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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 "magnifier initialization failed."; | 65 "magnifier initialization failed."; |
66 StartFallbackCapturer(); | 66 StartFallbackCapturer(); |
67 } | 67 } |
68 } | 68 } |
69 | 69 |
70 void ScreenCapturerWinMagnifier::SetSharedMemoryFactory( | 70 void ScreenCapturerWinMagnifier::SetSharedMemoryFactory( |
71 std::unique_ptr<SharedMemoryFactory> shared_memory_factory) { | 71 std::unique_ptr<SharedMemoryFactory> shared_memory_factory) { |
72 shared_memory_factory_ = std::move(shared_memory_factory); | 72 shared_memory_factory_ = std::move(shared_memory_factory); |
73 } | 73 } |
74 | 74 |
75 void ScreenCapturerWinMagnifier::Capture(const DesktopRegion& region) { | 75 void ScreenCapturerWinMagnifier::CaptureFrame() { |
76 if (!magnifier_initialized_ || | 76 if (!magnifier_initialized_ || |
77 !magnifier_capture_succeeded_ || | 77 !magnifier_capture_succeeded_ || |
78 GetSystemMetrics(SM_CMONITORS) != 1) { | 78 GetSystemMetrics(SM_CMONITORS) != 1) { |
79 // Do not try to use the magnifier if it failed before and in multi-screen | 79 // Do not try to use the magnifier if it failed before and in multi-screen |
80 // setup (where the API crashes sometimes). | 80 // setup (where the API crashes sometimes). |
81 LOG_F(LS_WARNING) << "Switching to the fallback screen capturer because " | 81 LOG_F(LS_WARNING) << "Switching to the fallback screen capturer because " |
82 "initialization or last capture attempt failed, or " | 82 "initialization or last capture attempt failed, or " |
83 "execute on multi-screen system."; | 83 "execute on multi-screen system."; |
84 StartFallbackCapturer(); | 84 StartFallbackCapturer(); |
85 fallback_capturer_->Capture(region); | 85 fallback_capturer_->CaptureFrame(); |
86 return; | 86 return; |
87 } | 87 } |
88 | 88 |
89 int64_t capture_start_time_nanos = rtc::TimeNanos(); | 89 int64_t capture_start_time_nanos = rtc::TimeNanos(); |
90 | 90 |
91 // Switch to the desktop receiving user input if different from the current | 91 // Switch to the desktop receiving user input if different from the current |
92 // one. | 92 // one. |
93 std::unique_ptr<Desktop> input_desktop(Desktop::GetInputDesktop()); | 93 std::unique_ptr<Desktop> input_desktop(Desktop::GetInputDesktop()); |
94 if (input_desktop.get() != NULL && !desktop_.IsSame(*input_desktop)) { | 94 if (input_desktop.get() != NULL && !desktop_.IsSame(*input_desktop)) { |
95 // Release GDI resources otherwise SetThreadDesktop will fail. | 95 // Release GDI resources otherwise SetThreadDesktop will fail. |
96 if (desktop_dc_) { | 96 if (desktop_dc_) { |
97 ReleaseDC(NULL, desktop_dc_); | 97 ReleaseDC(NULL, desktop_dc_); |
98 desktop_dc_ = NULL; | 98 desktop_dc_ = NULL; |
99 } | 99 } |
100 // If SetThreadDesktop() fails, the thread is still assigned a desktop. | 100 // If SetThreadDesktop() fails, the thread is still assigned a desktop. |
101 // So we can continue capture screen bits, just from the wrong desktop. | 101 // So we can continue capture screen bits, just from the wrong desktop. |
102 desktop_.SetThreadDesktop(input_desktop.release()); | 102 desktop_.SetThreadDesktop(input_desktop.release()); |
103 } | 103 } |
104 | 104 |
105 DesktopRect rect = GetScreenRect(current_screen_id_, current_device_key_); | 105 DesktopRect rect = GetScreenRect(current_screen_id_, current_device_key_); |
106 queue_.MoveToNextFrame(); | 106 queue_.MoveToNextFrame(); |
107 CreateCurrentFrameIfNecessary(rect.size()); | 107 CreateCurrentFrameIfNecessary(rect.size()); |
108 // CaptureImage may fail in some situations, e.g. windows8 metro mode. So | 108 // CaptureImage may fail in some situations, e.g. windows8 metro mode. So |
109 // defer to the fallback capturer if magnifier capturer did not work. | 109 // defer to the fallback capturer if magnifier capturer did not work. |
110 if (!CaptureImage(rect)) { | 110 if (!CaptureImage(rect)) { |
111 LOG_F(LS_WARNING) << "Switching to the fallback screen capturer because " | 111 LOG_F(LS_WARNING) << "Switching to the fallback screen capturer because " |
112 "last capture attempt failed."; | 112 "last capture attempt failed."; |
113 StartFallbackCapturer(); | 113 StartFallbackCapturer(); |
114 fallback_capturer_->Capture(region); | 114 fallback_capturer_->CaptureFrame(); |
115 return; | 115 return; |
116 } | 116 } |
117 | 117 |
118 // Emit the current frame. | 118 // Emit the current frame. |
119 std::unique_ptr<DesktopFrame> frame = queue_.current_frame()->Share(); | 119 std::unique_ptr<DesktopFrame> frame = queue_.current_frame()->Share(); |
120 frame->set_dpi(DesktopVector(GetDeviceCaps(desktop_dc_, LOGPIXELSX), | 120 frame->set_dpi(DesktopVector(GetDeviceCaps(desktop_dc_, LOGPIXELSX), |
121 GetDeviceCaps(desktop_dc_, LOGPIXELSY))); | 121 GetDeviceCaps(desktop_dc_, LOGPIXELSY))); |
122 frame->mutable_updated_region()->SetRect( | 122 frame->mutable_updated_region()->SetRect( |
123 DesktopRect::MakeSize(frame->size())); | 123 DesktopRect::MakeSize(frame->size())); |
124 frame->set_capture_time_ms((rtc::TimeNanos() - capture_start_time_nanos) / | 124 frame->set_capture_time_ms((rtc::TimeNanos() - capture_start_time_nanos) / |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 RTC_DCHECK(fallback_capturer_); | 380 RTC_DCHECK(fallback_capturer_); |
381 if (!fallback_capturer_started_) { | 381 if (!fallback_capturer_started_) { |
382 fallback_capturer_started_ = true; | 382 fallback_capturer_started_ = true; |
383 | 383 |
384 fallback_capturer_->Start(callback_); | 384 fallback_capturer_->Start(callback_); |
385 fallback_capturer_->SelectScreen(current_screen_id_); | 385 fallback_capturer_->SelectScreen(current_screen_id_); |
386 } | 386 } |
387 } | 387 } |
388 | 388 |
389 } // namespace webrtc | 389 } // namespace webrtc |
OLD | NEW |