Allowing to change the allocation dynamically.
authorJean-Marc Valin <jean-marc.valin@octasic.com>
Thu, 30 Sep 2010 14:16:22 +0000 (10:16 -0400)
committerJean-Marc Valin <jean-marc.valin@octasic.com>
Thu, 30 Sep 2010 14:16:22 +0000 (10:16 -0400)
Uses a scaling factor that gets applied to the allocation matrix.

Conflicts:

libcelt/celt.c
libcelt/rate.c
libcelt/rate.h

libcelt/celt.c
libcelt/rate.c
libcelt/rate.h

index 5e8c8c8..2d68f6d 100644 (file)
@@ -65,6 +65,9 @@ static const float transientWindow[16] = {
    0.8695045f, 0.9251086f, 0.9662361f, 0.9914865f};
 #endif
 
+static const int trim_cdf[7] = {0, 4, 10, 23, 119, 125, 128};
+static const int trim_coef[6] = {4, 6, 7, 8, 10, 12};
+
 /** Encoder state 
  @brief Encoder state
  */
@@ -895,8 +898,18 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, c
       offsets[i] *= (6<<BITRES);
    }
    bits = nbCompressedBytes*8 - ec_enc_tell(enc, 0) - 1;
-   codedBands = compute_allocation(st->mode, st->start, st->end, offsets, bits, pulses, fine_quant, fine_priority, C, LM);
-
+   {
+      int alloc_trim;
+      int trim_index = 3;
+
+      /*if (isTransient)
+         trim_index = 2;
+      if (has_fold==0)
+         trim_index = 2;*/
+      alloc_trim = trim_coef[trim_index];
+      ec_encode_bin(enc, trim_cdf[trim_index], trim_cdf[trim_index+1], 7);
+      codedBands = compute_allocation(st->mode, st->start, st->end, offsets, alloc_trim, bits, pulses, fine_quant, fine_priority, C, LM);
+   }
    quant_fine_energy(st->mode, st->start, st->end, bandE, oldBandE, error, fine_quant, enc, C);
 
 #ifdef MEASURE_NORM_MSE
@@ -1580,7 +1593,16 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
 
    bits = len*8 - ec_dec_tell(dec, 0) - 1;
    ALLOC(fine_quant, st->mode->nbEBands, int);
-   codedBands = compute_allocation(st->mode, st->start, st->end, offsets, bits, pulses, fine_quant, fine_priority, C, LM);
+   {
+      int fl, alloc_trim;
+      int trim_index=0;
+      fl = ec_decode_bin(dec, 7);
+      while (trim_cdf[trim_index+1] <= fl)
+         trim_index++;
+      ec_dec_update(dec, trim_cdf[trim_index], trim_cdf[trim_index+1], 128);
+      alloc_trim = trim_coef[trim_index];
+      codedBands = compute_allocation(st->mode, st->start, st->end, offsets, alloc_trim, bits, pulses, fine_quant, fine_priority, C, LM);
+   }
    /*bits = ec_dec_tell(dec, 0);
    compute_fine_allocation(st->mode, fine_quant, (20*C+len*8/5-(ec_dec_tell(dec, 0)-bits))/C);*/
    
index a760951..d1163d5 100644 (file)
@@ -257,7 +257,8 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end, int
    return codedBands;
 }
 
-int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int total, int *pulses, int *ebits, int *fine_priority, int _C, int LM)
+int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int alloc_trim,
+      int total, int *pulses, int *ebits, int *fine_priority, int _C, int LM)
 {
    int lo, hi, len, j;
    const int C = CHANNELS(_C);
@@ -279,7 +280,7 @@ int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int
       for (j=start;j<end;j++)
       {
          int N = m->eBands[j+1]-m->eBands[j];
-         bits1[j] = ((C*N*m->allocVectors[mid*len+j]<<LM>>2) + offsets[j]);
+         bits1[j] = ((alloc_trim*C*N*m->allocVectors[mid*len+j]<<LM>>5) + offsets[j]);
          psum += bits1[j];
          /*printf ("%d ", bits[j]);*/
       }
@@ -294,8 +295,8 @@ int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int
    for (j=start;j<end;j++)
    {
       int N = m->eBands[j+1]-m->eBands[j];
-      bits1[j] = (C*N*m->allocVectors[lo*len+j]<<LM>>2);
-      bits2[j] = (C*N*m->allocVectors[hi*len+j]<<LM>>2) - bits1[j];
+      bits1[j] = (alloc_trim*C*N*m->allocVectors[lo*len+j]<<LM>>5);
+      bits2[j] = (alloc_trim*C*N*m->allocVectors[hi*len+j]<<LM>>5) - bits1[j];
       bits1[j] += offsets[j];
    }
    codedBands = interp_bits2pulses(m, start, end, bits1, bits2, total, pulses, ebits, fine_priority, len, C, LM);
index 153b530..7269633 100644 (file)
@@ -104,7 +104,8 @@ celt_int16 **compute_alloc_cache(CELTMode *m, int M);
  @param pulses Number of pulses per band (returned)
  @return Total number of bits allocated
 */
-int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int total, int *pulses, int *ebits, int *fine_priority, int _C, int LM);
+int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int alloc_trim,
+      int total, int *pulses, int *ebits, int *fine_priority, int _C, int LM);
 
 
 #endif