[FFmpeg-devel] [PATCH, v2] lavc/vaapi_encode: add support for AVC Trellis
Fu, Linjie
linjie.fu at intel.com
Mon Jun 17 08:47:24 EEST 2019
> -----Original Message-----
> From: mypopy at gmail.com [mailto:mypopy at gmail.com]
> Sent: Wednesday, June 12, 2019 16:14
> To: FFmpeg development discussions and patches <ffmpeg-
> devel at ffmpeg.org>
> Cc: Fu, Linjie <linjie.fu at intel.com>
> Subject: Re: [FFmpeg-devel] [PATCH, v2] lavc/vaapi_encode: add support for
> AVC Trellis
>
> On Wed, Jun 12, 2019 at 3:28 PM Linjie Fu <linjie.fu at intel.com> wrote:
> >
> > Add support for VAAPI AVC Trellis Quantization with limitation:
> > - VA-API version >= (1, 0, 0)
> >
> > Use option "-trellis off/I/P/B" to disable or enable Trellis
> > quantization for I/P/B frames.
> >
> > Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> > ---
> > [v2]: Since nonstandard struct for VAEncMiscParameterQuantization is
> > fixed: https://github.com/intel/libva/issues/265
> > update patch based on:
> >
> http://git.ffmpeg.org/gitweb/ffmpeg.git/commit/2880a32c668023bfee47450
> 95c885450d547ae45
> > libavcodec/vaapi_encode.c | 48
> ++++++++++++++++++++++++++++++++++
> > libavcodec/vaapi_encode.h | 9 +++++--
> > libavcodec/vaapi_encode_h264.c | 9 +++++++
> > 3 files changed, 64 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
> > index dd2a24de04..fbfbe78c6b 100644
> > --- a/libavcodec/vaapi_encode.c
> > +++ b/libavcodec/vaapi_encode.c
> > @@ -1671,6 +1671,48 @@ rc_mode_found:
> > return 0;
> > }
> >
> > +static av_cold int vaapi_encode_init_quantization(AVCodecContext
> *avctx)
> > +{
> > +#if VA_CHECK_VERSION(1, 0, 0)
> > + VAAPIEncodeContext *ctx = avctx->priv_data;
> > + VAStatus vas;
> > + VAConfigAttrib attr = { VAConfigAttribEncQuantization };
> > + int trellis = ctx->trellis;
> > +
> > + 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 quantization "
> > + "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
> > + return AVERROR_EXTERNAL;
> > + }
> > +
> > + if (attr.value == VA_ATTRIB_NOT_SUPPORTED ||
> > + attr.value == VA_ENC_QUANTIZATION_NONE) {
> > + av_log(avctx, AV_LOG_WARNING, "Special Quantization attribute is
> not "
> > + "supported: will use default quantization.\n");
> > + } else if (attr.value == VA_ENC_QUANTIZATION_TRELLIS_SUPPORTED){
> > + av_log(avctx, AV_LOG_VERBOSE, "Quantization Trellis supported.\n");
> > +
> > + ctx->quantization_params = (VAEncMiscParameterQuantization) {
> > + .quantization_flags.value = trellis,
> > + };
> > +
> > + vaapi_encode_add_global_param(avctx,
> > + VAEncMiscParameterTypeQuantization,
> > + &ctx->quantization_params,
> > + sizeof(ctx->quantization_params));
> > + }
> > +#else
> > + av_log(avctx, AV_LOG_WARNING, "The encode quantization option
> (Trellis) is "
> > + "not supported with this VAAPI version.\n");
> > +#endif
> > +
> > + return 0;
> > +}
> > +
> > static av_cold int vaapi_encode_init_gop_structure(AVCodecContext
> *avctx)
> > {
> > VAAPIEncodeContext *ctx = avctx->priv_data;
> > @@ -2132,6 +2174,12 @@ av_cold int
> ff_vaapi_encode_init(AVCodecContext *avctx)
> > if (err < 0)
> > goto fail;
> >
> > + if (ctx->trellis) {
> > + err = vaapi_encode_init_quantization(avctx);
> > + if (err < 0)
> > + goto fail;
> > + }
> > +
> > if (avctx->compression_level >= 0) {
> > err = vaapi_encode_init_quality(avctx);
> > if (err < 0)
> > diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
> > index eeec06036b..b24735da59 100644
> > --- a/libavcodec/vaapi_encode.h
> > +++ b/libavcodec/vaapi_encode.h
> > @@ -37,7 +37,7 @@ struct VAAPIEncodePicture;
> >
> > enum {
> > MAX_CONFIG_ATTRIBUTES = 4,
> > - MAX_GLOBAL_PARAMS = 4,
> > + MAX_GLOBAL_PARAMS = 5,
> > MAX_DPB_SIZE = 16,
> > MAX_PICTURE_REFERENCES = 2,
> > MAX_REORDER_DELAY = 16,
> > @@ -220,6 +220,9 @@ typedef struct VAAPIEncodeContext {
> > // Packed headers which will actually be sent.
> > unsigned int va_packed_headers;
> >
> > + // Quantization mode
> > + int trellis;
> > +
> > // Configuration attributes to use when creating va_config.
> > VAConfigAttrib config_attributes[MAX_CONFIG_ATTRIBUTES];
> > int nb_config_attributes;
> > @@ -256,7 +259,9 @@ typedef struct VAAPIEncodeContext {
> > #if VA_CHECK_VERSION(0, 36, 0)
> > VAEncMiscParameterBufferQualityLevel quality_params;
> > #endif
> > -
> > +#if VA_CHECK_VERSION(1, 0, 0)
> > + VAEncMiscParameterQuantization quantization_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 d1427112ea..427fb6320e 100644
> > --- a/libavcodec/vaapi_encode_h264.c
> > +++ b/libavcodec/vaapi_encode_h264.c
> > @@ -72,6 +72,7 @@ typedef struct VAAPIEncodeH264Context {
> > int sei;
> > int profile;
> > int level;
> > + int trellis;
> >
> > // Derived settings.
> > int mb_width;
> > @@ -1233,6 +1234,8 @@ static av_cold int
> vaapi_encode_h264_init(AVCodecContext *avctx)
> > if (priv->qp > 0)
> > ctx->explicit_qp = priv->qp;
> >
> > + ctx->trellis = priv->trellis;
> > +
> > return ff_vaapi_encode_init(avctx);
> > }
> >
> > @@ -1263,6 +1266,12 @@ static const AVOption
> vaapi_encode_h264_options[] = {
> > { "cabac", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN,
> INT_MAX, FLAGS, "coder" },
> > { "vlc", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN,
> INT_MAX, FLAGS, "coder" },
> > { "ac", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN,
> INT_MAX, FLAGS, "coder" },
> > + { "trellis", "Trellis Quantization",
> > + OFFSET(trellis), AV_OPT_TYPE_FLAGS, { .i64 = 0}, 0, INT_MAX, FLAGS,
> "trellis"},
> > + { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN,
> INT_MAX, FLAGS, "trellis"},
> > + { "I", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, INT_MIN,
> INT_MAX, FLAGS, "trellis"},
> > + { "P", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 4 }, INT_MIN,
> INT_MAX, FLAGS, "trellis"},
> > + { "B", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 8 }, INT_MIN,
> INT_MAX, FLAGS, "trellis"},
> >
> > { "aud", "Include AUD",
> > OFFSET(aud), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
> > --
> > 2.17.1
> >
>
> Do you test this function for this feature with the other
> options/features, as I know, this feature have some limitation, I
> believe is a hardware or driver limitation, and we enable this
> features about 2 years ago, but didn't submit the patch because the
> limitation
Thanks for the remind, I’ve no idea about previous patches on trellis, which is
not mentioned in the forked ffmpeg repo when I take this task.
> Some question:
> 1. How is the impact on encoder performance and image quality?
Enabling trellis will gain better quality in the low QP range.
During my test, enable trellis can increase ~1% quality (PSNR).
Please feel free let me know if you have any concerns to offer this option within spec and increasing the quality.
> 2. What's the limitation with the other VA-API features?
As far as I know, Quality gain is QP dependent, with lower QP value, we could see higher quality gain.
In BRC mode, it might be disabled, but I haven't noticed this during my test.
We have the daily CI to ensure ffmpeg-vaaapi/qsv mainline quality, and pre-patch check-in service in github to ensure our patches quality. And I already pass the pre-checkin
> 3. Missed the docs
Will add docs.
Thanks,
Linjie
More information about the ffmpeg-devel
mailing list