diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-09-30 23:11:43 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-10-03 16:03:32 -0400 |
commit | 45e5d0c3ac0d144cf4dc7fb3d852ee05814bbd2b (patch) | |
tree | b86e440f7dbf5250c2be55eb5eb552c01ebd01e1 /libavcodec/libspeexdec.c | |
parent | 908e22b93a9532948d62e43b700d5c91ea37db2a (diff) | |
download | ffmpeg-45e5d0c3ac0d144cf4dc7fb3d852ee05814bbd2b.tar.gz |
libspeexdec: properly handle DTX for multiple frames-per-packet
Diffstat (limited to 'libavcodec/libspeexdec.c')
-rw-r--r-- | libavcodec/libspeexdec.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c index 1916fea2d1..760bfe2e49 100644 --- a/libavcodec/libspeexdec.c +++ b/libavcodec/libspeexdec.c @@ -119,10 +119,12 @@ static int libspeex_decode_frame(AVCodecContext *avctx, void *data, } output = (int16_t *)s->frame.data[0]; - /* if there is not enough data left for the smallest possible frame, - reset the libspeex buffer using the current packet, otherwise ignore - the current packet and keep decoding frames from the libspeex buffer. */ - if (speex_bits_remaining(&s->bits) < 43) { + /* if there is not enough data left for the smallest possible frame or the + next 5 bits are a terminator code, reset the libspeex buffer using the + current packet, otherwise ignore the current packet and keep decoding + frames from the libspeex buffer. */ + if (speex_bits_remaining(&s->bits) < 5 || + speex_bits_peek_unsigned(&s->bits, 5) == 0x1F) { /* check for flush packet */ if (!buf || !buf_size) { *got_frame_ptr = 0; |