Fix rate control for hevc with amdvce
This commit is contained in:
+29
-6
@@ -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
@@ -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
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user