From a70729c0b4b52fdfa2aeddf8dd931c22d9d40b96 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Mon, 31 Jan 2011 18:25:47 -0500 Subject: Koen's decoder updates --- src/opus_decoder.c | 26 +++++++++++++++----------- src/opus_decoder.h | 4 ++++ 2 files changed, 19 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/opus_decoder.c b/src/opus_decoder.c index fffd2283..f8a1f979 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -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;ichannels;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;ichannels;i++) - pcm[i] += pcm_celt[i]; + pcm[i] = ADD_SAT16(pcm[i], pcm_celt[i]); } return celt_ret<0 ? celt_ret : audiosize; diff --git a/src/opus_decoder.h b/src/opus_decoder.h index 3a39c872..875bb3c2 100644 --- a/src/opus_decoder.h +++ b/src/opus_decoder.h @@ -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 */ -- cgit v1.2.3