diff --git a/sunshine/config.cpp b/sunshine/config.cpp index 18083d9a..a35d5955 100644 --- a/sunshine/config.cpp +++ b/sunshine/config.cpp @@ -99,16 +99,22 @@ enum quality_e : int { _default = 0, speed, balanced, - //quality2, }; -enum rc_e : int { +enum class rc_hevc_e : int { constqp, /**< Constant QP mode */ vbr_latency, /**< Latency Constrained Variable Bitrate */ vbr_peak, /**< Peak Contrained Variable Bitrate */ 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 { _auto = 0, cabac, @@ -120,15 +126,25 @@ std::optional quality_from_view(const std::string_view &quality) { if(quality == #x##sv) return x _CONVERT_(speed); _CONVERT_(balanced); - //_CONVERT_(quality2); if(quality == "default"sv) return _default; #undef _CONVERT_ return std::nullopt; } -std::optional rc_from_view(const std::string_view &rc) { +std::optional rc_h264_from_view(const std::string_view &rc) { #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 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_(vbr_latency); _CONVERT_(vbr_peak); @@ -165,6 +181,7 @@ video_t video { { amd::balanced, std::nullopt, + std::nullopt, -1 }, // amd {}, // encoder @@ -659,8 +676,14 @@ void apply_config(std::unordered_map &&vars) { 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_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); + 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, "adapter_name", video.adapter_name); diff --git a/sunshine/config.h b/sunshine/config.h index 80d4052d..624e4225 100644 --- a/sunshine/config.h +++ b/sunshine/config.h @@ -29,7 +29,8 @@ struct video_t { struct { std::optional quality; - std::optional rc; + std::optional rc_h264; + std::optional rc_hevc; int coder; } amd; diff --git a/sunshine/video.cpp b/sunshine/video.cpp index 261d86bc..d52a5caa 100644 --- a/sunshine/video.cpp +++ b/sunshine/video.cpp @@ -459,19 +459,19 @@ static encoder_t amdvce { { "gops_per_idr"s, 30 }, { "usage"s, "ultralowlatency"s }, { "quality"s, &config::video.amd.quality }, - { "rc"s, &config::video.amd.rc }, + { "rc"s, &config::video.amd.rc_hevc }, }, - std::make_optional({ "qp"s, &config::video.qp }), + std::make_optional({ "qp_p"s, &config::video.qp }), "hevc_amf"s, }, { { { "usage"s, "ultralowlatency"s }, { "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 }, }, - std::make_optional({ "qp"s, &config::video.qp }), + std::make_optional({ "qp_p"s, &config::video.qp }), "h264_amf"s, }, DEFAULT,