obs-studio/patches/0003-8788.patch
Ward Nakchbandi (Cosmic Fusion) 6f0ee9ff13
2023-09-29 18:20:04 +03:00

64 lines
2.4 KiB
Diff

From 8e5fec4c7765b1c43d40f652b46d034340877a31 Mon Sep 17 00:00:00 2001
From: Ryan Foster <ryan@obsproject.com>
Date: Fri, 14 Apr 2023 12:05:59 -0400
Subject: [PATCH 1/2] obs-ffmpeg: Use 2x2 tiles in NVENC AV1 for 4K+
When resolution is 4K or higher, use 2x2 uniform tiles for NVENC AV1.
---
plugins/obs-ffmpeg/jim-nvenc.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/plugins/obs-ffmpeg/jim-nvenc.c b/plugins/obs-ffmpeg/jim-nvenc.c
index 10a7dd18549b9..c1e8bee154770 100644
--- a/plugins/obs-ffmpeg/jim-nvenc.c
+++ b/plugins/obs-ffmpeg/jim-nvenc.c
@@ -922,6 +922,17 @@ static bool init_encoder_av1(struct nvenc_data *enc, obs_data_t *settings,
if (config->rcParams.rateControlMode == NV_ENC_PARAMS_RC_CBR)
av1_config->enableBitstreamPadding = 1;
+#define FOUR_K_CX 3840
+#define FOUR_K_CY 2160
+#define PIXELCOUNT_4K (FOUR_K_CX * FOUR_K_CY)
+
+ /* If 4K+, set tiles to 2x2 uniform tiles. */
+ if ((voi->width * voi->height) >= PIXELCOUNT_4K) {
+ av1_config->enableCustomTileConfig = 0;
+ av1_config->numTileColumns = 2;
+ av1_config->numTileRows = 2;
+ }
+
switch (voi->colorspace) {
case VIDEO_CS_601:
av1_config->colorPrimaries = 6;
From 872f0353e68191d69bcc4678a2d195144fdcabeb Mon Sep 17 00:00:00 2001
From: Ryan Foster <ryan@obsproject.com>
Date: Fri, 14 Apr 2023 12:07:50 -0400
Subject: [PATCH 2/2] obs-ffmpeg: Use 2 tiles per frame in AMF AV1 for 4K+
When resolution is 4K or higher, use 2 tiles per frame in AMF AV1.
---
plugins/obs-ffmpeg/texture-amf.cpp | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/plugins/obs-ffmpeg/texture-amf.cpp b/plugins/obs-ffmpeg/texture-amf.cpp
index 88914a027f699..5979b903385ad 100644
--- a/plugins/obs-ffmpeg/texture-amf.cpp
+++ b/plugins/obs-ffmpeg/texture-amf.cpp
@@ -2018,6 +2018,15 @@ static void amf_av1_create_internal(amf_base *enc, obs_data_t *settings)
const bool is10bit = enc->amf_format == AMF_SURFACE_P010;
const char *preset = obs_data_get_string(settings, "preset");
+ constexpr uint32_t four_k_cx = 3840;
+ constexpr uint32_t four_k_cy = 2160;
+ constexpr uint32_t pixelcount_4k = four_k_cx * four_k_cy;
+
+ /* If 4K+, set tiles per frame to 2. */
+ if ((enc->cx * enc->cy) >= pixelcount_4k) {
+ set_av1_property(enc, TILES_PER_FRAME, 2);
+ }
+
set_av1_property(enc, FRAMESIZE, AMFConstructSize(enc->cx, enc->cy));
set_av1_property(enc, USAGE, AMF_VIDEO_ENCODER_USAGE_TRANSCODING);
set_av1_property(enc, ALIGNMENT_MODE,