Keeping the allocation of the intensity-codec bands
authorJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sat, 4 Dec 2010 15:27:22 +0000 (10:27 -0500)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Sat, 4 Dec 2010 15:27:22 +0000 (10:27 -0500)
Also some code to select between constrained and unconstrained VBR

libcelt/bands.c
libcelt/celt.c

index 8dffcca..3be99a2 100644 (file)
@@ -925,6 +925,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
    ALLOC(lowband_scratch, M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]), celt_norm);
    norm = _norm;
    norm2 = norm + M*eBands[m->nbEBands];
+#if 0
    if (C==2)
    {
       int j;
@@ -949,7 +950,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
          }
       }
    }
-
+#endif
    if (encode)
       seed = ((ec_enc*)ec)->rng;
    else
index 4693604..c1ac116 100644 (file)
@@ -71,6 +71,7 @@ struct CELTEncoder {
    int start, end;
 
    celt_int32 vbr_rate_norm; /* Target number of 8th bits per frame */
+   int constrained_vbr;      /* If zero, VBR can do whatever it likes with the rate */
 
    /* Everything beyond this point gets cleared on a reset */
 #define ENCODER_RESET_START frame_max
@@ -142,6 +143,7 @@ CELTEncoder *celt_encoder_init(CELTEncoder *st, const CELTMode *mode, int channe
 
    st->start = 0;
    st->end = st->mode->effEBands;
+   st->constrained_vbr = 1;
 
    st->vbr_rate_norm = 0;
    st->vbr_offset = 0;
@@ -1006,7 +1008,10 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
 
      /* Computes the max bit-rate allowed in VBR more to avoid violating the target rate and buffering */
      vbr_bound = vbr_rate;
-     max_allowed = IMIN(vbr_rate+vbr_bound-st->vbr_reservoir>>(BITRES+3),nbAvailableBytes);
+     if (st->constrained_vbr)
+        max_allowed = IMIN(vbr_rate+vbr_bound-st->vbr_reservoir>>(BITRES+3),nbAvailableBytes);
+     else
+        max_allowed = nbAvailableBytes;
      min_allowed = (tell>>(BITRES+3)) + 2 - nbFilledBytes;
 
      /* In VBR mode the frame size must not be reduced so much that it would result in the encoder running out of bits */
@@ -1021,7 +1026,8 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
      } else
         alpha = QCONST16(.001f,15);
      /* How many bits have we used in excess of what we're allowed */
-     st->vbr_reservoir += target - vbr_rate;
+     if (st->constrained_vbr)
+        st->vbr_reservoir += target - vbr_rate;
      /*printf ("%d\n", st->vbr_reservoir);*/
 
      /* Compute the offset we need to apply in order to reach the target */
@@ -1030,7 +1036,7 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i
      /*printf ("%d\n", st->vbr_drift);*/
 
      /* We could use any multiple of vbr_rate as bound (depending on the delay) */
-     if (st->vbr_reservoir < 0)
+     if (st->constrained_vbr && st->vbr_reservoir < 0)
      {
         /* We're under the min value -- increase rate */
         int adjust = (-st->vbr_reservoir)/(8<<BITRES);