Fix 40/60ms zero-length frame decode failure
Decoding failed with OPUS_BAD_ARG on a packet containing a 40ms or 60ms zero-length frame when it followed a hybrid or MDCT frame. It now invokes the PLC for the duration of the packet as expected. Signed-off-by: Jean-Marc Valin <jmvalin@jmvalin.ca>
This commit is contained in:
parent
dbc83d316c
commit
b88a3ad396
1 changed files with 18 additions and 8 deletions
|
@ -257,23 +257,33 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data,
|
||||||
ec_dec_init(&dec,(unsigned char*)data,len);
|
ec_dec_init(&dec,(unsigned char*)data,len);
|
||||||
} else {
|
} else {
|
||||||
audiosize = frame_size;
|
audiosize = frame_size;
|
||||||
|
mode = st->prev_mode;
|
||||||
|
|
||||||
if (st->prev_mode == 0)
|
if (mode == 0)
|
||||||
{
|
{
|
||||||
/* If we haven't got any packet yet, all we can do is return zeros */
|
/* If we haven't got any packet yet, all we can do is return zeros */
|
||||||
for (i=0;i<audiosize*st->channels;i++)
|
for (i=0;i<audiosize*st->channels;i++)
|
||||||
pcm[i] = 0;
|
pcm[i] = 0;
|
||||||
RESTORE_STACK;
|
RESTORE_STACK;
|
||||||
return audiosize;
|
return audiosize;
|
||||||
} else {
|
|
||||||
mode = st->prev_mode;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For CELT/hybrid PLC of more than 20 ms, opus_decode_native() will do
|
if (mode != MODE_SILK_ONLY && audiosize > F20)
|
||||||
multiple calls */
|
{
|
||||||
if (data==NULL && mode != MODE_SILK_ONLY)
|
do {
|
||||||
frame_size = IMIN(frame_size, F20);
|
int ret = opus_decode_frame(st, NULL, 0, pcm, IMIN(audiosize, F20), 0);
|
||||||
|
if (ret<0)
|
||||||
|
{
|
||||||
|
RESTORE_STACK;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
pcm += ret*st->channels;
|
||||||
|
audiosize -= ret;
|
||||||
|
} while (audiosize > 0);
|
||||||
|
RESTORE_STACK;
|
||||||
|
return frame_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pcm_transition_silk_size = 0;
|
pcm_transition_silk_size = 0;
|
||||||
pcm_transition_celt_size = 0;
|
pcm_transition_celt_size = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue