* [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize
@ 2022-05-05 9:07 Fei Wang
2022-05-05 9:07 ` [FFmpeg-devel] [PATCH v7 2/2] doc/vaapi_encode: add documentations for max_frame_size Fei Wang
2022-05-23 2:14 ` [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize Wang, Fei W
0 siblings, 2 replies; 5+ messages in thread
From: Fei Wang @ 2022-05-05 9:07 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Fei Wang, Linjie Fu
From: Linjie Fu <linjie.fu@intel.com>
Add support for max frame size:
- max_frame_size (bytes) to indicate the max allowed size for frame.
Control each encoded frame size into target limitation size by adjusting
whole frame's average QP value. The driver will use multi passes to
adjust average QP setp by step to achieve the target, and the result
may not strictly guaranteed. Frame size may exceed target alone with
using the maximum average QP value. The failure always happens on the
intra(especially the first intra frame of a new GOP) frames or set
max_frame_size with a very small number.
example cmdline:
ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -f rawvideo \
-v verbose -s:v 352x288 -i ./input.yuv -vf format=nv12,hwupload \
-c:v h264_vaapi -profile:v main -g 30 -rc_mode VBR -b:v 500k \
-bf 3 -max_frame_size 40000 -vframes 100 -y ./max_frame_size.h264
Max frame size was enabled since VA-API version (0, 33, 0), but query
is available since (1, 5, 0). It will be passed as a parameter in picParam
and should be set for each frame.
Signed-off-by: Linjie Fu <linjie.fu@intel.com>
Signed-off-by: Fei Wang <fei.w.wang@intel.com>
---
update:
1. return error when fail to set max frame size.
2. refine commit and debug message.
libavcodec/vaapi_encode.c | 74 +++++++++++++++++++++++++++++++++++++++
libavcodec/vaapi_encode.h | 10 +++++-
2 files changed, 83 insertions(+), 1 deletion(-)
diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index 0e2f5ed447..284ce29888 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -365,6 +365,17 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
goto fail;
}
+#if VA_CHECK_VERSION(1, 5, 0)
+ if (ctx->max_frame_size) {
+ err = vaapi_encode_make_misc_param_buffer(avctx, pic,
+ VAEncMiscParameterTypeMaxFrameSize,
+ &ctx->mfs_params,
+ sizeof(ctx->mfs_params));
+ if (err < 0)
+ goto fail;
+ }
+#endif
+
if (pic->type == PICTURE_TYPE_IDR) {
if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE &&
ctx->codec->write_sequence_header) {
@@ -1869,6 +1880,63 @@ rc_mode_found:
return 0;
}
+static av_cold int vaapi_encode_init_max_frame_size(AVCodecContext *avctx)
+{
+#if VA_CHECK_VERSION(1, 5, 0)
+ VAAPIEncodeContext *ctx = avctx->priv_data;
+ VAConfigAttrib attr = { VAConfigAttribMaxFrameSize };
+ VAStatus vas;
+
+ if (ctx->va_rc_mode == VA_RC_CQP) {
+ ctx->max_frame_size = 0;
+ av_log(avctx, AV_LOG_ERROR, "Max frame size is invalid in CQP rate "
+ "control mode.\n");
+ return AVERROR(EINVAL);
+ }
+
+ vas = vaGetConfigAttributes(ctx->hwctx->display,
+ ctx->va_profile,
+ ctx->va_entrypoint,
+ &attr, 1);
+ if (vas != VA_STATUS_SUCCESS) {
+ ctx->max_frame_size = 0;
+ av_log(avctx, AV_LOG_ERROR, "Failed to query max frame size "
+ "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
+ return AVERROR_EXTERNAL;
+ }
+
+ if (attr.value == VA_ATTRIB_NOT_SUPPORTED) {
+ ctx->max_frame_size = 0;
+ av_log(avctx, AV_LOG_ERROR, "Max frame size attribute "
+ "is not supported.\n");
+ return AVERROR(EINVAL);
+ } else {
+ VAConfigAttribValMaxFrameSize attr_mfs;
+ attr_mfs.value = attr.value;
+ // Prefer to use VAEncMiscParameterTypeMaxFrameSize for max frame size.
+ if (!attr_mfs.bits.max_frame_size && attr_mfs.bits.multiple_pass) {
+ ctx->max_frame_size = 0;
+ av_log(avctx, AV_LOG_ERROR, "Driver only supports multiple pass "
+ "max frame size which has not been implemented in FFmpeg.\n");
+ return AVERROR(EINVAL);
+ }
+
+ ctx->mfs_params = (VAEncMiscParameterBufferMaxFrameSize){
+ .max_frame_size = ctx->max_frame_size * 8,
+ };
+
+ av_log(avctx, AV_LOG_VERBOSE, "Set max frame size: %d bytes.\n",
+ ctx->max_frame_size);
+ }
+#else
+ av_log(avctx, AV_LOG_ERROR, "The max frame size option is not supported with "
+ "this VAAPI version.\n");
+ return AVERROR(EINVAL);
+#endif
+
+ return 0;
+}
+
static av_cold int vaapi_encode_init_gop_structure(AVCodecContext *avctx)
{
VAAPIEncodeContext *ctx = avctx->priv_data;
@@ -2548,6 +2616,12 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
goto fail;
}
+ if (ctx->max_frame_size) {
+ err = vaapi_encode_init_max_frame_size(avctx);
+ if (err < 0)
+ goto fail;
+ }
+
vas = vaCreateConfig(ctx->hwctx->display,
ctx->va_profile, ctx->va_entrypoint,
ctx->config_attributes, ctx->nb_config_attributes,
diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
index af0588c30b..359f954fff 100644
--- a/libavcodec/vaapi_encode.h
+++ b/libavcodec/vaapi_encode.h
@@ -191,6 +191,9 @@ typedef struct VAAPIEncodeContext {
// Desired B frame reference depth.
int desired_b_depth;
+ // Max Frame Size
+ int max_frame_size;
+
// Explicitly set RC mode (otherwise attempt to pick from
// available modes).
int explicit_rc_mode;
@@ -268,6 +271,7 @@ typedef struct VAAPIEncodeContext {
VAEncMiscParameterRateControl rc_params;
VAEncMiscParameterHRD hrd_params;
VAEncMiscParameterFrameRate fr_params;
+ VAEncMiscParameterBufferMaxFrameSize mfs_params;
#if VA_CHECK_VERSION(0, 36, 0)
VAEncMiscParameterBufferQualityLevel quality_params;
#endif
@@ -478,7 +482,11 @@ int ff_vaapi_encode_close(AVCodecContext *avctx);
"Increase this to improve single channel performance. This option " \
"doesn't work if driver doesn't implement vaSyncBuffer function.", \
OFFSET(common.async_depth), AV_OPT_TYPE_INT, \
- { .i64 = 2 }, 1, MAX_ASYNC_DEPTH, FLAGS }
+ { .i64 = 2 }, 1, MAX_ASYNC_DEPTH, FLAGS }, \
+ { "max_frame_size", \
+ "Maximum frame size (in bytes)",\
+ OFFSET(common.max_frame_size), AV_OPT_TYPE_INT, \
+ { .i64 = 0 }, 0, INT_MAX, FLAGS }
#define VAAPI_ENCODE_RC_MODE(name, desc) \
{ #name, desc, 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_ ## name }, \
--
2.25.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* [FFmpeg-devel] [PATCH v7 2/2] doc/vaapi_encode: add documentations for max_frame_size
2022-05-05 9:07 [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize Fei Wang
@ 2022-05-05 9:07 ` Fei Wang
2022-05-23 2:14 ` [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize Wang, Fei W
1 sibling, 0 replies; 5+ messages in thread
From: Fei Wang @ 2022-05-05 9:07 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Fei Wang, Linjie Fu
From: Linjie Fu <linjie.fu@intel.com>
Add docs for max_frame_size option.
Signed-off-by: Linjie Fu <linjie.fu@intel.com>
Signed-off-by: Fei Wang <fei.w.wang@intel.com>
---
doc/encoders.texi | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/doc/encoders.texi b/doc/encoders.texi
index 966032a720..43f6288e33 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -3665,6 +3665,11 @@ performance. This option doesn't work if driver doesn't implement vaSyncBuffer
function. Please make sure there are enough hw_frames allocated if a large
number of async_depth is used.
+@item max_frame_size
+Set the allowed max size in bytes for each frame. If the frame size exceeds
+the limitation, encoder will adjust the QP value to control the frame size.
+Invalid in CQP rate control mode.
+
@item rc_mode
Set the rate control mode to use. A given driver may only support a subset of
modes.
--
2.25.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize
2022-05-05 9:07 [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize Fei Wang
2022-05-05 9:07 ` [FFmpeg-devel] [PATCH v7 2/2] doc/vaapi_encode: add documentations for max_frame_size Fei Wang
@ 2022-05-23 2:14 ` Wang, Fei W
2022-05-30 1:27 ` Xiang, Haihao
1 sibling, 1 reply; 5+ messages in thread
From: Wang, Fei W @ 2022-05-23 2:14 UTC (permalink / raw)
To: FFmpeg development discussions and patches; +Cc: Mark Thompson, Linjie Fu
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Fei
> Wang
> Sent: Thursday, May 5, 2022 5:07 PM
> To: ffmpeg-devel@ffmpeg.org
> Cc: Wang, Fei W <fei.w.wang@intel.com>; Linjie Fu <linjie.fu@intel.com>
> Subject: [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for
> maxframesize
>
> From: Linjie Fu <linjie.fu@intel.com>
>
> Add support for max frame size:
> - max_frame_size (bytes) to indicate the max allowed size for frame.
>
> Control each encoded frame size into target limitation size by adjusting whole
> frame's average QP value. The driver will use multi passes to adjust average QP
> setp by step to achieve the target, and the result may not strictly guaranteed.
> Frame size may exceed target alone with using the maximum average QP value.
> The failure always happens on the intra(especially the first intra frame of a new
> GOP) frames or set max_frame_size with a very small number.
>
> example cmdline:
> ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -f rawvideo \
> -v verbose -s:v 352x288 -i ./input.yuv -vf format=nv12,hwupload \
> -c:v h264_vaapi -profile:v main -g 30 -rc_mode VBR -b:v 500k \
> -bf 3 -max_frame_size 40000 -vframes 100 -y ./max_frame_size.h264
>
> Max frame size was enabled since VA-API version (0, 33, 0), but query is available
> since (1, 5, 0). It will be passed as a parameter in picParam and should be set for
> each frame.
>
> Signed-off-by: Linjie Fu <linjie.fu@intel.com>
> Signed-off-by: Fei Wang <fei.w.wang@intel.com>
> ---
> update:
> 1. return error when fail to set max frame size.
> 2. refine commit and debug message.
>
> libavcodec/vaapi_encode.c | 74
> +++++++++++++++++++++++++++++++++++++++
> libavcodec/vaapi_encode.h | 10 +++++-
> 2 files changed, 83 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index
> 0e2f5ed447..284ce29888 100644
> --- a/libavcodec/vaapi_encode.c
> +++ b/libavcodec/vaapi_encode.c
> @@ -365,6 +365,17 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
> goto fail;
> }
>
> +#if VA_CHECK_VERSION(1, 5, 0)
> + if (ctx->max_frame_size) {
> + err = vaapi_encode_make_misc_param_buffer(avctx, pic,
> + VAEncMiscParameterTypeMaxFrameSize,
> + &ctx->mfs_params,
> + sizeof(ctx->mfs_params));
> + if (err < 0)
> + goto fail;
> + }
> +#endif
> +
> if (pic->type == PICTURE_TYPE_IDR) {
> if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE &&
> ctx->codec->write_sequence_header) { @@ -1869,6 +1880,63 @@
> rc_mode_found:
> return 0;
> }
>
> +static av_cold int vaapi_encode_init_max_frame_size(AVCodecContext
> +*avctx) { #if VA_CHECK_VERSION(1, 5, 0)
> + VAAPIEncodeContext *ctx = avctx->priv_data;
> + VAConfigAttrib attr = { VAConfigAttribMaxFrameSize };
> + VAStatus vas;
> +
> + if (ctx->va_rc_mode == VA_RC_CQP) {
> + ctx->max_frame_size = 0;
> + av_log(avctx, AV_LOG_ERROR, "Max frame size is invalid in CQP rate "
> + "control mode.\n");
> + return AVERROR(EINVAL);
> + }
> +
> + vas = vaGetConfigAttributes(ctx->hwctx->display,
> + ctx->va_profile,
> + ctx->va_entrypoint,
> + &attr, 1);
> + if (vas != VA_STATUS_SUCCESS) {
> + ctx->max_frame_size = 0;
> + av_log(avctx, AV_LOG_ERROR, "Failed to query max frame size "
> + "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
> + return AVERROR_EXTERNAL;
> + }
> +
> + if (attr.value == VA_ATTRIB_NOT_SUPPORTED) {
> + ctx->max_frame_size = 0;
> + av_log(avctx, AV_LOG_ERROR, "Max frame size attribute "
> + "is not supported.\n");
> + return AVERROR(EINVAL);
> + } else {
> + VAConfigAttribValMaxFrameSize attr_mfs;
> + attr_mfs.value = attr.value;
> + // Prefer to use VAEncMiscParameterTypeMaxFrameSize for max frame
> size.
> + if (!attr_mfs.bits.max_frame_size && attr_mfs.bits.multiple_pass) {
> + ctx->max_frame_size = 0;
> + av_log(avctx, AV_LOG_ERROR, "Driver only supports multiple pass "
> + "max frame size which has not been implemented in FFmpeg.\n");
> + return AVERROR(EINVAL);
> + }
> +
> + ctx->mfs_params = (VAEncMiscParameterBufferMaxFrameSize){
> + .max_frame_size = ctx->max_frame_size * 8,
> + };
> +
> + av_log(avctx, AV_LOG_VERBOSE, "Set max frame size: %d bytes.\n",
> + ctx->max_frame_size);
> + }
> +#else
> + av_log(avctx, AV_LOG_ERROR, "The max frame size option is not supported
> with "
> + "this VAAPI version.\n");
> + return AVERROR(EINVAL);
> +#endif
> +
> + return 0;
> +}
> +
> static av_cold int vaapi_encode_init_gop_structure(AVCodecContext *avctx) {
> VAAPIEncodeContext *ctx = avctx->priv_data; @@ -2548,6 +2616,12 @@
> av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
> goto fail;
> }
>
> + if (ctx->max_frame_size) {
> + err = vaapi_encode_init_max_frame_size(avctx);
> + if (err < 0)
> + goto fail;
> + }
> +
> vas = vaCreateConfig(ctx->hwctx->display,
> ctx->va_profile, ctx->va_entrypoint,
> ctx->config_attributes, ctx->nb_config_attributes, diff --git
> a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index
> af0588c30b..359f954fff 100644
> --- a/libavcodec/vaapi_encode.h
> +++ b/libavcodec/vaapi_encode.h
> @@ -191,6 +191,9 @@ typedef struct VAAPIEncodeContext {
> // Desired B frame reference depth.
> int desired_b_depth;
>
> + // Max Frame Size
> + int max_frame_size;
> +
> // Explicitly set RC mode (otherwise attempt to pick from
> // available modes).
> int explicit_rc_mode;
> @@ -268,6 +271,7 @@ typedef struct VAAPIEncodeContext {
> VAEncMiscParameterRateControl rc_params;
> VAEncMiscParameterHRD hrd_params;
> VAEncMiscParameterFrameRate fr_params;
> + VAEncMiscParameterBufferMaxFrameSize mfs_params;
> #if VA_CHECK_VERSION(0, 36, 0)
> VAEncMiscParameterBufferQualityLevel quality_params; #endif @@ -478,7
> +482,11 @@ int ff_vaapi_encode_close(AVCodecContext *avctx);
> "Increase this to improve single channel performance. This option " \
> "doesn't work if driver doesn't implement vaSyncBuffer function.", \
> OFFSET(common.async_depth), AV_OPT_TYPE_INT, \
> - { .i64 = 2 }, 1, MAX_ASYNC_DEPTH, FLAGS }
> + { .i64 = 2 }, 1, MAX_ASYNC_DEPTH, FLAGS }, \
> + { "max_frame_size", \
> + "Maximum frame size (in bytes)",\
> + OFFSET(common.max_frame_size), AV_OPT_TYPE_INT, \
> + { .i64 = 0 }, 0, INT_MAX, FLAGS }
>
> #define VAAPI_ENCODE_RC_MODE(name, desc) \
> { #name, desc, 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_ ## name }, \
> --
> 2.25.1
>
Mark, any other comment on this version? Thanks.
Thanks
Fei
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org
> with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize
2022-05-23 2:14 ` [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize Wang, Fei W
@ 2022-05-30 1:27 ` Xiang, Haihao
2022-06-06 6:16 ` Xiang, Haihao
0 siblings, 1 reply; 5+ messages in thread
From: Xiang, Haihao @ 2022-05-30 1:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: sw, linjie.fu
On Mon, 2022-05-23 at 02:14 +0000, Wang, Fei W wrote:
> > -----Original Message-----
> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Fei
> > Wang
> > Sent: Thursday, May 5, 2022 5:07 PM
> > To: ffmpeg-devel@ffmpeg.org
> > Cc: Wang, Fei W <fei.w.wang@intel.com>; Linjie Fu <linjie.fu@intel.com>
> > Subject: [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for
> > maxframesize
> >
> > From: Linjie Fu <linjie.fu@intel.com>
> >
> > Add support for max frame size:
> > - max_frame_size (bytes) to indicate the max allowed size for frame.
> >
> > Control each encoded frame size into target limitation size by adjusting
> > whole
> > frame's average QP value. The driver will use multi passes to adjust average
> > QP
> > setp by step to achieve the target, and the result may not strictly
> > guaranteed.
> > Frame size may exceed target alone with using the maximum average QP value.
> > The failure always happens on the intra(especially the first intra frame of
> > a new
> > GOP) frames or set max_frame_size with a very small number.
> >
> > example cmdline:
> > ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -f rawvideo \
> > -v verbose -s:v 352x288 -i ./input.yuv -vf format=nv12,hwupload \
> > -c:v h264_vaapi -profile:v main -g 30 -rc_mode VBR -b:v 500k \
> > -bf 3 -max_frame_size 40000 -vframes 100 -y ./max_frame_size.h264
> >
> > Max frame size was enabled since VA-API version (0, 33, 0), but query is
> > available
> > since (1, 5, 0). It will be passed as a parameter in picParam and should be
> > set for
> > each frame.
> >
> > Signed-off-by: Linjie Fu <linjie.fu@intel.com>
> > Signed-off-by: Fei Wang <fei.w.wang@intel.com>
> > ---
> > update:
> > 1. return error when fail to set max frame size.
> > 2. refine commit and debug message.
> >
> > libavcodec/vaapi_encode.c | 74
> > +++++++++++++++++++++++++++++++++++++++
> > libavcodec/vaapi_encode.h | 10 +++++-
> > 2 files changed, 83 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index
> > 0e2f5ed447..284ce29888 100644
> > --- a/libavcodec/vaapi_encode.c
> > +++ b/libavcodec/vaapi_encode.c
> > @@ -365,6 +365,17 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
> > goto fail;
> > }
> >
> > +#if VA_CHECK_VERSION(1, 5, 0)
> > + if (ctx->max_frame_size) {
> > + err = vaapi_encode_make_misc_param_buffer(avctx, pic,
> > + VAEncMiscParameterTypeMax
> > FrameSize,
> > + &ctx->mfs_params,
> > + sizeof(ctx->mfs_params));
> > + if (err < 0)
> > + goto fail;
> > + }
> > +#endif
> > +
> > if (pic->type == PICTURE_TYPE_IDR) {
> > if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE &&
> > ctx->codec->write_sequence_header) { @@ -1869,6 +1880,63 @@
> > rc_mode_found:
> > return 0;
> > }
> >
> > +static av_cold int vaapi_encode_init_max_frame_size(AVCodecContext
> > +*avctx) { #if VA_CHECK_VERSION(1, 5, 0)
> > + VAAPIEncodeContext *ctx = avctx->priv_data;
> > + VAConfigAttrib attr = { VAConfigAttribMaxFrameSize };
> > + VAStatus vas;
> > +
> > + if (ctx->va_rc_mode == VA_RC_CQP) {
> > + ctx->max_frame_size = 0;
> > + av_log(avctx, AV_LOG_ERROR, "Max frame size is invalid in CQP rate
> > "
> > + "control mode.\n");
> > + return AVERROR(EINVAL);
> > + }
> > +
> > + vas = vaGetConfigAttributes(ctx->hwctx->display,
> > + ctx->va_profile,
> > + ctx->va_entrypoint,
> > + &attr, 1);
> > + if (vas != VA_STATUS_SUCCESS) {
> > + ctx->max_frame_size = 0;
> > + av_log(avctx, AV_LOG_ERROR, "Failed to query max frame size "
> > + "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
> > + return AVERROR_EXTERNAL;
> > + }
> > +
> > + if (attr.value == VA_ATTRIB_NOT_SUPPORTED) {
> > + ctx->max_frame_size = 0;
> > + av_log(avctx, AV_LOG_ERROR, "Max frame size attribute "
> > + "is not supported.\n");
> > + return AVERROR(EINVAL);
> > + } else {
> > + VAConfigAttribValMaxFrameSize attr_mfs;
> > + attr_mfs.value = attr.value;
> > + // Prefer to use VAEncMiscParameterTypeMaxFrameSize for max frame
> > size.
> > + if (!attr_mfs.bits.max_frame_size && attr_mfs.bits.multiple_pass) {
> > + ctx->max_frame_size = 0;
> > + av_log(avctx, AV_LOG_ERROR, "Driver only supports multiple pass
> > "
> > + "max frame size which has not been implemented in
> > FFmpeg.\n");
> > + return AVERROR(EINVAL);
> > + }
> > +
> > + ctx->mfs_params = (VAEncMiscParameterBufferMaxFrameSize){
> > + .max_frame_size = ctx->max_frame_size * 8,
> > + };
> > +
> > + av_log(avctx, AV_LOG_VERBOSE, "Set max frame size: %d bytes.\n",
> > + ctx->max_frame_size);
> > + }
> > +#else
> > + av_log(avctx, AV_LOG_ERROR, "The max frame size option is not supported
> > with "
> > + "this VAAPI version.\n");
> > + return AVERROR(EINVAL);
> > +#endif
> > +
> > + return 0;
> > +}
> > +
> > static av_cold int vaapi_encode_init_gop_structure(AVCodecContext
> > *avctx) {
> > VAAPIEncodeContext *ctx = avctx->priv_data; @@ -2548,6 +2616,12 @@
> > av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
> > goto fail;
> > }
> >
> > + if (ctx->max_frame_size) {
> > + err = vaapi_encode_init_max_frame_size(avctx);
> > + if (err < 0)
> > + goto fail;
> > + }
> > +
> > vas = vaCreateConfig(ctx->hwctx->display,
> > ctx->va_profile, ctx->va_entrypoint,
> > ctx->config_attributes, ctx->nb_config_attributes,
> > diff --git
> > a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index
> > af0588c30b..359f954fff 100644
> > --- a/libavcodec/vaapi_encode.h
> > +++ b/libavcodec/vaapi_encode.h
> > @@ -191,6 +191,9 @@ typedef struct VAAPIEncodeContext {
> > // Desired B frame reference depth.
> > int desired_b_depth;
> >
> > + // Max Frame Size
> > + int max_frame_size;
> > +
> > // Explicitly set RC mode (otherwise attempt to pick from
> > // available modes).
> > int explicit_rc_mode;
> > @@ -268,6 +271,7 @@ typedef struct VAAPIEncodeContext {
> > VAEncMiscParameterRateControl rc_params;
> > VAEncMiscParameterHRD hrd_params;
> > VAEncMiscParameterFrameRate fr_params;
> > + VAEncMiscParameterBufferMaxFrameSize mfs_params;
> > #if VA_CHECK_VERSION(0, 36, 0)
> > VAEncMiscParameterBufferQualityLevel quality_params; #endif @@ -478,7
> > +482,11 @@ int ff_vaapi_encode_close(AVCodecContext *avctx);
> > "Increase this to improve single channel performance. This option " \
> > "doesn't work if driver doesn't implement vaSyncBuffer function.", \
> > OFFSET(common.async_depth), AV_OPT_TYPE_INT, \
> > - { .i64 = 2 }, 1, MAX_ASYNC_DEPTH, FLAGS }
> > + { .i64 = 2 }, 1, MAX_ASYNC_DEPTH, FLAGS }, \
> > + { "max_frame_size", \
> > + "Maximum frame size (in bytes)",\
> > + OFFSET(common.max_frame_size), AV_OPT_TYPE_INT, \
> > + { .i64 = 0 }, 0, INT_MAX, FLAGS }
> >
> > #define VAAPI_ENCODE_RC_MODE(name, desc) \
> > { #name, desc, 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_ ## name }, \
> > --
> > 2.25.1
> >
>
> Mark, any other comment on this version? Thanks.
>
@Mark,
Do you have any comment about this new version ? I'll merge it if no more
comment for v7.
Thanks
Haihao
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize
2022-05-30 1:27 ` Xiang, Haihao
@ 2022-06-06 6:16 ` Xiang, Haihao
0 siblings, 0 replies; 5+ messages in thread
From: Xiang, Haihao @ 2022-06-06 6:16 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: sw, linjie.fu
On Mon, 2022-05-30 at 01:27 +0000, Xiang, Haihao wrote:
> On Mon, 2022-05-23 at 02:14 +0000, Wang, Fei W wrote:
> > > -----Original Message-----
> > > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Fei
> > > Wang
> > > Sent: Thursday, May 5, 2022 5:07 PM
> > > To: ffmpeg-devel@ffmpeg.org
> > > Cc: Wang, Fei W <fei.w.wang@intel.com>; Linjie Fu <linjie.fu@intel.com>
> > > Subject: [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for
> > > maxframesize
> > >
> > > From: Linjie Fu <linjie.fu@intel.com>
> > >
> > > Add support for max frame size:
> > > - max_frame_size (bytes) to indicate the max allowed size for frame.
> > >
> > > Control each encoded frame size into target limitation size by adjusting
> > > whole
> > > frame's average QP value. The driver will use multi passes to adjust
> > > average
> > > QP
> > > setp by step to achieve the target, and the result may not strictly
> > > guaranteed.
> > > Frame size may exceed target alone with using the maximum average QP
> > > value.
> > > The failure always happens on the intra(especially the first intra frame
> > > of
> > > a new
> > > GOP) frames or set max_frame_size with a very small number.
> > >
> > > example cmdline:
> > > ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -f rawvideo \
> > > -v verbose -s:v 352x288 -i ./input.yuv -vf format=nv12,hwupload \
> > > -c:v h264_vaapi -profile:v main -g 30 -rc_mode VBR -b:v 500k \
> > > -bf 3 -max_frame_size 40000 -vframes 100 -y ./max_frame_size.h264
> > >
> > > Max frame size was enabled since VA-API version (0, 33, 0), but query is
> > > available
> > > since (1, 5, 0). It will be passed as a parameter in picParam and should
> > > be
> > > set for
> > > each frame.
> > >
> > > Signed-off-by: Linjie Fu <linjie.fu@intel.com>
> > > Signed-off-by: Fei Wang <fei.w.wang@intel.com>
> > > ---
> > > update:
> > > 1. return error when fail to set max frame size.
> > > 2. refine commit and debug message.
> > >
> > > libavcodec/vaapi_encode.c | 74
> > > +++++++++++++++++++++++++++++++++++++++
> > > libavcodec/vaapi_encode.h | 10 +++++-
> > > 2 files changed, 83 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index
> > > 0e2f5ed447..284ce29888 100644
> > > --- a/libavcodec/vaapi_encode.c
> > > +++ b/libavcodec/vaapi_encode.c
> > > @@ -365,6 +365,17 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
> > > goto fail;
> > > }
> > >
> > > +#if VA_CHECK_VERSION(1, 5, 0)
> > > + if (ctx->max_frame_size) {
> > > + err = vaapi_encode_make_misc_param_buffer(avctx, pic,
> > > + VAEncMiscParameterTypeM
> > > ax
> > > FrameSize,
> > > + &ctx->mfs_params,
> > > + sizeof(ctx-
> > > >mfs_params));
> > > + if (err < 0)
> > > + goto fail;
> > > + }
> > > +#endif
> > > +
> > > if (pic->type == PICTURE_TYPE_IDR) {
> > > if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE &&
> > > ctx->codec->write_sequence_header) { @@ -1869,6 +1880,63 @@
> > > rc_mode_found:
> > > return 0;
> > > }
> > >
> > > +static av_cold int vaapi_encode_init_max_frame_size(AVCodecContext
> > > +*avctx) { #if VA_CHECK_VERSION(1, 5, 0)
> > > + VAAPIEncodeContext *ctx = avctx->priv_data;
> > > + VAConfigAttrib attr = { VAConfigAttribMaxFrameSize };
> > > + VAStatus vas;
> > > +
> > > + if (ctx->va_rc_mode == VA_RC_CQP) {
> > > + ctx->max_frame_size = 0;
> > > + av_log(avctx, AV_LOG_ERROR, "Max frame size is invalid in CQP
> > > rate
> > > "
> > > + "control mode.\n");
> > > + return AVERROR(EINVAL);
> > > + }
> > > +
> > > + vas = vaGetConfigAttributes(ctx->hwctx->display,
> > > + ctx->va_profile,
> > > + ctx->va_entrypoint,
> > > + &attr, 1);
> > > + if (vas != VA_STATUS_SUCCESS) {
> > > + ctx->max_frame_size = 0;
> > > + av_log(avctx, AV_LOG_ERROR, "Failed to query max frame size "
> > > + "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
> > > + return AVERROR_EXTERNAL;
> > > + }
> > > +
> > > + if (attr.value == VA_ATTRIB_NOT_SUPPORTED) {
> > > + ctx->max_frame_size = 0;
> > > + av_log(avctx, AV_LOG_ERROR, "Max frame size attribute "
> > > + "is not supported.\n");
> > > + return AVERROR(EINVAL);
> > > + } else {
> > > + VAConfigAttribValMaxFrameSize attr_mfs;
> > > + attr_mfs.value = attr.value;
> > > + // Prefer to use VAEncMiscParameterTypeMaxFrameSize for max frame
> > > size.
> > > + if (!attr_mfs.bits.max_frame_size && attr_mfs.bits.multiple_pass)
> > > {
> > > + ctx->max_frame_size = 0;
> > > + av_log(avctx, AV_LOG_ERROR, "Driver only supports multiple
> > > pass
> > > "
> > > + "max frame size which has not been implemented in
> > > FFmpeg.\n");
> > > + return AVERROR(EINVAL);
> > > + }
> > > +
> > > + ctx->mfs_params = (VAEncMiscParameterBufferMaxFrameSize){
> > > + .max_frame_size = ctx->max_frame_size * 8,
> > > + };
> > > +
> > > + av_log(avctx, AV_LOG_VERBOSE, "Set max frame size: %d bytes.\n",
> > > + ctx->max_frame_size);
> > > + }
> > > +#else
> > > + av_log(avctx, AV_LOG_ERROR, "The max frame size option is not
> > > supported
> > > with "
> > > + "this VAAPI version.\n");
> > > + return AVERROR(EINVAL);
> > > +#endif
> > > +
> > > + return 0;
> > > +}
> > > +
> > > static av_cold int vaapi_encode_init_gop_structure(AVCodecContext
> > > *avctx) {
> > > VAAPIEncodeContext *ctx = avctx->priv_data; @@ -2548,6 +2616,12 @@
> > > av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
> > > goto fail;
> > > }
> > >
> > > + if (ctx->max_frame_size) {
> > > + err = vaapi_encode_init_max_frame_size(avctx);
> > > + if (err < 0)
> > > + goto fail;
> > > + }
> > > +
> > > vas = vaCreateConfig(ctx->hwctx->display,
> > > ctx->va_profile, ctx->va_entrypoint,
> > > ctx->config_attributes, ctx-
> > > >nb_config_attributes,
> > > diff --git
> > > a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index
> > > af0588c30b..359f954fff 100644
> > > --- a/libavcodec/vaapi_encode.h
> > > +++ b/libavcodec/vaapi_encode.h
> > > @@ -191,6 +191,9 @@ typedef struct VAAPIEncodeContext {
> > > // Desired B frame reference depth.
> > > int desired_b_depth;
> > >
> > > + // Max Frame Size
> > > + int max_frame_size;
> > > +
> > > // Explicitly set RC mode (otherwise attempt to pick from
> > > // available modes).
> > > int explicit_rc_mode;
> > > @@ -268,6 +271,7 @@ typedef struct VAAPIEncodeContext {
> > > VAEncMiscParameterRateControl rc_params;
> > > VAEncMiscParameterHRD hrd_params;
> > > VAEncMiscParameterFrameRate fr_params;
> > > + VAEncMiscParameterBufferMaxFrameSize mfs_params;
> > > #if VA_CHECK_VERSION(0, 36, 0)
> > > VAEncMiscParameterBufferQualityLevel quality_params; #endif @@
> > > -478,7
> > > +482,11 @@ int ff_vaapi_encode_close(AVCodecContext *avctx);
> > > "Increase this to improve single channel performance. This option "
> > > \
> > > "doesn't work if driver doesn't implement vaSyncBuffer function.",
> > > \
> > > OFFSET(common.async_depth), AV_OPT_TYPE_INT, \
> > > - { .i64 = 2 }, 1, MAX_ASYNC_DEPTH, FLAGS }
> > > + { .i64 = 2 }, 1, MAX_ASYNC_DEPTH, FLAGS }, \
> > > + { "max_frame_size", \
> > > + "Maximum frame size (in bytes)",\
> > > + OFFSET(common.max_frame_size), AV_OPT_TYPE_INT, \
> > > + { .i64 = 0 }, 0, INT_MAX, FLAGS }
> > >
> > > #define VAAPI_ENCODE_RC_MODE(name, desc) \
> > > { #name, desc, 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_ ## name }, \
> > > --
> > > 2.25.1
> > >
> >
> > Mark, any other comment on this version? Thanks.
> >
>
> @Mark,
>
> Do you have any comment about this new version ? I'll merge it if no more
> comment for v7.
>
Applied, thx
-Haihao
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-06-06 6:17 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-05 9:07 [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize Fei Wang
2022-05-05 9:07 ` [FFmpeg-devel] [PATCH v7 2/2] doc/vaapi_encode: add documentations for max_frame_size Fei Wang
2022-05-23 2:14 ` [FFmpeg-devel] [PATCH v7 1/2] lavc/vaapi_encode: add support for maxframesize Wang, Fei W
2022-05-30 1:27 ` Xiang, Haihao
2022-06-06 6:16 ` Xiang, Haihao
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git