[PATCH] Fix CNG when effEBands is less than nbEBands.

Timothy B. Terriberry tterribe at xiph.org
Wed Mar 2 15:28:08 PST 2011


We were trying to normalize bands that didn't actually exist (e.g.,
 the last band with 320-sample frames at 32kHz).
Thanks to John Ridges for the report.
---
 libcelt/celt.c |   24 +++++++++++++++++-------
 1 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/libcelt/celt.c b/libcelt/celt.c
index 31d35f8..287c720 100644
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -1137,6 +1137,7 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
             ec_enc_icdf(enc, prefilter_tapset, tapset_icdf, 2);
          else
            prefilter_tapset = 0;
+         fprintf(stderr,"pitch_index: %4i  gain %0.2f  tapset: %i\n",pitch_index,gain1,prefilter_tapset);
          gain1 = QCONST16(0.09375f,15)*(qg+1);
          pf_on = 1;
       }
@@ -1967,17 +1968,26 @@ static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict p
       log2Amp(st->mode, st->start, st->end, bandE, backgroundLogE, C);
 
       seed = st->rng;
-      for (i=0;i<C*N;i++)
+      for (c=0;c<C;c++)
       {
-            seed = lcg_rand(seed);
-            X[i] = (celt_int32)(seed)>>20;
+         for (i=0;i<st->mode->effEBands;i++)
+         {
+            int j;
+            int boffs;
+            int blen;
+            boffs = N*c+(st->mode->eBands[i]<<LM);
+            blen = (st->mode->eBands[i+1]-st->mode->eBands[i])<<LM;
+            for (j=0;j<blen;j++)
+            {
+               seed = lcg_rand(seed);
+               X[boffs+j] = (celt_int32)(seed)>>20;
+            }
+            renormalise_vector(X+boffs, blen, Q15ONE);
+         }
       }
       st->rng = seed;
-      for (c=0;c<C;c++)
-         for (i=0;i<st->mode->nbEBands;i++)
-            renormalise_vector(X+N*c+(st->mode->eBands[i]<<LM), (st->mode->eBands[i+1]-st->mode->eBands[i])<<LM, Q15ONE);
 
-      denormalise_bands(st->mode, X, freq, bandE, st->mode->nbEBands, C, 1<<LM);
+      denormalise_bands(st->mode, X, freq, bandE, st->mode->effEBands, C, 1<<LM);
 
       compute_inv_mdcts(st->mode, 0, freq, out_syn, overlap_mem, C, LM);
       plc = 0;
-- 
1.7.3.4


--------------090601070100070002060702--


More information about the celt-dev mailing list