fix(video): allow encoder probing when there are no devices at all (#3594)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Setup Flatpak Matrix (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (push) Has been cancelled
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled

This commit is contained in:
Lukas Senionis
2025-01-27 19:19:47 +02:00
committed by GitHub
parent 24cce3a666
commit 23e131439f
3 changed files with 41 additions and 14 deletions

View File

@@ -40,6 +40,37 @@ using namespace std::literals;
namespace video {
namespace {
/**
* @brief Check if we can allow probing for the encoders.
* @return True if there should be no issues with the probing, false if we should prevent it.
*/
bool allow_encoder_probing() {
const auto devices {display_device::enumerate_devices()};
// If there are no devices, then either the API is not working correctly or OS does not support the lib.
// Either way we should not block the probing in this case as we can't tell what's wrong.
if (devices.empty()) {
return true;
}
// Since Windows 11 24H2, it is possible that there will be no active devices present
// for some reason (probably a bug). Trying to probe encoders in such a state locks/breaks the DXGI
// and also the display device for Windows. So we must have at least 1 active device.
const bool at_least_one_device_is_active = std::any_of(std::begin(devices), std::end(devices), [](const auto &device) {
// If device has additional info, it is active.
return static_cast<bool>(device.m_info);
});
if (at_least_one_device_is_active) {
return true;
}
BOOST_LOG(error) << "No display devices are active at the moment! Cannot probe the encoders.";
return false;
}
} // namespace
void free_ctx(AVCodecContext *ctx) {
avcodec_free_context(&ctx);
}
@@ -2550,8 +2581,8 @@ namespace video {
}
int probe_encoders() {
if (!display_device::is_any_device_active()) {
BOOST_LOG(error) << "No display devices are active at the moment! Cannot probe encoders as this could break Sunshine.";
if (!allow_encoder_probing()) {
// Error already logged
return -1;
}