Implemented variable spreading amount in the decoder
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sat, 7 Aug 2010 13:21:32 +0000 (09:21 -0400)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sat, 7 Aug 2010 13:21:32 +0000 (09:21 -0400)
Decision not yet implemented in the encoder

libcelt/bands.c
libcelt/celt.c
libcelt/vq.c

index 1962037..df7da03 100644 (file)
@@ -819,7 +819,6 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, celt_nor
    VARDECL(celt_norm, _norm);
    int B;
    int M;
-   int spread;
    celt_int32 seed;
    celt_norm *lowband;
    int update_lowband = 1;
@@ -828,7 +827,6 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, celt_nor
 
    M = 1<<LM;
    B = shortBlocks ? M : 1;
-   spread = fold ? B : 0;
    ALLOC(_norm, M*eBands[m->nbEBands], celt_norm);
    norm = _norm;
 
index e754da6..63cfb2c 100644 (file)
@@ -808,7 +808,8 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, c
       (first symbols in the stream) */
    ec_enc_bit_prob(enc, intra_ener, 8192);
    ec_enc_bit_prob(enc, shortBlocks!=0, 8192);
-   ec_enc_bit_prob(enc, has_fold, 57344);
+   ec_enc_bit_prob(enc, has_fold>>1, 8192);
+   ec_enc_bit_prob(enc, has_fold&1, (has_fold>>1) ? 32768 : 49152);
 
    if (shortBlocks)
    {
@@ -1610,7 +1611,8 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
    /* Decode the global flags (first symbols in the stream) */
    intra_ener = ec_dec_bit_prob(dec, 8192);
    isTransient = ec_dec_bit_prob(dec, 8192);
-   has_fold = ec_dec_bit_prob(dec, 57344);
+   has_fold = ec_dec_bit_prob(dec, 8192)<<1;
+   has_fold |= ec_dec_bit_prob(dec, (has_fold>>1) ? 32768 : 49152);
 
    if (isTransient)
       shortBlocks = M;
index 16b19ce..1fd3064 100644 (file)
@@ -74,12 +74,13 @@ static void exp_rotation1(celt_norm *X, int len, int stride, celt_word16 c, celt
    }
 }
 
-static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K)
+static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread)
 {
    int i;
    celt_word16 c, s;
    celt_word16 gain, theta;
    int stride2=0;
+   int factor;
    /*int i;
    if (len>=30)
    {
@@ -88,9 +89,16 @@ static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K)
       X[14] = 1;
       K=5;
    }*/
-   if (2*K>=len)
+   if (2*K>=len || spread==0)
       return;
-   gain = celt_div((celt_word32)MULT16_16(Q15_ONE,len),(celt_word32)(len+10*K));
+   if (spread==1)
+      factor=10;
+   else if (spread==2)
+      factor=5;
+   else
+      factor=15;
+
+   gain = celt_div((celt_word32)MULT16_16(Q15_ONE,len),(celt_word32)(len+factor*K));
    /* FIXME: Make that HALF16 instead of HALF32 */
    theta = HALF32(MULT16_16_Q15(gain,gain));
 
@@ -196,8 +204,7 @@ void alg_quant(celt_norm *X, int N, int K, int spread, int B, celt_norm *lowband
    ALLOC(signx, N, celt_word16);
    N_1 = 512/N;
    
-   if (spread)
-      exp_rotation(X, N, 1, B, K);
+   exp_rotation(X, N, 1, B, K, spread);
 
    /* Get rid of the sign */
    sum = 0;
@@ -332,8 +339,7 @@ void alg_quant(celt_norm *X, int N, int K, int spread, int B, celt_norm *lowband
    if (resynth)
    {
       normalise_residual(iy, X, N, K, EXTRACT16(SHR32(yy,2*yshift)));
-      if (spread)
-         exp_rotation(X, N, -1, B, K);
+      exp_rotation(X, N, -1, B, K, spread);
    }
    RESTORE_STACK;
 }
@@ -374,8 +380,7 @@ void alg_unquant(celt_norm *X, int N, int K, int spread, int B, celt_norm *lowba
       Ryy = MAC16_16(Ryy, iy[i], iy[i]);
    } while (++i < N);
    normalise_residual(iy, X, N, K, Ryy);
-   if (spread)
-      exp_rotation(X, N, -1, B, K);
+   exp_rotation(X, N, -1, B, K, spread);
    RESTORE_STACK;
 }