OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 | 83 |
84 void ScreenCapturerWinMagnifier::SetSharedMemoryFactory( | 84 void ScreenCapturerWinMagnifier::SetSharedMemoryFactory( |
85 rtc::scoped_ptr<SharedMemoryFactory> shared_memory_factory) { | 85 rtc::scoped_ptr<SharedMemoryFactory> shared_memory_factory) { |
86 shared_memory_factory_ = | 86 shared_memory_factory_ = |
87 rtc::ScopedToUnique(std::move(shared_memory_factory)); | 87 rtc::ScopedToUnique(std::move(shared_memory_factory)); |
88 } | 88 } |
89 | 89 |
90 void ScreenCapturerWinMagnifier::Capture(const DesktopRegion& region) { | 90 void ScreenCapturerWinMagnifier::Capture(const DesktopRegion& region) { |
91 TickTime capture_start_time = TickTime::Now(); | 91 TickTime capture_start_time = TickTime::Now(); |
92 | 92 |
93 queue_.MoveToNextFrame(); | 93 queue_.MoveToNext(); |
94 | 94 |
95 // Request that the system not power-down the system, or the display hardware. | 95 // Request that the system not power-down the system, or the display hardware. |
96 if (!SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED)) { | 96 if (!SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED)) { |
97 if (!set_thread_execution_state_failed_) { | 97 if (!set_thread_execution_state_failed_) { |
98 set_thread_execution_state_failed_ = true; | 98 set_thread_execution_state_failed_ = true; |
99 LOG_F(LS_WARNING) << "Failed to make system & display power assertion: " | 99 LOG_F(LS_WARNING) << "Failed to make system & display power assertion: " |
100 << GetLastError(); | 100 << GetLastError(); |
101 } | 101 } |
102 } | 102 } |
103 // Switch to the desktop receiving user input if different from the current | 103 // Switch to the desktop receiving user input if different from the current |
(...skipping 24 matching lines...) Expand all Loading... |
128 } | 128 } |
129 | 129 |
130 // Defer to the fallback capturer if magnifier capturer did not work. | 130 // Defer to the fallback capturer if magnifier capturer did not work. |
131 if (!succeeded) { | 131 if (!succeeded) { |
132 LOG_F(LS_WARNING) << "Switching to the fallback screen capturer."; | 132 LOG_F(LS_WARNING) << "Switching to the fallback screen capturer."; |
133 StartFallbackCapturer(); | 133 StartFallbackCapturer(); |
134 fallback_capturer_->Capture(region); | 134 fallback_capturer_->Capture(region); |
135 return; | 135 return; |
136 } | 136 } |
137 | 137 |
138 const DesktopFrame* current_frame = queue_.current_frame(); | 138 const DesktopFrame* current_frame = queue_.current(); |
139 const DesktopFrame* last_frame = queue_.previous_frame(); | 139 const DesktopFrame* last_frame = queue_.previous(); |
140 if (last_frame && last_frame->size().equals(current_frame->size())) { | 140 if (last_frame && last_frame->size().equals(current_frame->size())) { |
141 // Make sure the differencer is set up correctly for these previous and | 141 // Make sure the differencer is set up correctly for these previous and |
142 // current screens. | 142 // current screens. |
143 if (!differ_.get() || (differ_->width() != current_frame->size().width()) || | 143 if (!differ_.get() || (differ_->width() != current_frame->size().width()) || |
144 (differ_->height() != current_frame->size().height()) || | 144 (differ_->height() != current_frame->size().height()) || |
145 (differ_->bytes_per_row() != current_frame->stride())) { | 145 (differ_->bytes_per_row() != current_frame->stride())) { |
146 differ_.reset(new Differ(current_frame->size().width(), | 146 differ_.reset(new Differ(current_frame->size().width(), |
147 current_frame->size().height(), | 147 current_frame->size().height(), |
148 DesktopFrame::kBytesPerPixel, | 148 DesktopFrame::kBytesPerPixel, |
149 current_frame->stride())); | 149 current_frame->stride())); |
150 } | 150 } |
151 | 151 |
152 // Calculate difference between the two last captured frames. | 152 // Calculate difference between the two last captured frames. |
153 DesktopRegion region; | 153 DesktopRegion region; |
154 differ_->CalcDirtyRegion( | 154 differ_->CalcDirtyRegion( |
155 last_frame->data(), current_frame->data(), ®ion); | 155 last_frame->data(), current_frame->data(), ®ion); |
156 helper_.InvalidateRegion(region); | 156 helper_.InvalidateRegion(region); |
157 } else { | 157 } else { |
158 // No previous frame is available, or the screen is resized. Invalidate the | 158 // No previous frame is available, or the screen is resized. Invalidate the |
159 // whole screen. | 159 // whole screen. |
160 helper_.InvalidateScreen(current_frame->size()); | 160 helper_.InvalidateScreen(current_frame->size()); |
161 } | 161 } |
162 | 162 |
163 helper_.set_size_most_recent(current_frame->size()); | 163 helper_.set_size_most_recent(current_frame->size()); |
164 | 164 |
165 // Emit the current frame. | 165 // Emit the current frame. |
166 DesktopFrame* frame = queue_.current_frame()->Share(); | 166 DesktopFrame* frame = queue_.current()->Share(); |
167 frame->set_dpi(DesktopVector(GetDeviceCaps(desktop_dc_, LOGPIXELSX), | 167 frame->set_dpi(DesktopVector(GetDeviceCaps(desktop_dc_, LOGPIXELSX), |
168 GetDeviceCaps(desktop_dc_, LOGPIXELSY))); | 168 GetDeviceCaps(desktop_dc_, LOGPIXELSY))); |
169 frame->mutable_updated_region()->Clear(); | 169 frame->mutable_updated_region()->Clear(); |
170 helper_.TakeInvalidRegion(frame->mutable_updated_region()); | 170 helper_.TakeInvalidRegion(frame->mutable_updated_region()); |
171 frame->set_capture_time_ms( | 171 frame->set_capture_time_ms( |
172 (TickTime::Now() - capture_start_time).Milliseconds()); | 172 (TickTime::Now() - capture_start_time).Milliseconds()); |
173 callback_->OnCaptureCompleted(frame); | 173 callback_->OnCaptureCompleted(frame); |
174 } | 174 } |
175 | 175 |
176 bool ScreenCapturerWinMagnifier::GetScreenList(ScreenList* screens) { | 176 bool ScreenCapturerWinMagnifier::GetScreenList(ScreenList* screens) { |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 | 386 |
387 assert(tls_index_.Value() != static_cast<int32_t>(TLS_OUT_OF_INDEXES)); | 387 assert(tls_index_.Value() != static_cast<int32_t>(TLS_OUT_OF_INDEXES)); |
388 TlsSetValue(tls_index_.Value(), this); | 388 TlsSetValue(tls_index_.Value(), this); |
389 | 389 |
390 magnifier_initialized_ = true; | 390 magnifier_initialized_ = true; |
391 return true; | 391 return true; |
392 } | 392 } |
393 | 393 |
394 void ScreenCapturerWinMagnifier::OnCaptured(void* data, | 394 void ScreenCapturerWinMagnifier::OnCaptured(void* data, |
395 const MAGIMAGEHEADER& header) { | 395 const MAGIMAGEHEADER& header) { |
396 DesktopFrame* current_frame = queue_.current_frame(); | 396 DesktopFrame* current_frame = queue_.current(); |
397 | 397 |
398 // Verify the format. | 398 // Verify the format. |
399 // TODO(jiayl): support capturing sources with pixel formats other than RGBA. | 399 // TODO(jiayl): support capturing sources with pixel formats other than RGBA. |
400 int captured_bytes_per_pixel = header.cbSize / header.width / header.height; | 400 int captured_bytes_per_pixel = header.cbSize / header.width / header.height; |
401 if (header.format != GUID_WICPixelFormat32bppRGBA || | 401 if (header.format != GUID_WICPixelFormat32bppRGBA || |
402 header.width != static_cast<UINT>(current_frame->size().width()) || | 402 header.width != static_cast<UINT>(current_frame->size().width()) || |
403 header.height != static_cast<UINT>(current_frame->size().height()) || | 403 header.height != static_cast<UINT>(current_frame->size().height()) || |
404 header.stride != static_cast<UINT>(current_frame->stride()) || | 404 header.stride != static_cast<UINT>(current_frame->stride()) || |
405 captured_bytes_per_pixel != DesktopFrame::kBytesPerPixel) { | 405 captured_bytes_per_pixel != DesktopFrame::kBytesPerPixel) { |
406 LOG_F(LS_WARNING) << "Output format does not match the captured format: " | 406 LOG_F(LS_WARNING) << "Output format does not match the captured format: " |
(...skipping 13 matching lines...) Expand all Loading... |
420 DesktopRect::MakeXYWH(0, 0, header.width, header.height)); | 420 DesktopRect::MakeXYWH(0, 0, header.width, header.height)); |
421 | 421 |
422 magnifier_capture_succeeded_ = true; | 422 magnifier_capture_succeeded_ = true; |
423 } | 423 } |
424 | 424 |
425 void ScreenCapturerWinMagnifier::CreateCurrentFrameIfNecessary( | 425 void ScreenCapturerWinMagnifier::CreateCurrentFrameIfNecessary( |
426 const DesktopSize& size) { | 426 const DesktopSize& size) { |
427 // If the current buffer is from an older generation then allocate a new one. | 427 // If the current buffer is from an older generation then allocate a new one. |
428 // Note that we can't reallocate other buffers at this point, since the caller | 428 // Note that we can't reallocate other buffers at this point, since the caller |
429 // may still be reading from them. | 429 // may still be reading from them. |
430 if (!queue_.current_frame() || !queue_.current_frame()->size().equals(size)) { | 430 if (!queue_.current() || !queue_.current()->size().equals(size)) { |
431 std::unique_ptr<DesktopFrame> frame = | 431 std::unique_ptr<DesktopFrame> frame = |
432 shared_memory_factory_ | 432 shared_memory_factory_ |
433 ? SharedMemoryDesktopFrame::Create(size, | 433 ? SharedMemoryDesktopFrame::Create(size, |
434 shared_memory_factory_.get()) | 434 shared_memory_factory_.get()) |
435 : std::unique_ptr<DesktopFrame>(new BasicDesktopFrame(size)); | 435 : std::unique_ptr<DesktopFrame>(new BasicDesktopFrame(size)); |
436 queue_.ReplaceCurrentFrame(frame.release()); | 436 queue_.ReplaceCurrent(SharedDesktopFrame::Wrap(std::move(frame))); |
437 } | 437 } |
438 } | 438 } |
439 | 439 |
440 void ScreenCapturerWinMagnifier::StartFallbackCapturer() { | 440 void ScreenCapturerWinMagnifier::StartFallbackCapturer() { |
441 assert(fallback_capturer_); | 441 assert(fallback_capturer_); |
442 if (!fallback_capturer_started_) { | 442 if (!fallback_capturer_started_) { |
443 fallback_capturer_started_ = true; | 443 fallback_capturer_started_ = true; |
444 | 444 |
445 fallback_capturer_->Start(callback_); | 445 fallback_capturer_->Start(callback_); |
446 fallback_capturer_->SelectScreen(current_screen_id_); | 446 fallback_capturer_->SelectScreen(current_screen_id_); |
447 } | 447 } |
448 } | 448 } |
449 | 449 |
450 } // namespace webrtc | 450 } // namespace webrtc |
OLD | NEW |