webrtc_m130/modules/desktop_capture/screen_capturer_win.cc
henrika d549e4b6ce DXGI now consumes may_contain_cursor
Before:

No attempt was made to figure out of the cursor was embedded into the
captured video frame when using DXGI on Windows as screen capturer.
Instead the cursor is superimposed on the frame by an external mouse
and cursor composer.

After:

We now check if the display adapter supports embedding the mouse
cursor and if so use it as is and thereby avoid adding it independently.

Bug: chromium:1421656
Change-Id: Ie07fe13e1c8f9583769961328bb41fbc689cd8e0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/299241
Reviewed-by: Alexander Cooper <alcooper@chromium.org>
Commit-Queue: Henrik Andreassson <henrika@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39742}
2023-04-03 08:30:59 +00:00

73 lines
2.8 KiB
C++

/*
* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include <memory>
#include <utility>
#include "modules/desktop_capture/blank_detector_desktop_capturer_wrapper.h"
#include "modules/desktop_capture/desktop_capture_options.h"
#include "modules/desktop_capture/desktop_capturer.h"
#include "modules/desktop_capture/fallback_desktop_capturer_wrapper.h"
#include "modules/desktop_capture/rgba_color.h"
#include "modules/desktop_capture/win/screen_capturer_win_directx.h"
#include "modules/desktop_capture/win/screen_capturer_win_gdi.h"
#include "modules/desktop_capture/win/screen_capturer_win_magnifier.h"
namespace webrtc {
namespace {
std::unique_ptr<DesktopCapturer> CreateScreenCapturerWinDirectx(
const DesktopCaptureOptions& options) {
std::unique_ptr<DesktopCapturer> capturer(
new ScreenCapturerWinDirectx(options));
capturer.reset(new BlankDetectorDesktopCapturerWrapper(
std::move(capturer), RgbaColor(0, 0, 0, 0)));
return capturer;
}
std::unique_ptr<DesktopCapturer> CreateScreenCapturerWinMagnifier() {
std::unique_ptr<DesktopCapturer> capturer(new ScreenCapturerWinMagnifier());
return capturer;
}
} // namespace
// static
std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
const DesktopCaptureOptions& options) {
// Default capturer if no options are enabled is GDI.
std::unique_ptr<DesktopCapturer> capturer(new ScreenCapturerWinGdi(options));
// If DirectX is enabled use it as main capturer with GDI as fallback.
if (options.allow_directx_capturer()) {
// `dxgi_duplicator_controller` should be alive in this scope to ensure it
// won't unload DxgiDuplicatorController.
auto dxgi_duplicator_controller = DxgiDuplicatorController::Instance();
if (ScreenCapturerWinDirectx::IsSupported()) {
capturer.reset(new FallbackDesktopCapturerWrapper(
CreateScreenCapturerWinDirectx(options), std::move(capturer)));
return capturer;
}
} else if (options.allow_use_magnification_api()) {
// ScreenCapturerWinMagnifier cannot work on Windows XP or earlier, as well
// as 64-bit only Windows, and it may randomly crash on multi-screen
// systems. So we may need to fallback to use original capturer.
capturer.reset(new FallbackDesktopCapturerWrapper(
CreateScreenCapturerWinMagnifier(), std::move(capturer)));
return capturer;
}
// Use GDI as default capturer without any fallback solution.
return capturer;
}
} // namespace webrtc