fix(amf): attempt to use level 5.1/5.2 for hevc (#3888)
This commit is contained in:
@@ -765,6 +765,18 @@ namespace video {
|
|||||||
{"usage"s, &config::video.amd.amd_usage_hevc},
|
{"usage"s, &config::video.amd.amd_usage_hevc},
|
||||||
{"vbaq"s, &config::video.amd.amd_vbaq},
|
{"vbaq"s, &config::video.amd.amd_vbaq},
|
||||||
{"enforce_hrd"s, &config::video.amd.amd_enforce_hrd},
|
{"enforce_hrd"s, &config::video.amd.amd_enforce_hrd},
|
||||||
|
{"level"s, [](const config_t &cfg) {
|
||||||
|
auto size = cfg.width * cfg.height;
|
||||||
|
// For 4K and below, try to use level 5.1 or 5.2 if possible
|
||||||
|
if (size <= 8912896) {
|
||||||
|
if (size * cfg.framerate <= 534773760) {
|
||||||
|
return "5.1"s;
|
||||||
|
} else if (size * cfg.framerate <= 1069547520) {
|
||||||
|
return "5.2"s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "auto"s;
|
||||||
|
}},
|
||||||
},
|
},
|
||||||
{}, // SDR-specific options
|
{}, // SDR-specific options
|
||||||
{}, // HDR-specific options
|
{}, // HDR-specific options
|
||||||
@@ -1639,7 +1651,7 @@ namespace video {
|
|||||||
ctx->thread_count = ctx->slices;
|
ctx->thread_count = ctx->slices;
|
||||||
|
|
||||||
AVDictionary *options {nullptr};
|
AVDictionary *options {nullptr};
|
||||||
auto handle_option = [&options](const encoder_t::option_t &option) {
|
auto handle_option = [&options, &config](const encoder_t::option_t &option) {
|
||||||
std::visit(
|
std::visit(
|
||||||
util::overloaded {
|
util::overloaded {
|
||||||
[&](int v) {
|
[&](int v) {
|
||||||
@@ -1653,7 +1665,7 @@ namespace video {
|
|||||||
av_dict_set_int(&options, option.name.c_str(), **v, 0);
|
av_dict_set_int(&options, option.name.c_str(), **v, 0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[&](std::function<int()> v) {
|
[&](const std::function<int()> &v) {
|
||||||
av_dict_set_int(&options, option.name.c_str(), v(), 0);
|
av_dict_set_int(&options, option.name.c_str(), v(), 0);
|
||||||
},
|
},
|
||||||
[&](const std::string &v) {
|
[&](const std::string &v) {
|
||||||
@@ -1663,6 +1675,9 @@ namespace video {
|
|||||||
if (!v->empty()) {
|
if (!v->empty()) {
|
||||||
av_dict_set(&options, option.name.c_str(), v->c_str(), 0);
|
av_dict_set(&options, option.name.c_str(), v->c_str(), 0);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
[&](const std::function<const std::string(const config_t &cfg)> &v) {
|
||||||
|
av_dict_set(&options, option.name.c_str(), v(config).c_str(), 0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
option.value
|
option.value
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ namespace video {
|
|||||||
option_t(const option_t &) = default;
|
option_t(const option_t &) = default;
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
std::variant<int, int *, std::optional<int> *, std::function<int()>, std::string, std::string *> value;
|
std::variant<int, int *, std::optional<int> *, std::function<int()>, std::string, std::string *, std::function<const std::string(const config_t &)>> value;
|
||||||
|
|
||||||
option_t(std::string &&name, decltype(value) &&value):
|
option_t(std::string &&name, decltype(value) &&value):
|
||||||
name {std::move(name)},
|
name {std::move(name)},
|
||||||
|
|||||||
Reference in New Issue
Block a user