Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: webrtc/modules/desktop_capture/win/dxgi_adapter_duplicator.cc

Issue 2099123002: [Chromoting] Improve DirectX capturer to support multiple outputs (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/modules/desktop_capture/win/dxgi_adapter_duplicator.h"
12
13 #include <comdef.h>
14 #include <DXGI.h>
15
16 #include "webrtc/base/logging.h"
17
18 namespace webrtc {
19
20 using Microsoft::WRL::ComPtr;
21
22 namespace {
23
24 bool IsValidRect(const RECT& rect) {
25 return rect.left >= 0 && rect.top >= 0 &&
26 rect.right > rect.left && rect.bottom > rect.top;
27 }
28
29 } // namespace
30
31 bool DxgiAdapterDuplicator::Initialize(const D3dDevice& device) {
32 if (DoInitialize(device)) {
33 return true;
34 }
35 duplicators_.clear();
36 return false;
37 }
38
39 bool DxgiAdapterDuplicator::DoInitialize(const D3dDevice& device) {
40 for (int i = 0;; i++) {
41 ComPtr<IDXGIOutput> output;
42 _com_error error = device.dxgi_adapter()->EnumOutputs(
43 i, output.GetAddressOf());
44 if (error.Error() == S_OK && output) {
45 DXGI_OUTPUT_DESC desc;
46 error = _com_error(output->GetDesc(&desc));
47 if (error.Error() == S_OK) {
48 if (desc.AttachedToDesktop && IsValidRect(desc.DesktopCoordinates)) {
49 ComPtr<IDXGIOutput1> output1;
50 error = _com_error(output.As(&output1));
51 if (error.Error() != S_OK || !output1) {
52 LOG(LS_WARNING) << "Failed to convert IDXGIOutput to IDXGIOutput1, "
53 "this usually means the system does not support "
54 "DirectX 11";
55 return false;
56 }
57 duplicators_.emplace_back(device, output1, desc);
58 if (!duplicators_.back().Initialize()) {
59 return false;
60 }
61 if (desktop_rect_.is_empty()) {
62 desktop_rect_ = duplicators_.back().desktop_rect();
63 } else {
64 desktop_rect_.JoinWith(duplicators_.back().desktop_rect());
65 }
66 }
67 } else {
68 LOG(LS_WARNING) << "Failed to get output description of device " << i
69 << ", ignore.";
70 }
71 } else if (error.Error() == DXGI_ERROR_NOT_FOUND) {
72 return true;
Sergey Ulanov 2016/07/08 22:36:54 break; and return true after the loop
Hzj_jie 2016/07/11 00:54:59 Done.
73 } else {
74 return false;
Sergey Ulanov 2016/07/08 22:36:53 handle error cases first: if (error.Error() == DX
Hzj_jie 2016/07/11 00:54:59 Done.
75 }
76 }
77 }
78
79 bool DxgiAdapterDuplicator::Duplicate(
80 DesktopFrame* target, const DesktopFrame* last_frame) {
Sergey Ulanov 2016/07/08 22:36:53 one argument per line, please (clang-format should
Hzj_jie 2016/07/11 00:54:59 Done.
81 for (size_t i = 0; i < duplicators_.size(); i++) {
Sergey Ulanov 2016/07/08 22:36:53 for (auto& duplicator: duplicators_)...
Hzj_jie 2016/07/11 00:54:59 Oh, I thought for each and auto& are both discoura
Sergey Ulanov 2016/07/20 19:05:17 Nope, see https://chromium-cpp.appspot.com/ auto s
Hzj_jie 2016/07/22 18:43:43 Got it, I have updated both this file and DxgiDupl
82 if (!duplicators_[i].Duplicate(target, last_frame)) {
83 return false;
84 }
85 }
86 return true;
87 }
88
89 bool DxgiAdapterDuplicator::Duplicate(
90 int id, DesktopFrame* target, const DesktopFrame* last_frame) {
Sergey Ulanov 2016/07/08 22:36:53 one argument per line, please (clang-format should
Hzj_jie 2016/07/11 00:54:59 Done.
91 if (id < 0 || id >= static_cast<int>(duplicators_.size())) {
92 return false;
93 }
94 return duplicators_[id].Duplicate(target, last_frame, DesktopVector());
95 }
96
97 DesktopRect DxgiAdapterDuplicator::ScreenRect(int id) const {
98 if (id < 0 || id >= static_cast<int>(duplicators_.size())) {
99 return DesktopRect();
100 }
101 return duplicators_[id].desktop_rect();
102 }
103
104 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698