[FFmpeg-devel] [PATCH, v4] lavc/qsvenc: add VDENC support for H264

Li, Zhong zhong.li at intel.com
Thu Nov 29 06:35:44 EET 2018


> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> Of Linjie Fu
> Sent: Wednesday, November 28, 2018 12:45 PM
> To: ffmpeg-devel at ffmpeg.org
> Cc: Fu, Linjie <linjie.fu at intel.com>
> Subject: [FFmpeg-devel] [PATCH,v4] lavc/qsvenc: add VDENC support for
> H264
> 
> Add VDENC(lowpower mode) support for QSV H264
> 
> It's an experimental function(like lowpower in vaapi) with some limitations:
> - CBR/VBR require HuC which should be explicitly loaded via i915 module
> parameter(i915.enable_guc=2 for linux kernel version >= 4.16)
> 
> Use option "-low_power 1" to enable VDENC.
> Add in dump_video_param() to show the status of VDENC in runtime log.
> 
> Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> ---
> [v2]: modified the commit message and option comments, use
> AV_OPT_TYPE_BOOL to replace AV_OPT_TYPE_INT.
> [v3]: enable H264 VDENC separately.
> [v4]: Add in dump_video_param to show the status of VDENC in runtime log.
> 
>  libavcodec/qsvenc.c      | 11 +++++++++++
>  libavcodec/qsvenc.h      |  2 ++
>  libavcodec/qsvenc_h264.c |  3 +++
>  3 files changed, 16 insertions(+)
> 
> diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index
> 948751daf4..42804e68af 100644
> --- a/libavcodec/qsvenc.c
> +++ b/libavcodec/qsvenc.c
> @@ -226,6 +226,14 @@ static void dump_video_param(AVCodecContext
> *avctx, QSVEncContext *q,
>      av_log(avctx, AV_LOG_VERBOSE, "\n");  #endif
> 
> +#if QSV_HAVE_VDENC
> +    av_log(avctx, AV_LOG_VERBOSE, "VDENC: ");
> +    if (info->LowPower == MFX_CODINGOPTION_ON)
> +        av_log(avctx, AV_LOG_VERBOSE, "ON\n");
> +    else
> +        av_log(avctx, AV_LOG_VERBOSE, "OFF\n"); #endif

print_threestate() can be used to print libmfx option strings.
print_threestate(co->RateDistortionOpt) is an example.

> +
>  #if QSV_VERSION_ATLEAST(1, 8)
>      av_log(avctx, AV_LOG_VERBOSE,
>             "RepeatPPS: %s; NumMbPerSlice: %"PRIu16"; LookAheadDS: ",
> @@ -464,6 +472,9 @@ static int init_video_param(AVCodecContext *avctx,
> QSVEncContext *q)
>          }
>      }
> 
> +#if QSV_HAVE_VDENC
> +    q->param.mfx.LowPower           = q->low_power ?
> MFX_CODINGOPTION_ON:MFX_CODINGOPTION_OFF;
> +#endif
>      q->param.mfx.CodecProfile       = q->profile;
>      q->param.mfx.TargetUsage        = avctx->compression_level;
>      q->param.mfx.GopPicSize         = FFMAX(0, avctx->gop_size);
> diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h index
> 50cc4267e7..a396aa7d3f 100644
> --- a/libavcodec/qsvenc.h
> +++ b/libavcodec/qsvenc.h
> @@ -44,6 +44,7 @@
>  #define QSV_HAVE_LA     QSV_VERSION_ATLEAST(1, 7)
>  #define QSV_HAVE_LA_DS  QSV_VERSION_ATLEAST(1, 8)  #define
> QSV_HAVE_LA_HRD QSV_VERSION_ATLEAST(1, 11)
> +#define QSV_HAVE_VDENC  QSV_VERSION_ATLEAST(1, 15)
> 
>  #if defined(_WIN32) || defined(__CYGWIN__)
>  #define QSV_HAVE_AVBR   QSV_VERSION_ATLEAST(1, 3)
> @@ -162,6 +163,7 @@ typedef struct QSVEncContext {
>      int recovery_point_sei;
> 
>      int a53_cc;
> +    int low_power;
> 
>  #if QSV_HAVE_MF
>      int mfmode;
> diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c index
> 07c9d64e6b..40071d805a 100644
> --- a/libavcodec/qsvenc_h264.c
> +++ b/libavcodec/qsvenc_h264.c
> @@ -153,6 +153,9 @@ static const AVOption options[] = {
>      { "off"    , NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> MFX_MF_DISABLED }, INT_MIN, INT_MAX,     VE, "mfmode" },
>      { "auto"   , NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> MFX_MF_AUTO     }, INT_MIN, INT_MAX,     VE, "mfmode" },
>  #endif
> +#if QSV_HAVE_VDENC
> +    { "low_power", "enable low power mode(experimental: many
> +limitations by mfx version, BRC modes, etc.)", OFFSET(qsv.low_power),
> +AV_OPT_TYPE_BOOL, { .i64 =  0 }, 0, 1, VE}, #endif
> 
>      { NULL },
>  };
> --
> 2.17.1

The reset LGTM



More information about the ffmpeg-devel mailing list