Module: libav
Branch: master
Commit: 09c274e067ee10271127f0278046b019dcd599cd

Author:    Dustin Brody <[email protected]>
Committer: Ronald S. Bultje <[email protected]>
Date:      Tue Aug 16 11:35:04 2011 -0400

mpeg12: propagate chunk decode errors and fix conditional indentation

Signed-off-by: Ronald S. Bultje <[email protected]>

---

 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{

_______________________________________________
libav-commits mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-commits

Reply via email to