diff options
author | Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> | 2011-02-16 08:41:04 +0300 |
---|---|---|
committer | Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> | 2011-02-16 08:41:04 +0300 |
commit | ca869b2ee46b294f9a8fecfefc9a67293bf97a57 (patch) | |
tree | 35483a7148cd8ee50bf3dd51dac511881abfda3d | |
parent | 73870719a2cceb4aeb5465eb2f5ee15f1c4b58c6 (diff) |
Makes sure there's a PLC-only region in the mode transition
-rw-r--r-- | src/opus_decoder.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/opus_decoder.c b/src/opus_decoder.c index e4f4d677..41671ebe 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -225,15 +225,17 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, if (transition) { - int tlength; + int plc_length, overlap; if (mode == MODE_CELT_ONLY) - tlength = IMIN(audiosize, 10+st->Fs/200); + plc_length = IMIN(audiosize, 10+st->Fs/200); else - tlength = IMIN(audiosize, 10+st->Fs/400); - for (i=0;i<audiosize;i++) - { - pcm[i] = (i*pcm[i] + (audiosize-i)*pcm_transition[i])/audiosize; - } + plc_length = IMIN(audiosize, 10+st->Fs/400); + for (i=0;i<plc_length;i++) + pcm[i] = pcm_transition[i]; + + overlap = IMIN(480, IMAX(0, audiosize-plc_length)); + for (i=0;i<overlap;i++) + pcm[plc_length+i] = (i*pcm[plc_length+i] + (overlap-i)*pcm_transition[plc_length+i])/overlap; } #if OPUS_TEST_RANGE_CODER_STATE st->rangeFinal = dec.rng; |