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