From 33dafbc801b798e849c3d1bf27f2d2a24a399c8f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 11 May 2023 19:55:11 -0500 Subject: [PATCH] Add warning when Desktop Duplication API masks protected content from capture --- src/platform/windows/display.h | 1 + src/platform/windows/display_base.cpp | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/platform/windows/display.h b/src/platform/windows/display.h index 9e019a32..2496cd3f 100644 --- a/src/platform/windows/display.h +++ b/src/platform/windows/display.h @@ -109,6 +109,7 @@ namespace platf::dxgi { dup_t dup; bool has_frame {}; bool use_dwmflush {}; + std::chrono::steady_clock::time_point last_protected_content_warning_time {}; capture_e next_frame(DXGI_OUTDUPL_FRAME_INFO &frame_info, std::chrono::milliseconds timeout, resource_t::pointer *res_p); diff --git a/src/platform/windows/display_base.cpp b/src/platform/windows/display_base.cpp index ae9807f4..e4483ae7 100644 --- a/src/platform/windows/display_base.cpp +++ b/src/platform/windows/display_base.cpp @@ -40,6 +40,14 @@ namespace platf::dxgi { switch (status) { case S_OK: + // ProtectedContentMaskedOut seems to semi-randomly be TRUE or FALSE even when protected content + // is on screen the whole time, so we can't just print when it changes. Instead we'll keep track + // of the last time we printed the warning and print another if we haven't printed one recently. + if (frame_info.ProtectedContentMaskedOut && std::chrono::steady_clock::now() > last_protected_content_warning_time + 10s) { + BOOST_LOG(warning) << "Windows is currently blocking DRM-protected content from capture. You may see black regions where this content would be."sv; + last_protected_content_warning_time = std::chrono::steady_clock::now(); + } + has_frame = true; return capture_e::ok; case DXGI_ERROR_WAIT_TIMEOUT: