Koen's decoder updates
authorJean-Marc Valin <jean-marc.valin@octasic.com>
Mon, 31 Jan 2011 23:25:47 +0000 (18:25 -0500)
committerJean-Marc Valin <jean-marc.valin@octasic.com>
Mon, 31 Jan 2011 23:25:47 +0000 (18:25 -0500)
configure.ac
src/opus_decoder.c
src/opus_decoder.h

index 8dc2c1d..f99c88a 100644 (file)
@@ -3,7 +3,7 @@
 
 AC_PREREQ([2.59])
 AC_INIT(src/opus.h)
-AM_INIT_AUTOMAKE(opus,20110122)
+AM_INIT_AUTOMAKE(opus,20110131)
 
 # Checks for programs.
 AC_PROG_CC
index fffd228..f8a1f97 100644 (file)
@@ -130,6 +130,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
 
     if (st->mode != MODE_CELT_ONLY)
     {
+        SKP_int16 *pcm_ptr = pcm;
         DecControl.API_sampleRate = st->Fs;
         DecControl.payloadSize_ms = 1000 * audiosize / st->Fs;
         if( st->mode == MODE_SILK_ONLY ) {
@@ -147,15 +148,18 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
             DecControl.internalSampleRate = 16000;
         }
 
-        /* We Should eventually have to set the bandwidth here */
-
-        /* Call SILK encoder for the low band */
-        silk_ret = SKP_Silk_SDK_Decode( st->silk_dec, &DecControl, data == NULL, &dec, len, pcm, &silk_frame_size );
-        if (silk_ret)
-        {
-            fprintf (stderr, "SILK decode error\n");
-            /* Handle error */
-        }
+        /* FIXME: Add a check here to avoid a buffer overflow if there are more
+           samples in the SILK frame. In fact the TOC byte should tell us how many
+           frames there are */
+        do {
+            /* Call SILK decoder */
+            silk_ret = SKP_Silk_SDK_Decode( st->silk_dec, &DecControl, data == NULL, &dec, len, pcm_ptr, &silk_frame_size );
+            if( silk_ret ) {
+                fprintf (stderr, "SILK decode error\n");
+                /* Handle error */
+            }
+            pcm_ptr += silk_frame_size;
+        } while( DecControl.moreInternalDecoderFrames );
     } else {
         for (i=0;i<frame_size*st->channels;i++)
             pcm[i] = 0;
@@ -169,7 +173,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
         celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(0));
     }
 
-    if (st->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND)
+    if (st->mode != MODE_SILK_ONLY)
     {
        int endband;
 
@@ -194,7 +198,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
         /* Encode high band with CELT */
         celt_ret = celt_decode_with_ec(st->celt_dec, data, len, pcm_celt, frame_size, &dec);
         for (i=0;i<frame_size*st->channels;i++)
-            pcm[i] += pcm_celt[i];
+            pcm[i] = ADD_SAT16(pcm[i], pcm_celt[i]);
     }
        return celt_ret<0 ? celt_ret : audiosize;
 
index 3a39c87..875bb3c 100644 (file)
@@ -47,6 +47,10 @@ struct OpusDecoder {
     int          Fs;
 };
 
+inline short ADD_SAT16(a, b) {
+    int sum = a + b;
+    return sum > 32767 ? 32767 : sum < -32768 ? -32768 : (short)sum;
+}
 
 #endif /* OPUS_DECODER_H */