shithub: opus

Download patch

ref: 1a8bf37dbaa461d410c101d1be302a67b4927035
parent: 37e788c185a98cde764f391f497d5dc76bd0599d
author: Jean-Marc Valin <[email protected]>
date: Wed Mar 16 18:03:15 EDT 2011

Taking into account the start and end bands in CNG

--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -1988,7 +1988,12 @@
       VARDECL(celt_norm, X);
       VARDECL(celt_ener, bandE);
       celt_uint32 seed;
+      int effEnd;
 
+      effEnd = st->end;
+      if (effEnd > st->mode->effEBands)
+         effEnd = st->mode->effEBands;
+
       ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */
       ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
       ALLOC(bandE, st->mode->nbEBands*C, celt_ener);
@@ -1998,6 +2003,8 @@
       seed = st->rng;
       for (c=0;c<C;c++)
       {
+         for (i=0;i<(st->mode->eBands[st->start]<<LM);i++)
+            X[c*N+i] = 0;
          for (i=0;i<st->mode->effEBands;i++)
          {
             int j;
@@ -2012,11 +2019,24 @@
             }
             renormalise_vector(X+boffs, blen, Q15ONE);
          }
+         for (i=(st->mode->eBands[st->end]<<LM);i<N;i++)
+            X[c*N+i] = 0;
       }
       st->rng = seed;
 
       denormalise_bands(st->mode, X, freq, bandE, st->mode->effEBands, C, 1<<LM);
 
+      c=0; do
+         for (i=0;i<st->mode->eBands[st->start]<<LM;i++)
+            freq[c*N+i] = 0;
+      while (++c<C);
+      c=0; do {
+         int bound = st->mode->eBands[effEnd]<<LM;
+         if (st->downsample!=1)
+            bound = IMIN(bound, N/st->downsample);
+         for (i=bound;i<N;i++)
+            freq[c*N+i] = 0;
+      } while (++c<C);
       compute_inv_mdcts(st->mode, 0, freq, out_syn, overlap_mem, C, LM);
       plc = 0;
    } else if (st->loss_count == 0)