Fix rate control for hevc with amdvce

This commit is contained in:
loki-47-6F-64
2021-09-27 19:12:42 +02:00
parent f4cb13aa0e
commit 9f14b2278d
3 changed files with 35 additions and 11 deletions
+29 -6
View File
@@ -99,16 +99,22 @@ enum quality_e : int {
_default = 0, _default = 0,
speed, speed,
balanced, balanced,
//quality2,
}; };
enum rc_e : int { enum class rc_hevc_e : int {
constqp, /**< Constant QP mode */ constqp, /**< Constant QP mode */
vbr_latency, /**< Latency Constrained Variable Bitrate */ vbr_latency, /**< Latency Constrained Variable Bitrate */
vbr_peak, /**< Peak Contrained Variable Bitrate */ vbr_peak, /**< Peak Contrained Variable Bitrate */
cbr, /**< Constant bitrate mode */ cbr, /**< Constant bitrate mode */
}; };
enum class rc_h264_e : int {
constqp, /**< Constant QP mode */
cbr, /**< Constant bitrate mode */
vbr_peak, /**< Peak Contrained Variable Bitrate */
vbr_latency, /**< Latency Constrained Variable Bitrate */
};
enum coder_e : int { enum coder_e : int {
_auto = 0, _auto = 0,
cabac, cabac,
@@ -120,15 +126,25 @@ std::optional<quality_e> quality_from_view(const std::string_view &quality) {
if(quality == #x##sv) return x if(quality == #x##sv) return x
_CONVERT_(speed); _CONVERT_(speed);
_CONVERT_(balanced); _CONVERT_(balanced);
//_CONVERT_(quality2);
if(quality == "default"sv) return _default; if(quality == "default"sv) return _default;
#undef _CONVERT_ #undef _CONVERT_
return std::nullopt; return std::nullopt;
} }
std::optional<rc_e> rc_from_view(const std::string_view &rc) { std::optional<int> rc_h264_from_view(const std::string_view &rc) {
#define _CONVERT_(x) \ #define _CONVERT_(x) \
if(rc == #x##sv) return x if(rc == #x##sv) return (int)rc_h264_e::x
_CONVERT_(constqp);
_CONVERT_(vbr_latency);
_CONVERT_(vbr_peak);
_CONVERT_(cbr);
#undef _CONVERT_
return std::nullopt;
}
std::optional<int> rc_hevc_from_view(const std::string_view &rc) {
#define _CONVERT_(x) \
if(rc == #x##sv) return (int)rc_hevc_e::x
_CONVERT_(constqp); _CONVERT_(constqp);
_CONVERT_(vbr_latency); _CONVERT_(vbr_latency);
_CONVERT_(vbr_peak); _CONVERT_(vbr_peak);
@@ -165,6 +181,7 @@ video_t video {
{ {
amd::balanced, amd::balanced,
std::nullopt, std::nullopt,
std::nullopt,
-1 }, // amd -1 }, // amd
{}, // encoder {}, // encoder
@@ -659,8 +676,14 @@ void apply_config(std::unordered_map<std::string, std::string> &&vars) {
int_f(vars, "nv_coder", video.nv.coder, nv::coder_from_view); int_f(vars, "nv_coder", video.nv.coder, nv::coder_from_view);
int_f(vars, "amd_quality", video.amd.quality, amd::quality_from_view); int_f(vars, "amd_quality", video.amd.quality, amd::quality_from_view);
int_f(vars, "amd_rc", video.amd.rc, amd::rc_from_view);
std::string rc;
string_f(vars, "amd_rc", rc);
int_f(vars, "amd_coder", video.amd.coder, amd::coder_from_view); int_f(vars, "amd_coder", video.amd.coder, amd::coder_from_view);
if(!rc.empty()) {
video.amd.rc_h264 = amd::rc_h264_from_view(rc);
video.amd.rc_hevc = amd::rc_hevc_from_view(rc);
}
string_f(vars, "encoder", video.encoder); string_f(vars, "encoder", video.encoder);
string_f(vars, "adapter_name", video.adapter_name); string_f(vars, "adapter_name", video.adapter_name);
+2 -1
View File
@@ -29,7 +29,8 @@ struct video_t {
struct { struct {
std::optional<int> quality; std::optional<int> quality;
std::optional<int> rc; std::optional<int> rc_h264;
std::optional<int> rc_hevc;
int coder; int coder;
} amd; } amd;
+4 -4
View File
@@ -459,19 +459,19 @@ static encoder_t amdvce {
{ "gops_per_idr"s, 30 }, { "gops_per_idr"s, 30 },
{ "usage"s, "ultralowlatency"s }, { "usage"s, "ultralowlatency"s },
{ "quality"s, &config::video.amd.quality }, { "quality"s, &config::video.amd.quality },
{ "rc"s, &config::video.amd.rc }, { "rc"s, &config::video.amd.rc_hevc },
}, },
std::make_optional<encoder_t::option_t>({ "qp"s, &config::video.qp }), std::make_optional<encoder_t::option_t>({ "qp_p"s, &config::video.qp }),
"hevc_amf"s, "hevc_amf"s,
}, },
{ {
{ {
{ "usage"s, "ultralowlatency"s }, { "usage"s, "ultralowlatency"s },
{ "quality"s, &config::video.amd.quality }, { "quality"s, &config::video.amd.quality },
{ "rc"s, &config::video.amd.rc }, { "rc"s, &config::video.amd.rc_h264 },
{ "log_to_dbg"s, "1"s }, { "log_to_dbg"s, "1"s },
}, },
std::make_optional<encoder_t::option_t>({ "qp"s, &config::video.qp }), std::make_optional<encoder_t::option_t>({ "qp_p"s, &config::video.qp }),
"h264_amf"s, "h264_amf"s,
}, },
DEFAULT, DEFAULT,