Fixing stereo: Do not attempt to use more bits than are available.
authorGregory Maxwell <greg@xiph.org>
Mon, 4 May 2009 19:58:40 +0000 (15:58 -0400)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Tue, 5 May 2009 11:31:44 +0000 (07:31 -0400)
This change breaks the bitstream.

Make the first frame out of the encoder an intra-frame. (While not required this may help
in the case that the decoder has old state laying around, and it shouldn't hurt)

libcelt/arch.h
libcelt/bands.c
libcelt/celt.c

index f5a253a..3367517 100644 (file)
 
 #define ABS(x) ((x) < 0 ? (-(x)) : (x))      /**< Absolute integer value. */
 #define ABS16(x) ((x) < 0 ? (-(x)) : (x))    /**< Absolute 16-bit value.  */
-#define MIN16(a,b) ((a) < (b) ? (a) : (b))   /**< Maximum 16-bit value.   */
+#define MIN16(a,b) ((a) < (b) ? (a) : (b))   /**< Minimum 16-bit value.   */
 #define MAX16(a,b) ((a) > (b) ? (a) : (b))   /**< Maximum 16-bit value.   */
 #define ABS32(x) ((x) < 0 ? (-(x)) : (x))    /**< Absolute 32-bit value.  */
-#define MIN32(a,b) ((a) < (b) ? (a) : (b))   /**< Maximum 32-bit value.   */
+#define MIN32(a,b) ((a) < (b) ? (a) : (b))   /**< Minimum 32-bit value.   */
 #define MAX32(a,b) ((a) > (b) ? (a) : (b))   /**< Maximum 32-bit value.   */
+#define IMIN(a,b) ((a) < (b) ? (a) : (b))   /**< Minimum int value.   */
 #define IMAX(a,b) ((a) > (b) ? (a) : (b))   /**< Maximum int value.   */
 #define UADD32(a,b) ((a)+(b))
 #define USUB32(a,b) ((a)-(b))
index e111490..ff39149 100644 (file)
@@ -539,7 +539,7 @@ void quant_bands_stereo(const CELTMode *m, celt_norm_t * restrict X, celt_norm_t
       if (curr_balance > 3)
          curr_balance = 3;
       curr_balance = balance / curr_balance;
-      b = pulses[i]+curr_balance;
+      b = IMIN(remaining_bits+1,pulses[i]+curr_balance);
       if (b<0)
          b = 0;
 
@@ -892,7 +892,7 @@ void unquant_bands_stereo(const CELTMode *m, celt_norm_t * restrict X, celt_norm
       if (curr_balance > 3)
          curr_balance = 3;
       curr_balance = balance / curr_balance;
-      b = pulses[i]+curr_balance;
+      b = IMIN(remaining_bits+1,pulses[i]+curr_balance);
       if (b<0)
          b = 0;
       
index b21f99b..fb43c40 100644 (file)
@@ -110,6 +110,7 @@ CELTEncoder *celt_encoder_create(const CELTMode *mode)
 
    st->pitch_enabled = 1;
    st->pitch_available = 1;
+   st->delayedIntra = 1;
 
    st->in_mem = celt_alloc(st->overlap*C*sizeof(celt_sig_t));
    st->out_mem = celt_alloc((MAX_PERIOD+st->overlap)*C*sizeof(celt_sig_t));