---
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