OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 18 matching lines...) Expand all Loading... |
29 return DxgiDuplicatorController::Instance()->IsSupported(); | 29 return DxgiDuplicatorController::Instance()->IsSupported(); |
30 } | 30 } |
31 | 31 |
32 // static | 32 // static |
33 bool ScreenCapturerWinDirectx::RetrieveD3dInfo(D3dInfo* info) { | 33 bool ScreenCapturerWinDirectx::RetrieveD3dInfo(D3dInfo* info) { |
34 // Forwards SupportedFeatureLevels() function call to | 34 // Forwards SupportedFeatureLevels() function call to |
35 // DxgiDuplicatorController. | 35 // DxgiDuplicatorController. |
36 return DxgiDuplicatorController::Instance()->RetrieveD3dInfo(info); | 36 return DxgiDuplicatorController::Instance()->RetrieveD3dInfo(info); |
37 } | 37 } |
38 | 38 |
39 ScreenCapturerWinDirectx::ScreenCapturerWinDirectx( | 39 ScreenCapturerWinDirectx::ScreenCapturerWinDirectx() |
40 const DesktopCaptureOptions& options) | 40 : controller_(DxgiDuplicatorController::Instance()) {} |
41 : callback_(nullptr) {} | |
42 | 41 |
43 ScreenCapturerWinDirectx::~ScreenCapturerWinDirectx() {} | 42 ScreenCapturerWinDirectx::~ScreenCapturerWinDirectx() = default; |
44 | 43 |
45 void ScreenCapturerWinDirectx::Start(Callback* callback) { | 44 void ScreenCapturerWinDirectx::Start(Callback* callback) { |
46 RTC_DCHECK(!callback_); | 45 RTC_DCHECK(!callback_); |
47 RTC_DCHECK(callback); | 46 RTC_DCHECK(callback); |
48 | 47 |
49 callback_ = callback; | 48 callback_ = callback; |
50 } | 49 } |
51 | 50 |
52 void ScreenCapturerWinDirectx::SetSharedMemoryFactory( | 51 void ScreenCapturerWinDirectx::SetSharedMemoryFactory( |
53 std::unique_ptr<SharedMemoryFactory> shared_memory_factory) { | 52 std::unique_ptr<SharedMemoryFactory> shared_memory_factory) { |
54 shared_memory_factory_ = std::move(shared_memory_factory); | 53 shared_memory_factory_ = std::move(shared_memory_factory); |
55 } | 54 } |
56 | 55 |
57 void ScreenCapturerWinDirectx::CaptureFrame() { | 56 void ScreenCapturerWinDirectx::CaptureFrame() { |
58 RTC_DCHECK(callback_); | 57 RTC_DCHECK(callback_); |
59 | 58 |
60 int64_t capture_start_time_nanos = rtc::TimeNanos(); | 59 int64_t capture_start_time_nanos = rtc::TimeNanos(); |
61 | 60 |
62 frames_.MoveToNextFrame(); | 61 frames_.MoveToNextFrame(); |
63 if (!frames_.current_frame()) { | 62 if (!frames_.current_frame()) { |
64 frames_.ReplaceCurrentFrame( | 63 frames_.ReplaceCurrentFrame( |
65 rtc::MakeUnique<DxgiFrame>(shared_memory_factory_.get())); | 64 rtc::MakeUnique<DxgiFrame>(shared_memory_factory_.get())); |
66 } | 65 } |
67 | 66 |
68 DxgiDuplicatorController::Result result; | 67 DxgiDuplicatorController::Result result; |
69 if (current_screen_id_ == kFullDesktopScreenId) { | 68 if (current_screen_id_ == kFullDesktopScreenId) { |
70 result = DxgiDuplicatorController::Instance()->Duplicate( | 69 result = controller_->Duplicate(frames_.current_frame()); |
71 frames_.current_frame()); | |
72 } else { | 70 } else { |
73 result = DxgiDuplicatorController::Instance()->DuplicateMonitor( | 71 result = controller_->DuplicateMonitor( |
74 frames_.current_frame(), current_screen_id_); | 72 frames_.current_frame(), current_screen_id_); |
75 } | 73 } |
76 | 74 |
77 using DuplicateResult = DxgiDuplicatorController::Result; | 75 using DuplicateResult = DxgiDuplicatorController::Result; |
78 switch (result) { | 76 switch (result) { |
79 case DuplicateResult::FRAME_PREPARE_FAILED: { | 77 case DuplicateResult::FRAME_PREPARE_FAILED: { |
80 LOG(LS_ERROR) << "Failed to allocate a new DesktopFrame."; | 78 LOG(LS_ERROR) << "Failed to allocate a new DesktopFrame."; |
81 // This usually means we do not have enough memory or SharedMemoryFactory | 79 // This usually means we do not have enough memory or SharedMemoryFactory |
82 // cannot work correctly. | 80 // cannot work correctly. |
83 callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr); | 81 callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr); |
(...skipping 15 matching lines...) Expand all Loading... |
99 (rtc::TimeNanos() - capture_start_time_nanos) / | 97 (rtc::TimeNanos() - capture_start_time_nanos) / |
100 rtc::kNumNanosecsPerMillisec); | 98 rtc::kNumNanosecsPerMillisec); |
101 frame->set_capturer_id(DesktopCapturerId::kScreenCapturerWinDirectx); | 99 frame->set_capturer_id(DesktopCapturerId::kScreenCapturerWinDirectx); |
102 callback_->OnCaptureResult(Result::SUCCESS, std::move(frame)); | 100 callback_->OnCaptureResult(Result::SUCCESS, std::move(frame)); |
103 break; | 101 break; |
104 } | 102 } |
105 } | 103 } |
106 } | 104 } |
107 | 105 |
108 bool ScreenCapturerWinDirectx::GetSourceList(SourceList* sources) { | 106 bool ScreenCapturerWinDirectx::GetSourceList(SourceList* sources) { |
109 int screen_count = DxgiDuplicatorController::Instance()->ScreenCount(); | 107 int screen_count = controller_->ScreenCount(); |
110 for (int i = 0; i < screen_count; i++) { | 108 for (int i = 0; i < screen_count; i++) { |
111 sources->push_back({i}); | 109 sources->push_back({i}); |
112 } | 110 } |
113 return true; | 111 return true; |
114 } | 112 } |
115 | 113 |
116 bool ScreenCapturerWinDirectx::SelectSource(SourceId id) { | 114 bool ScreenCapturerWinDirectx::SelectSource(SourceId id) { |
117 if (id == current_screen_id_) { | 115 if (id == current_screen_id_) { |
118 return true; | 116 return true; |
119 } | 117 } |
120 | 118 |
121 if (id == kFullDesktopScreenId) { | 119 if (id == kFullDesktopScreenId) { |
122 current_screen_id_ = id; | 120 current_screen_id_ = id; |
123 return true; | 121 return true; |
124 } | 122 } |
125 | 123 |
126 int screen_count = DxgiDuplicatorController::Instance()->ScreenCount(); | 124 int screen_count = controller_->ScreenCount(); |
127 if (id >= 0 && id < screen_count) { | 125 if (id >= 0 && id < screen_count) { |
128 current_screen_id_ = id; | 126 current_screen_id_ = id; |
129 return true; | 127 return true; |
130 } | 128 } |
131 return false; | 129 return false; |
132 } | 130 } |
133 | 131 |
134 } // namespace webrtc | 132 } // namespace webrtc |
OLD | NEW |