OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/video/capture/screen/screen_capturer.h" | 5 #include "media/video/capture/screen/screen_capturer.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 | 125 |
126 // Rectangle describing the bounds of the desktop device context. | 126 // Rectangle describing the bounds of the desktop device context. |
127 SkIRect desktop_dc_rect_; | 127 SkIRect desktop_dc_rect_; |
128 | 128 |
129 // Class to calculate the difference between two screen bitmaps. | 129 // Class to calculate the difference between two screen bitmaps. |
130 scoped_ptr<Differ> differ_; | 130 scoped_ptr<Differ> differ_; |
131 | 131 |
132 base::ScopedNativeLibrary dwmapi_library_; | 132 base::ScopedNativeLibrary dwmapi_library_; |
133 DwmEnableCompositionFunc composition_func_; | 133 DwmEnableCompositionFunc composition_func_; |
134 | 134 |
| 135 // Used to suppress duplicate logging of SetThreadExecutionState errors. |
| 136 bool set_thread_execution_state_failed_; |
| 137 |
135 DISALLOW_COPY_AND_ASSIGN(ScreenCapturerWin); | 138 DISALLOW_COPY_AND_ASSIGN(ScreenCapturerWin); |
136 }; | 139 }; |
137 | 140 |
138 // 3780 pixels per meter is equivalent to 96 DPI, typical on desktop monitors. | 141 // 3780 pixels per meter is equivalent to 96 DPI, typical on desktop monitors. |
139 static const int kPixelsPerMeter = 3780; | 142 static const int kPixelsPerMeter = 3780; |
140 | 143 |
141 ScreenCaptureFrameWin::ScreenCaptureFrameWin( | 144 ScreenCaptureFrameWin::ScreenCaptureFrameWin( |
142 HDC desktop_dc, | 145 HDC desktop_dc, |
143 const SkISize& size, | 146 const SkISize& size, |
144 ScreenCapturer::Delegate* delegate) | 147 ScreenCapturer::Delegate* delegate) |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 set_pixels(reinterpret_cast<uint8*>(data)); | 199 set_pixels(reinterpret_cast<uint8*>(data)); |
197 set_dimensions(SkISize::Make(bmi.bmiHeader.biWidth, | 200 set_dimensions(SkISize::Make(bmi.bmiHeader.biWidth, |
198 std::abs(bmi.bmiHeader.biHeight))); | 201 std::abs(bmi.bmiHeader.biHeight))); |
199 set_bytes_per_row( | 202 set_bytes_per_row( |
200 bmi.bmiHeader.biSizeImage / std::abs(bmi.bmiHeader.biHeight)); | 203 bmi.bmiHeader.biSizeImage / std::abs(bmi.bmiHeader.biHeight)); |
201 } | 204 } |
202 | 205 |
203 ScreenCapturerWin::ScreenCapturerWin() | 206 ScreenCapturerWin::ScreenCapturerWin() |
204 : delegate_(NULL), | 207 : delegate_(NULL), |
205 desktop_dc_rect_(SkIRect::MakeEmpty()), | 208 desktop_dc_rect_(SkIRect::MakeEmpty()), |
206 composition_func_(NULL) { | 209 composition_func_(NULL), |
| 210 set_thread_execution_state_failed_(false) { |
207 } | 211 } |
208 | 212 |
209 ScreenCapturerWin::~ScreenCapturerWin() { | 213 ScreenCapturerWin::~ScreenCapturerWin() { |
210 } | 214 } |
211 | 215 |
212 void ScreenCapturerWin::InvalidateRegion(const SkRegion& invalid_region) { | 216 void ScreenCapturerWin::InvalidateRegion(const SkRegion& invalid_region) { |
213 helper_.InvalidateRegion(invalid_region); | 217 helper_.InvalidateRegion(invalid_region); |
214 } | 218 } |
215 | 219 |
216 void ScreenCapturerWin::CaptureFrame() { | 220 void ScreenCapturerWin::CaptureFrame() { |
217 base::Time capture_start_time = base::Time::Now(); | 221 base::Time capture_start_time = base::Time::Now(); |
218 | 222 |
219 // Force the system to power-up display hardware, if it has been suspended. | 223 // Request that the system not power-down the system, or the display hardware. |
220 SetThreadExecutionState(ES_DISPLAY_REQUIRED); | 224 if (!SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED)) { |
| 225 if (!set_thread_execution_state_failed_) { |
| 226 set_thread_execution_state_failed_ = true; |
| 227 LOG_GETLASTERROR(WARNING) |
| 228 << "Failed to make system & display power assertion"; |
| 229 } |
| 230 } |
221 | 231 |
222 // Make sure the GDI capture resources are up-to-date. | 232 // Make sure the GDI capture resources are up-to-date. |
223 PrepareCaptureResources(); | 233 PrepareCaptureResources(); |
224 | 234 |
225 // Copy screen bits to the current buffer. | 235 // Copy screen bits to the current buffer. |
226 CaptureImage(); | 236 CaptureImage(); |
227 | 237 |
228 const ScreenCaptureFrame* current_buffer = queue_.current_frame(); | 238 const ScreenCaptureFrame* current_buffer = queue_.current_frame(); |
229 const ScreenCaptureFrame* last_buffer = queue_.previous_frame(); | 239 const ScreenCaptureFrame* last_buffer = queue_.previous_frame(); |
230 if (last_buffer) { | 240 if (last_buffer) { |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 void ScreenCapturer::Delegate::ReleaseSharedBuffer( | 587 void ScreenCapturer::Delegate::ReleaseSharedBuffer( |
578 scoped_refptr<SharedBuffer> buffer) { | 588 scoped_refptr<SharedBuffer> buffer) { |
579 } | 589 } |
580 | 590 |
581 // static | 591 // static |
582 scoped_ptr<ScreenCapturer> ScreenCapturer::Create() { | 592 scoped_ptr<ScreenCapturer> ScreenCapturer::Create() { |
583 return scoped_ptr<ScreenCapturer>(new ScreenCapturerWin()); | 593 return scoped_ptr<ScreenCapturer>(new ScreenCapturerWin()); |
584 } | 594 } |
585 | 595 |
586 } // namespace media | 596 } // namespace media |
OLD | NEW |