From ae71a6ad83539168a0e13383353576a46a162a03 Mon Sep 17 00:00:00 2001 From: Conn O'Griofa Date: Sat, 30 Mar 2024 01:07:24 +0000 Subject: [PATCH] AMF: rate control improvements (#2251) --- docs/source/about/advanced_usage.rst | 37 ++++++++++++++----- src/config.cpp | 33 +++++++++++------ src/config.h | 1 + src/video.cpp | 3 ++ src_assets/common/assets/web/config.html | 15 +++++++- .../assets/web/public/assets/locale/en.json | 8 ++-- 6 files changed, 70 insertions(+), 27 deletions(-) diff --git a/docs/source/about/advanced_usage.rst b/docs/source/about/advanced_usage.rst index 36468fd1..1c3a0f64 100644 --- a/docs/source/about/advanced_usage.rst +++ b/docs/source/about/advanced_usage.rst @@ -1523,12 +1523,12 @@ keybindings =========== =========== **Default** - ``vbr_latency`` + ``cbr`` **Example** .. code-block:: text - amd_rc = vbr_latency + amd_rc = cbr `amd_usage `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1543,14 +1543,15 @@ keybindings .. table:: :widths: auto - =============== =========== - Value Description - =============== =========== - transcoding transcoding (slowest) - webcam webcam (slow) - lowlatency low latency (fast) - ultralowlatency ultra low latency (fastest) - =============== =========== + ======================= =========== + Value Description + ======================= =========== + transcoding transcoding (slowest) + webcam webcam (slow) + lowlatency_high_quality low latency, high quality (fast) + lowlatency low latency (faster) + ultralowlatency ultra low latency (fastest) + ======================= =========== **Default** ``ultralowlatency`` @@ -1592,6 +1593,22 @@ keybindings amd_vbaq = enabled +`amd_enforce_hrd `__ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Description** + Enable Hypothetical Reference Decoder (HRD) enforcement to help constrain the target bitrate. + + .. note:: This option only applies when using amdvce `encoder`_. + +**Default** + ``enabled`` + +**Example** + .. code-block:: text + + amd_enforce_hrd = enabled + `amd_coder `__ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/config.cpp b/src/config.cpp index fd36c672..29a18f63 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -85,14 +85,17 @@ namespace config { #define AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY 1 #define AMF_VIDEO_ENCODER_AV1_USAGE_ULTRA_LOW_LATENCY 2 #define AMF_VIDEO_ENCODER_AV1_USAGE_WEBCAM 3 - #define AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING 0 + #define AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY_HIGH_QUALITY 5 + #define AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCODING 0 #define AMF_VIDEO_ENCODER_HEVC_USAGE_ULTRA_LOW_LATENCY 1 #define AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY 2 #define AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM 3 - #define AMF_VIDEO_ENCODER_USAGE_TRANSCONDING 0 + #define AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY_HIGH_QUALITY 5 + #define AMF_VIDEO_ENCODER_USAGE_TRANSCODING 0 #define AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY 1 #define AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY 2 #define AMF_VIDEO_ENCODER_USAGE_WEBCAM 3 + #define AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY_HIGH_QUALITY 5 #define AMF_VIDEO_ENCODER_UNDEFINED 0 #define AMF_VIDEO_ENCODER_CABAC 1 #define AMF_VIDEO_ENCODER_CALV 2 @@ -144,20 +147,23 @@ namespace config { enum class usage_av1_e : int { transcoding = AMF_VIDEO_ENCODER_AV1_USAGE_TRANSCODING, webcam = AMF_VIDEO_ENCODER_AV1_USAGE_WEBCAM, + lowlatency_high_quality = AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY_HIGH_QUALITY, lowlatency = AMF_VIDEO_ENCODER_AV1_USAGE_LOW_LATENCY, ultralowlatency = AMF_VIDEO_ENCODER_AV1_USAGE_ULTRA_LOW_LATENCY }; enum class usage_hevc_e : int { - transcoding = AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING, + transcoding = AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCODING, webcam = AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM, + lowlatency_high_quality = AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY_HIGH_QUALITY, lowlatency = AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY, ultralowlatency = AMF_VIDEO_ENCODER_HEVC_USAGE_ULTRA_LOW_LATENCY }; enum class usage_h264_e : int { - transcoding = AMF_VIDEO_ENCODER_USAGE_TRANSCONDING, + transcoding = AMF_VIDEO_ENCODER_USAGE_TRANSCODING, webcam = AMF_VIDEO_ENCODER_USAGE_WEBCAM, + lowlatency_high_quality = AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY_HIGH_QUALITY, lowlatency = AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY, ultralowlatency = AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY }; @@ -195,12 +201,13 @@ namespace config { template std::optional - usage_from_view(const std::string_view &rc) { + usage_from_view(const std::string_view &usage) { #define _CONVERT_(x) \ - if (rc == #x##sv) return (int) T::x + if (usage == #x##sv) return (int) T::x _CONVERT_(transcoding); _CONVERT_(webcam); _CONVERT_(lowlatency); + _CONVERT_(lowlatency_high_quality); _CONVERT_(ultralowlatency); #undef _CONVERT_ return std::nullopt; @@ -346,14 +353,15 @@ namespace config { (int) amd::quality_h264_e::balanced, // quality (h264) (int) amd::quality_hevc_e::balanced, // quality (hevc) (int) amd::quality_av1_e::balanced, // quality (av1) - (int) amd::rc_h264_e::vbr_latency, // rate control (h264) - (int) amd::rc_hevc_e::vbr_latency, // rate control (hevc) - (int) amd::rc_av1_e::vbr_latency, // rate control (av1) + (int) amd::rc_h264_e::cbr, // rate control (h264) + (int) amd::rc_hevc_e::cbr, // rate control (hevc) + (int) amd::rc_av1_e::cbr, // rate control (av1) (int) amd::usage_h264_e::ultralowlatency, // usage (h264) (int) amd::usage_hevc_e::ultralowlatency, // usage (hevc) (int) amd::usage_av1_e::ultralowlatency, // usage (av1) 0, // preanalysis 1, // vbaq + 1, // enforce_hrd (int) amd::coder_e::_auto, // coder }, // amd @@ -991,13 +999,14 @@ namespace config { std::string usage; string_f(vars, "amd_usage", usage); if (!usage.empty()) { - video.amd.amd_usage_h264 = amd::usage_from_view(rc); - video.amd.amd_usage_hevc = amd::usage_from_view(rc); - video.amd.amd_usage_av1 = amd::usage_from_view(rc); + video.amd.amd_usage_h264 = amd::usage_from_view(usage); + video.amd.amd_usage_hevc = amd::usage_from_view(usage); + video.amd.amd_usage_av1 = amd::usage_from_view(usage); } bool_f(vars, "amd_preanalysis", (bool &) video.amd.amd_preanalysis); bool_f(vars, "amd_vbaq", (bool &) video.amd.amd_vbaq); + bool_f(vars, "amd_enforce_hrd", (bool &) video.amd.amd_enforce_hrd); int_f(vars, "vt_coder", video.vt.vt_coder, vt::coder_from_view); int_f(vars, "vt_software", video.vt.vt_allow_sw, vt::allow_software_from_view); diff --git a/src/config.h b/src/config.h index f30e7e6a..2c85096b 100644 --- a/src/config.h +++ b/src/config.h @@ -59,6 +59,7 @@ namespace config { std::optional amd_usage_av1; std::optional amd_preanalysis; std::optional amd_vbaq; + std::optional amd_enforce_hrd; int amd_coder; } amd; diff --git a/src/video.cpp b/src/video.cpp index 920ce1a4..6c1938c2 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -672,6 +672,7 @@ namespace video { { "quality"s, &config::video.amd.amd_quality_av1 }, { "rc"s, &config::video.amd.amd_rc_av1 }, { "usage"s, &config::video.amd.amd_usage_av1 }, + { "enforce_hrd"s, &config::video.amd.amd_enforce_hrd }, }, {}, // SDR-specific options {}, // HDR-specific options @@ -693,6 +694,7 @@ namespace video { { "rc"s, &config::video.amd.amd_rc_hevc }, { "usage"s, &config::video.amd.amd_usage_hevc }, { "vbaq"s, &config::video.amd.amd_vbaq }, + { "enforce_hrd"s, &config::video.amd.amd_enforce_hrd }, }, {}, // SDR-specific options {}, // HDR-specific options @@ -712,6 +714,7 @@ namespace video { { "rc"s, &config::video.amd.amd_rc_h264 }, { "usage"s, &config::video.amd.amd_usage_h264 }, { "vbaq"s, &config::video.amd.amd_vbaq }, + { "enforce_hrd"s, &config::video.amd.amd_enforce_hrd }, }, // SDR-specific options {}, diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html index debcdaae..5e73ad20 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -888,10 +888,10 @@
@@ -902,6 +902,7 @@ + @@ -924,6 +925,15 @@ + +
+ + +
+
@@ -1146,10 +1156,11 @@ name: "AMD AMF Encoder", options: { "amd_quality": "balanced", - "amd_rc": "vbr_latency", + "amd_rc": "cbr", "amd_usage": "ultralowlatency", "amd_preanalysis": "disabled", "amd_vbaq": "enabled", + "amd_enforce_hrd": "enabled", "amd_coder": "auto", }, }, diff --git a/src_assets/common/assets/web/public/assets/locale/en.json b/src_assets/common/assets/web/public/assets/locale/en.json index 8d1be14d..586e811c 100644 --- a/src_assets/common/assets/web/public/assets/locale/en.json +++ b/src_assets/common/assets/web/public/assets/locale/en.json @@ -92,18 +92,20 @@ "always_send_scancodes": "Always Send Scancodes", "always_send_scancodes_desc": "Sending scancodes enhances compatibility with games and apps but may result in incorrect keyboard input from certain clients that aren't using a US English keyboard layout. Enable if keyboard input is not working at all in certain applications. Disable if keys on the client are generating the wrong input on the host.", "amd_coder": "AMF Coder (H264)", + "amd_enforce_hrd": "AMF Hypothetical Reference Decoder (HRD) Enforcement", "amd_preanalysis": "AMF Preanalysis", "amd_quality": "AMF Quality", "amd_quality_balanced": "balanced -- balanced (default)", "amd_quality_quality": "quality -- prefer quality", "amd_quality_speed": "speed -- prefer speed", "amd_rc": "AMF Rate Control", - "amd_rc_cbr": "cbr -- constant bitrate", + "amd_rc_cbr": "cbr -- constant bitrate (default)", "amd_rc_cqp": "cqp -- constant qp mode", - "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate (default)", + "amd_rc_vbr_latency": "vbr_latency -- latency constrained variable bitrate", "amd_rc_vbr_peak": "vbr_peak -- peak constrained variable bitrate", "amd_usage": "AMF Usage", - "amd_usage_lowlatency": "lowlatency - low latency (fast)", + "amd_usage_lowlatency": "lowlatency - low latency (fastest)", + "amd_usage_lowlatency_high_quality": "lowlatency_high_quality - low latency, high quality (fast)", "amd_usage_transcoding": "transcoding -- transcoding (slowest)", "amd_usage_ultralowlatency": "ultralowlatency - ultra low latency (fastest)", "amd_usage_webcam": "webcam -- webcam (slow)",