diff --git a/src/video.cpp b/src/video.cpp index a4a3aed6..b2c22242 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -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; });