[FFmpeg-cvslog] mpeg12: propagate chunk decode errors and fix conditional indentation
Dustin Brody
git at videolan.org
Fri Aug 26 01:53:30 CEST 2011
ffmpeg | branch: master | Dustin Brody <libav at parsoma.net> | Tue Aug 16 11:35:04 2011 -0400| [09c274e067ee10271127f0278046b019dcd599cd] | committer: Ronald S. Bultje
mpeg12: propagate chunk decode errors and fix conditional indentation
Signed-off-by: Ronald S. Bultje <rsbultje at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=09c274e067ee10271127f0278046b019dcd599cd
---
libavcodec/mpeg12.c | 28 ++++++++++++++++++++++++----
1 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index 91eb3f5..4b20610 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{
More information about the ffmpeg-cvslog
mailing list