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:
James Almer 2022-03-27 20:06:51 -03:00
parent cd96211ace
commit e3c4442b24

View File

@ -178,6 +178,9 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param,
param->rate_control_mode = 1; param->rate_control_mode = 1;
else else
param->rate_control_mode = 2; 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->max_bit_rate = avctx->rc_max_rate;
param->vbv_bufsize = avctx->rc_buffer_size; param->vbv_bufsize = avctx->rc_buffer_size;
@ -191,6 +194,37 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param,
param->enable_adaptive_quantization = 0; 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) #if SVT_AV1_CHECK_VERSION(0, 9, 1)
while ((en = av_dict_get(svt_enc->svtav1_opts, "", en, AV_DICT_IGNORE_SUFFIX))) { 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); 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_width = avctx->width;
param->source_height = avctx->height; param->source_height = avctx->height;
desc = av_pix_fmt_desc_get(avctx->pix_fmt);
param->encoder_bit_depth = desc->comp[0].depth; param->encoder_bit_depth = desc->comp[0].depth;
if (desc->log2_chroma_w == 1 && desc->log2_chroma_h == 1) 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); 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) if ((param->encoder_color_format == EB_YUV422 || param->encoder_bit_depth > 10)
&& param->profile != FF_PROFILE_AV1_PROFESSIONAL ) { && param->profile != FF_PROFILE_AV1_PROFESSIONAL ) {
av_log(avctx, AV_LOG_WARNING, "Forcing Professional profile\n"); 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; 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; 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; return 0;
} }