Folding code moved to quant_band() to prevent duplication.
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sat, 16 Oct 2010 03:43:45 +0000 (23:43 -0400)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sat, 16 Oct 2010 03:43:45 +0000 (23:43 -0400)
libcelt/bands.c
libcelt/vq.c

index cf345e3..24d7a93 100644 (file)
@@ -486,6 +486,10 @@ static int compute_qn(int N, int b, int offset, int stereo)
    return qn;
 }
 
+static celt_uint32 lcg_rand(celt_uint32 seed)
+{
+   return 1664525 * seed + 1013904223;
+}
 
 /* This function is responsible for encoding and decoding a band for both
    the mono and stereo case. Even in the mono case, it can split the band
@@ -821,11 +825,37 @@ static void quant_band(int encode, const CELTMode *m, int i, celt_norm *X, celt_
          *remaining_bits -= curr_bits;
       }
 
-      /* Finally do the actual quantization */
-      if (encode)
-         alg_quant(X, N, q, spread, B, lowband, resynth, (ec_enc*)ec, seed, gain);
-      else
-         alg_unquant(X, N, q, spread, B, lowband, (ec_dec*)ec, seed, gain);
+      if (q!=0)
+      {
+         int K = get_pulses(q);
+
+         /* Finally do the actual quantization */
+         if (encode)
+            alg_quant(X, N, K, spread, B, lowband, resynth, (ec_enc*)ec, seed, gain);
+         else
+            alg_unquant(X, N, K, spread, B, lowband, (ec_dec*)ec, seed, gain);
+      } else {
+         int j;
+         if (lowband != NULL && resynth)
+         {
+            if (spread==2 && B<=1)
+            {
+               for (j=0;j<N;j++)
+               {
+                  *seed = lcg_rand(*seed);
+                  X[j] = (int)(*seed)>>20;
+               }
+            } else {
+               for (j=0;j<N;j++)
+                  X[j] = lowband[j];
+            }
+            renormalise_vector(X, N, gain);
+         } else {
+            /* This is important for encoding the side in stereo mode */
+            for (j=0;j<N;j++)
+               X[j] = 0;
+         }
+      }
    }
 
    /* This code is used by the decoder and by the resynthesis-enabled encoder */
index 8299a42..442347f 100644 (file)
 #define M_PI 3.141592653
 #endif
 
-static celt_uint32 lcg_rand(celt_uint32 seed)
-{
-   return 1664525 * seed + 1013904223;
-}
-
 static void exp_rotation1(celt_norm *X, int len, int stride, celt_word16 c, celt_word16 s)
 {
    int i;
@@ -175,31 +170,7 @@ void alg_quant(celt_norm *X, int N, int K, int spread, int B, celt_norm *lowband
    celt_word16 yy;
    SAVE_STACK;
 
-   /* When there's no pulse, fill with noise or folded spectrum */
-   if (K==0)
-   {
-      if (lowband != NULL && resynth)
-      {
-         if (spread==2 && B<=1)
-         {
-            for (j=0;j<N;j++)
-            {
-               *seed = lcg_rand(*seed);
-               X[j] = (int)(*seed)>>20;
-            }
-         } else {
-            for (j=0;j<N;j++)
-               X[j] = lowband[j];
-         }
-         renormalise_vector(X, N, gain);
-      } else {
-         /* This is important for encoding the side in stereo mode */
-         for (j=0;j<N;j++)
-            X[j] = 0;
-      }
-      return;
-   }
-   K = get_pulses(K);
+   celt_assert2(K!=0, "alg_quant() needs at least one pulse");
 
    ALLOC(y, N, celt_norm);
    ALLOC(iy, N, int);
@@ -354,30 +325,7 @@ void alg_unquant(celt_norm *X, int N, int K, int spread, int B,
    VARDECL(int, iy);
    SAVE_STACK;
 
-   if (K==0)
-   {
-      if (lowband != NULL)
-      {
-         if (spread==2 && B<=1)
-         {
-            for (i=0;i<N;i++)
-            {
-               *seed = lcg_rand(*seed);
-               X[i] = (int)(*seed)>>20;
-            }
-         } else {
-            for (i=0;i<N;i++)
-               X[i] = lowband[i];
-         }
-         renormalise_vector(X, N, gain);
-      } else {
-         /* This is important for encoding the side in stereo mode */
-         for (i=0;i<N;i++)
-            X[i] = 0;
-      }
-      return;
-   }
-   K = get_pulses(K);
+   celt_assert2(K!=0, "alg_unquant() needs at least one pulse");
    ALLOC(iy, N, int);
    decode_pulses(iy, N, K, dec);
    Ryy = 0;