diff options
author | Clément Bœsch <u@pkh.me> | 2016-07-27 17:28:00 +0200 |
---|---|---|
committer | Clément Bœsch <u@pkh.me> | 2016-07-27 17:31:18 +0200 |
commit | 87d1f820591b87bec452f33f451dee4db142ee9a (patch) | |
tree | 80a2aae11b6c7e7455218d8f402bd8ac5bf4b0f2 /libavcodec/h264_slice.c | |
parent | f8ce1e828299695997b832cb8d2d6b0d8f1f53ee (diff) | |
parent | f966498e433fead2f5e6b5b66fad2ac062146d22 (diff) | |
download | ffmpeg-87d1f820591b87bec452f33f451dee4db142ee9a.tar.gz |
Merge commit 'f966498e433fead2f5e6b5b66fad2ac062146d22'
* commit 'f966498e433fead2f5e6b5b66fad2ac062146d22':
h264: decode the poc values from the slice header into the per-slice context
Merged-by: Clément Bœsch <u@pkh.me>
Diffstat (limited to 'libavcodec/h264_slice.c')
-rw-r--r-- | libavcodec/h264_slice.c | 46 |
1 files changed, 18 insertions, 28 deletions
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index f68dfc7ba8..74e8118fa5 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1150,6 +1150,12 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl, h->droppable = (nal->ref_idc == 0); h->picture_structure = sl->picture_structure; + h->poc.frame_num = sl->frame_num; + h->poc.poc_lsb = sl->poc_lsb; + h->poc.delta_poc_bottom = sl->delta_poc_bottom; + h->poc.delta_poc[0] = sl->delta_poc[0]; + h->poc.delta_poc[1] = sl->delta_poc[1]; + /* Shorten frame num gaps so we don't have to allocate reference * frames just to throw them away */ if (h->poc.frame_num != h->poc.prev_frame_num) { @@ -1340,7 +1346,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, unsigned int slice_type, tmp, i; int field_pic_flag, bottom_field_flag; int first_slice = sl == h->slice_ctx && !h->current_slice; - int frame_num, picture_structure; + int picture_structure; if (first_slice) av_assert0(!h->setup_finished); @@ -1390,18 +1396,15 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, } sps = (const SPS*)h->ps.sps_list[pps->sps_id]->data; - frame_num = get_bits(&sl->gb, sps->log2_max_frame_num); + sl->frame_num = get_bits(&sl->gb, sps->log2_max_frame_num); if (!first_slice) { - if (h->poc.frame_num != frame_num) { + if (h->poc.frame_num != sl->frame_num) { av_log(h->avctx, AV_LOG_ERROR, "Frame num change from %d to %d\n", - h->poc.frame_num, frame_num); + h->poc.frame_num, sl->frame_num); return AVERROR_INVALIDDATA; } } - if (!h->setup_finished) - h->poc.frame_num = frame_num; - sl->mb_mbaff = 0; if (sps->frame_mbs_only_flag) { @@ -1423,10 +1426,10 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, sl->mb_field_decoding_flag = picture_structure != PICT_FRAME; if (picture_structure == PICT_FRAME) { - h->curr_pic_num = h->poc.frame_num; + h->curr_pic_num = sl->frame_num; h->max_pic_num = 1 << sps->log2_max_frame_num; } else { - h->curr_pic_num = 2 * h->poc.frame_num + 1; + h->curr_pic_num = 2 * sl->frame_num + 1; h->max_pic_num = 1 << (sps->log2_max_frame_num + 1); } @@ -1434,30 +1437,17 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, get_ue_golomb_long(&sl->gb); /* idr_pic_id */ if (sps->poc_type == 0) { - int poc_lsb = get_bits(&sl->gb, sps->log2_max_poc_lsb); + sl->poc_lsb = get_bits(&sl->gb, sps->log2_max_poc_lsb); - if (!h->setup_finished) - h->poc.poc_lsb = poc_lsb; - - if (pps->pic_order_present == 1 && picture_structure == PICT_FRAME) { - int delta_poc_bottom = get_se_golomb(&sl->gb); - if (!h->setup_finished) - h->poc.delta_poc_bottom = delta_poc_bottom; - } + if (pps->pic_order_present == 1 && picture_structure == PICT_FRAME) + sl->delta_poc_bottom = get_se_golomb(&sl->gb); } if (sps->poc_type == 1 && !sps->delta_pic_order_always_zero_flag) { - int delta_poc = get_se_golomb(&sl->gb); + sl->delta_poc[0] = get_se_golomb(&sl->gb); - if (!h->setup_finished) - h->poc.delta_poc[0] = delta_poc; - - if (pps->pic_order_present == 1 && picture_structure == PICT_FRAME) { - delta_poc = get_se_golomb(&sl->gb); - - if (!h->setup_finished) - h->poc.delta_poc[1] = delta_poc; - } + if (pps->pic_order_present == 1 && picture_structure == PICT_FRAME) + sl->delta_poc[1] = get_se_golomb(&sl->gb); } if (pps->redundant_pic_cnt_present) |