Index: webrtc/modules/desktop_capture/win/dxgi_adapter_duplicator.h |
diff --git a/webrtc/modules/desktop_capture/win/dxgi_adapter_duplicator.h b/webrtc/modules/desktop_capture/win/dxgi_adapter_duplicator.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..be9fd17009782f1f3c9af6514eb1def0f42dbb93 |
--- /dev/null |
+++ b/webrtc/modules/desktop_capture/win/dxgi_adapter_duplicator.h |
@@ -0,0 +1,88 @@ |
+/* |
+ * 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_frame.h" |
+#include "webrtc/modules/desktop_capture/desktop_geometry.h" |
+#include "webrtc/modules/desktop_capture/desktop_region.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(); |
+ |
+ // Sequential calls Duplicate function of all the DxgiOutputDuplicators owned |
+ // by this instance. |
+ bool Duplicate(Context* context, |
+ const DesktopFrame* last_frame, |
+ DesktopFrame* target); |
+ |
+ // Captures one monitor and writes into target. |monitor_id| should be between |
+ // [0, screen_count()). |
+ bool DuplicateMonitor(Context* context, |
+ int monitor_id, |
+ const DesktopFrame* last_frame, |
+ DesktopFrame* 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_ |