aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/h264_parser.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2016-03-21 16:14:31 +0100
committerAnton Khirnov <anton@khirnov.net>2016-04-24 10:06:23 +0200
commita6e27f7add2698fdd89911632b570c3d0c3f2aaa (patch)
tree8e345bf225e923c9c8fc0e68809dd28b8aa27ad7 /libavcodec/h264_parser.c
parent56b17a33f231859cbccbd741b4763617cb4ecf03 (diff)
downloadffmpeg-a6e27f7add2698fdd89911632b570c3d0c3f2aaa.tar.gz
h264: factor out parsing the reference count into a separate file
This will allow decoupling the parser from the decoder.
Diffstat (limited to 'libavcodec/h264_parser.c')
-rw-r--r--libavcodec/h264_parser.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
index 87f6fe6706..2d39ee4a04 100644
--- a/libavcodec/h264_parser.c
+++ b/libavcodec/h264_parser.c
@@ -111,6 +111,7 @@ static int scan_mmco_reset(AVCodecParserContext *s)
H264ParseContext *p = s->priv_data;
H264Context *h = &p->h;
H264SliceContext *sl = &h->slice_ctx[0];
+ int list_count, ref_count[2];
sl->slice_type_nos = s->pict_type & 3;
@@ -120,12 +121,13 @@ static int scan_mmco_reset(AVCodecParserContext *s)
if (sl->slice_type_nos == AV_PICTURE_TYPE_B)
get_bits1(&sl->gb); // direct_spatial_mv_pred
- if (ff_set_ref_count(h, sl) < 0)
+ if (ff_h264_parse_ref_count(&list_count, ref_count, &sl->gb, &h->pps,
+ sl->slice_type_nos, h->picture_structure) < 0)
return AVERROR_INVALIDDATA;
if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
int list;
- for (list = 0; list < sl->list_count; list++) {
+ for (list = 0; list < list_count; list++) {
if (get_bits1(&sl->gb)) {
int index;
for (index = 0; ; index++) {
@@ -141,7 +143,7 @@ static int scan_mmco_reset(AVCodecParserContext *s)
} else
break;
- if (index >= sl->ref_count[list]) {
+ if (index >= ref_count[list]) {
av_log(h->avctx, AV_LOG_ERROR,
"reference count %d overflow\n", index);
return AVERROR_INVALIDDATA;
@@ -153,7 +155,7 @@ static int scan_mmco_reset(AVCodecParserContext *s)
if ((h->pps.weighted_pred && sl->slice_type_nos == AV_PICTURE_TYPE_P) ||
(h->pps.weighted_bipred_idc == 1 && sl->slice_type_nos == AV_PICTURE_TYPE_B))
- ff_h264_pred_weight_table(&sl->gb, &h->sps, sl->ref_count, sl->slice_type_nos,
+ ff_h264_pred_weight_table(&sl->gb, &h->sps, ref_count, sl->slice_type_nos,
&sl->pwt);
if (get_bits1(&sl->gb)) { // adaptive_ref_pic_marking_mode_flag