mirror of https://git.ffmpeg.org/ffmpeg.git
vaapi_encode: Clean up the encode quality configuration
This commit is contained in:
parent
95f6f7b704
commit
ac31d84506
|
@ -1387,6 +1387,51 @@ static av_cold int vaapi_encode_init_rate_control(AVCodecContext *avctx)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static av_cold int vaapi_encode_init_quality(AVCodecContext *avctx)
|
||||||
|
{
|
||||||
|
#if VA_CHECK_VERSION(0, 36, 0)
|
||||||
|
VAAPIEncodeContext *ctx = avctx->priv_data;
|
||||||
|
VAStatus vas;
|
||||||
|
VAConfigAttrib attr = { VAConfigAttribEncQualityRange };
|
||||||
|
int quality = avctx->compression_level;
|
||||||
|
|
||||||
|
vas = vaGetConfigAttributes(ctx->hwctx->display,
|
||||||
|
ctx->va_profile,
|
||||||
|
ctx->va_entrypoint,
|
||||||
|
&attr, 1);
|
||||||
|
if (vas != VA_STATUS_SUCCESS) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "Failed to query quality "
|
||||||
|
"config attribute: %d (%s).\n", vas, vaErrorStr(vas));
|
||||||
|
return AVERROR_EXTERNAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attr.value == VA_ATTRIB_NOT_SUPPORTED) {
|
||||||
|
if (quality != 0) {
|
||||||
|
av_log(avctx, AV_LOG_WARNING, "Quality attribute is not "
|
||||||
|
"supported: will use default quality level.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (quality > attr.value) {
|
||||||
|
av_log(avctx, AV_LOG_WARNING, "Invalid quality level: "
|
||||||
|
"valid range is 0-%d, using %d.\n",
|
||||||
|
attr.value, attr.value);
|
||||||
|
quality = attr.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->quality_params.misc.type = VAEncMiscParameterTypeQualityLevel;
|
||||||
|
ctx->quality_params.quality.quality_level = quality;
|
||||||
|
|
||||||
|
vaapi_encode_add_global_param(avctx, &ctx->quality_params.misc,
|
||||||
|
sizeof(ctx->quality_params));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
av_log(avctx, AV_LOG_WARNING, "The encode quality option is "
|
||||||
|
"not supported with this VAAPI version.\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void vaapi_encode_free_output_buffer(void *opaque,
|
static void vaapi_encode_free_output_buffer(void *opaque,
|
||||||
uint8_t *data)
|
uint8_t *data)
|
||||||
{
|
{
|
||||||
|
@ -1568,6 +1613,12 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
if (avctx->compression_level >= 0) {
|
||||||
|
err = vaapi_encode_init_quality(avctx);
|
||||||
|
if (err < 0)
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
vas = vaCreateConfig(ctx->hwctx->display,
|
vas = vaCreateConfig(ctx->hwctx->display,
|
||||||
ctx->va_profile, ctx->va_entrypoint,
|
ctx->va_profile, ctx->va_entrypoint,
|
||||||
ctx->config_attributes, ctx->nb_config_attributes,
|
ctx->config_attributes, ctx->nb_config_attributes,
|
||||||
|
@ -1617,39 +1668,6 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avctx->compression_level >= 0) {
|
|
||||||
#if VA_CHECK_VERSION(0, 36, 0)
|
|
||||||
VAConfigAttrib attr = { VAConfigAttribEncQualityRange };
|
|
||||||
|
|
||||||
vas = vaGetConfigAttributes(ctx->hwctx->display,
|
|
||||||
ctx->va_profile,
|
|
||||||
ctx->va_entrypoint,
|
|
||||||
&attr, 1);
|
|
||||||
if (vas != VA_STATUS_SUCCESS) {
|
|
||||||
av_log(avctx, AV_LOG_WARNING, "Failed to query quality "
|
|
||||||
"attribute: will use default compression level.\n");
|
|
||||||
} else {
|
|
||||||
if (avctx->compression_level > attr.value) {
|
|
||||||
av_log(avctx, AV_LOG_WARNING, "Invalid compression "
|
|
||||||
"level: valid range is 0-%d, using %d.\n",
|
|
||||||
attr.value, attr.value);
|
|
||||||
avctx->compression_level = attr.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->quality_params.misc.type =
|
|
||||||
VAEncMiscParameterTypeQualityLevel;
|
|
||||||
ctx->quality_params.quality.quality_level =
|
|
||||||
avctx->compression_level;
|
|
||||||
|
|
||||||
vaapi_encode_add_global_param(avctx, &ctx->quality_params.misc,
|
|
||||||
sizeof(ctx->quality_params));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
av_log(avctx, AV_LOG_WARNING, "The encode compression level "
|
|
||||||
"option is not supported with this VAAPI version.\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->input_order = 0;
|
ctx->input_order = 0;
|
||||||
ctx->output_delay = avctx->max_b_frames;
|
ctx->output_delay = avctx->max_b_frames;
|
||||||
ctx->decode_delay = 1;
|
ctx->decode_delay = 1;
|
||||||
|
|
|
@ -831,9 +831,6 @@ static av_cold int vaapi_encode_h264_configure(AVCodecContext *avctx)
|
||||||
av_assert0(0 && "Invalid RC mode.");
|
av_assert0(0 && "Invalid RC mode.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avctx->compression_level == FF_COMPRESSION_DEFAULT)
|
|
||||||
avctx->compression_level = priv->quality;
|
|
||||||
|
|
||||||
if (priv->sei & SEI_IDENTIFIER) {
|
if (priv->sei & SEI_IDENTIFIER) {
|
||||||
const char *lavc = LIBAVCODEC_IDENT;
|
const char *lavc = LIBAVCODEC_IDENT;
|
||||||
const char *vaapi = VA_VERSION_S;
|
const char *vaapi = VA_VERSION_S;
|
||||||
|
@ -907,6 +904,8 @@ static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
|
||||||
avctx->profile = priv->profile;
|
avctx->profile = priv->profile;
|
||||||
if (avctx->level == FF_LEVEL_UNKNOWN)
|
if (avctx->level == FF_LEVEL_UNKNOWN)
|
||||||
avctx->level = priv->level;
|
avctx->level = priv->level;
|
||||||
|
if (avctx->compression_level == FF_COMPRESSION_DEFAULT)
|
||||||
|
avctx->compression_level = priv->quality;
|
||||||
|
|
||||||
// Reject unsupported profiles.
|
// Reject unsupported profiles.
|
||||||
switch (avctx->profile) {
|
switch (avctx->profile) {
|
||||||
|
@ -972,7 +971,7 @@ static const AVOption vaapi_encode_h264_options[] = {
|
||||||
{ "qp", "Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
|
{ "qp", "Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
|
||||||
OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 20 }, 0, 52, FLAGS },
|
OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 20 }, 0, 52, FLAGS },
|
||||||
{ "quality", "Set encode quality (trades off against speed, higher is faster)",
|
{ "quality", "Set encode quality (trades off against speed, higher is faster)",
|
||||||
OFFSET(quality), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 8, FLAGS },
|
OFFSET(quality), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, FLAGS },
|
||||||
{ "coder", "Entropy coder type",
|
{ "coder", "Entropy coder type",
|
||||||
OFFSET(coder), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, FLAGS, "coder" },
|
OFFSET(coder), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, FLAGS, "coder" },
|
||||||
{ "cavlc", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS, "coder" },
|
{ "cavlc", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, FLAGS, "coder" },
|
||||||
|
|
Loading…
Reference in New Issue