X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpc8.c;h=3be2f79a5a1a79d20d52bbc29fc8699f61e4d145;hb=6dbb64fdccafe846aaec75d3784f7ad49d8af5df;hp=80e0e9e68df896a9d8e49b38afa0e88175ff729d;hpb=75bf51ef87f4cb5afca701b33bf22339d8a4db24;p=ffmpeg diff --git a/libavcodec/mpc8.c b/libavcodec/mpc8.c index 80e0e9e68df..3be2f79a5a1 100644 --- a/libavcodec/mpc8.c +++ b/libavcodec/mpc8.c @@ -250,11 +250,6 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data, int maxband, keyframe; int last[2]; - /* get output buffer */ - frame->nb_samples = MPC_FRAME_SIZE; - if ((res = ff_get_buffer(avctx, frame, 0)) < 0) - return res; - keyframe = c->cur_frame == 0; if(keyframe){ @@ -273,6 +268,11 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data, if(maxband > 32) maxband -= 33; } + if (get_bits_left(gb) < 0) { + *got_frame_ptr = 0; + return buf_size; + } + if(maxband > c->maxbands + 1) { av_log(avctx, AV_LOG_ERROR, "maxband %d too large\n",maxband); return AVERROR_INVALIDDATA; @@ -410,6 +410,10 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data, } } + frame->nb_samples = MPC_FRAME_SIZE; + if ((res = ff_get_buffer(avctx, frame, 0)) < 0) + return res; + ff_mpc_dequantize_and_synth(c, maxband - 1, (int16_t **)frame->extended_data, avctx->channels); @@ -419,11 +423,11 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data, c->last_bits_used = get_bits_count(gb); if(c->cur_frame >= c->frames) c->cur_frame = 0; - if(c->cur_frame == 0 && get_bits_left(gb) < 8) {// we have only padding left - c->last_bits_used = buf_size << 3; - } else if (get_bits_left(gb) < 0) { + if (get_bits_left(gb) < 0) { av_log(avctx, AV_LOG_ERROR, "Overread %d\n", -get_bits_left(gb)); c->last_bits_used = buf_size << 3; + } else if (c->cur_frame == 0 && get_bits_left(gb) < 8) {// we have only padding left + c->last_bits_used = buf_size << 3; } *got_frame_ptr = 1;