Adds support for up to 32767 pulses for the N=3 case (disabled for now)
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Thu, 21 May 2009 02:50:46 +0000 (22:50 -0400)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Fri, 22 May 2009 11:45:58 +0000 (07:45 -0400)
libcelt/bands.c
libcelt/rate.h

index ff39149..e5ba899 100644 (file)
@@ -421,12 +421,14 @@ void quant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, ce
    for (i=0;i<m->nbEBands;i++)
    {
       int tell;
+      int N;
       int q;
       celt_word16_t n;
       const celt_int16_t * const *BPbits;
       
       int curr_balance, curr_bits;
       
+      N = eBands[i+1]-eBands[i];
       BPbits = m->bits;
 
       tell = ec_enc_tell(enc, 4);
@@ -437,14 +439,14 @@ void quant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, ce
       if (curr_balance > 3)
          curr_balance = 3;
       curr_balance = balance / curr_balance;
-      q = bits2pulses(m, BPbits[i], pulses[i]+curr_balance);
-      curr_bits = BPbits[i][q];
+      q = bits2pulses(m, BPbits[i], N, pulses[i]+curr_balance);
+      curr_bits = pulses2bits(BPbits[i], N, q);
       remaining_bits -= curr_bits;
       while (remaining_bits < 0 && q > 0)
       {
          remaining_bits += curr_bits;
          q--;
-         curr_bits = BPbits[i][q];
+         curr_bits = pulses2bits(BPbits[i], N, q);
          remaining_bits -= curr_bits;
       }
       balance += pulses[i] + tell;
@@ -545,14 +547,14 @@ void quant_bands_stereo(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t
 
       if (N<5) {
          
-         q1 = bits2pulses(m, BPbits[i], b/2);
-         curr_bits = 2*BPbits[i][q1];
+         q1 = bits2pulses(m, BPbits[i], N, b/2);
+         curr_bits = 2*pulses2bits(BPbits[i], N, q1);
          remaining_bits -= curr_bits;
          while (remaining_bits < 0 && q1 > 0)
          {
             remaining_bits += curr_bits;
             q1--;
-            curr_bits = 2*BPbits[i][q1];
+            curr_bits = 2*pulses2bits(BPbits[i], N, q1);
             remaining_bits -= curr_bits;
          }
          balance += pulses[i] + tell;
@@ -653,9 +655,9 @@ void quant_bands_stereo(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t
       if (mbits<0)
          mbits=0;
       sbits = b-qalloc-mbits;
-      q1 = bits2pulses(m, BPbits[i], mbits);
-      q2 = bits2pulses(m, BPbits[i], sbits);
-      curr_bits = BPbits[i][q1]+BPbits[i][q2]+qalloc;
+      q1 = bits2pulses(m, BPbits[i], N, mbits);
+      q2 = bits2pulses(m, BPbits[i], N, sbits);
+      curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc;
       remaining_bits -= curr_bits;
       while (remaining_bits < 0 && (q1 > 0 || q2 > 0))
       {
@@ -663,10 +665,10 @@ void quant_bands_stereo(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t
          if (q1>q2)
          {
             q1--;
-            curr_bits = BPbits[i][q1]+BPbits[i][q2]+qalloc;
+            curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc;
          } else {
             q2--;
-            curr_bits = BPbits[i][q1]+BPbits[i][q2]+qalloc;
+            curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc;
          }
          remaining_bits -= curr_bits;
       }
@@ -775,12 +777,14 @@ void unquant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P,
    for (i=0;i<m->nbEBands;i++)
    {
       int tell;
+      int N;
       int q;
       celt_word16_t n;
       const celt_int16_t * const *BPbits;
       
       int curr_balance, curr_bits;
-      
+
+      N = eBands[i+1]-eBands[i];
       BPbits = m->bits;
 
       tell = ec_dec_tell(dec, 4);
@@ -791,14 +795,14 @@ void unquant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P,
       if (curr_balance > 3)
          curr_balance = 3;
       curr_balance = balance / curr_balance;
-      q = bits2pulses(m, BPbits[i], pulses[i]+curr_balance);
-      curr_bits = BPbits[i][q];
+      q = bits2pulses(m, BPbits[i], N, pulses[i]+curr_balance);
+      curr_bits = pulses2bits(BPbits[i], N, q);
       remaining_bits -= curr_bits;
       while (remaining_bits < 0 && q > 0)
       {
          remaining_bits += curr_bits;
          q--;
-         curr_bits = BPbits[i][q];
+         curr_bits = pulses2bits(BPbits[i], N, q);
          remaining_bits -= curr_bits;
       }
       balance += pulses[i] + tell;
@@ -898,14 +902,14 @@ void unquant_bands_stereo(const CELTMode *m, celt_norm_t * restrict X, celt_norm
       
       if (N<5) {
          
-         q1 = bits2pulses(m, BPbits[i], b/2);
-         curr_bits = 2*BPbits[i][q1];
+         q1 = bits2pulses(m, BPbits[i], N, b/2);
+         curr_bits = 2*pulses2bits(BPbits[i], N, q1);
          remaining_bits -= curr_bits;
          while (remaining_bits < 0 && q1 > 0)
          {
             remaining_bits += curr_bits;
             q1--;
-            curr_bits = 2*BPbits[i][q1];
+            curr_bits = 2*pulses2bits(BPbits[i], N, q1);
             remaining_bits -= curr_bits;
          }
          balance += pulses[i] + tell;
@@ -992,9 +996,9 @@ void unquant_bands_stereo(const CELTMode *m, celt_norm_t * restrict X, celt_norm
       if (mbits<0)
          mbits=0;
       sbits = b-qalloc-mbits;
-      q1 = bits2pulses(m, BPbits[i], mbits);
-      q2 = bits2pulses(m, BPbits[i], sbits);
-      curr_bits = BPbits[i][q1]+BPbits[i][q2]+qalloc;
+      q1 = bits2pulses(m, BPbits[i], N, mbits);
+      q2 = bits2pulses(m, BPbits[i], N, sbits);
+      curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc;
       remaining_bits -= curr_bits;
       while (remaining_bits < 0 && (q1 > 0 || q2 > 0))
       {
@@ -1002,10 +1006,10 @@ void unquant_bands_stereo(const CELTMode *m, celt_norm_t * restrict X, celt_norm
          if (q1>q2)
          {
             q1--;
-            curr_bits = BPbits[i][q1]+BPbits[i][q2]+qalloc;
+            curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc;
          } else {
             q2--;
-            curr_bits = BPbits[i][q1]+BPbits[i][q2]+qalloc;
+            curr_bits = pulses2bits(BPbits[i], N, q1)+pulses2bits(BPbits[i], N, q2)+qalloc;
          }
          remaining_bits -= curr_bits;
       }
index 8f931ff..45d104f 100644 (file)
 #define BITROUND 8
 #define BITOVERFLOW 30000
 
-static inline int bits2pulses(const CELTMode *m, const celt_int16_t *cache, int bits)
+#include "cwrs.h"
+
+static inline int bits2pulses(const CELTMode *m, const celt_int16_t *cache, int N, int bits)
 {
    int i;
    int lo, hi;
    lo = 0;
    hi = MAX_PULSES-1;
    
+   /* Use of more than MAX_PULSES is disabled until we are able to cwrs that decently */
+   if (0 && bits > cache[MAX_PULSES-1] && N==3)
+   {
+      /*int pulses;
+      pulses = 127;
+      while (16 + log2_frac(2*(pulses+1)*(pulses+1) + 1, 4) <= bits && pulses < 32767)
+         pulses++;*/
+      lo = 127;
+      hi = 32767;
+      for (i=0;i<15;i++)
+      {
+         int pulses = (lo+hi)>>1;
+         if (16 + log2_frac(2*pulses*pulses + 1, 4) > bits)
+            hi = pulses;
+         else
+            lo = pulses;
+      }
+      return lo;
+   }
    /* Instead of using the "bisection condition" we use a fixed number of 
    iterations because it should be faster */
    /*while (hi-lo != 1)*/
@@ -64,6 +85,21 @@ static inline int bits2pulses(const CELTMode *m, const celt_int16_t *cache, int
       return hi;
 }
 
+
+static inline int pulses2bits(const celt_int16_t *cache, int N, int pulses)
+{
+   /* Use of more than MAX_PULSES is disabled until we are able to cwrs that decently */
+   if (0 && pulses > 127)
+   {
+      int bits;
+      celt_assert (N==3);
+      bits = 16 + log2_frac(2*pulses*pulses + 1, 4);
+      /*printf ("%d <- %d\n", bits, pulses);*/
+      return bits;
+   }
+   return cache[pulses];
+}
+
 /** Computes a cache of the pulses->bits mapping in each band */
 celt_int16_t **compute_alloc_cache(CELTMode *m, int C);