Message ID | 20181101025838.6839-1-linjie.fu@intel.com |
---|---|
State | Superseded |
Headers | show |
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf > Of Linjie Fu > Sent: Thursday, November 1, 2018 10:59 AM > To: ffmpeg-devel@ffmpeg.org > Cc: Fu, Linjie <linjie.fu@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@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
> -----Original Message----- > From: Li, Zhong > Sent: Thursday, November 1, 2018 15:16 > To: FFmpeg development discussions and patches <ffmpeg- > devel@ffmpeg.org> > Cc: Fu, Linjie <linjie.fu@intel.com> > Subject: RE: [FFmpeg-devel] [PATCH] avcodec/qsvenc: add VDENC support > for H264 and HEVC > > > From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On > Behalf > > Of Linjie Fu > > Sent: Thursday, November 1, 2018 10:59 AM > > To: ffmpeg-devel@ffmpeg.org > > Cc: Fu, Linjie <linjie.fu@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@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.
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", OFFSET(qsv.low_power), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, +#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 { NULL }, };
Add VDENC(lowpower mode) support for QSV h264 and HEVC with the limitation of MSDK API verion greater than 1.15. 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) - HEVC VDENC was supported >= ICE LAKE use option "-low_power 1" to enable VDENC. Signed-off-by: Linjie Fu <linjie.fu@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(+)