Commit 643fd8a1 authored by Reimar Döffinger's avatar Reimar Döffinger

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
parent b27bf2a7
...@@ -338,6 +338,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) ...@@ -338,6 +338,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
} }
s->picture.pict_type= FF_I_TYPE; s->picture.pict_type= FF_I_TYPE;
s->picture.key_frame= 1; s->picture.key_frame= 1;
s->got_picture = 1;
for(i=0; i<3; i++){ for(i=0; i<3; i++){
s->linesize[i]= s->picture.linesize[i] << s->interlaced; s->linesize[i]= s->picture.linesize[i] << s->interlaced;
...@@ -1249,6 +1250,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, ...@@ -1249,6 +1250,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx,
int start_code; int start_code;
AVFrame *picture = data; AVFrame *picture = data;
s->got_picture = 0; // picture from previous image can not be reused
buf_ptr = buf; buf_ptr = buf;
buf_end = buf + buf_size; buf_end = buf + buf_size;
while (buf_ptr < buf_end) { while (buf_ptr < buf_end) {
...@@ -1410,6 +1412,10 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, ...@@ -1410,6 +1412,10 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx,
if ((s->buggy_avid && !s->interlaced) || s->restart_interval) if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
break; break;
eoi_parser: eoi_parser:
if (!s->got_picture) {
av_log(avctx, AV_LOG_WARNING, "Found EOI before any SOF, ignoring\n");
break;
}
{ {
if (s->interlaced) { if (s->interlaced) {
s->bottom_field ^= 1; s->bottom_field ^= 1;
...@@ -1434,6 +1440,10 @@ eoi_parser: ...@@ -1434,6 +1440,10 @@ eoi_parser:
} }
break; break;
case SOS: 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); ff_mjpeg_decode_sos(s);
/* buggy avid puts EOI every 10-20th frame */ /* buggy avid puts EOI every 10-20th frame */
/* if restart period is over process EOI */ /* if restart period is over process EOI */
......
...@@ -81,6 +81,7 @@ typedef struct MJpegDecodeContext { ...@@ -81,6 +81,7 @@ typedef struct MJpegDecodeContext {
int quant_index[4]; /* quant table index for each component */ 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 ?) */ int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
AVFrame picture; /* picture structure */ AVFrame picture; /* picture structure */
int got_picture; ///< we found a SOF and picture is valid, too.
int linesize[MAX_COMPONENTS]; ///< linesize << interlaced int linesize[MAX_COMPONENTS]; ///< linesize << interlaced
int8_t *qscale_table; int8_t *qscale_table;
DECLARE_ALIGNED_16(DCTELEM, block[64]); DECLARE_ALIGNED_16(DCTELEM, block[64]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment