Fixes FEC issues introduced in 7fcd66c
This left FEC disabled on the decoder side for all cases except concatenated packets. Also fixes a FEC bug in opus_demo (wrong output buffer size calculation).
This commit is contained in:
parent
f77410deb6
commit
1bf32bb5ac
2 changed files with 11 additions and 6 deletions
|
@ -781,17 +781,20 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data,
|
||||||
int duration_copy;
|
int duration_copy;
|
||||||
int ret;
|
int ret;
|
||||||
/* If no FEC can be present, run the PLC (recursive call) */
|
/* If no FEC can be present, run the PLC (recursive call) */
|
||||||
if (frame_size <= packet_frame_size || packet_mode == MODE_CELT_ONLY || st->mode == MODE_CELT_ONLY)
|
if (frame_size < packet_frame_size || packet_mode == MODE_CELT_ONLY || st->mode == MODE_CELT_ONLY)
|
||||||
return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL, soft_clip);
|
return opus_decode_native(st, NULL, 0, pcm, frame_size, 0, 0, NULL, soft_clip);
|
||||||
/* Otherwise, run the PLC on everything except the size for which we might have FEC */
|
/* Otherwise, run the PLC on everything except the size for which we might have FEC */
|
||||||
duration_copy = st->last_packet_duration;
|
duration_copy = st->last_packet_duration;
|
||||||
ret = opus_decode_native(st, NULL, 0, pcm, frame_size-packet_frame_size, 0, 0, NULL, soft_clip);
|
if (frame_size-packet_frame_size!=0)
|
||||||
if (ret<0)
|
|
||||||
{
|
{
|
||||||
st->last_packet_duration = duration_copy;
|
ret = opus_decode_native(st, NULL, 0, pcm, frame_size-packet_frame_size, 0, 0, NULL, soft_clip);
|
||||||
return ret;
|
if (ret<0)
|
||||||
|
{
|
||||||
|
st->last_packet_duration = duration_copy;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
celt_assert(ret==frame_size-packet_frame_size);
|
||||||
}
|
}
|
||||||
celt_assert(ret==frame_size-packet_frame_size);
|
|
||||||
/* Complete with FEC */
|
/* Complete with FEC */
|
||||||
st->mode = packet_mode;
|
st->mode = packet_mode;
|
||||||
st->bandwidth = packet_bandwidth;
|
st->bandwidth = packet_bandwidth;
|
||||||
|
|
|
@ -737,9 +737,11 @@ int main(int argc, char *argv[])
|
||||||
if( use_inbandfec ) {
|
if( use_inbandfec ) {
|
||||||
if( lost_prev ) {
|
if( lost_prev ) {
|
||||||
/* attempt to decode with in-band FEC from next packet */
|
/* attempt to decode with in-band FEC from next packet */
|
||||||
|
opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples));
|
||||||
output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 1);
|
output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 1);
|
||||||
} else {
|
} else {
|
||||||
/* regular decode */
|
/* regular decode */
|
||||||
|
output_samples = max_frame_size;
|
||||||
output_samples = opus_decode(dec, data[1-toggle], len[1-toggle], out, output_samples, 0);
|
output_samples = opus_decode(dec, data[1-toggle], len[1-toggle], out, output_samples, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue