* [FFmpeg-devel] [PATCH v2] avcodec/nvenc: Unify CBR filler data insertion for all codecs
@ 2025-03-31 22:40 Cameron Gutman
2025-04-01 8:28 ` Timo Rothenpieler
0 siblings, 1 reply; 2+ messages in thread
From: Cameron Gutman @ 2025-03-31 22:40 UTC (permalink / raw)
To: timo, ffmpeg-devel
Previously, AV1 used filler data with CBR by default while H.264
and HEVC may or may not depending on driver version. Make this
consistent by using not filler data in CBR mode for all codecs.
Since there are valid reasons to use CBR with or without filler,
also add a cbr_padding option to allow users to override this.
Signed-off-by: Cameron Gutman <aicommander@gmail.com>
---
v2: Changed cbr_padding default to 0 and rewrote commit text
---
libavcodec/nvenc.c | 16 +++++++++++++---
libavcodec/nvenc.h | 2 ++
libavcodec/nvenc_av1.c | 2 ++
libavcodec/nvenc_h264.c | 4 ++++
libavcodec/nvenc_hevc.c | 4 ++++
5 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index 0f5e772b3e..41a4dc55f4 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -1304,7 +1304,12 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx)
h264->idrPeriod = cc->gopLength;
if (IS_CBR(cc->rcParams.rateControlMode)) {
- h264->outputBufferingPeriodSEI = 1;
+ /* Older SDKs use outputBufferingPeriodSEI to control filler data */
+ h264->outputBufferingPeriodSEI = ctx->cbr_padding;
+
+#ifdef NVENC_HAVE_FILLER_DATA
+ h264->enableFillerDataInsertion = ctx->cbr_padding;
+#endif
}
h264->outputPictureTimingSEI = 1;
@@ -1503,7 +1508,12 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx)
hevc->idrPeriod = cc->gopLength;
if (IS_CBR(cc->rcParams.rateControlMode)) {
- hevc->outputBufferingPeriodSEI = 1;
+ /* Older SDKs use outputBufferingPeriodSEI to control filler data */
+ hevc->outputBufferingPeriodSEI = ctx->cbr_padding;
+
+#ifdef NVENC_HAVE_FILLER_DATA
+ hevc->enableFillerDataInsertion = ctx->cbr_padding;
+#endif
}
hevc->outputPictureTimingSEI = 1;
@@ -1625,7 +1635,7 @@ static av_cold int nvenc_setup_av1_config(AVCodecContext *avctx)
av1->idrPeriod = cc->gopLength;
if (IS_CBR(cc->rcParams.rateControlMode)) {
- av1->enableBitstreamPadding = 1;
+ av1->enableBitstreamPadding = ctx->cbr_padding;
}
if (ctx->tile_cols >= 0)
diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h
index e035e123c6..4b12846ed7 100644
--- a/libavcodec/nvenc.h
+++ b/libavcodec/nvenc.h
@@ -61,6 +61,7 @@ typedef void ID3D11Device;
#define NVENC_HAVE_MULTIPLE_REF_FRAMES
#define NVENC_HAVE_CUSTREAM_PTR
#define NVENC_HAVE_GETLASTERRORSTRING
+#define NVENC_HAVE_FILLER_DATA
#endif
// SDK 10.0 compile time feature checks
@@ -309,6 +310,7 @@ typedef struct NvencContext
int unidir_b;
int split_encode_mode;
int mdm, cll;
+ int cbr_padding;
} NvencContext;
int ff_nvenc_encode_init(AVCodecContext *avctx);
diff --git a/libavcodec/nvenc_av1.c b/libavcodec/nvenc_av1.c
index 01626113ab..df6a93edcb 100644
--- a/libavcodec/nvenc_av1.c
+++ b/libavcodec/nvenc_av1.c
@@ -156,6 +156,8 @@ static const AVOption options[] = {
OFFSET(extra_sei), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
{ "a53cc", "Use A53 Closed Captions (if available)", OFFSET(a53_cc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
{ "s12m_tc", "Use timecode (if available)", OFFSET(s12m_tc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
+ { "cbr_padding", "Pad the bitstream to ensure bitrate does not drop below the target in CBR mode",
+ OFFSET(cbr_padding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
#ifdef NVENC_HAVE_H264_AND_AV1_TEMPORAL_FILTER
{ "tf_level", "Specifies the strength of the temporal filtering",
OFFSET(tf_level), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, .unit = "tf_level" },
diff --git a/libavcodec/nvenc_h264.c b/libavcodec/nvenc_h264.c
index 21d25d643a..842e4eef60 100644
--- a/libavcodec/nvenc_h264.c
+++ b/libavcodec/nvenc_h264.c
@@ -231,6 +231,10 @@ static const AVOption options[] = {
OFFSET(max_slice_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
{ "constrained-encoding", "Enable constrainedFrame encoding where each slice in the constrained picture is independent of other slices",
OFFSET(constrained_encoding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
+#ifdef NVENC_HAVE_FILLER_DATA
+ { "cbr_padding", "Pad the bitstream to ensure bitrate does not drop below the target in CBR mode",
+ OFFSET(cbr_padding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
+#endif
#ifdef NVENC_HAVE_H264_AND_AV1_TEMPORAL_FILTER
{ "tf_level", "Specifies the strength of the temporal filtering",
OFFSET(tf_level), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, .unit = "tf_level" },
diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c
index c74eca9bb3..d74314f245 100644
--- a/libavcodec/nvenc_hevc.c
+++ b/libavcodec/nvenc_hevc.c
@@ -206,6 +206,10 @@ static const AVOption options[] = {
OFFSET(max_slice_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
{ "constrained-encoding", "Enable constrainedFrame encoding where each slice in the constrained picture is independent of other slices",
OFFSET(constrained_encoding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
+#ifdef NVENC_HAVE_FILLER_DATA
+ { "cbr_padding", "Pad the bitstream to ensure bitrate does not drop below the target in CBR mode",
+ OFFSET(cbr_padding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
+#endif
#ifdef NVENC_HAVE_TEMPORAL_FILTER
{ "tf_level", "Specifies the strength of the temporal filtering",
OFFSET(tf_level), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, .unit = "tf_level" },
--
2.49.0
_______________________________________________
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] 2+ messages in thread
* Re: [FFmpeg-devel] [PATCH v2] avcodec/nvenc: Unify CBR filler data insertion for all codecs
2025-03-31 22:40 [FFmpeg-devel] [PATCH v2] avcodec/nvenc: Unify CBR filler data insertion for all codecs Cameron Gutman
@ 2025-04-01 8:28 ` Timo Rothenpieler
0 siblings, 0 replies; 2+ messages in thread
From: Timo Rothenpieler @ 2025-04-01 8:28 UTC (permalink / raw)
To: Cameron Gutman, ffmpeg-devel
On 01/04/2025 00:40, Cameron Gutman wrote:
> Previously, AV1 used filler data with CBR by default while H.264
> and HEVC may or may not depending on driver version. Make this
> consistent by using not filler data in CBR mode for all codecs.
>
> Since there are valid reasons to use CBR with or without filler,
> also add a cbr_padding option to allow users to override this.
>
> Signed-off-by: Cameron Gutman <aicommander@gmail.com>
> ---
> v2: Changed cbr_padding default to 0 and rewrote commit text
> ---
> libavcodec/nvenc.c | 16 +++++++++++++---
> libavcodec/nvenc.h | 2 ++
> libavcodec/nvenc_av1.c | 2 ++
> libavcodec/nvenc_h264.c | 4 ++++
> libavcodec/nvenc_hevc.c | 4 ++++
> 5 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
> index 0f5e772b3e..41a4dc55f4 100644
> --- a/libavcodec/nvenc.c
> +++ b/libavcodec/nvenc.c
> @@ -1304,7 +1304,12 @@ static av_cold int nvenc_setup_h264_config(AVCodecContext *avctx)
> h264->idrPeriod = cc->gopLength;
>
> if (IS_CBR(cc->rcParams.rateControlMode)) {
> - h264->outputBufferingPeriodSEI = 1;
> + /* Older SDKs use outputBufferingPeriodSEI to control filler data */
> + h264->outputBufferingPeriodSEI = ctx->cbr_padding;
> +
> +#ifdef NVENC_HAVE_FILLER_DATA
> + h264->enableFillerDataInsertion = ctx->cbr_padding;
> +#endif
> }
>
> h264->outputPictureTimingSEI = 1;
> @@ -1503,7 +1508,12 @@ static av_cold int nvenc_setup_hevc_config(AVCodecContext *avctx)
> hevc->idrPeriod = cc->gopLength;
>
> if (IS_CBR(cc->rcParams.rateControlMode)) {
> - hevc->outputBufferingPeriodSEI = 1;
> + /* Older SDKs use outputBufferingPeriodSEI to control filler data */
> + hevc->outputBufferingPeriodSEI = ctx->cbr_padding;
> +
> +#ifdef NVENC_HAVE_FILLER_DATA
> + hevc->enableFillerDataInsertion = ctx->cbr_padding;
> +#endif
> }
>
> hevc->outputPictureTimingSEI = 1;
> @@ -1625,7 +1635,7 @@ static av_cold int nvenc_setup_av1_config(AVCodecContext *avctx)
> av1->idrPeriod = cc->gopLength;
>
> if (IS_CBR(cc->rcParams.rateControlMode)) {
> - av1->enableBitstreamPadding = 1;
> + av1->enableBitstreamPadding = ctx->cbr_padding;
> }
>
> if (ctx->tile_cols >= 0)
> diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h
> index e035e123c6..4b12846ed7 100644
> --- a/libavcodec/nvenc.h
> +++ b/libavcodec/nvenc.h
> @@ -61,6 +61,7 @@ typedef void ID3D11Device;
> #define NVENC_HAVE_MULTIPLE_REF_FRAMES
> #define NVENC_HAVE_CUSTREAM_PTR
> #define NVENC_HAVE_GETLASTERRORSTRING
> +#define NVENC_HAVE_FILLER_DATA
> #endif
>
> // SDK 10.0 compile time feature checks
> @@ -309,6 +310,7 @@ typedef struct NvencContext
> int unidir_b;
> int split_encode_mode;
> int mdm, cll;
> + int cbr_padding;
> } NvencContext;
>
> int ff_nvenc_encode_init(AVCodecContext *avctx);
> diff --git a/libavcodec/nvenc_av1.c b/libavcodec/nvenc_av1.c
> index 01626113ab..df6a93edcb 100644
> --- a/libavcodec/nvenc_av1.c
> +++ b/libavcodec/nvenc_av1.c
> @@ -156,6 +156,8 @@ static const AVOption options[] = {
> OFFSET(extra_sei), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
> { "a53cc", "Use A53 Closed Captions (if available)", OFFSET(a53_cc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
> { "s12m_tc", "Use timecode (if available)", OFFSET(s12m_tc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
> + { "cbr_padding", "Pad the bitstream to ensure bitrate does not drop below the target in CBR mode",
> + OFFSET(cbr_padding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
> #ifdef NVENC_HAVE_H264_AND_AV1_TEMPORAL_FILTER
> { "tf_level", "Specifies the strength of the temporal filtering",
> OFFSET(tf_level), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, .unit = "tf_level" },
> diff --git a/libavcodec/nvenc_h264.c b/libavcodec/nvenc_h264.c
> index 21d25d643a..842e4eef60 100644
> --- a/libavcodec/nvenc_h264.c
> +++ b/libavcodec/nvenc_h264.c
> @@ -231,6 +231,10 @@ static const AVOption options[] = {
> OFFSET(max_slice_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
> { "constrained-encoding", "Enable constrainedFrame encoding where each slice in the constrained picture is independent of other slices",
> OFFSET(constrained_encoding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
> +#ifdef NVENC_HAVE_FILLER_DATA
> + { "cbr_padding", "Pad the bitstream to ensure bitrate does not drop below the target in CBR mode",
> + OFFSET(cbr_padding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
> +#endif
> #ifdef NVENC_HAVE_H264_AND_AV1_TEMPORAL_FILTER
> { "tf_level", "Specifies the strength of the temporal filtering",
> OFFSET(tf_level), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, .unit = "tf_level" },
> diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c
> index c74eca9bb3..d74314f245 100644
> --- a/libavcodec/nvenc_hevc.c
> +++ b/libavcodec/nvenc_hevc.c
> @@ -206,6 +206,10 @@ static const AVOption options[] = {
> OFFSET(max_slice_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
> { "constrained-encoding", "Enable constrainedFrame encoding where each slice in the constrained picture is independent of other slices",
> OFFSET(constrained_encoding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
> +#ifdef NVENC_HAVE_FILLER_DATA
> + { "cbr_padding", "Pad the bitstream to ensure bitrate does not drop below the target in CBR mode",
> + OFFSET(cbr_padding), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
> +#endif
> #ifdef NVENC_HAVE_TEMPORAL_FILTER
> { "tf_level", "Specifies the strength of the temporal filtering",
> OFFSET(tf_level), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, .unit = "tf_level" },
Looks good to me, will test later tonight and then apply.
_______________________________________________
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] 2+ messages in thread
end of thread, other threads:[~2025-04-01 8:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-03-31 22:40 [FFmpeg-devel] [PATCH v2] avcodec/nvenc: Unify CBR filler data insertion for all codecs Cameron Gutman
2025-04-01 8:28 ` Timo Rothenpieler
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