diff options
author | Anton Khirnov <anton@khirnov.net> | 2016-05-17 15:35:50 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2016-06-21 11:08:56 +0200 |
commit | f966498e433fead2f5e6b5b66fad2ac062146d22 (patch) | |
tree | 212757e848db68db4b7fa516d52befa2864cd7fe | |
parent | 54dd9b1cdd9e54f1ee39ae25af0324f8aba2831b (diff) | |
download | ffmpeg-f966498e433fead2f5e6b5b66fad2ac062146d22.tar.gz |
h264: decode the poc values from the slice header into the per-slice context
Copy them into the decoder-global context in field_start(). This avoids
modifying the decoder-global context during bitstream parsing.
-rw-r--r-- | libavcodec/h264.h | 5 | ||||
-rw-r--r-- | libavcodec/h264_slice.c | 41 |
2 files changed, 21 insertions, 25 deletions
diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 6cd2506e6f..4a109e119c 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -446,6 +446,11 @@ typedef struct H264SliceContext { MMCO mmco[MAX_MMCO_COUNT]; int nb_mmco; int explicit_ref_marking; + + int frame_num; + int poc_lsb; + int delta_poc_bottom; + int delta_poc[2]; } H264SliceContext; /** diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 4b0adab110..be44e66b3e 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1009,6 +1009,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) { @@ -1175,7 +1181,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, int ret; unsigned int slice_type, tmp, i; int field_pic_flag, bottom_field_flag; - int frame_num, droppable, picture_structure; + int droppable, picture_structure; sl->first_mb_addr = get_ue_golomb(&sl->gb); @@ -1222,9 +1228,7 @@ 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); - if (!h->setup_finished) - h->poc.frame_num = frame_num; + sl->frame_num = get_bits(&sl->gb, sps->log2_max_frame_num); sl->mb_mbaff = 0; @@ -1244,10 +1248,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); } @@ -1255,30 +1259,17 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl, get_ue_golomb(&sl->gb); /* idr_pic_id */ if (sps->poc_type == 0) { - int poc_lsb = get_bits(&sl->gb, sps->log2_max_poc_lsb); - - if (!h->setup_finished) - h->poc.poc_lsb = poc_lsb; + sl->poc_lsb = get_bits(&sl->gb, sps->log2_max_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) |