| /* |
| * Copyright (c) 2016 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. |
| */ |
| |
| #ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_ADAPTER_DUPLICATOR_H_ |
| #define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_ADAPTER_DUPLICATOR_H_ |
| |
| #include <wrl/client.h> |
| |
| #include <vector> |
| |
| #include "webrtc/modules/desktop_capture/desktop_geometry.h" |
| #include "webrtc/modules/desktop_capture/desktop_region.h" |
| #include "webrtc/modules/desktop_capture/shared_desktop_frame.h" |
| #include "webrtc/modules/desktop_capture/win/d3d_device.h" |
| #include "webrtc/modules/desktop_capture/win/dxgi_output_duplicator.h" |
| |
| namespace webrtc { |
| |
| // A container of DxgiOutputDuplicators to duplicate monitors attached to a |
| // single video card. |
| class DxgiAdapterDuplicator { |
| public: |
| struct Context { |
| // Child DxgiOutputDuplicator::Context belongs to this |
| // DxgiAdapterDuplicator::Context. |
| std::vector<DxgiOutputDuplicator::Context> contexts; |
| }; |
| |
| // Creates an instance of DxgiAdapterDuplicator from a D3dDevice. Only |
| // DxgiDuplicatorController can create an instance. |
| explicit DxgiAdapterDuplicator(const D3dDevice& device); |
| |
| // Move constructor, to make it possible to store instances of |
| // DxgiAdapterDuplicator in std::vector<>. |
| DxgiAdapterDuplicator(DxgiAdapterDuplicator&& other); |
| |
| // Initializes the DxgiAdapterDuplicator from a D3dDevice. |
| bool Initialize(); |
| |
| // Sequentially calls Duplicate function of all the DxgiOutputDuplicator |
| // instances owned by this instance, and writes into |target|. |
| bool Duplicate(Context* context, SharedDesktopFrame* target); |
| |
| // Captures one monitor and writes into |target|. |monitor_id| should be |
| // between [0, screen_count()). |
| bool DuplicateMonitor(Context* context, |
| int monitor_id, |
| SharedDesktopFrame* target); |
| |
| // Returns desktop rect covered by this DxgiAdapterDuplicator. |
| DesktopRect desktop_rect() const { return desktop_rect_; } |
| |
| // Returns the size of one screen owned by this DxgiAdapterDuplicator. |id| |
| // should be between [0, screen_count()). |
| DesktopRect ScreenRect(int id) const; |
| |
| // Returns the count of screens owned by this DxgiAdapterDuplicator. These |
| // screens can be retrieved by an interger in the range of |
| // [0, screen_count()). |
| int screen_count() const { return static_cast<int>(duplicators_.size()); } |
| |
| private: |
| friend class DxgiDuplicatorController; |
| |
| bool DoInitialize(); |
| |
| void Setup(Context* context); |
| |
| void Unregister(const Context* const context); |
| |
| const D3dDevice device_; |
| std::vector<DxgiOutputDuplicator> duplicators_; |
| DesktopRect desktop_rect_; |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_ADAPTER_DUPLICATOR_H_ |