Fix log2_frac() to return an upper bound, not a lower bound.
authorTimothy B. Terriberry <tterribe@xiph.org>
Sun, 14 Dec 2008 06:42:37 +0000 (01:42 -0500)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Wed, 17 Dec 2008 12:31:38 +0000 (07:31 -0500)
libcelt/bands.c
libcelt/cwrs.c

index 762eda5..d0c3498 100644 (file)
@@ -389,7 +389,7 @@ void quant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P, ce
       tell = ec_enc_tell(enc, 4);
       if (i != 0)
          balance -= tell;
-      remaining_bits = (total_bits<<BITRES)-tell-2;
+      remaining_bits = (total_bits<<BITRES)-tell-1;
       curr_balance = (m->nbEBands-i);
       if (curr_balance > 3)
          curr_balance = 3;
@@ -472,7 +472,7 @@ void unquant_bands(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t *P,
       tell = ec_dec_tell(dec, 4);
       if (i != 0)
          balance -= tell;
-      remaining_bits = (total_bits<<BITRES)-tell-2;
+      remaining_bits = (total_bits<<BITRES)-tell-1;
       curr_balance = (m->nbEBands-i);
       if (curr_balance > 3)
          curr_balance = 3;
index 19681fd..a39c1a1 100644 (file)
@@ -54,6 +54,8 @@ int log2_frac(ec_uint32 val, int frac)
    int i;
    /* EC_ILOG() actually returns log2()+1, go figure */
    int L = EC_ILOG(val)-1;
+   int pow2;
+   pow2=!(val&val-1);
    /*printf ("in: %d %d ", val, L);*/
    if (L>14)
       val >>= L-14;
@@ -67,9 +69,12 @@ int log2_frac(ec_uint32 val, int frac)
       /*printf ("%d\n", val);*/
       if (val > 16384)
          L |= (1<<(frac-i-1));
-      else   
+      else
          val <<= 1;
 }
+   /*The previous loop returns a conservatively low estimate.
+     If val wasn't a power of two, we should round up.*/
+   L += !pow2;
    return L;
 }