From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <ffmpeg-devel-bounces@ffmpeg.org> Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 70B7A4B878 for <ffmpegdev@gitmailbox.com>; Mon, 31 Mar 2025 22:42:02 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 144E7687C9A; Tue, 1 Apr 2025 01:41:58 +0300 (EEST) Received: from mail-oo1-f54.google.com (mail-oo1-f54.google.com [209.85.161.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3E21C687B8A for <ffmpeg-devel@ffmpeg.org>; Tue, 1 Apr 2025 01:41:51 +0300 (EEST) Received: by mail-oo1-f54.google.com with SMTP id 006d021491bc7-601ebdf02daso2730584eaf.0 for <ffmpeg-devel@ffmpeg.org>; Mon, 31 Mar 2025 15:41:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743460909; x=1744065709; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=RUGS8OzZCviQXJqni1yBlUgxQzEvwS7WWaqrq2Nu1Jw=; b=Sp5Q27ZmiYE1rbiDCfuRnATYA+MwZXnCTgwYJil4ZoO4kpp0KR2x/3zJTvATgwV2C0 AN4T8zreJiRFdhmCkw29lVRPkDBnsqXTnHtfhnWC1xIGmt8pv0+/nZSh6rkIrIJ7UzpB 5sRZfSBi7+heieGrJIP6G5qCBniPYDdajz/oo2NxxBte+eBo6IYSn6L2tV6RFuEE5f/L czvyR6ec7JiPf9RmuZ3/h0DV1wp8AyQx8izyfFigc94fv3cgkPvDszwKxAtnJbJajTFF 2cls5tsDCdIgWFIf6dZWMvHQ24cycYFl+ZYa5Us8WFJPcguVRbQeGAB9WwqQUVSaJsff ePag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743460909; x=1744065709; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=RUGS8OzZCviQXJqni1yBlUgxQzEvwS7WWaqrq2Nu1Jw=; b=RE/726+To8HeJEW1l6ezgzsjfotiSz6tiD9Ae3xc5OnfYQntuwNiEi7s4yShoJ33Oh S4Lqu/B66TWoLjkbm40rRlbBhjGDPQtwJsUpUKvE1c5D04jLx/AMefSnJRWna8lB/A4J fNFvK5HOBlXJl5J3biflru+qK34DExHwMGyb7lrXBpu3te/SS0txXjq1gCFWcoJvx9y+ yMMD/gsOnUaVBO+y0bja5j+uszIAi45PvVoSVoxl0tTGtLXcETuCmCJpVOmCxMmF5vQw u7gSxXunRHwOOct8ywtovVmDIfAaZFC8CAV0qfgE1rokHbGBR3VEQGDodTw0J/x3P3RQ V7BQ== X-Forwarded-Encrypted: i=1; AJvYcCXydpivTD2zbx2ro7EFAZol0oWp0ydUT758o0X5fPmixV0N8ZZ4Ed8g4mlMI7aMvDePe1CJCgle7sadfVI=@ffmpeg.org X-Gm-Message-State: AOJu0YwdA11NIiFPsahDWmV8yoZ8A+Mj7GAmbNV+UajM9o5YAoBHmaKA N7VgKxzW0gH0Yek7cxhAzN/HprSD7dRs5eXXcz+Hvtb7pe32aIOm X-Gm-Gg: ASbGncs1Nj3Av6Y5SVQAIUz5HWezu9cksOXGCO3JoPEP/vPWFBryz7F37Mwn7xUlZWp Shzfdgenrcd9fRQRqbULldrhiAocGhIHzn4sOBP/bWhELMDyqlS7J526lsNG9uOjT/ih3ZBk0V7 eFIhmDwh7y2aYub+Hn0s5cwhfwgsZ+o/aog5UB33AheG7l3B5WgGwPFJYWCRoMCaSzTehvhS/qC g5vfX9w8rYQFRxib/bn4a+Cbxp7LvzwQwtAeH+ORygXR8WbucXd0WyX/2xW68lTdf1yTS8aQ/Dw FQJYagBnQi0fo6LuFhQQai2UOEhjJXi1OiXYqLP3GH0uVW4XBgZLoohhF3Pm9w== X-Google-Smtp-Source: AGHT+IGwzafSCjbcFqjngiHjEgYfWuJ3pN/fkORiXLBk9yv7Vldzy8RxAhMgxS2lwy3rw2Z4bia3Xw== X-Received: by 2002:a4a:c118:0:b0:601:d8be:efcc with SMTP id 006d021491bc7-60285c06cf9mr8536822eaf.4.1743460909112; Mon, 31 Mar 2025 15:41:49 -0700 (PDT) Received: from cassini.localdomain ([2600:1702:50c6:cf10:38b3:1353:266b:b701]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-602845f3c47sm1596846eaf.32.2025.03.31.15.41.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Mar 2025 15:41:48 -0700 (PDT) From: Cameron Gutman <aicommander@gmail.com> To: timo@rothenpieler.org, ffmpeg-devel@ffmpeg.org Date: Mon, 31 Mar 2025 17:40:11 -0500 Message-ID: <20250331224147.314846-1-aicommander@gmail.com> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avcodec/nvenc: Unify CBR filler data insertion for all codecs X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org> List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe> List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel> List-Post: <mailto:ffmpeg-devel@ffmpeg.org> List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help> List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe> Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org> Archived-At: <https://master.gitmailbox.com/ffmpegdev/20250331224147.314846-1-aicommander@gmail.com/> List-Archive: <https://master.gitmailbox.com/ffmpegdev/> List-Post: <mailto:ffmpegdev@gitmailbox.com> 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".