[FFmpeg-devel] [PATCH] lavc/h263dec: return or propagate proper error codes

Stefano Sabatini stefasab at gmail.com
Mon Sep 10 18:15:40 CEST 2012


Also add a missing log.
---
 libavcodec/h263dec.c |   41 +++++++++++++++++++++++------------------
 1 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 6c01e00..f3d6d9d 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -47,6 +47,7 @@
 av_cold int ff_h263_decode_init(AVCodecContext *avctx)
 {
     MpegEncContext *s = avctx->priv_data;
+    int ret;
 
     s->avctx = avctx;
     s->out_format = FMT_H263;
@@ -110,15 +111,17 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
         s->h263_flv = 1;
         break;
     default:
-        return -1;
+        av_log(avctx, AV_LOG_ERROR, "Invalid codec ID '%s'\n",
+               avcodec_get_name(avctx->codec_id));
+        return AVERROR(EINVAL);
     }
     s->codec_id= avctx->codec->id;
     avctx->hwaccel= ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
 
     /* for h263, we allocate the images after having read the header */
     if (avctx->codec->id != AV_CODEC_ID_H263 && avctx->codec->id != AV_CODEC_ID_H263P && avctx->codec->id != AV_CODEC_ID_MPEG4)
-        if (ff_MPV_common_init(s) < 0)
-            return -1;
+        if ((ret = ff_MPV_common_init(s)) < 0)
+            return ret;
 
         ff_h263_decode_init_vlc(s);
 
@@ -157,6 +160,8 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size){
 static int decode_slice(MpegEncContext *s){
     const int part_mask= s->partitioned_frame ? (ER_AC_END|ER_AC_ERROR) : 0x7F;
     const int mb_size= 16>>s->avctx->lowres;
+    int ret;
+
     s->last_resync_gb= s->gb;
     s->first_slice_line= 1;
 
@@ -176,8 +181,8 @@ static int decode_slice(MpegEncContext *s){
         const int qscale= s->qscale;
 
         if(CONFIG_MPEG4_DECODER && s->codec_id==AV_CODEC_ID_MPEG4){
-            if(ff_mpeg4_decode_partitions(s) < 0)
-                return -1;
+            if ((ret = ff_mpeg4_decode_partitions(s)) < 0)
+                return ret;
         }
 
         /* restore variables which were modified */
@@ -246,12 +251,12 @@ static int decode_slice(MpegEncContext *s){
                 }else if(ret==SLICE_NOEND){
                     av_log(s->avctx, AV_LOG_ERROR, "Slice mismatch at MB: %d\n", xy);
                     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x+1, s->mb_y, ER_MB_END&part_mask);
-                    return -1;
+                    return AVERROR_INVALIDDATA;
                 }
                 av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy);
                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR&part_mask);
 
-                return -1;
+                return AVERROR_INVALIDDATA;
             }
 
             ff_MPV_decode_mb(s, s->block);
@@ -339,7 +344,7 @@ static int decode_slice(MpegEncContext *s){
 
     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_END&part_mask);
 
-    return -1;
+    return AVERROR_INVALIDDATA;
 }
 
 int ff_h263_decode_frame(AVCodecContext *avctx,
@@ -382,7 +387,7 @@ uint64_t time= rdtsc();
             next= ff_h263_find_frame_end(&s->parse_context, buf, buf_size);
         }else{
             av_log(s->avctx, AV_LOG_ERROR, "this codec does not support truncated bitstreams\n");
-            return -1;
+            return AVERROR(EINVAL);
         }
 
         if( ff_combine_frame(&s->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 )
@@ -411,8 +416,8 @@ retry:
     s->bitstream_buffer_size=0;
 
     if (!s->context_initialized) {
-        if (ff_MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix
-            return -1;
+        if ((ret = ff_MPV_common_init(s)) < 0) //we need the idct permutaton for reading a custom matrix
+            return ret;
     }
 
     /* We need to set current_picture_ptr before reading the header,
@@ -458,7 +463,7 @@ retry:
     /* skip if the header was thrashed */
     if (ret < 0){
         av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
-        return -1;
+        return ret;
     } else if ((s->width  != avctx->coded_width  ||
                 s->height != avctx->coded_height ||
                 (s->width  + 15) >> 4 != s->mb_width ||
@@ -651,8 +656,8 @@ retry:
         s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab;
     }
 
-    if(ff_MPV_frame_start(s, avctx) < 0)
-        return -1;
+    if ((ret = ff_MPV_frame_start(s, avctx)) < 0)
+        return ret;
 
     if (!s->divx_packed) ff_thread_finish_setup(avctx);
 
@@ -662,8 +667,8 @@ retry:
     }
 
     if (avctx->hwaccel) {
-        if (avctx->hwaccel->start_frame(avctx, s->gb.buffer, s->gb.buffer_end - s->gb.buffer) < 0)
-            return -1;
+        if ((ret = avctx->hwaccel->start_frame(avctx, s->gb.buffer, s->gb.buffer_end - s->gb.buffer)) < 0)
+            return ret;
     }
 
     ff_er_frame_start(s);
@@ -737,8 +742,8 @@ intrax8_decoded:
     ff_er_frame_end(s);
 
     if (avctx->hwaccel) {
-        if (avctx->hwaccel->end_frame(avctx) < 0)
-            return -1;
+        if ((ret = avctx->hwaccel->end_frame(avctx)) < 0)
+            return ret;
     }
 
     ff_MPV_frame_end(s);
-- 
1.7.5.4



More information about the ffmpeg-devel mailing list