summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2022-03-27 20:06:51 -0300
committerJames Almer <jamrial@gmail.com>2022-04-07 12:15:39 -0300
commite3c4442b249acde1d50e7b0deb3422141c6248d8 (patch)
tree73fe099d15f95cbdaf442e042cfbd822802bc96d
parentcd96211ace22224e27d00ed8bf92955e48ebff73 (diff)
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>
-rw-r--r--libavcodec/libsvtav1.c69
1 files changed, 34 insertions, 35 deletions
diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c
index 7db789be5e..2e3d96ce37 100644
--- a/libavcodec/libsvtav1.c
+++ b/libavcodec/libsvtav1.c
@@ -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;
}