@ -3382,11 +3382,12 @@ static int h264_slice_header_init(H264Context *h, int reinit)
int ff_set_ref_count ( H264Context * h )
{
int ref_count [ 2 ] , list_count ;
int num_ref_idx_active_override_flag ;
// set defaults, might be overridden a few lines later
h - > ref_count [ 0 ] = h - > pps . ref_count [ 0 ] ;
h - > ref_count [ 1 ] = h - > pps . ref_count [ 1 ] ;
ref_count [ 0 ] = h - > pps . ref_count [ 0 ] ;
ref_count [ 1 ] = h - > pps . ref_count [ 1 ] ;
if ( h - > slice_type_nos ! = AV_PICTURE_TYPE_I ) {
unsigned max [ 2 ] ;
@ -3397,27 +3398,36 @@ int ff_set_ref_count(H264Context *h)
num_ref_idx_active_override_flag = get_bits1 ( & h - > gb ) ;
if ( num_ref_idx_active_override_flag ) {
h - > ref_count [ 0 ] = get_ue_golomb ( & h - > gb ) + 1 ;
ref_count [ 0 ] = get_ue_golomb ( & h - > gb ) + 1 ;
if ( h - > slice_type_nos = = AV_PICTURE_TYPE_B ) {
h - > ref_count [ 1 ] = get_ue_golomb ( & h - > gb ) + 1 ;
ref_count [ 1 ] = get_ue_golomb ( & h - > gb ) + 1 ;
} else
// full range is spec-ok in this case, even for frames
h - > ref_count [ 1 ] = 1 ;
ref_count [ 1 ] = 1 ;
}
if ( h - > ref_count [ 0 ] - 1 > max [ 0 ] | | h - > ref_count [ 1 ] - 1 > max [ 1 ] ) {
av_log ( h - > avctx , AV_LOG_ERROR , " reference overflow %u > %u or %u > %u \n " , h - > ref_count [ 0 ] - 1 , max [ 0 ] , h - > ref_count [ 1 ] - 1 , max [ 1 ] ) ;
if ( ref_count [ 0 ] - 1 > max [ 0 ] | | ref_count [ 1 ] - 1 > max [ 1 ] ) {
av_log ( h - > avctx , AV_LOG_ERROR , " reference overflow %u > %u or %u > %u \n " , ref_count [ 0 ] - 1 , max [ 0 ] , ref_count [ 1 ] - 1 , max [ 1 ] ) ;
h - > ref_count [ 0 ] = h - > ref_count [ 1 ] = 0 ;
return AVERROR_INVALIDDATA ;
}
if ( h - > slice_type_nos = = AV_PICTURE_TYPE_B )
h - > list_count = 2 ;
list_count = 2 ;
else
h - > list_count = 1 ;
list_count = 1 ;
} else {
h - > list_count = 0 ;
h - > ref_count [ 0 ] = h - > ref_count [ 1 ] = 0 ;
list_count = 0 ;
ref_count [ 0 ] = ref_count [ 1 ] = 0 ;
}
if ( list_count ! = h - > list_count | |
ref_count [ 0 ] ! = h - > ref_count [ 0 ] | |
ref_count [ 1 ] ! = h - > ref_count [ 1 ] ) {
h - > ref_count [ 0 ] = ref_count [ 0 ] ;
h - > ref_count [ 1 ] = ref_count [ 1 ] ;
h - > list_count = list_count ;
return 1 ;
}
return 0 ;