From ee62b364be0c30cba83b5ff10a3ca8c3e866ade6 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 6 Apr 2015 20:33:58 +0200 Subject: h264: eliminate ff_h264_set_parameter_from_sps() 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. --- libavcodec/h264_slice.c | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) (limited to 'libavcodec/h264_slice.c') diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 864ee980ef..da394d19e4 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -428,11 +428,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, h->sps.bit_depth_luma != h1->sps.bit_depth_luma || h->sps.chroma_format_idc != h1->sps.chroma_format_idc || 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; } @@ -571,8 +566,6 @@ int ff_h264_update_thread_context(AVCodecContext *dst, /* copy block_offset since frame_start may not be called */ memcpy(h->block_offset, h1->block_offset, sizeof(h->block_offset)); - - ff_h264_set_parameter_from_sps(h); } if (!h->cur_pic_ptr) @@ -1012,6 +1005,23 @@ static int h264_slice_header_init(H264Context *h, int reinit) 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)) { int max_slices; 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; 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); -- cgit v1.2.3