mirror of https://git.ffmpeg.org/ffmpeg.git
hevc: split out setting AVCodecContext parameters
Additionally always set the software pixel format, so it's available even if ff_get_format() is not called later. This will be useful for exporting stream parameters from init().
This commit is contained in:
parent
7d097a0fc5
commit
1ae7afd256
|
@ -383,24 +383,65 @@ static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void export_stream_params(AVCodecContext *avctx,
|
||||||
|
const HEVCContext *s, const HEVCSPS *sps)
|
||||||
|
{
|
||||||
|
const HEVCVPS *vps = (const HEVCVPS*)s->vps_list[sps->vps_id]->data;
|
||||||
|
unsigned int num = 0, den = 0;
|
||||||
|
|
||||||
|
avctx->pix_fmt = sps->pix_fmt;
|
||||||
|
avctx->coded_width = sps->width;
|
||||||
|
avctx->coded_height = sps->height;
|
||||||
|
avctx->width = sps->output_width;
|
||||||
|
avctx->height = sps->output_height;
|
||||||
|
avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
|
||||||
|
avctx->profile = sps->ptl.general_ptl.profile_idc;
|
||||||
|
avctx->level = sps->ptl.general_ptl.level_idc;
|
||||||
|
|
||||||
|
ff_set_sar(avctx, sps->vui.sar);
|
||||||
|
|
||||||
|
if (sps->vui.video_signal_type_present_flag)
|
||||||
|
avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG
|
||||||
|
: AVCOL_RANGE_MPEG;
|
||||||
|
else
|
||||||
|
avctx->color_range = AVCOL_RANGE_MPEG;
|
||||||
|
|
||||||
|
if (sps->vui.colour_description_present_flag) {
|
||||||
|
avctx->color_primaries = sps->vui.colour_primaries;
|
||||||
|
avctx->color_trc = sps->vui.transfer_characteristic;
|
||||||
|
avctx->colorspace = sps->vui.matrix_coeffs;
|
||||||
|
} else {
|
||||||
|
avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
|
||||||
|
avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
|
||||||
|
avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vps->vps_timing_info_present_flag) {
|
||||||
|
num = vps->vps_num_units_in_tick;
|
||||||
|
den = vps->vps_time_scale;
|
||||||
|
} else if (sps->vui.vui_timing_info_present_flag) {
|
||||||
|
num = sps->vui.vui_num_units_in_tick;
|
||||||
|
den = sps->vui.vui_time_scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num != 0 && den != 0)
|
||||||
|
av_reduce(&avctx->framerate.den, &avctx->framerate.num,
|
||||||
|
num, den, 1 << 30);
|
||||||
|
}
|
||||||
|
|
||||||
static int set_sps(HEVCContext *s, const HEVCSPS *sps)
|
static int set_sps(HEVCContext *s, const HEVCSPS *sps)
|
||||||
{
|
{
|
||||||
#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL)
|
#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL)
|
||||||
enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
|
enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int num = 0, den = 0;
|
|
||||||
|
export_stream_params(s->avctx, s, sps);
|
||||||
|
|
||||||
pic_arrays_free(s);
|
pic_arrays_free(s);
|
||||||
ret = pic_arrays_init(s, sps);
|
ret = pic_arrays_init(s, sps);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
s->avctx->coded_width = sps->width;
|
|
||||||
s->avctx->coded_height = sps->height;
|
|
||||||
s->avctx->width = sps->output_width;
|
|
||||||
s->avctx->height = sps->output_height;
|
|
||||||
s->avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
|
|
||||||
|
|
||||||
if (sps->pix_fmt == AV_PIX_FMT_YUV420P || sps->pix_fmt == AV_PIX_FMT_YUVJ420P) {
|
if (sps->pix_fmt == AV_PIX_FMT_YUV420P || sps->pix_fmt == AV_PIX_FMT_YUVJ420P) {
|
||||||
#if CONFIG_HEVC_DXVA2_HWACCEL
|
#if CONFIG_HEVC_DXVA2_HWACCEL
|
||||||
*fmt++ = AV_PIX_FMT_DXVA2_VLD;
|
*fmt++ = AV_PIX_FMT_DXVA2_VLD;
|
||||||
|
@ -415,24 +456,6 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps)
|
||||||
goto fail;
|
goto fail;
|
||||||
s->avctx->pix_fmt = ret;
|
s->avctx->pix_fmt = ret;
|
||||||
|
|
||||||
ff_set_sar(s->avctx, sps->vui.sar);
|
|
||||||
|
|
||||||
if (sps->vui.video_signal_type_present_flag)
|
|
||||||
s->avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG
|
|
||||||
: AVCOL_RANGE_MPEG;
|
|
||||||
else
|
|
||||||
s->avctx->color_range = AVCOL_RANGE_MPEG;
|
|
||||||
|
|
||||||
if (sps->vui.colour_description_present_flag) {
|
|
||||||
s->avctx->color_primaries = sps->vui.colour_primaries;
|
|
||||||
s->avctx->color_trc = sps->vui.transfer_characteristic;
|
|
||||||
s->avctx->colorspace = sps->vui.matrix_coeffs;
|
|
||||||
} else {
|
|
||||||
s->avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
|
|
||||||
s->avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
|
|
||||||
s->avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
|
|
||||||
}
|
|
||||||
|
|
||||||
ff_hevc_pred_init(&s->hpc, sps->bit_depth);
|
ff_hevc_pred_init(&s->hpc, sps->bit_depth);
|
||||||
ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
|
ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
|
||||||
ff_videodsp_init (&s->vdsp, sps->bit_depth);
|
ff_videodsp_init (&s->vdsp, sps->bit_depth);
|
||||||
|
@ -448,18 +471,6 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps)
|
||||||
s->sps = sps;
|
s->sps = sps;
|
||||||
s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;
|
s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;
|
||||||
|
|
||||||
if (s->vps->vps_timing_info_present_flag) {
|
|
||||||
num = s->vps->vps_num_units_in_tick;
|
|
||||||
den = s->vps->vps_time_scale;
|
|
||||||
} else if (sps->vui.vui_timing_info_present_flag) {
|
|
||||||
num = sps->vui.vui_num_units_in_tick;
|
|
||||||
den = sps->vui.vui_time_scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (num != 0 && den != 0)
|
|
||||||
av_reduce(&s->avctx->framerate.den, &s->avctx->framerate.num,
|
|
||||||
num, den, 1 << 30);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
@ -509,9 +520,6 @@ static int hls_slice_header(HEVCContext *s)
|
||||||
s->max_ra = INT_MAX;
|
s->max_ra = INT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->avctx->profile = s->sps->ptl.general_ptl.profile_idc;
|
|
||||||
s->avctx->level = s->sps->ptl.general_ptl.level_idc;
|
|
||||||
|
|
||||||
sh->dependent_slice_segment_flag = 0;
|
sh->dependent_slice_segment_flag = 0;
|
||||||
if (!sh->first_slice_in_pic_flag) {
|
if (!sh->first_slice_in_pic_flag) {
|
||||||
int slice_address_length;
|
int slice_address_length;
|
||||||
|
|
Loading…
Reference in New Issue