Store the total budget of compute_allocation in BITRES units.
authorTimothy B. Terriberry <tterribe@xiph.org>
Wed, 15 Dec 2010 14:56:00 +0000 (06:56 -0800)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Wed, 15 Dec 2010 15:04:45 +0000 (10:04 -0500)
The margin of safety was supposed to be 1/8th bit, not 1 bit, and the
 bit we reserved to terminate skip signalling before was actually 8
 bits.
This patch updates the margin of safety to the correct value and
 accounts for the one bit (not 8) needed for skip signalling.
It also fixes the remainder calculation in the skip loop to work
 correctly when start>0.

libcelt/celt.c
libcelt/rate.c

index c034f24..3b4ce28 100644 (file)
@@ -1119,8 +1119,8 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
    ALLOC(pulses, st->mode->nbEBands, int);
    ALLOC(fine_priority, st->mode->nbEBands, int);
 
-   /* bits =   packet size    -    where we are   - safety */
-   bits = nbCompressedBytes*8 - ec_enc_tell(enc, 0) - 1;
+   /* bits =   packet size        -       where we are           - safety - skip signalling*/
+   bits = (nbCompressedBytes*8<<BITRES) - ec_enc_tell(enc, BITRES) - 1    - (1<<BITRES);
    codedBands = compute_allocation(st->mode, st->start, st->end, offsets,
          alloc_trim, bits, pulses, fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands);
    st->lastCodedBands = codedBands;
@@ -1856,7 +1856,7 @@ int celt_decode_with_ec_float(CELTDecoder * restrict st, const unsigned char *da
       intensity = ec_dec_uint(dec, 1+st->end-st->start);
    }
 
-   bits = len*8 - ec_dec_tell(dec, 0) - 1;
+   bits = (len*8<<BITRES) - ec_dec_tell(dec, BITRES) - 1 - (1<<BITRES);
    codedBands = compute_allocation(st->mode, st->start, st->end, offsets,
          alloc_trim, bits, pulses, fine_quant, fine_priority, C, LM, dec, 0, 0);
    
index 1bc2181..f9ff6d8 100644 (file)
@@ -178,7 +178,7 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end,
                psum += alloc_floor;
          }
       }
-      if (psum > (total<<BITRES))
+      if (psum > total)
          hi = mid;
       else
          lo = mid;
@@ -214,10 +214,10 @@ static inline int interp_bits2pulses(const CELTMode *m, int start, int end,
       int rem;
       /*Figure out how many left-over bits we would be adding to this band.
         This can include bits we've stolen back from higher, skipped bands.*/
-      left = (total<<BITRES)-psum;
+      left = total-psum;
       percoeff = left/(m->eBands[codedBands]-m->eBands[start]);
       left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
-      rem = IMAX(left-m->eBands[j],0);
+      rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0);
       band_width = m->eBands[codedBands]-m->eBands[j];
       band_bits = bits[j] + percoeff*band_width + rem;
       /*Only code a skip decision if we're above the threshold for this band.
@@ -379,7 +379,7 @@ int compute_allocation(const CELTMode *m, int start, int end, int *offsets, int
          /*printf ("%d ", bits[j]);*/
       }
       /*printf ("\n");*/
-      if (psum > (total<<BITRES))
+      if (psum > total)
          hi = mid;
       else
          lo = mid;