Module: libav Branch: master Commit: 19388a7200e5d99c703271f05dba1c806720e808
Author: Mark Thompson <s...@jkqxz.net> Committer: Mark Thompson <s...@jkqxz.net> Date: Sun Apr 30 19:27:54 2017 +0100 vaapi_encode: Move quality option to common code Use AVCodecContext.compression_level rather than a private option, replacing the H.264-specific quality option (which stays only for compatibility). This now works with the H.265 encoder in the i965 driver, as well as the existing cases with the H.264 encoder. --- doc/encoders.texi | 9 ++++++--- libavcodec/vaapi_encode.c | 35 +++++++++++++++++++++++++++++++++++ libavcodec/vaapi_encode.h | 6 ++++++ libavcodec/vaapi_encode_h264.c | 25 ++----------------------- 4 files changed, 49 insertions(+), 26 deletions(-) diff --git a/doc/encoders.texi b/doc/encoders.texi index 7cebe39..c369e03 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -948,7 +948,13 @@ The following standard libavcodec options are used: @item @option{rc_init_occupancy} / @option{rc_initial_buffer_occupancy} @item +@option{compression_level} + +Speed / quality tradeoff: higher values are faster / worse quality. +@item @option{q} / @option{global_quality} + +Size / quality tradeoff: higher values are smaller / worse quality. @item @option{qmin} (only: @option{qmax} is not supported) @@ -969,9 +975,6 @@ The following standard libavcodec options are used: @option{level} sets the value of @emph{level_idc}. @table @option -@item quality -Set the local encoding quality/speed tradeoff (range 1-8, higher values are faster; not all -systems implement all levels). @item low_power Use low-power encoding mode. @end table diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index 6205184..462ec7a 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -1423,6 +1423,41 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx) 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; + + ctx->global_params[ctx->nb_global_params] = + &ctx->quality_params.misc; + ctx->global_params_size[ctx->nb_global_params++] = + 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->output_delay = avctx->max_b_frames; ctx->decode_delay = 1; diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index fc62365..1b0fed8 100644 --- a/libavcodec/vaapi_encode.h +++ b/libavcodec/vaapi_encode.h @@ -159,6 +159,12 @@ typedef struct VAAPIEncodeContext { VAEncMiscParameterBuffer misc; VAEncMiscParameterFrameRate fr; } fr_params; +#if VA_CHECK_VERSION(0, 36, 0) + struct { + VAEncMiscParameterBuffer misc; + VAEncMiscParameterBufferQualityLevel quality; + } quality_params; +#endif // Per-sequence parameter structure (VAEncSequenceParameterBuffer*). void *codec_sequence_params; diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c index 7583a20..e08cf61 100644 --- a/libavcodec/vaapi_encode_h264.c +++ b/libavcodec/vaapi_encode_h264.c @@ -154,14 +154,6 @@ typedef struct VAAPIEncodeH264Context { // Rate control configuration. int send_timing_sei; - -#if VA_CHECK_VERSION(0, 36, 0) - // Speed-quality tradeoff setting. - struct { - VAEncMiscParameterBuffer misc; - VAEncMiscParameterBufferQualityLevel quality; - } quality_params; -#endif } VAAPIEncodeH264Context; typedef struct VAAPIEncodeH264Options { @@ -1141,21 +1133,8 @@ static av_cold int vaapi_encode_h264_configure(AVCodecContext *avctx) av_assert0(0 && "Invalid RC mode."); } - if (opt->quality > 0) { -#if VA_CHECK_VERSION(0, 36, 0) - priv->quality_params.misc.type = - VAEncMiscParameterTypeQualityLevel; - priv->quality_params.quality.quality_level = opt->quality; - - ctx->global_params[ctx->nb_global_params] = - &priv->quality_params.misc; - ctx->global_params_size[ctx->nb_global_params++] = - sizeof(priv->quality_params); -#else - av_log(avctx, AV_LOG_WARNING, "The encode quality option is not " - "supported with this VAAPI version.\n"); -#endif - } + if (avctx->compression_level == FF_COMPRESSION_DEFAULT) + avctx->compression_level = opt->quality; return 0; } _______________________________________________ libav-commits mailing list libav-commits@libav.org https://lists.libav.org/mailman/listinfo/libav-commits