summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2016-05-17 15:35:50 +0200
committerAnton Khirnov <anton@khirnov.net>2016-06-21 11:08:56 +0200
commitf966498e433fead2f5e6b5b66fad2ac062146d22 (patch)
tree212757e848db68db4b7fa516d52befa2864cd7fe
parent54dd9b1cdd9e54f1ee39ae25af0324f8aba2831b (diff)
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.h5
-rw-r--r--libavcodec/h264_slice.c41
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)