diff options
author | Dustin Brody <libav@parsoma.net> | 2011-08-16 11:35:04 -0400 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2011-08-25 15:49:28 -0700 |
commit | 09c274e067ee10271127f0278046b019dcd599cd (patch) | |
tree | 3b946378619f78ac9eac3c95e265f92fd3886728 /libavcodec/mpeg12.c | |
parent | 0d802ac54e86aee587f5e9917a2eefbfecd73571 (diff) | |
download | ffmpeg-09c274e067ee10271127f0278046b019dcd599cd.tar.gz |
mpeg12: propagate chunk decode errors and fix conditional indentation
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
Diffstat (limited to 'libavcodec/mpeg12.c')
-rw-r--r-- | libavcodec/mpeg12.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index 91eb3f5ece..4b20610cab 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -1911,6 +1911,8 @@ static int slice_decode_thread(AVCodecContext *c, void *arg){ //av_log(c, AV_LOG_DEBUG, "ret:%d resync:%d/%d mb:%d/%d ts:%d/%d ec:%d\n", //ret, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, s->start_mb_y, s->end_mb_y, s->error_count); if(ret < 0){ + if (c->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; if(s->resync_mb_x>=0 && s->resync_mb_y>=0) ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); }else{ @@ -2265,8 +2267,10 @@ static int mpeg_decode_frame(AVCodecContext *avctx, s->slice_count= 0; - if(avctx->extradata && !avctx->frame_number) - decode_chunks(avctx, picture, data_size, avctx->extradata, avctx->extradata_size); + if(avctx->extradata && !avctx->frame_number && + decode_chunks(avctx, picture, data_size, avctx->extradata, avctx->extradata_size) < 0 && + avctx->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; return decode_chunks(avctx, picture, data_size, buf, buf_size); } @@ -2318,11 +2322,13 @@ static int decode_chunks(AVCodecContext *avctx, switch(start_code) { case SEQ_START_CODE: if(last_code == 0){ - mpeg1_decode_sequence(avctx, buf_ptr, - input_size); + mpeg1_decode_sequence(avctx, buf_ptr, + input_size); s->sync=1; }else{ av_log(avctx, AV_LOG_ERROR, "ignoring SEQ_START_CODE after %X\n", last_code); + if (avctx->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; } break; @@ -2351,6 +2357,8 @@ static int decode_chunks(AVCodecContext *avctx, last_code= PICTURE_START_CODE; }else{ av_log(avctx, AV_LOG_ERROR, "ignoring pic after %X\n", last_code); + if (avctx->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; } break; case EXT_START_CODE: @@ -2362,6 +2370,8 @@ static int decode_chunks(AVCodecContext *avctx, mpeg_decode_sequence_extension(s); }else{ av_log(avctx, AV_LOG_ERROR, "ignoring seq ext after %X\n", last_code); + if (avctx->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; } break; case 0x2: @@ -2378,6 +2388,8 @@ static int decode_chunks(AVCodecContext *avctx, mpeg_decode_picture_coding_extension(s); }else{ av_log(avctx, AV_LOG_ERROR, "ignoring pic cod ext after %X\n", last_code); + if (avctx->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; } break; } @@ -2394,6 +2406,8 @@ static int decode_chunks(AVCodecContext *avctx, s->sync=1; }else{ av_log(avctx, AV_LOG_ERROR, "ignoring GOP_START_CODE after %X\n", last_code); + if (avctx->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; } break; default: @@ -2438,6 +2452,8 @@ static int decode_chunks(AVCodecContext *avctx, if(!s2->pict_type){ av_log(avctx, AV_LOG_ERROR, "Missing picture start code\n"); + if (avctx->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; break; } @@ -2448,6 +2464,8 @@ static int decode_chunks(AVCodecContext *avctx, } if(!s2->current_picture_ptr){ av_log(avctx, AV_LOG_ERROR, "current_picture not initialized\n"); + if (avctx->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; return -1; } @@ -2476,6 +2494,8 @@ static int decode_chunks(AVCodecContext *avctx, emms_c(); if(ret < 0){ + if (avctx->error_recognition >= FF_ER_EXPLODE) + return AVERROR_INVALIDDATA; if(s2->resync_mb_x>=0 && s2->resync_mb_y>=0) ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x, s2->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); }else{ |