mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-05 06:13:43 +00:00
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>
This commit is contained in:
parent
1c45104f74
commit
1f265aa91d
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -157,6 +157,14 @@ static const AVOption options[] = {
|
||||
{ "1", "", 0, AV_OPT_TYPE_CONST, { .i64 = NV_ENC_LOOKAHEAD_LEVEL_1 }, 0, 0, VE, .unit = "lookahead_level" },
|
||||
{ "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 }
|
||||
};
|
||||
|
@ -216,6 +216,14 @@ static const AVOption options[] = {
|
||||
#endif
|
||||
#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 }
|
||||
};
|
||||
|
@ -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, \
|
||||
|
Loading…
Reference in New Issue
Block a user