[FFmpeg-devel] [PATCH] avcodec/qsvenc: add VDENC support for H264 and HEVC

Fu, Linjie linjie.fu at intel.com
Mon Nov 5 03:31:48 EET 2018


> -----Original Message-----
> From: Li, Zhong
> Sent: Thursday, November 1, 2018 15:16
> To: FFmpeg development discussions and patches <ffmpeg-
> devel at ffmpeg.org>
> Cc: Fu, Linjie <linjie.fu at intel.com>
> Subject: RE: [FFmpeg-devel] [PATCH] avcodec/qsvenc: add VDENC support
> for H264 and HEVC
> 
> > From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On
> Behalf
> > Of Linjie Fu
> > Sent: Thursday, November 1, 2018 10:59 AM
> > To: ffmpeg-devel at ffmpeg.org
> > Cc: Fu, Linjie <linjie.fu at intel.com>
> > Subject: [FFmpeg-devel] [PATCH] avcodec/qsvenc: add VDENC support for
> > H264 and HEVC
> >
> > Add VDENC(lowpower mode) support for QSV h264 and HEVC with the
> > limitation of MSDK API verion greater than 1.15.
> 
> Should be "version", not "verion"
> IMHO, API version limitation is not necessary in the commit message since it
> is quite clear in the code
> 
> >
> > 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 >=4.16)
> 
> 4.16 is not a clear message, should be Linux kernel version >= 4.16.
> 
> > - HEVC VDENC was supported >= ICE LAKE
> >
> > use option "-low_power 1" to enable VDENC.
> >
> > Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> > ---
> >  libavcodec/qsvenc.c      | 3 +++
> >  libavcodec/qsvenc.h      | 2 ++
> >  libavcodec/qsvenc_h264.c | 3 +++
> >  libavcodec/qsvenc_hevc.c | 3 +++
> >  4 files changed, 11 insertions(+)
> >
> > diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index
> > 948751daf4..7a031297fe 100644
> > --- a/libavcodec/qsvenc.c
> > +++ b/libavcodec/qsvenc.c
> > @@ -464,6 +464,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..483faf832b 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",  "low power mode for encoder h264_qsv",
> 
> Since it is a h264_qsv private option, it is no need to add the comment "for
> encoder h264_qsv "
> I prefer "enable low power mode (experimental, many limitations by mfx
> version, HW platform, BRC modes, etc.)"
> 
> > OFFSET(qsv.low_power),      AV_OPT_TYPE_INT, { .i64 =  0 },     0,
> > 1, VE },
> 
> Should be AV_OPT_TYPE_BOOL.
> 
> > +#endif
> >
> >      { NULL },
> >  };
> > diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c index
> > 4339b316a3..cfe3674f0f 100644
> > --- a/libavcodec/qsvenc_hevc.c
> > +++ b/libavcodec/qsvenc_hevc.c
> > @@ -243,6 +243,9 @@ static const AVOption options[] = {
> >      { "main",    NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> > MFX_PROFILE_HEVC_MAIN    }, INT_MIN, INT_MAX,     VE, "profile" },
> >      { "main10",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> > MFX_PROFILE_HEVC_MAIN10  }, INT_MIN, INT_MAX,     VE, "profile" },
> >      { "mainsp",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> > MFX_PROFILE_HEVC_MAINSP  }, INT_MIN, INT_MAX,     VE, "profile" },
> > +#if QSV_HAVE_VDENC
> > +    { "low_power", "low power mode for encoder hevc_qsv",
> > +OFFSET(qsv.low_power), AV_OPT_TYPE_INT, { .i64 =  0 },  0,  1, VE },
> > +#endif
> 
> Should be AV_OPT_TYPE_BOOL as above.
> 
> >
> >      { NULL },
> >  };
> > --
> > 2.17.1

Thanks for the comments, and I modified the patch as suggestions. 
Will send a [V2] patch. 


More information about the ffmpeg-devel mailing list