@ -1150,6 +1150,12 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl,
h - > droppable = ( nal - > ref_idc = = 0 ) ;
h - > droppable = ( nal - > ref_idc = = 0 ) ;
h - > picture_structure = sl - > picture_structure ;
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
/* Shorten frame num gaps so we don't have to allocate reference
* frames just to throw them away */
* frames just to throw them away */
if ( h - > poc . frame_num ! = h - > poc . prev_frame_num ) {
if ( h - > poc . frame_num ! = h - > poc . prev_frame_num ) {
@ -1340,7 +1346,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl,
unsigned int slice_type , tmp , i ;
unsigned int slice_type , tmp , i ;
int field_pic_flag , bottom_field_flag ;
int field_pic_flag , bottom_field_flag ;
int first_slice = sl = = h - > slice_ctx & & ! h - > current_slice ;
int first_slice = sl = = h - > slice_ctx & & ! h - > current_slice ;
int frame_num , picture_structure ;
int picture_structure ;
if ( first_slice )
if ( first_slice )
av_assert0 ( ! h - > setup_finished ) ;
av_assert0 ( ! h - > setup_finished ) ;
@ -1390,18 +1396,15 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl,
}
}
sps = ( const SPS * ) h - > ps . sps_list [ pps - > sps_id ] - > data ;
sps = ( const SPS * ) h - > ps . sps_list [ pps - > sps_id ] - > data ;
frame_num = get_bits ( & sl - > gb , sps - > log2_max_frame_num ) ;
sl - > frame_num = get_bits ( & sl - > gb , sps - > log2_max_frame_num ) ;
if ( ! first_slice ) {
if ( ! first_slice ) {
if ( h - > poc . frame_num ! = frame_num ) {
if ( h - > poc . frame_num ! = sl - > frame_num ) {
av_log ( h - > avctx , AV_LOG_ERROR , " Frame num change from %d to %d \n " ,
av_log ( h - > avctx , AV_LOG_ERROR , " Frame num change from %d to %d \n " ,
h - > poc . frame_num , frame_num ) ;
h - > poc . frame_num , sl - > frame_num ) ;
return AVERROR_INVALIDDATA ;
return AVERROR_INVALIDDATA ;
}
}
}
}
if ( ! h - > setup_finished )
h - > poc . frame_num = frame_num ;
sl - > mb_mbaff = 0 ;
sl - > mb_mbaff = 0 ;
if ( sps - > frame_mbs_only_flag ) {
if ( sps - > frame_mbs_only_flag ) {
@ -1423,10 +1426,10 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl,
sl - > mb_field_decoding_flag = picture_structure ! = PICT_FRAME ;
sl - > mb_field_decoding_flag = picture_structure ! = PICT_FRAME ;
if ( 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 ;
h - > max_pic_num = 1 < < sps - > log2_max_frame_num ;
} else {
} 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 ) ;
h - > max_pic_num = 1 < < ( sps - > log2_max_frame_num + 1 ) ;
}
}
@ -1434,30 +1437,17 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl,
get_ue_golomb_long ( & sl - > gb ) ; /* idr_pic_id */
get_ue_golomb_long ( & sl - > gb ) ; /* idr_pic_id */
if ( sps - > poc_type = = 0 ) {
if ( sps - > poc_type = = 0 ) {
int poc_lsb = get_bits ( & sl - > gb , sps - > log2_max_poc_lsb ) ;
sl - > poc_lsb = get_bits ( & sl - > gb , sps - > log2_max_poc_lsb ) ;
if ( ! h - > setup_finished )
if ( pps - > pic_order_present = = 1 & & picture_structure = = PICT_FRAME )
h - > poc . poc_lsb = poc_lsb ;
sl - > delta_poc_bottom = get_se_golomb ( & sl - > gb ) ;
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 ( sps - > poc_type = = 1 & & ! sps - > delta_pic_order_always_zero_flag ) {
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 )
if ( pps - > pic_order_present = = 1 & & picture_structure = = PICT_FRAME )
h - > poc . delta_poc [ 0 ] = delta_poc ;
sl - > delta_poc [ 1 ] = get_se_golomb ( & sl - > gb ) ;
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 - > redundant_pic_cnt_present )
if ( pps - > redundant_pic_cnt_present )