@ -988,7 +988,8 @@ static int h264_init_ps(H264Context *h, const H264SliceContext *sl)
* slice in a field ( or a frame ) . It decides whether we are decoding a new frame
* or a second field in a pair and does the necessary setup .
*/
static int h264_field_start ( H264Context * h , const H264SliceContext * sl )
static int h264_field_start ( H264Context * h , const H264SliceContext * sl ,
const H2645NAL * nal )
{
const SPS * sps ;
@ -1002,7 +1003,7 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl)
last_pic_droppable = h - > droppable ;
last_pic_structure = h - > picture_structure ;
h - > droppable = ( h - > nal_ ref_idc = = 0 ) ;
h - > droppable = ( nal - > ref_idc = = 0 ) ;
h - > picture_structure = sl - > picture_structure ;
/* Shorten frame num gaps so we don't have to allocate reference
@ -1163,7 +1164,8 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl)
return 0 ;
}
static int h264_slice_header_parse ( H264Context * h , H264SliceContext * sl )
static int h264_slice_header_parse ( H264Context * h , H264SliceContext * sl ,
const H2645NAL * nal )
{
const SPS * sps ;
const PPS * pps ;
@ -1207,7 +1209,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
sl - > slice_type = slice_type ;
sl - > slice_type_nos = slice_type & 3 ;
if ( h - > nal_unit_ type = = NAL_IDR_SLICE & &
if ( nal - > type = = NAL_IDR_SLICE & &
sl - > slice_type_nos ! = AV_PICTURE_TYPE_I ) {
av_log ( h - > avctx , AV_LOG_ERROR , " A non-intra slice in an IDR NAL unit. \n " ) ;
return AVERROR_INVALIDDATA ;
@ -1244,7 +1246,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
sl - > mb_mbaff = 0 ;
droppable = h - > nal_ ref_idc = = 0 ;
droppable = nal - > ref_idc = = 0 ;
if ( sps - > frame_mbs_only_flag ) {
picture_structure = PICT_FRAME ;
} else {
@ -1286,7 +1288,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
h - > max_pic_num = 1 < < ( sps - > log2_max_frame_num + 1 ) ;
}
if ( h - > nal_unit_ type = = NAL_IDR_SLICE )
if ( nal - > type = = NAL_IDR_SLICE )
get_ue_golomb ( & sl - > gb ) ; /* idr_pic_id */
if ( sps - > poc_type = = 0 ) {
@ -1348,7 +1350,7 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
sl - > slice_type_nos , & sl - > pwt ) ;
sl - > explicit_ref_marking = 0 ;
if ( h - > nal_ ref_idc) {
if ( nal - > ref_idc ) {
ret = ff_h264_decode_ref_pic_marking ( h , sl , & sl - > gb ) ;
if ( ret < 0 & & ( h - > avctx - > err_recognition & AV_EF_EXPLODE ) )
return AVERROR_INVALIDDATA ;
@ -1419,16 +1421,17 @@ static int h264_slice_header_parse(H264Context *h, H264SliceContext *sl)
*
* @ return 0 if okay , < 0 if an error occurred
*/
int ff_h264_decode_slice_header ( H264Context * h , H264SliceContext * sl )
int ff_h264_decode_slice_header ( H264Context * h , H264SliceContext * sl ,
const H2645NAL * nal )
{
int i , j , ret = 0 ;
ret = h264_slice_header_parse ( h , sl ) ;
ret = h264_slice_header_parse ( h , sl , nal ) ;
if ( ret < 0 )
return ret ;
if ( h - > current_slice = = 0 ) {
ret = h264_field_start ( h , sl ) ;
ret = h264_field_start ( h , sl , nal ) ;
if ( ret < 0 )
return ret ;
}
@ -1448,7 +1451,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
if ( ! h - > setup_finished ) {
ff_h264_init_poc ( h - > cur_pic_ptr - > field_poc , & h - > cur_pic_ptr - > poc ,
h - > ps . sps , & h - > poc , h - > picture_structure , h - > nal_ ref_idc) ;
h - > ps . sps , & h - > poc , h - > picture_structure , nal - > ref_idc ) ;
memcpy ( h - > mmco , sl - > mmco , sl - > nb_mmco * sizeof ( * h - > mmco ) ) ;
h - > nb_mmco = sl - > nb_mmco ;
@ -1478,7 +1481,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
( h - > avctx - > skip_loop_filter > = AVDISCARD_BIDIR & &
sl - > slice_type_nos = = AV_PICTURE_TYPE_B ) | |
( h - > avctx - > skip_loop_filter > = AVDISCARD_NONREF & &
h - > nal_ ref_idc = = 0 ) )
nal - > ref_idc = = 0 ) )
sl - > deblocking_filter = 0 ;
if ( sl - > deblocking_filter = = 1 & & h - > nb_slice_ctx > 1 ) {
@ -1544,7 +1547,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl)
sl - > mb_y * h - > mb_width + sl - > mb_x ,
av_get_picture_type_char ( sl - > slice_type ) ,
sl - > slice_type_fixed ? " fix " : " " ,
h - > nal_unit_ type = = NAL_IDR_SLICE ? " IDR " : " " ,
nal - > type = = NAL_IDR_SLICE ? " IDR " : " " ,
h - > poc . frame_num ,
h - > cur_pic_ptr - > field_poc [ 0 ] ,
h - > cur_pic_ptr - > field_poc [ 1 ] ,