diff options
author | Diego Felix de Souza <ddesouza@nvidia.com> | 2024-04-12 20:08:12 +0000 |
---|---|---|
committer | Timo Rothenpieler <timo@rothenpieler.org> | 2024-04-13 18:00:43 +0200 |
commit | 1f265aa91d6ce11fbf499ee867eae13bc7117e9d (patch) | |
tree | 5ef9a666a4d627ae53b3c1c804c58b265b175aeb | |
parent | 1c45104f74e59beb25ce7451c98527f7a3c518f6 (diff) | |
download | ffmpeg-1f265aa91d6ce11fbf499ee867eae13bc7117e9d.tar.gz |
avcodec/nvenc: Multi NVENC Split Frame Encoding in HEVC and AV1
When Split frame encoding is enabled, each input frame is partitioned into
horizontal strips which are encoded independently and simultaneously by
separate NVENCs, usually resulting in increased encoding speed compared to
single NVENC encoding.
Signed-off-by: Diego Felix de Souza <ddesouza@nvidia.com>
Signed-off-by: Timo Rothenpieler <timo@rothenpieler.org>
-rw-r--r-- | libavcodec/nvenc.c | 9 | ||||
-rw-r--r-- | libavcodec/nvenc.h | 2 | ||||
-rw-r--r-- | libavcodec/nvenc_av1.c | 8 | ||||
-rw-r--r-- | libavcodec/nvenc_hevc.c | 8 | ||||
-rw-r--r-- | libavcodec/version.h | 2 |
5 files changed, 28 insertions, 1 deletions
diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index b6c5ed3e6b..794174a53f 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -1696,6 +1696,15 @@ FF_ENABLE_DEPRECATION_WARNINGS if (ctx->weighted_pred == 1) ctx->init_encode_params.enableWeightedPrediction = 1; +#ifdef NVENC_HAVE_SPLIT_FRAME_ENCODING + ctx->init_encode_params.splitEncodeMode = ctx->split_encode_mode; + + if (ctx->split_encode_mode != NV_ENC_SPLIT_DISABLE_MODE) { + if (avctx->codec->id == AV_CODEC_ID_HEVC && ctx->weighted_pred == 1) + av_log(avctx, AV_LOG_WARNING, "Split encoding not supported with weighted prediction enabled.\n"); + } +#endif + if (ctx->bluray_compat) { ctx->aud = 1; ctx->dpb_size = FFMIN(FFMAX(avctx->refs, 0), 6); diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h index 85ecaf1b5f..09de00badc 100644 --- a/libavcodec/nvenc.h +++ b/libavcodec/nvenc.h @@ -81,6 +81,7 @@ typedef void ID3D11Device; // SDK 12.1 compile time feature checks #if NVENCAPI_CHECK_VERSION(12, 1) #define NVENC_NO_DEPRECATED_RC +#define NVENC_HAVE_SPLIT_FRAME_ENCODING #endif // SDK 12.2 compile time feature checks @@ -280,6 +281,7 @@ typedef struct NvencContext int tf_level; int lookahead_level; int unidir_b; + int split_encode_mode; } NvencContext; int ff_nvenc_encode_init(AVCodecContext *avctx); diff --git a/libavcodec/nvenc_av1.c b/libavcodec/nvenc_av1.c index d37ee07bff..a9e065e3b9 100644 --- a/libavcodec/nvenc_av1.c +++ b/libavcodec/nvenc_av1.c @@ -158,6 +158,14 @@ static const AVOption options[] = { { "2", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LOOKAHEAD_LEVEL_2 }, 0, 0, VE, .unit = "lookahead_level" }, { "3", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LOOKAHEAD_LEVEL_3 }, 0, 0, VE, .unit = "lookahead_level" }, #endif +#ifdef NVENC_HAVE_SPLIT_FRAME_ENCODING + { "split_encode_mode", "Specifies the split encoding mode", OFFSET(split_encode_mode), AV_OPT_TYPE_INT, { .i64 = NV_ENC_SPLIT_AUTO_MODE }, 0, NV_ENC_SPLIT_DISABLE_MODE, VE, .unit = "split_encode_mode" }, + { "disabled", "Disabled for all configurations", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_DISABLE_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, + { "auto", "Enabled or disabled depending on the preset and tuning info", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_AUTO_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, + { "forced", "Enabled with number of horizontal strips selected by the driver", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_AUTO_FORCED_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, + { "2", "Enabled with number of horizontal strips forced to 2 when number of NVENCs > 1", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_TWO_FORCED_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, + { "3", "Enabled with number of horizontal strips forced to 3 when number of NVENCs > 2", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_THREE_FORCED_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, +#endif { NULL } }; diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c index bd8b6153f3..b949cb1bd7 100644 --- a/libavcodec/nvenc_hevc.c +++ b/libavcodec/nvenc_hevc.c @@ -217,6 +217,14 @@ static const AVOption options[] = { #ifdef NVENC_HAVE_UNIDIR_B { "unidir_b", "Enable use of unidirectional B-Frames.", OFFSET(unidir_b), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, #endif +#ifdef NVENC_HAVE_SPLIT_FRAME_ENCODING + { "split_encode_mode", "Specifies the split encoding mode", OFFSET(split_encode_mode), AV_OPT_TYPE_INT, { .i64 = NV_ENC_SPLIT_AUTO_MODE }, 0, NV_ENC_SPLIT_DISABLE_MODE, VE, .unit = "split_encode_mode" }, + { "disabled", "Disabled for all configurations", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_DISABLE_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, + { "auto", "Enabled or disabled depending on the preset and tuning info", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_AUTO_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, + { "forced", "Enabled with number of horizontal strips selected by the driver", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_AUTO_FORCED_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, + { "2", "Enabled with number of horizontal strips forced to 2 when number of NVENCs > 1", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_TWO_FORCED_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, + { "3", "Enabled with number of horizontal strips forced to 3 when number of NVENCs > 2", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_SPLIT_THREE_FORCED_MODE }, 0, 0, VE, .unit = "split_encode_mode" }, +#endif { NULL } }; diff --git a/libavcodec/version.h b/libavcodec/version.h index 564119396d..f0958eee14 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -30,7 +30,7 @@ #include "version_major.h" #define LIBAVCODEC_VERSION_MINOR 5 -#define LIBAVCODEC_VERSION_MICRO 102 +#define LIBAVCODEC_VERSION_MICRO 103 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ |