mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
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.
This commit is contained in:
parent
54986d6db9
commit
ee62b364be
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user