---
Resend with more appropriate commit message, more checks, no formatting changes.
Vittorio


 libavcodec/h264.c |  155 ++++++++++++++++++++++++++++++++---------------------
 1 file changed, 94 insertions(+), 61 deletions(-)

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index c53ea13..75fad3d 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -456,7 +456,7 @@ int ff_h264_check_intra_pred_mode(H264Context *h, int mode, 
int is_chroma)
         av_log(h->avctx, AV_LOG_ERROR,
                "out of range intra chroma pred mode at %d %d\n",
                h->mb_x, h->mb_y);
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     if (!(h->top_samples_available & 0x8000)) {
@@ -465,7 +465,7 @@ int ff_h264_check_intra_pred_mode(H264Context *h, int mode, 
int is_chroma)
             av_log(h->avctx, AV_LOG_ERROR,
                    "top block unavailable for requested intra mode at %d %d\n",
                    h->mb_x, h->mb_y);
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
     }
 
@@ -481,7 +481,7 @@ int ff_h264_check_intra_pred_mode(H264Context *h, int mode, 
int is_chroma)
             av_log(h->avctx, AV_LOG_ERROR,
                    "left block unavailable for requested intra mode at %d 
%d\n",
                    h->mb_x, h->mb_y);
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
     }
 
@@ -1260,7 +1260,7 @@ int ff_h264_alloc_tables(H264Context *h)
 
 fail:
     free_tables(h, 1);
-    return -1;
+    return AVERROR(ENOMEM);
 }
 
 /**
@@ -1359,7 +1359,7 @@ static int context_init(H264Context *h)
     return 0;
 
 fail:
-    return -1; // free_tables will clean up for us
+    return AVERROR(ENOMEM); // free_tables will clean up for us
 }
 
 static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size,
@@ -1368,6 +1368,7 @@ static int decode_nal_units(H264Context *h, const uint8_t 
*buf, int buf_size,
 int ff_h264_decode_extradata(H264Context *h)
 {
     AVCodecContext *avctx = h->avctx;
+    int ret;
 
     if (avctx->extradata[0] == 1) {
         int i, cnt, nalsize;
@@ -1377,7 +1378,7 @@ int ff_h264_decode_extradata(H264Context *h)
 
         if (avctx->extradata_size < 7) {
             av_log(avctx, AV_LOG_ERROR, "avcC too short\n");
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
         /* sps and pps in the avcC always have length coded with 2 bytes,
          * so put a fake nal_length_size = 2 while parsing them */
@@ -1388,11 +1389,12 @@ int ff_h264_decode_extradata(H264Context *h)
         for (i = 0; i < cnt; i++) {
             nalsize = AV_RB16(p) + 2;
             if (p - avctx->extradata + nalsize > avctx->extradata_size)
-                return -1;
-            if (decode_nal_units(h, p, nalsize, 1) < 0) {
+                return AVERROR_INVALIDDATA;
+            ret = decode_nal_units(h, p, nalsize, 1);
+            if (ret < 0) {
                 av_log(avctx, AV_LOG_ERROR,
                        "Decoding sps %d from avcC failed\n", i);
-                return -1;
+                return ret;
             }
             p += nalsize;
         }
@@ -1402,10 +1404,11 @@ int ff_h264_decode_extradata(H264Context *h)
             nalsize = AV_RB16(p) + 2;
             if (p - avctx->extradata + nalsize > avctx->extradata_size)
                 return -1;
-            if (decode_nal_units(h, p, nalsize, 1) < 0) {
+            ret = decode_nal_units(h, p, nalsize, 1);
+            if (ret < 0) {
                 av_log(avctx, AV_LOG_ERROR,
                        "Decoding pps %d from avcC failed\n", i);
-                return -1;
+                return ret;
             }
             p += nalsize;
         }
@@ -1413,8 +1416,9 @@ int ff_h264_decode_extradata(H264Context *h)
         h->nal_length_size = (avctx->extradata[4] & 0x03) + 1;
     } else {
         h->is_avc = 0;
-        if (decode_nal_units(h, avctx->extradata, avctx->extradata_size, 1) < 
0)
-            return -1;
+        ret = decode_nal_units(h, avctx->extradata, avctx->extradata_size, 1);
+        if (ret < 0)
+            return ret;
     }
     return 0;
 }
@@ -1423,6 +1427,7 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
 {
     H264Context *h = avctx->priv_data;
     int i;
+    int ret;
 
     h->avctx = avctx;
 
@@ -1474,9 +1479,11 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
         avctx->ticks_per_frame = 2;
     }
 
-    if (avctx->extradata_size > 0 && avctx->extradata &&
-        ff_h264_decode_extradata(h))
-        return -1;
+    if (avctx->extradata_size > 0 && avctx->extradata) {
+       ret = ff_h264_decode_extradata(h);
+       if (ret < 0)
+           return ret;
+    }
 
     if (h->sps.bitstream_restriction_flag &&
         h->avctx->has_b_frames < h->sps.num_reorder_frames) {
@@ -1626,11 +1633,16 @@ static int decode_update_thread_context(AVCodecContext 
*dst,
         h->ref_index_pool = NULL;
         h->motion_val_pool = NULL;
 
-        if (ff_h264_alloc_tables(h) < 0) {
+        ret = ff_h264_alloc_tables(h);
+        if (ret < 0) {
             av_log(dst, AV_LOG_ERROR, "Could not allocate memory for h264\n");
-            return AVERROR(ENOMEM);
+            return ret;
+        }
+        ret = context_init(h);
+        if (ret < 0) {
+            av_log(dst, AV_LOG_ERROR, "context_init() failed.\n");
+            return ret;
         }
-        context_init(h);
 
         for (i = 0; i < 2; i++) {
             h->rbsp_buffer[i]      = NULL;
@@ -2760,6 +2772,7 @@ static int field_end(H264Context *h, int in_setup)
 {
     AVCodecContext *const avctx = h->avctx;
     int err = 0;
+    int ret;
     h->mb_y = 0;
 
     if (!in_setup && !h->droppable)
@@ -2782,7 +2795,8 @@ static int field_end(H264Context *h, int in_setup)
     }
 
     if (avctx->hwaccel) {
-        if (avctx->hwaccel->end_frame(avctx) < 0)
+        ret = avctx->hwaccel->end_frame(avctx);
+        if (ret < 0)
             av_log(avctx, AV_LOG_ERROR,
                    "hardware accelerator failed to decode picture\n");
     }
@@ -3015,7 +3029,7 @@ static int h264_slice_header_init(H264Context *h, int 
reinit)
     int nb_slices = (HAVE_THREADS &&
                      h->avctx->active_thread_type & FF_THREAD_SLICE) ?
                     h->avctx->thread_count : 1;
-    int i;
+    int i, ret;
 
     h->avctx->sample_aspect_ratio = h->sps.sar;
     av_assert0(h->avctx->sample_aspect_ratio.den);
@@ -3038,7 +3052,8 @@ static int h264_slice_header_init(H264Context *h, int 
reinit)
     h->prev_interlaced_frame = 1;
 
     init_scan_tables(h);
-    if (ff_h264_alloc_tables(h) < 0) {
+    ret = ff_h264_alloc_tables(h);
+    if (ret < 0) {
         av_log(h->avctx, AV_LOG_ERROR,
                "Could not allocate memory for h264\n");
         return AVERROR(ENOMEM);
@@ -3057,9 +3072,10 @@ static int h264_slice_header_init(H264Context *h, int 
reinit)
     h->slice_context_count = nb_slices;
 
     if (!HAVE_THREADS || !(h->avctx->active_thread_type & FF_THREAD_SLICE)) {
-        if (context_init(h) < 0) {
+        ret = context_init(h);
+        if (ret < 0) {
             av_log(h->avctx, AV_LOG_ERROR, "context_init() failed.\n");
-            return -1;
+            return ret;
         }
     } else {
         for (i = 1; i < h->slice_context_count; i++) {
@@ -3097,11 +3113,13 @@ static int h264_slice_header_init(H264Context *h, int 
reinit)
             c->context_initialized = 1;
         }
 
-        for (i = 0; i < h->slice_context_count; i++)
-            if (context_init(h->thread_context[i]) < 0) {
+        for (i = 0; i < h->slice_context_count; i++) {
+            ret = context_init(h->thread_context[i]);
+            if (ret < 0) {
                 av_log(h->avctx, AV_LOG_ERROR, "context_init() failed.\n");
-                return -1;
+                return ret;
             }
+        }
     }
 
     h->context_initialized = 1;
@@ -3128,6 +3146,7 @@ static int decode_slice_header(H264Context *h, 
H264Context *h0)
     int default_ref_list_done = 0;
     int last_pic_structure, last_pic_droppable;
     int needs_reinit = 0;
+    int field_pic_flag, bottom_field_flag;
 
     h->me.qpel_put = h->h264qpel.put_h264_qpel_pixels_tab;
     h->me.qpel_avg = h->h264qpel.avg_h264_qpel_pixels_tab;
@@ -3305,8 +3324,10 @@ static int decode_slice_header(H264Context *h, 
H264Context *h0)
     if (h->sps.frame_mbs_only_flag) {
         h->picture_structure = PICT_FRAME;
     } else {
-        if (get_bits1(&h->gb)) { // field_pic_flag
-            h->picture_structure = PICT_TOP_FIELD + get_bits1(&h->gb); // 
bottom_field_flag
+        field_pic_flag = get_bits1(&h->gb);
+        if (field_pic_flag) {
+            bottom_field_flag = get_bits1(&h->gb);
+            h->picture_structure = PICT_TOP_FIELD + bottom_field_flag;
         } else {
             h->picture_structure = PICT_FRAME;
             h->mb_aff_frame      = h->sps.mb_aff;
@@ -3404,19 +3425,20 @@ static int decode_slice_header(H264Context *h, 
H264Context *h0)
             Picture *prev = h->short_ref_count ? h->short_ref[0] : NULL;
             av_log(h->avctx, AV_LOG_DEBUG, "Frame num gap %d %d\n",
                    h->frame_num, h->prev_frame_num);
-            if (h264_frame_start(h) < 0)
-                return -1;
+            ret = h264_frame_start(h);
+            if (ret < 0)
+                return ret;
             h->prev_frame_num++;
             h->prev_frame_num %= 1 << h->sps.log2_max_frame_num;
             h->cur_pic_ptr->frame_num = h->prev_frame_num;
             ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 0);
             ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX, 1);
-            if ((ret = ff_generate_sliding_window_mmcos(h, 1)) < 0 &&
-                h->avctx->err_recognition & AV_EF_EXPLODE)
+            ret = ff_generate_sliding_window_mmcos(h, 1);
+            if (ret < 0 && h->avctx->err_recognition & AV_EF_EXPLODE)
+                return ret;
+            ret = ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index);
+            if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
                 return ret;
-            if (ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index) < 0 
&&
-                (h->avctx->err_recognition & AV_EF_EXPLODE))
-                return AVERROR_INVALIDDATA;
             /* Error concealment: if a ref is missing, copy the previous ref 
in its place.
              * FIXME: avoiding a memcpy would be nice, but ref handling makes 
many assumptions
              * about there being no actual duplicates.
@@ -3562,10 +3584,12 @@ static int decode_slice_header(H264Context *h, 
H264Context *h0)
     if (!default_ref_list_done)
         ff_h264_fill_default_ref_list(h);
 
-    if (h->slice_type_nos != AV_PICTURE_TYPE_I &&
-        ff_h264_decode_ref_pic_list_reordering(h) < 0) {
-        h->ref_count[1] = h->ref_count[0] = 0;
-        return -1;
+    if (h->slice_type_nos != AV_PICTURE_TYPE_I) {
+       ret = ff_h264_decode_ref_pic_list_reordering(h);
+       if (ret < 0) {
+           h->ref_count[1] = h->ref_count[0] = 0;
+           return ret;
+       }
     }
 
     if ((h->pps.weighted_pred && h->slice_type_nos == AV_PICTURE_TYPE_P) ||
@@ -3588,12 +3612,13 @@ static int decode_slice_header(H264Context *h, 
H264Context *h0)
     // or h->mmco, which will cause ref list mix-ups and decoding errors
     // further down the line. This may break decoding if the first slice is
     // corrupt, thus we only do this if frame-mt is enabled.
-    if (h->nal_ref_idc &&
-        ff_h264_decode_ref_pic_marking(h0, &h->gb,
+    if (h->nal_ref_idc) {
+        ret = ff_h264_decode_ref_pic_marking(h0, &h->gb,
                             !(h->avctx->active_thread_type & FF_THREAD_FRAME) 
||
-                            h0->current_slice == 0) < 0 &&
-        (h->avctx->err_recognition & AV_EF_EXPLODE))
-        return AVERROR_INVALIDDATA;
+                            h0->current_slice == 0);
+        if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
+            return AVERROR_INVALIDDATA;
+    }
 
     if (FRAME_MBAFF(h)) {
         ff_h264_fill_mbaff_ref_list(h);
@@ -4014,6 +4039,7 @@ static void loop_filter(H264Context *h, int start_x, int 
end_x)
     const int old_slice_type = h->slice_type;
     const int pixel_shift    = h->pixel_shift;
     const int block_h        = 16 >> h->chroma_y_shift;
+    int ret;
 
     if (h->deblocking_filter) {
         for (mb_x = start_x; mb_x < end_x; mb_x++)
@@ -4054,7 +4080,8 @@ static void loop_filter(H264Context *h, int start_x, int 
end_x)
                 }
                 backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize,
                                  uvlinesize, 0);
-                if (fill_filter_caches(h, mb_type))
+                ret = fill_filter_caches(h, mb_type);
+                if (ret)
                     continue;
                 h->chroma_qp[0] = get_chroma_qp(h, 0, 
h->cur_pic.qscale_table[mb_xy]);
                 h->chroma_qp[1] = get_chroma_qp(h, 1, 
h->cur_pic.qscale_table[mb_xy]);
@@ -4134,6 +4161,7 @@ static int decode_slice(struct AVCodecContext *avctx, 
void *arg)
 {
     H264Context *h = *(void **)arg;
     int lf_x_start = h->mb_x;
+    int ret, eos;
 
     h->mb_skip_run = -1;
 
@@ -4155,8 +4183,7 @@ static int decode_slice(struct AVCodecContext *avctx, 
void *arg)
 
         for (;;) {
             // START_TIMER
-            int ret = ff_h264_decode_mb_cabac(h);
-            int eos;
+            ret = ff_h264_decode_mb_cabac(h);
             // STOP_TIMER("decode_mb_cabac")
 
             if (ret >= 0)
@@ -4216,7 +4243,7 @@ static int decode_slice(struct AVCodecContext *avctx, 
void *arg)
         }
     } else {
         for (;;) {
-            int ret = ff_h264_decode_mb_cavlc(h);
+            ret = ff_h264_decode_mb_cavlc(h);
 
             if (ret >= 0)
                 ff_h264_hl_decode_mb(h);
@@ -4253,12 +4280,13 @@ static int decode_slice(struct AVCodecContext *avctx, 
void *arg)
                     tprintf(h->avctx, "slice end %d %d\n",
                             get_bits_count(&h->gb), h->gb.size_in_bits);
 
-                    if (get_bits_left(&h->gb) == 0) {
+                    ret = get_bits_left(&h->gb);
+                    if (ret == 0) {
                         er_add_slice(h, h->resync_mb_x, h->resync_mb_y,
                                         h->mb_x - 1, h->mb_y,
                                         ER_MB_END);
 
-                        return 0;
+                        return ret;
                     } else {
                         er_add_slice(h, h->resync_mb_x, h->resync_mb_y,
                                         h->mb_x - 1, h->mb_y,
@@ -4269,17 +4297,20 @@ static int decode_slice(struct AVCodecContext *avctx, 
void *arg)
                 }
             }
 
-            if (get_bits_left(&h->gb) <= 0 && h->mb_skip_run <= 0) {
-                tprintf(h->avctx, "slice end %d %d\n",
-                        get_bits_count(&h->gb), h->gb.size_in_bits);
-                if (get_bits_left(&h->gb) == 0) {
+            ret = get_bits_left(&h->gb);
+            if (ret <= 0 && h->mb_skip_run <= 0) {
+                ret = get_bits_count(&h->gb);
+                tprintf(h->avctx, "slice end %d %d\n", ret, 
h->gb.size_in_bits);
+
+                ret = get_bits_left(&h->gb);
+                if (ret == 0) {
                     er_add_slice(h, h->resync_mb_x, h->resync_mb_y,
                                     h->mb_x - 1, h->mb_y,
                                     ER_MB_END);
                     if (h->mb_x > lf_x_start)
                         loop_filter(h, lf_x_start, h->mb_x);
 
-                    return 0;
+                    return ret;
                 } else {
                     er_add_slice(h, h->resync_mb_x, h->resync_mb_y, h->mb_x,
                                     h->mb_y, ER_MB_ERROR);
@@ -4361,7 +4392,7 @@ static int decode_nal_units(H264Context *h, const uint8_t 
*buf, int buf_size,
             int bit_length;
             const uint8_t *ptr;
             int i, nalsize = 0;
-            int err;
+            int err, ret;
 
             if (buf_index >= next_avc) {
                 if (buf_index >= buf_size - h->nal_length_size)
@@ -4442,7 +4473,8 @@ static int decode_nal_units(H264Context *h, const uint8_t 
*buf, int buf_size,
                 case NAL_IDR_SLICE:
                 case NAL_SLICE:
                     init_get_bits(&hx->gb, ptr, bit_length);
-                    if (!get_ue_golomb(&hx->gb))
+                    ret = get_ue_golomb(&hx->gb);
+                    if (ret == 0)
                         nals_needed = nal_index;
                 }
                 continue;
@@ -4560,8 +4592,8 @@ again:
                 break;
             case NAL_SPS:
                 init_get_bits(&h->gb, ptr, bit_length);
-                if (ff_h264_decode_seq_parameter_set(h) < 0 &&
-                    h->is_avc && (nalsize != consumed) && nalsize) {
+                ret = ff_h264_decode_seq_parameter_set(h);
+                if (ret < 0 && h->is_avc && (nalsize != consumed) && nalsize) {
                     av_log(h->avctx, AV_LOG_DEBUG,
                            "SPS decoding failure, trying again with the 
complete NAL\n");
                     init_get_bits(&h->gb, buf + buf_index + 1 - consumed,
@@ -4569,7 +4601,8 @@ again:
                     ff_h264_decode_seq_parameter_set(h);
                 }
 
-                if (h264_set_parameter_from_sps(h) < 0) {
+                ret = h264_set_parameter_from_sps(h);
+                if (ret < 0) {
                     buf_index = -1;
                     goto end;
                 }
-- 
1.7.9.5

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

Reply via email to