diff --git a/libavcodec/dv.c b/libavcodec/dv.c index aaab0ab4c4..3271490682 100644 --- a/libavcodec/dv.c +++ b/libavcodec/dv.c @@ -494,7 +494,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, UINT8 *buf, int buf_size) { DVVideoDecodeContext *s = avctx->priv_data; - int sct, dsf, apt, ds, nb_dif_segs, vs, size, width, height, i; + int sct, dsf, apt, ds, nb_dif_segs, vs, size, width, height, i, packet_size; UINT8 *buf_ptr; const UINT16 *mb_pos_ptr; AVPicture *picture; @@ -531,17 +531,18 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, /* init size */ width = 720; if (dsf) { - if (buf_size != PAL_FRAME_SIZE) - return -1; + packet_size = PAL_FRAME_SIZE; height = 576; nb_dif_segs = 12; } else { - if (buf_size != NTSC_FRAME_SIZE) - return -1; + packet_size = NTSC_FRAME_SIZE; height = 480; nb_dif_segs = 10; } - + /* NOTE: we only accept several full frames */ + if (buf_size < packet_size) + return -1; + /* XXX: is it correct to assume that 420 is always used in PAL mode ? */ s->sampling_411 = !dsf; @@ -604,8 +605,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, picture->data[i] = s->current_picture[i]; picture->linesize[i] = s->linesize[i]; } - - return buf_size; + return packet_size; } static int dvvideo_decode_end(AVCodecContext *avctx)