diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c index 8a5ffb86a59b5..c41eb6ced6a3d 100644 --- a/libavcodec/wmalosslessdec.c +++ b/libavcodec/wmalosslessdec.c @@ -1043,6 +1043,9 @@ static int decode_frame(WmallDecodeCtx *s) if (get_bits1(gb)) { skip = get_bits(gb, av_log2(s->samples_per_frame * 2)); ff_dlog(s->avctx, "end skip: %i\n", skip); + s->frame->nb_samples -= skip; + if (s->frame->nb_samples <= 0) + return AVERROR_INVALIDDATA; } } @@ -1163,7 +1166,11 @@ static int decode_packet(AVCodecContext *avctx, void *data, int *got_frame_ptr, s->frame->nb_samples = 0; - if (s->packet_done || s->packet_loss) { + if (!buf_size && s->num_saved_bits > get_bits_count(&s->gb)) { + s->packet_done = 0; + if (!decode_frame(s)) + s->num_saved_bits = 0; + } else if (s->packet_done || s->packet_loss) { s->packet_done = 0; if (!buf_size) @@ -1264,7 +1271,7 @@ static int decode_packet(AVCodecContext *avctx, void *data, int *got_frame_ptr, s->packet_offset = get_bits_count(gb) & 7; - return (s->packet_loss) ? AVERROR_INVALIDDATA : get_bits_count(gb) >> 3; + return (s->packet_loss) ? AVERROR_INVALIDDATA : buf_size ? get_bits_count(gb) >> 3 : 0; } static void flush(AVCodecContext *avctx)