Fixes a crash in silk prefill (used for mode switching)

Also fixes two stereo mode switching issues.
This commit is contained in:
Jean-Marc Valin 2011-05-27 10:03:58 -04:00
parent 8019e4e32e
commit 047f0256c8
2 changed files with 10 additions and 6 deletions

View file

@ -304,6 +304,7 @@ SKP_int silk_Encode(
/* Total target bits for packet */ /* Total target bits for packet */
nBits = SKP_DIV32_16( SKP_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 ); nBits = SKP_DIV32_16( SKP_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 );
/* Subtract half of the bits already used */ /* Subtract half of the bits already used */
if (!prefillFlag)
nBits -= ec_tell( psRangeEnc ) >> 1; nBits -= ec_tell( psRangeEnc ) >> 1;
/* Divide by number of uncoded frames left in packet */ /* Divide by number of uncoded frames left in packet */
nBits = SKP_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket - psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ); nBits = SKP_DIV32_16( nBits, psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket - psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded );
@ -323,6 +324,7 @@ SKP_int silk_Encode(
silk_stereo_LR_to_MS( &psEnc->sStereo, psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->state_Fxx[ 1 ].sCmn.inputBuf, silk_stereo_LR_to_MS( &psEnc->sStereo, psEnc->state_Fxx[ 0 ].sCmn.inputBuf, psEnc->state_Fxx[ 1 ].sCmn.inputBuf,
psEnc->sStereo.ix[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ], MStargetRates_bps, TargetRate_bps, psEnc->sStereo.ix[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ], MStargetRates_bps, TargetRate_bps,
psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, psEnc->state_Fxx[ 0 ].sCmn.frame_length ); psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8, psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, psEnc->state_Fxx[ 0 ].sCmn.frame_length );
if (!prefillFlag)
silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.ix[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] ); silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.ix[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] );
} else { } else {
/* Buffering */ /* Buffering */
@ -361,6 +363,7 @@ SKP_int silk_Encode(
flags = SKP_LSHIFT( flags, 1 ); flags = SKP_LSHIFT( flags, 1 );
flags |= psEnc->state_Fxx[ n ].sCmn.LBRR_flag; flags |= psEnc->state_Fxx[ n ].sCmn.LBRR_flag;
} }
if (!prefillFlag)
ec_enc_patch_initial_bits( psRangeEnc, flags, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal ); ec_enc_patch_initial_bits( psRangeEnc, flags, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal );
/* Return zero bytes if all channels DTXed */ /* Return zero bytes if all channels DTXed */

View file

@ -347,17 +347,18 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data,
for (c=0;c<st->channels;c++) for (c=0;c<st->channels;c++)
{ {
for (i=0;i<F2_5;i++) for (i=0;i<F2_5;i++)
pcm[st->channels*i+c] = redundant_audio[st->channels*i]; pcm[st->channels*i+c] = redundant_audio[st->channels*i+c];
} }
smooth_fade(redundant_audio+st->channels*F2_5, pcm+st->channels*F2_5, smooth_fade(redundant_audio+st->channels*F2_5, pcm+st->channels*F2_5,
pcm+st->channels*F2_5, F2_5, st->channels, window, st->Fs); pcm+st->channels*F2_5, F2_5, st->channels, window, st->Fs);
} }
if (transition) if (transition)
{ {
for (i=0;i<F2_5;i++) for (i=0;i<st->channels*F2_5;i++)
pcm[i] = pcm_transition[i]; pcm[i] = pcm_transition[i];
if (audiosize >= F5) if (audiosize >= F5)
smooth_fade(pcm_transition+F2_5, pcm+F2_5, pcm+F2_5, F2_5, smooth_fade(pcm_transition+st->channels*F2_5, pcm+st->channels*F2_5,
pcm+st->channels*F2_5, F2_5,
st->channels, window, st->Fs); st->channels, window, st->Fs);
} }
#if OPUS_TEST_RANGE_CODER_STATE #if OPUS_TEST_RANGE_CODER_STATE