fix(amf): attempt to use level 5.1/5.2 for hevc (#3888)

This commit is contained in:
Mariotaku
2025-07-08 03:53:40 +09:00
committed by GitHub
parent d96251d18f
commit 01f281a4a3
2 changed files with 18 additions and 3 deletions

View File

@@ -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

View File

@@ -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)},