From 643fd8a198ddb67225f5edd503f8f151d13635a3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Reimar=20D=C3=B6ffinger?= Date: Sat, 4 Jul 2009 18:20:35 +0000 Subject: [PATCH] Add a got_picture flag to MJpegDecodeContext which indicates if its picture element is valid. Skip the code handling SOS and EOI if not, since it can not work without a valid AVPicture. This fixes a crash with mjpeg/smclockmjpeg.avi.1.0 from issue 1240 where the decoder returned an invalid AVPicture. Originally committed as revision 19342 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mjpegdec.c | 10 ++++++++++ libavcodec/mjpegdec.h | 1 + 2 files changed, 11 insertions(+) diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index 90b87f412b..b5f8281cc1 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -338,6 +338,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) } s->picture.pict_type= FF_I_TYPE; s->picture.key_frame= 1; + s->got_picture = 1; for(i=0; i<3; i++){ s->linesize[i]= s->picture.linesize[i] << s->interlaced; @@ -1249,6 +1250,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, int start_code; AVFrame *picture = data; + s->got_picture = 0; // picture from previous image can not be reused buf_ptr = buf; buf_end = buf + buf_size; while (buf_ptr < buf_end) { @@ -1410,6 +1412,10 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, if ((s->buggy_avid && !s->interlaced) || s->restart_interval) break; eoi_parser: + if (!s->got_picture) { + av_log(avctx, AV_LOG_WARNING, "Found EOI before any SOF, ignoring\n"); + break; + } { if (s->interlaced) { s->bottom_field ^= 1; @@ -1434,6 +1440,10 @@ eoi_parser: } break; case SOS: + if (!s->got_picture) { + av_log(avctx, AV_LOG_WARNING, "Can not process SOS before SOF, skipping\n"); + break; + } ff_mjpeg_decode_sos(s); /* buggy avid puts EOI every 10-20th frame */ /* if restart period is over process EOI */ diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h index 5a77759b3c..9ef8987db3 100644 --- a/libavcodec/mjpegdec.h +++ b/libavcodec/mjpegdec.h @@ -81,6 +81,7 @@ typedef struct MJpegDecodeContext { int quant_index[4]; /* quant table index for each component */ int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */ AVFrame picture; /* picture structure */ + int got_picture; ///< we found a SOF and picture is valid, too. int linesize[MAX_COMPONENTS]; ///< linesize << interlaced int8_t *qscale_table; DECLARE_ALIGNED_16(DCTELEM, block[64]); -- 2.11.0