That function currently does two things -- reinitializing the DSP contexts and setting low_delay based on the SPS values. The former more appropriately belongs in h264_slice_header_init(), while the latter only really makes sense in decode_slice_header(). The third call to ff_h264_set_parameter_from_sps(), done immediately after parsing a new SPS, appears to serve no useful purpose, so it is just dropped. Also, drop now unneeded H264Context.cur_chroma_format_idc.tags/n2.7
| @@ -570,7 +570,6 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h) | |||||
| h->avctx = avctx; | h->avctx = avctx; | ||||
| h->dequant_coeff_pps = -1; | h->dequant_coeff_pps = -1; | ||||
| h->cur_chroma_format_idc = -1; | |||||
| h->picture_structure = PICT_FRAME; | h->picture_structure = PICT_FRAME; | ||||
| h->slice_context_count = 1; | h->slice_context_count = 1; | ||||
| @@ -1175,44 +1174,6 @@ int ff_h264_get_profile(SPS *sps) | |||||
| return profile; | return profile; | ||||
| } | } | ||||
| int ff_h264_set_parameter_from_sps(H264Context *h) | |||||
| { | |||||
| if (h->flags & CODEC_FLAG_LOW_DELAY || | |||||
| (h->sps.bitstream_restriction_flag && | |||||
| !h->sps.num_reorder_frames)) { | |||||
| if (h->avctx->has_b_frames > 1 || h->delayed_pic[0]) | |||||
| av_log(h->avctx, AV_LOG_WARNING, "Delayed frames seen. " | |||||
| "Reenabling low delay requires a codec flush.\n"); | |||||
| else | |||||
| h->low_delay = 1; | |||||
| } | |||||
| if (h->avctx->has_b_frames < 2) | |||||
| h->avctx->has_b_frames = !h->low_delay; | |||||
| if (h->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 <= 10) { | |||||
| h->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_h264chroma_init(&h->h264chroma, h->sps.bit_depth_chroma); | |||||
| ff_h264qpel_init(&h->h264qpel, h->sps.bit_depth_luma); | |||||
| ff_h264_pred_init(&h->hpc, h->avctx->codec_id, h->sps.bit_depth_luma, | |||||
| h->sps.chroma_format_idc); | |||||
| ff_videodsp_init(&h->vdsp, h->sps.bit_depth_luma); | |||||
| } else { | |||||
| av_log(h->avctx, AV_LOG_ERROR, "Unsupported bit depth %d\n", | |||||
| h->sps.bit_depth_luma); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| int ff_set_ref_count(H264Context *h, H264SliceContext *sl) | int ff_set_ref_count(H264Context *h, H264SliceContext *sl) | ||||
| { | { | ||||
| int ref_count[2], list_count; | int ref_count[2], list_count; | ||||
| @@ -1559,10 +1520,6 @@ again: | |||||
| ff_h264_decode_seq_parameter_set(h); | ff_h264_decode_seq_parameter_set(h); | ||||
| } | } | ||||
| ret = ff_h264_set_parameter_from_sps(h); | |||||
| if (ret < 0) | |||||
| goto end; | |||||
| break; | break; | ||||
| case NAL_PPS: | case NAL_PPS: | ||||
| init_get_bits(&h->gb, ptr, bit_length); | init_get_bits(&h->gb, ptr, bit_length); | ||||
| @@ -724,8 +724,6 @@ typedef struct H264Context { | |||||
| int sei_buffering_period_present; ///< Buffering period SEI flag | int sei_buffering_period_present; ///< Buffering period SEI flag | ||||
| int initial_cpb_removal_delay[32]; ///< Initial timestamps for CPBs | int initial_cpb_removal_delay[32]; ///< Initial timestamps for CPBs | ||||
| int cur_chroma_format_idc; | |||||
| int enable_er; | int enable_er; | ||||
| AVBufferPool *qscale_table_pool; | AVBufferPool *qscale_table_pool; | ||||
| @@ -1073,7 +1071,6 @@ int ff_h264_ref_picture(H264Context *h, H264Picture *dst, H264Picture *src); | |||||
| void ff_h264_unref_picture(H264Context *h, H264Picture *pic); | void ff_h264_unref_picture(H264Context *h, H264Picture *pic); | ||||
| int ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl); | int ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl); | ||||
| int ff_h264_set_parameter_from_sps(H264Context *h); | |||||
| void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, int y, int height); | void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, int y, int height); | ||||
| int ff_init_poc(H264Context *h, int pic_field_poc[2], int *pic_poc); | int ff_init_poc(H264Context *h, int pic_field_poc[2], int *pic_poc); | ||||
| @@ -428,11 +428,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, | |||||
| h->sps.bit_depth_luma != h1->sps.bit_depth_luma || | h->sps.bit_depth_luma != h1->sps.bit_depth_luma || | ||||
| h->sps.chroma_format_idc != h1->sps.chroma_format_idc || | h->sps.chroma_format_idc != h1->sps.chroma_format_idc || | ||||
| h->sps.colorspace != h1->sps.colorspace)) { | h->sps.colorspace != h1->sps.colorspace)) { | ||||
| /* set bits_per_raw_sample to the previous value. the check for changed | |||||
| * bit depth in h264_set_parameter_from_sps() uses it and sets it to | |||||
| * the current value */ | |||||
| h->avctx->bits_per_raw_sample = h->sps.bit_depth_luma; | |||||
| need_reinit = 1; | need_reinit = 1; | ||||
| } | } | ||||
| @@ -571,8 +566,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, | |||||
| /* copy block_offset since frame_start may not be called */ | /* copy block_offset since frame_start may not be called */ | ||||
| memcpy(h->block_offset, h1->block_offset, sizeof(h->block_offset)); | memcpy(h->block_offset, h1->block_offset, sizeof(h->block_offset)); | ||||
| ff_h264_set_parameter_from_sps(h); | |||||
| } | } | ||||
| if (!h->cur_pic_ptr) | if (!h->cur_pic_ptr) | ||||
| @@ -1012,6 +1005,23 @@ static int h264_slice_header_init(H264Context *h, int reinit) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| if (h->sps.bit_depth_luma < 8 || h->sps.bit_depth_luma > 10) { | |||||
| av_log(h->avctx, AV_LOG_ERROR, "Unsupported bit depth %d\n", | |||||
| h->sps.bit_depth_luma); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| h->avctx->bits_per_raw_sample = h->sps.bit_depth_luma; | |||||
| 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_h264chroma_init(&h->h264chroma, h->sps.bit_depth_chroma); | |||||
| ff_h264qpel_init(&h->h264qpel, h->sps.bit_depth_luma); | |||||
| ff_h264_pred_init(&h->hpc, h->avctx->codec_id, h->sps.bit_depth_luma, | |||||
| h->sps.chroma_format_idc); | |||||
| ff_videodsp_init(&h->vdsp, h->sps.bit_depth_luma); | |||||
| if (nb_slices > H264_MAX_THREADS || (nb_slices > h->mb_height && h->mb_height)) { | if (nb_slices > H264_MAX_THREADS || (nb_slices > h->mb_height && h->mb_height)) { | ||||
| int max_slices; | int max_slices; | ||||
| if (h->mb_height) | if (h->mb_height) | ||||
| @@ -1152,8 +1162,20 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl) | |||||
| h->chroma_format_idc = h->sps.chroma_format_idc; | h->chroma_format_idc = h->sps.chroma_format_idc; | ||||
| needs_reinit = 1; | needs_reinit = 1; | ||||
| } | } | ||||
| if ((ret = ff_h264_set_parameter_from_sps(h)) < 0) | |||||
| return ret; | |||||
| if (h->flags & CODEC_FLAG_LOW_DELAY || | |||||
| (h->sps.bitstream_restriction_flag && | |||||
| !h->sps.num_reorder_frames)) { | |||||
| if (h->avctx->has_b_frames > 1 || h->delayed_pic[0]) | |||||
| av_log(h->avctx, AV_LOG_WARNING, "Delayed frames seen. " | |||||
| "Reenabling low delay requires a codec flush.\n"); | |||||
| else | |||||
| h->low_delay = 1; | |||||
| } | |||||
| if (h->avctx->has_b_frames < 2) | |||||
| h->avctx->has_b_frames = !h->low_delay; | |||||
| } | } | ||||
| h->avctx->profile = ff_h264_get_profile(&h->sps); | h->avctx->profile = ff_h264_get_profile(&h->sps); | ||||