diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-04-23 10:41:28 +0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-04-23 10:41:28 +0400 |
commit | 1bf32bb5ac1b55c5c383024426bb0adad72a95a8 (patch) | |
tree | 6b2c91a2a5f4ab7c4bb8bbd85cf028d8fde7c0b2 | |
parent | f77410deb6922e8f557d6b53d9102763c4d28158 (diff) |
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).
-rw-r--r-- | src/opus_decoder.c | 15 | ||||
-rw-r--r-- | src/opus_demo.c | 2 |
2 files changed, 11 insertions, 6 deletions
diff --git a/src/opus_decoder.c b/src/opus_decoder.c index 5cae08ca..32b849b6 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -781,17 +781,20 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data, int duration_copy; int ret; /* 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); /* Otherwise, run the PLC on everything except the size for which we might have FEC */ 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 (ret<0) + if (frame_size-packet_frame_size!=0) { - st->last_packet_duration = duration_copy; - return ret; + ret = opus_decode_native(st, NULL, 0, pcm, frame_size-packet_frame_size, 0, 0, NULL, soft_clip); + 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 */ st->mode = packet_mode; st->bandwidth = packet_bandwidth; diff --git a/src/opus_demo.c b/src/opus_demo.c index a0acb0cd..4c644022 100644 --- a/src/opus_demo.c +++ b/src/opus_demo.c @@ -737,9 +737,11 @@ int main(int argc, char *argv[]) if( use_inbandfec ) { if( lost_prev ) { /* 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); } else { /* regular decode */ + output_samples = max_frame_size; output_samples = opus_decode(dec, data[1-toggle], len[1-toggle], out, output_samples, 0); } } else { |