mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-29 02:42:21 +00:00
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
This commit is contained in:
parent
b27bf2a7b4
commit
643fd8a198
@ -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 */
|
||||
|
@ -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]);
|
||||
|
Loading…
Reference in New Issue
Block a user