@ -2357,6 +2357,54 @@ int ff_h264_get_profile(SPS *sps)
return profile ;
}
static int h264_set_parameter_from_sps ( H264Context * h )
{
MpegEncContext * s = & h - > s ;
if ( s - > flags & CODEC_FLAG_LOW_DELAY | |
( h - > sps . bitstream_restriction_flag & &
! h - > sps . num_reorder_frames ) ) {
if ( s - > avctx - > has_b_frames > 1 | | h - > delayed_pic [ 0 ] )
av_log ( h - > s . avctx , AV_LOG_WARNING , " Delayed frames seen. "
" Reenabling low delay requires a codec flush. \n " ) ;
else
s - > low_delay = 1 ;
}
if ( s - > avctx - > has_b_frames < 2 )
s - > avctx - > has_b_frames = ! s - > low_delay ;
if ( s - > avctx - > bits_per_raw_sample ! = h - > sps . bit_depth_luma | |
h - > cur_chroma_format_idc ! = h - > sps . chroma_format_idc ) {
if ( s - > avctx - > codec & &
s - > avctx - > codec - > capabilities & CODEC_CAP_HWACCEL_VDPAU & &
( h - > sps . bit_depth_luma ! = 8 | | h - > sps . chroma_format_idc > 1 ) ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
" VDPAU decoding does not support video colorspace. \n " ) ;
return AVERROR_INVALIDDATA ;
}
if ( h - > sps . bit_depth_luma > = 8 & & h - > sps . bit_depth_luma < = 14 & &
h - > sps . bit_depth_luma ! = 11 & & h - > sps . bit_depth_luma ! = 13 & &
( h - > sps . bit_depth_luma ! = 9 | | ! CHROMA422 ) ) {
s - > avctx - > bits_per_raw_sample = h - > sps . bit_depth_luma ;
h - > cur_chroma_format_idc = h - > sps . chroma_format_idc ;
h - > pixel_shift = h - > sps . bit_depth_luma > 8 ;
ff_h264dsp_init ( & h - > h264dsp , h - > sps . bit_depth_luma ,
h - > sps . chroma_format_idc ) ;
ff_h264_pred_init ( & h - > hpc , s - > codec_id , h - > sps . bit_depth_luma ,
h - > sps . chroma_format_idc ) ;
s - > dsp . dct_bits = h - > sps . bit_depth_luma > 8 ? 32 : 16 ;
ff_dsputil_init ( & s - > dsp , s - > avctx ) ;
} else {
av_log ( s - > avctx , AV_LOG_ERROR , " Unsupported bit depth: %d \n " ,
h - > sps . bit_depth_luma ) ;
return AVERROR_INVALIDDATA ;
}
}
return 0 ;
}
/**
* Decode a slice header .
* This will also call ff_MPV_common_init ( ) and frame_start ( ) as needed .
@ -2373,7 +2421,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
MpegEncContext * const s0 = & h0 - > s ;
unsigned int first_mb_in_slice ;
unsigned int pps_id ;
int num_ref_idx_active_override_flag ;
int num_ref_idx_active_override_flag , ret ;
unsigned int slice_type , tmp , i , j ;
int default_ref_list_done = 0 ;
int last_pic_structure , last_pic_droppable ;
@ -2450,7 +2498,14 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
h - > pps . sps_id ) ;
return - 1 ;
}
h - > sps = * h0 - > sps_buffers [ h - > pps . sps_id ] ;
if ( h - > pps . sps_id ! = h - > current_sps_id | |
h0 - > sps_buffers [ h - > pps . sps_id ] - > new ) {
h0 - > sps_buffers [ h - > pps . sps_id ] - > new = 0 ;
h - > current_sps_id = h - > pps . sps_id ;
h - > sps = * h0 - > sps_buffers [ h - > pps . sps_id ] ;
}
s - > avctx - > profile = ff_h264_get_profile ( & h - > sps ) ;
s - > avctx - > level = h - > sps . level_idc ;
@ -2508,33 +2563,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
s - > avctx - > sample_aspect_ratio = h - > sps . sar ;
av_assert0 ( s - > avctx - > sample_aspect_ratio . den ) ;
if ( s - > avctx - > codec - > capabilities & CODEC_CAP_HWACCEL_VDPAU
& & ( h - > sps . bit_depth_luma ! = 8 | |
h - > sps . chroma_format_idc > 1 ) ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
" VDPAU decoding does not support video "
" colorspace \n " ) ;
return - 1 ;
}
if ( s - > avctx - > bits_per_raw_sample ! = h - > sps . bit_depth_luma | |
h - > cur_chroma_format_idc ! = h - > sps . chroma_format_idc ) {
if ( h - > sps . bit_depth_luma > = 8 & & h - > sps . bit_depth_luma < = 14 & & h - > sps . bit_depth_luma ! = 11 & & h - > sps . bit_depth_luma ! = 13 & &
( h - > sps . bit_depth_luma ! = 9 | | ! CHROMA422 ) ) {
s - > avctx - > bits_per_raw_sample = h - > sps . bit_depth_luma ;
h - > cur_chroma_format_idc = h - > sps . chroma_format_idc ;
h - > pixel_shift = h - > sps . bit_depth_luma > 8 ;
ff_h264dsp_init ( & h - > h264dsp , h - > sps . bit_depth_luma , h - > sps . chroma_format_idc ) ;
ff_h264_pred_init ( & h - > hpc , s - > codec_id , h - > sps . bit_depth_luma , h - > sps . chroma_format_idc ) ;
s - > dsp . dct_bits = h - > sps . bit_depth_luma > 8 ? 32 : 16 ;
ff_dsputil_init ( & s - > dsp , s - > avctx ) ;
} else {
av_log ( s - > avctx , AV_LOG_ERROR , " Unsupported bit depth: %d chroma_idc: %d \n " ,
h - > sps . bit_depth_luma , h - > sps . chroma_format_idc ) ;
return - 1 ;
}
}
if ( ( ret = h264_set_parameter_from_sps ( h ) ) < 0 )
return ret ;
if ( h - > sps . video_signal_type_present_flag ) {
s - > avctx - > color_range = h - > sps . full_range > 0 ? AVCOL_RANGE_JPEG
@ -4027,6 +4057,7 @@ again:
ff_h264_decode_seq_parameter_set ( h ) ;
}
if ( s - > flags & CODEC_FLAG_LOW_DELAY | |
( h - > sps . bitstream_restriction_flag & &
! h - > sps . num_reorder_frames ) ) {