Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-Marc Valin <jean-marc.valin@octasic.com>2011-02-01 02:25:47 +0300
committerJean-Marc Valin <jean-marc.valin@octasic.com>2011-02-01 02:25:47 +0300
commita70729c0b4b52fdfa2aeddf8dd931c22d9d40b96 (patch)
treef4920f10723cb7e6606b0cbf142bd94348c296ff /src
parent9ed526cc849c2f4dcebb6f43d95af674d75c419d (diff)
Koen's decoder updates
Diffstat (limited to 'src')
-rw-r--r--src/opus_decoder.c26
-rw-r--r--src/opus_decoder.h4
2 files changed, 19 insertions, 11 deletions
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;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;
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 */