diff --git a/docs/source/about/advanced_usage.rst b/docs/source/about/advanced_usage.rst index ee1776c6..1e46bb57 100644 --- a/docs/source/about/advanced_usage.rst +++ b/docs/source/about/advanced_usage.rst @@ -1081,6 +1081,68 @@ amd_rc amd_rc = vbr_latency +amd_usage +^^^^^^^^^ + +**Description** + The encoder usage profile, used to balance latency with encoding quality. + + .. Note:: This option only applies when using amdvce `encoder`_. + +**Choices** + +.. table:: + :widths: auto + + =============== =========== + Value Description + =============== =========== + transcoding transcoding (slowest) + webcam webcam (slow) + lowlatency low latency (fast) + ultralowlatency ultra low latency (fastest) + =============== =========== + +**Default** + ``ultralowlatency`` + +**Example** + .. code-block:: text + + amd_usage = ultralowlatency + +amd_preanalysis +^^^^^^^^^^^^^^^ + +**Description** + Preanalysis can increase encoding quality at the cost of latency. + + .. Note:: This option only applies when using amdvce `encoder`_. + +**Default** + ``disabled`` + +**Example** + .. code-block:: text + + amd_preanalysis = disabled + +amd_vbaq +^^^^^^^^ + +**Description** + Variance Based Adaptive Quantization (VBAQ) can increase subjective visual quality. + + .. Note:: This option only applies when using amdvce `encoder`_. + +**Default** + ``enabled`` + +**Example** + .. code-block:: text + + amd_vbaq = enabled + amd_coder ^^^^^^^^^ diff --git a/src/config.cpp b/src/config.cpp index 11c393a8..7e93ee62 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -130,6 +130,14 @@ namespace amd { #define AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR 1 #define AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR 2 #define AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR 3 +#define AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING 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_USAGE_ULTRA_LOW_LATENCY 1 +#define AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY 2 +#define AMF_VIDEO_ENCODER_USAGE_WEBCAM 3 #define AMF_VIDEO_ENCODER_UNDEFINED 0 #define AMF_VIDEO_ENCODER_CABAC 1 #define AMF_VIDEO_ENCODER_CALV 2 @@ -164,6 +172,20 @@ enum class rc_h264_e : int { cbr = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR }; +enum class usage_hevc_e : int { + transcoding = AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING, + webcam = AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM, + 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, + webcam = AMF_VIDEO_ENCODER_USAGE_WEBCAM, + lowlatency = AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY, + ultralowlatency = AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY +}; + enum coder_e : int { _auto = AMF_VIDEO_ENCODER_UNDEFINED, cabac = AMF_VIDEO_ENCODER_CABAC, @@ -191,6 +213,17 @@ std::optional rc_from_view(const std::string_view &rc, int codec) { return std::nullopt; } +std::optional usage_from_view(const std::string_view &rc, int codec) { +#define _CONVERT_(x) \ + if(rc == #x##sv) return codec == 0 ? (int)usage_hevc_e::x : (int)usage_h264_e::x + _CONVERT_(transcoding); + _CONVERT_(webcam); + _CONVERT_(lowlatency); + _CONVERT_(ultralowlatency); +#undef _CONVERT_ + return std::nullopt; +} + int coder_from_view(const std::string_view &coder) { if(coder == "auto"sv) return _auto; if(coder == "cabac"sv || coder == "ac"sv) return cabac; @@ -300,12 +333,16 @@ video_t video { }, // qsv { - (int)amd::quality_h264_e::balanced, // quality (h264) - (int)amd::quality_hevc_e::balanced, // quality (hevc) - (int)amd::rc_h264_e::vbr_latency, // rate control (h264) - (int)amd::rc_hevc_e::vbr_latency, // rate control (hevc) - (int)amd::coder_e::_auto, // coder - }, // amd + (int)amd::quality_h264_e::balanced, // quality (h264) + (int)amd::quality_hevc_e::balanced, // quality (hevc) + (int)amd::rc_h264_e::vbr_latency, // rate control (h264) + (int)amd::rc_hevc_e::vbr_latency, // rate control (hevc) + (int)amd::usage_h264_e::ultralowlatency, // usage (h264) + (int)amd::usage_hevc_e::ultralowlatency, // usage (hevc) + 0, // preanalysis + 1, // vbaq + (int)amd::coder_e::_auto, // coder + }, // amd { 0, @@ -826,6 +863,16 @@ void apply_config(std::unordered_map &&vars) { video.amd.rc_hevc = amd::rc_from_view(rc, 0); } + std::string usage; + string_f(vars, "amd_usage", usage); + if(!usage.empty()) { + video.amd.usage_h264 = amd::usage_from_view(rc, 1); + video.amd.usage_hevc = amd::usage_from_view(rc, 0); + } + + bool_f(vars, "amd_preanalysis", (bool &)video.amd.preanalysis); + bool_f(vars, "amd_vbaq", (bool &)video.amd.vbaq); + int_f(vars, "vt_coder", video.vt.coder, vt::coder_from_view); int_f(vars, "vt_software", video.vt.allow_sw, vt::allow_software_from_view); int_f(vars, "vt_software", video.vt.require_sw, vt::force_software_from_view); diff --git a/src/config.h b/src/config.h index a95e0f85..77bf9506 100644 --- a/src/config.h +++ b/src/config.h @@ -38,6 +38,10 @@ struct video_t { std::optional quality_hevc; std::optional rc_h264; std::optional rc_hevc; + std::optional usage_h264; + std::optional usage_hevc; + std::optional preanalysis; + std::optional vbaq; int coder; } amd; diff --git a/src/video.cpp b/src/video.cpp index 9389ee3d..4a7ac864 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -539,15 +539,16 @@ static encoder_t amdvce { { // Common options { - { "enforce_hrd"s, true }, + { "filler_data"s, true }, { "gops_per_idr"s, 1 }, { "header_insertion_mode"s, "idr"s }, + { "preanalysis"s, &config::video.amd.preanalysis }, { "qmax"s, 51 }, { "qmin"s, 0 }, { "quality"s, &config::video.amd.quality_hevc }, { "rc"s, &config::video.amd.rc_hevc }, - { "usage"s, "ultralowlatency"s }, - { "vbaq"s, true }, + { "usage"s, &config::video.amd.usage_hevc }, + { "vbaq"s, &config::video.amd.vbaq }, }, {}, // SDR-specific options {}, // HDR-specific options @@ -557,14 +558,15 @@ static encoder_t amdvce { { // Common options { - { "enforce_hrd"s, true }, + { "filler_data"s, true }, { "log_to_dbg"s, "1"s }, + { "preanalysis"s, &config::video.amd.preanalysis }, { "qmax"s, 51 }, { "qmin"s, 0 }, { "quality"s, &config::video.amd.quality_h264 }, { "rc"s, &config::video.amd.rc_h264 }, - { "usage"s, "ultralowlatency"s }, - { "vbaq"s, true }, + { "usage"s, &config::video.amd.usage_h264 }, + { "vbaq"s, &config::video.amd.vbaq }, }, {}, // SDR-specific options {}, // HDR-specific options diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html index 98368a36..9fbc0854 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -765,6 +765,29 @@ +
+ + +
+
+ + +
+
+ + +