From 21b4708969415b9ec6d212fb35c12e4d1c28d066 Mon Sep 17 00:00:00 2001 From: Timo Rothenpieler Date: Sun, 31 Mar 2024 21:26:15 +0200 Subject: [PATCH] avcodec/nvenc: add support for unidirectional b-frames --- libavcodec/nvenc.c | 12 ++++++++++++ libavcodec/nvenc.h | 2 ++ libavcodec/nvenc_hevc.c | 3 +++ libavcodec/version.h | 2 +- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 7f938a519f..d121442957 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -613,6 +613,14 @@ static int nvenc_check_capabilities(AVCodecContext *avctx) } #endif +#ifdef NVENC_HAVE_UNIDIR_B + ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_UNIDIRECTIONAL_B); + if(ctx->unidir_b && ret <= 0) { + av_log(avctx, AV_LOG_WARNING, "Unidirectional B-Frames not supported by the device\n"); + return AVERROR(ENOSYS); + } +#endif + ctx->support_dyn_bitrate = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_DYN_BITRATE_CHANGE); return 0; @@ -1658,6 +1666,10 @@ FF_DISABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS } +#ifdef NVENC_HAVE_UNIDIR_B + ctx->init_encode_params.enableUniDirectionalB = ctx->unidir_b; +#endif + ctx->init_encode_params.enableEncodeAsync = 0; ctx->init_encode_params.enablePTD = 1; diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h index 3e207b1877..45860de722 100644 --- a/libavcodec/nvenc.h +++ b/libavcodec/nvenc.h @@ -89,6 +89,7 @@ typedef void ID3D11Device; #define NVENC_HAVE_TEMPORAL_FILTER #define NVENC_HAVE_LOOKAHEAD_LEVEL #define NVENC_HAVE_UHQ_TUNING +#define NVENC_HAVE_UNIDIR_B #endif typedef struct NvencSurface @@ -276,6 +277,7 @@ typedef struct NvencContext int rgb_mode; int tf_level; int lookahead_level; + int unidir_b; } NvencContext; int ff_nvenc_encode_init(AVCodecContext *avctx); diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c index e0d16e82c7..bd8b6153f3 100644 --- a/libavcodec/nvenc_hevc.c +++ b/libavcodec/nvenc_hevc.c @@ -213,6 +213,9 @@ 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_UNIDIR_B + { "unidir_b", "Enable use of unidirectional B-Frames.", OFFSET(unidir_b), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, #endif { NULL } }; diff --git a/libavcodec/version.h b/libavcodec/version.h index 06631ffa8c..7aa95fc3f1 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 4 +#define LIBAVCODEC_VERSION_MINOR 5 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \