ref: 57ddf37c83eff80a5064c38fde57b6cc6ad1e739
parent: 63855aff731dcf58875c159dc2fa7463a444d617
author: Mark Harris <[email protected]>
date: Sun Jun 26 09:40:45 EDT 2022
Fix 8101b33 to decode ignored redundancy Even if the redundancy is ignored, the final range from the decoder is needed for testing. Reviewed by Timothy B. Terriberry.
--- a/src/opus_decoder.c
+++ b/src/opus_decoder.c
@@ -455,10 +455,6 @@
{
transition = 0;
pcm_transition_silk_size=ALLOC_NONE;
- /* don't use stale CELT decoder to decode second redundancy frame if
- the first redundancy frame for a transition from SILK was lost */
- if (celt_to_silk && st->prev_mode == MODE_SILK_ONLY && !st->prev_redundancy)
- redundancy = 0;
}
ALLOC(pcm_transition_silk, pcm_transition_silk_size, opus_val16);
@@ -504,6 +500,11 @@
/* 5 ms redundant frame for CELT->SILK*/
if (redundancy && celt_to_silk)
{
+ /* If the previous frame did not use CELT (the first redundancy frame in
+ a transition from SILK may have been lost) then the CELT decoder is
+ stale at this point and the redundancy audio is not useful, however
+ the final range is still needed (for testing), so the redundancy is
+ always decoded but the decoded audio may not be used */
MUST_SUCCEED(celt_decoder_ctl(celt_dec, CELT_SET_START_BAND(0)));
celt_decode_with_ec(celt_dec, data+len, redundancy_bytes,
redundant_audio, F5, NULL, 0);
@@ -566,7 +567,10 @@
smooth_fade(pcm+st->channels*(frame_size-F2_5), redundant_audio+st->channels*F2_5,
pcm+st->channels*(frame_size-F2_5), F2_5, st->channels, window, st->Fs);
}
- if (redundancy && celt_to_silk)
+ /* 5ms redundant frame for CELT->SILK; ignore if the previous frame did not
+ use CELT (the first redundancy frame in a transition from SILK may have
+ been lost) */
+ if (redundancy && celt_to_silk && (st->prev_mode != MODE_SILK_ONLY || st->prev_redundancy))
{
for (c=0;c<st->channels;c++)
{