mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-30 03:13:18 +00:00
avcodec/libsvtav1: give svtav1-params priority over avctx values
If the svt equivalent option to an avctx AVOption is passed by the user then it should have priority. The exception are fields like dimensions, bitdepth and pixel format, which must match what lavc will feed the encoder after init. This addresses libsvt-av1 issue #1858. Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
cd96211ace
commit
e3c4442b24
@ -178,6 +178,9 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param,
|
||||
param->rate_control_mode = 1;
|
||||
else
|
||||
param->rate_control_mode = 2;
|
||||
|
||||
param->max_qp_allowed = avctx->qmax;
|
||||
param->min_qp_allowed = avctx->qmin;
|
||||
}
|
||||
param->max_bit_rate = avctx->rc_max_rate;
|
||||
param->vbv_bufsize = avctx->rc_buffer_size;
|
||||
@ -191,6 +194,37 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param,
|
||||
param->enable_adaptive_quantization = 0;
|
||||
}
|
||||
|
||||
desc = av_pix_fmt_desc_get(avctx->pix_fmt);
|
||||
param->color_primaries = avctx->color_primaries;
|
||||
param->matrix_coefficients = (desc->flags & AV_PIX_FMT_FLAG_RGB) ?
|
||||
AVCOL_SPC_RGB : avctx->colorspace;
|
||||
param->transfer_characteristics = avctx->color_trc;
|
||||
|
||||
if (avctx->color_range != AVCOL_RANGE_UNSPECIFIED)
|
||||
param->color_range = avctx->color_range == AVCOL_RANGE_JPEG;
|
||||
else
|
||||
param->color_range = !!(desc->flags & AV_PIX_FMT_FLAG_RGB);
|
||||
|
||||
if (avctx->profile != FF_PROFILE_UNKNOWN)
|
||||
param->profile = avctx->profile;
|
||||
|
||||
if (avctx->level != FF_LEVEL_UNKNOWN)
|
||||
param->level = avctx->level;
|
||||
|
||||
if (avctx->gop_size > 0)
|
||||
param->intra_period_length = avctx->gop_size - 1;
|
||||
|
||||
if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
|
||||
param->frame_rate_numerator = avctx->framerate.num;
|
||||
param->frame_rate_denominator = avctx->framerate.den;
|
||||
} else {
|
||||
param->frame_rate_numerator = avctx->time_base.den;
|
||||
param->frame_rate_denominator = avctx->time_base.num * avctx->ticks_per_frame;
|
||||
}
|
||||
|
||||
/* 2 = IDR, closed GOP, 1 = CRA, open GOP */
|
||||
param->intra_refresh_type = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP ? 2 : 1;
|
||||
|
||||
#if SVT_AV1_CHECK_VERSION(0, 9, 1)
|
||||
while ((en = av_dict_get(svt_enc->svtav1_opts, "", en, AV_DICT_IGNORE_SUFFIX))) {
|
||||
EbErrorType ret = svt_av1_enc_parse_parameter(param, en->key, en->value);
|
||||
@ -214,7 +248,6 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param,
|
||||
param->source_width = avctx->width;
|
||||
param->source_height = avctx->height;
|
||||
|
||||
desc = av_pix_fmt_desc_get(avctx->pix_fmt);
|
||||
param->encoder_bit_depth = desc->comp[0].depth;
|
||||
|
||||
if (desc->log2_chroma_w == 1 && desc->log2_chroma_h == 1)
|
||||
@ -228,22 +261,6 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param,
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
param->color_primaries = avctx->color_primaries;
|
||||
param->matrix_coefficients = (desc->flags & AV_PIX_FMT_FLAG_RGB) ?
|
||||
AVCOL_SPC_RGB : avctx->colorspace;
|
||||
param->transfer_characteristics = avctx->color_trc;
|
||||
|
||||
if (avctx->color_range != AVCOL_RANGE_UNSPECIFIED)
|
||||
param->color_range = avctx->color_range == AVCOL_RANGE_JPEG;
|
||||
else
|
||||
param->color_range = !!(desc->flags & AV_PIX_FMT_FLAG_RGB);
|
||||
|
||||
if (avctx->profile != FF_PROFILE_UNKNOWN)
|
||||
param->profile = avctx->profile;
|
||||
|
||||
if (avctx->level != FF_LEVEL_UNKNOWN)
|
||||
param->level = avctx->level;
|
||||
|
||||
if ((param->encoder_color_format == EB_YUV422 || param->encoder_bit_depth > 10)
|
||||
&& param->profile != FF_PROFILE_AV1_PROFESSIONAL ) {
|
||||
av_log(avctx, AV_LOG_WARNING, "Forcing Professional profile\n");
|
||||
@ -253,25 +270,7 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param,
|
||||
param->profile = FF_PROFILE_AV1_HIGH;
|
||||
}
|
||||
|
||||
if (avctx->gop_size > 0)
|
||||
param->intra_period_length = avctx->gop_size - 1;
|
||||
|
||||
if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
|
||||
param->frame_rate_numerator = avctx->framerate.num;
|
||||
param->frame_rate_denominator = avctx->framerate.den;
|
||||
} else {
|
||||
param->frame_rate_numerator = avctx->time_base.den;
|
||||
param->frame_rate_denominator = avctx->time_base.num * avctx->ticks_per_frame;
|
||||
}
|
||||
|
||||
avctx->bit_rate = param->target_bit_rate;
|
||||
if (avctx->bit_rate) {
|
||||
param->max_qp_allowed = avctx->qmax;
|
||||
param->min_qp_allowed = avctx->qmin;
|
||||
}
|
||||
|
||||
/* 2 = IDR, closed GOP, 1 = CRA, open GOP */
|
||||
param->intra_refresh_type = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP ? 2 : 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user