Treat codec modes as soft requirements
This commit is contained in:
@@ -2241,11 +2241,8 @@ namespace video {
|
||||
BOOST_LOG(info) << "Encoder ["sv << encoder.name << "] failed"sv;
|
||||
});
|
||||
|
||||
auto force_hevc = active_hevc_mode >= 2;
|
||||
auto test_hevc = force_hevc || (active_hevc_mode == 0 && !(encoder.flags & H264_ONLY));
|
||||
|
||||
auto force_av1 = active_av1_mode >= 2;
|
||||
auto test_av1 = force_av1 || (active_av1_mode == 0 && !(encoder.flags & H264_ONLY));
|
||||
auto test_hevc = active_hevc_mode >= 2 || (active_hevc_mode == 0 && !(encoder.flags & H264_ONLY));
|
||||
auto test_av1 = active_av1_mode >= 2 || (active_av1_mode == 0 && !(encoder.flags & H264_ONLY));
|
||||
|
||||
encoder.h264.capabilities.set();
|
||||
encoder.hevc.capabilities.set();
|
||||
@@ -2303,18 +2300,11 @@ namespace video {
|
||||
retry_hevc:
|
||||
auto max_ref_frames_hevc = validate_config(disp, encoder, config_max_ref_frames);
|
||||
auto autoselect_hevc = max_ref_frames_hevc >= 0 ? max_ref_frames_hevc : validate_config(disp, encoder, config_autoselect);
|
||||
if (autoselect_hevc < 0) {
|
||||
if (encoder.hevc.qp && encoder.hevc[encoder_t::CBR]) {
|
||||
// It's possible the encoder isn't accepting Constant Bit Rate. Turn off CBR and make another attempt
|
||||
encoder.hevc.capabilities.set();
|
||||
encoder.hevc[encoder_t::CBR] = false;
|
||||
goto retry_hevc;
|
||||
}
|
||||
|
||||
// If HEVC must be supported, but it is not supported
|
||||
if (force_hevc) {
|
||||
return false;
|
||||
}
|
||||
if (autoselect_hevc < 0 && encoder.hevc.qp && encoder.hevc[encoder_t::CBR]) {
|
||||
// It's possible the encoder isn't accepting Constant Bit Rate. Turn off CBR and make another attempt
|
||||
encoder.hevc.capabilities.set();
|
||||
encoder.hevc[encoder_t::CBR] = false;
|
||||
goto retry_hevc;
|
||||
}
|
||||
|
||||
for (auto [validate_flag, encoder_flag] : packet_deficiencies) {
|
||||
@@ -2336,18 +2326,11 @@ namespace video {
|
||||
retry_av1:
|
||||
auto max_ref_frames_av1 = validate_config(disp, encoder, config_max_ref_frames);
|
||||
auto autoselect_av1 = max_ref_frames_av1 >= 0 ? max_ref_frames_av1 : validate_config(disp, encoder, config_autoselect);
|
||||
if (autoselect_av1 < 0) {
|
||||
if (encoder.av1.qp && encoder.av1[encoder_t::CBR]) {
|
||||
// It's possible the encoder isn't accepting Constant Bit Rate. Turn off CBR and make another attempt
|
||||
encoder.av1.capabilities.set();
|
||||
encoder.av1[encoder_t::CBR] = false;
|
||||
goto retry_av1;
|
||||
}
|
||||
|
||||
// If AV1 must be supported, but it is not supported
|
||||
if (force_av1) {
|
||||
return false;
|
||||
}
|
||||
if (autoselect_av1 < 0 && encoder.av1.qp && encoder.av1[encoder_t::CBR]) {
|
||||
// It's possible the encoder isn't accepting Constant Bit Rate. Turn off CBR and make another attempt
|
||||
encoder.av1.capabilities.set();
|
||||
encoder.av1[encoder_t::CBR] = false;
|
||||
goto retry_av1;
|
||||
}
|
||||
|
||||
for (auto [validate_flag, encoder_flag] : packet_deficiencies) {
|
||||
@@ -2419,6 +2402,27 @@ namespace video {
|
||||
active_av1_mode = config::video.av1_mode;
|
||||
last_encoder_probe_supported_ref_frames_invalidation = false;
|
||||
|
||||
auto adjust_encoder_constraints = [&](encoder_t *encoder) {
|
||||
// If we can't satisfy both the encoder and codec requirement, prefer the encoder over codec support
|
||||
if (active_hevc_mode == 3 && !encoder->hevc[encoder_t::DYNAMIC_RANGE]) {
|
||||
BOOST_LOG(warning) << "Encoder ["sv << encoder->name << "] does not support HEVC Main10 on this system"sv;
|
||||
active_hevc_mode = 0;
|
||||
}
|
||||
else if (active_hevc_mode == 2 && !encoder->hevc[encoder_t::PASSED]) {
|
||||
BOOST_LOG(warning) << "Encoder ["sv << encoder->name << "] does not support HEVC on this system"sv;
|
||||
active_hevc_mode = 0;
|
||||
}
|
||||
|
||||
if (active_av1_mode == 3 && !encoder->av1[encoder_t::DYNAMIC_RANGE]) {
|
||||
BOOST_LOG(warning) << "Encoder ["sv << encoder->name << "] does not support AV1 Main10 on this system"sv;
|
||||
active_av1_mode = 0;
|
||||
}
|
||||
else if (active_av1_mode == 2 && !encoder->av1[encoder_t::PASSED]) {
|
||||
BOOST_LOG(warning) << "Encoder ["sv << encoder->name << "] does not support AV1 on this system"sv;
|
||||
active_av1_mode = 0;
|
||||
}
|
||||
};
|
||||
|
||||
if (!config::video.encoder.empty()) {
|
||||
// If there is a specific encoder specified, use it if it passes validation
|
||||
KITTY_WHILE_LOOP(auto pos = std::begin(encoder_list), pos != std::end(encoder_list), {
|
||||
@@ -2431,15 +2435,8 @@ namespace video {
|
||||
break;
|
||||
}
|
||||
|
||||
// If we can't satisfy both the encoder and HDR requirement, prefer the encoder over HDR support
|
||||
if (active_hevc_mode == 3 && !encoder->hevc[encoder_t::DYNAMIC_RANGE]) {
|
||||
BOOST_LOG(warning) << "Encoder ["sv << config::video.encoder << "] does not support HEVC Main10 on this system"sv;
|
||||
active_hevc_mode = 0;
|
||||
}
|
||||
if (active_av1_mode == 3 && !encoder->av1[encoder_t::DYNAMIC_RANGE]) {
|
||||
BOOST_LOG(warning) << "Encoder ["sv << config::video.encoder << "] does not support AV1 Main10 on this system"sv;
|
||||
active_av1_mode = 0;
|
||||
}
|
||||
// We will return an encoder here even if it fails one of the codec requirements specified by the user
|
||||
adjust_encoder_constraints(encoder);
|
||||
|
||||
chosen_encoder = encoder;
|
||||
break;
|
||||
@@ -2455,8 +2452,8 @@ namespace video {
|
||||
|
||||
BOOST_LOG(info) << "// Testing for available encoders, this may generate errors. You can safely ignore those errors. //"sv;
|
||||
|
||||
// If we haven't found an encoder yet, but we want one with HDR support, search for that now.
|
||||
if (chosen_encoder == nullptr && (active_hevc_mode == 3 || active_av1_mode == 3)) {
|
||||
// If we haven't found an encoder yet, but we want one with specific codec support, search for that now.
|
||||
if (chosen_encoder == nullptr && (active_hevc_mode >= 2 || active_av1_mode >= 2)) {
|
||||
KITTY_WHILE_LOOP(auto pos = std::begin(encoder_list), pos != std::end(encoder_list), {
|
||||
auto encoder = *pos;
|
||||
|
||||
@@ -2466,7 +2463,14 @@ namespace video {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip it if it doesn't support HDR
|
||||
// Skip it if it doesn't support the specified codec at all
|
||||
if ((active_hevc_mode >= 2 && !encoder->hevc[encoder_t::PASSED]) ||
|
||||
(active_av1_mode >= 2 && !encoder->av1[encoder_t::PASSED])) {
|
||||
pos++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip it if it doesn't support HDR on the specified codec
|
||||
if ((active_hevc_mode == 3 && !encoder->hevc[encoder_t::DYNAMIC_RANGE]) ||
|
||||
(active_av1_mode == 3 && !encoder->av1[encoder_t::DYNAMIC_RANGE])) {
|
||||
pos++;
|
||||
@@ -2478,7 +2482,7 @@ namespace video {
|
||||
});
|
||||
|
||||
if (chosen_encoder == nullptr) {
|
||||
BOOST_LOG(error) << "Couldn't find any working HDR-capable encoder"sv;
|
||||
BOOST_LOG(error) << "Couldn't find any working encoder that meets HEVC/AV1 requirements"sv;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2496,6 +2500,9 @@ namespace video {
|
||||
continue;
|
||||
}
|
||||
|
||||
// We will return an encoder here even if it fails one of the codec requirements specified by the user
|
||||
adjust_encoder_constraints(encoder);
|
||||
|
||||
chosen_encoder = encoder;
|
||||
break;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user