From a93f501cfa9848ac37dcbf9618c5e6ee039d1059 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <jean-marc.valin@octasic.com> Date: Thu, 3 Mar 2011 15:50:08 -0500 Subject: [PATCH] Fix PLC-based mode transition code. --- src/opus_decoder.c | 10 ++++++---- src/opus_encoder.c | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/opus_decoder.c b/src/opus_decoder.c index 1ebc3ea2e..4477ccbe3 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -84,7 +84,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, int mode; int transition=0; int start_band; - int redundancy; + int redundancy=0; /* Payloads of 1 (2 including ToC) or 0 trigger the PLC/DTX */ if (len<=2) @@ -189,21 +189,23 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, } start_band = 0; - if (mode == MODE_HYBRID) + if (mode == MODE_HYBRID && data != NULL) { /* Check if we have a redundant 0-8 kHz band */ redundancy = ec_dec_bit_logp(&dec, 12); if (!redundancy) start_band = 17; } - celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(start_band)); - if (redundancy) transition = 0; if (transition && mode != MODE_CELT_ONLY) opus_decode(st, NULL, 0, pcm_transition, IMAX(480, audiosize), 0); + /* MUST be after PLC */ + celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(start_band)); + + if (mode != MODE_SILK_ONLY) { int endband; diff --git a/src/opus_encoder.c b/src/opus_encoder.c index 2c2e589fc..4910fd998 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -157,7 +157,10 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size, /* Call SILK encoder for the low band */ nBytes = max_data_bytes-1; if (prefill) - SKP_Silk_SDK_Encode( st->silk_enc, &st->silk_mode, st->delay_buffer, ENCODER_BUFFER, NULL, 0, 1 ); + { + int zero=0; + SKP_Silk_SDK_Encode( st->silk_enc, &st->silk_mode, st->delay_buffer, ENCODER_BUFFER, NULL, &zero, 1 ); + } ret = SKP_Silk_SDK_Encode( st->silk_enc, &st->silk_mode, pcm, frame_size, &enc, &nBytes, 0 ); if( ret ) { -- GitLab