From 06bab45fb4d604e15017152209e99141a9b1955e Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jmvalin@jmvalin.ca>
Date: Tue, 6 Nov 2012 16:29:11 -0500
Subject: [PATCH] Moved up the second encoder mdct to reduce stack usage

---
 celt/celt.c | 59 +++++++++++++++++++++++++++--------------------------
 1 file changed, 30 insertions(+), 29 deletions(-)

diff --git a/celt/celt.c b/celt/celt.c
index 7c78947b8..8c0014ce3 100644
--- a/celt/celt.c
+++ b/celt/celt.c
@@ -1283,6 +1283,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
    int nbEBands;
    int overlap;
    const opus_int16 *eBands;
+   int secondMdct;
    ALLOC_STACK;
 
    mode = st->mode;
@@ -1489,7 +1490,34 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
    ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */
    ALLOC(bandE,nbEBands*CC, celt_ener);
    ALLOC(bandLogE,nbEBands*CC, opus_val16);
-   /* Compute MDCTs */
+
+   secondMdct = shortBlocks && st->complexity>=8;
+   ALLOC(bandLogE2, C*nbEBands, opus_val16);
+   if (secondMdct)
+   {
+      compute_mdcts(mode, 0, in, freq, CC, LM);
+      if (CC==2&&C==1)
+      {
+         for (i=0;i<N;i++)
+            freq[i] = ADD32(HALF32(freq[i]), HALF32(freq[N+i]));
+      }
+      if (st->upsample != 1)
+      {
+         c=0; do
+         {
+            int bound = N/st->upsample;
+            for (i=0;i<bound;i++)
+               freq[c*N+i] *= st->upsample;
+            for (;i<N;i++)
+               freq[c*N+i] = 0;
+         } while (++c<C);
+      }
+      compute_band_energies(mode, freq, bandE, effEnd, C, M);
+      amp2Log2(mode, effEnd, st->end, bandE, bandLogE2, C);
+      for (i=0;i<C*nbEBands;i++)
+         bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
+   }
+
    compute_mdcts(mode, shortBlocks, in, freq, CC, LM);
 
    if (CC==2&&C==1)
@@ -1516,35 +1544,8 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
       printf("%f ", bandLogE[i]);
    printf("\n");*/
 
-   ALLOC(bandLogE2, C*nbEBands, opus_val16);
-   if (shortBlocks && st->complexity>=8)
+   if (!secondMdct)
    {
-      VARDECL(celt_sig, freq2);
-      VARDECL(opus_val32, bandE2);
-      ALLOC(freq2, CC*N, celt_sig);
-      compute_mdcts(mode, 0, in, freq2, CC, LM);
-      if (CC==2&&C==1)
-      {
-         for (i=0;i<N;i++)
-            freq2[i] = ADD32(HALF32(freq2[i]), HALF32(freq2[N+i]));
-      }
-      if (st->upsample != 1)
-      {
-         c=0; do
-         {
-            int bound = N/st->upsample;
-            for (i=0;i<bound;i++)
-               freq2[c*N+i] *= st->upsample;
-            for (;i<N;i++)
-               freq2[c*N+i] = 0;
-         } while (++c<C);
-      }
-      ALLOC(bandE2, C*nbEBands, opus_val32);
-      compute_band_energies(mode, freq2, bandE2, effEnd, C, M);
-      amp2Log2(mode, effEnd, st->end, bandE2, bandLogE2, C);
-      for (i=0;i<C*nbEBands;i++)
-         bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
-   } else {
       for (i=0;i<C*nbEBands;i++)
          bandLogE2[i] = bandLogE[i];
    }
-- 
GitLab