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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 // ScreenCapturerWin captures 32bit RGB using GDI. | 73 // ScreenCapturerWin captures 32bit RGB using GDI. |
74 // | 74 // |
75 // ScreenCapturerWin is double-buffered as required by ScreenCapturer. | 75 // ScreenCapturerWin is double-buffered as required by ScreenCapturer. |
76 class ScreenCapturerWin : public ScreenCapturer { | 76 class ScreenCapturerWin : public ScreenCapturer { |
77 public: | 77 public: |
78 ScreenCapturerWin(); | 78 ScreenCapturerWin(); |
79 virtual ~ScreenCapturerWin(); | 79 virtual ~ScreenCapturerWin(); |
80 | 80 |
81 // Overridden from ScreenCapturer: | 81 // Overridden from ScreenCapturer: |
82 virtual void Start(Delegate* delegate) OVERRIDE; | 82 virtual void Start(Delegate* delegate) OVERRIDE; |
83 virtual void Stop() OVERRIDE; | |
84 virtual void InvalidateRegion(const SkRegion& invalid_region) OVERRIDE; | |
85 virtual void CaptureFrame() OVERRIDE; | 83 virtual void CaptureFrame() OVERRIDE; |
86 | 84 |
87 private: | 85 private: |
88 // Make sure that the device contexts match the screen configuration. | 86 // Make sure that the device contexts match the screen configuration. |
89 void PrepareCaptureResources(); | 87 void PrepareCaptureResources(); |
90 | 88 |
91 // Creates a ScreenCaptureData instance wrapping the current framebuffer and | 89 // Creates a ScreenCaptureData instance wrapping the current framebuffer and |
92 // notifies |delegate_|. | 90 // notifies |delegate_|. |
93 void CaptureRegion(const SkRegion& region, | 91 void CaptureRegion(const SkRegion& region, |
94 const base::Time& capture_start_time); | 92 const base::Time& capture_start_time); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 } | 202 } |
205 | 203 |
206 ScreenCapturerWin::ScreenCapturerWin() | 204 ScreenCapturerWin::ScreenCapturerWin() |
207 : delegate_(NULL), | 205 : delegate_(NULL), |
208 desktop_dc_rect_(SkIRect::MakeEmpty()), | 206 desktop_dc_rect_(SkIRect::MakeEmpty()), |
209 composition_func_(NULL), | 207 composition_func_(NULL), |
210 set_thread_execution_state_failed_(false) { | 208 set_thread_execution_state_failed_(false) { |
211 } | 209 } |
212 | 210 |
213 ScreenCapturerWin::~ScreenCapturerWin() { | 211 ScreenCapturerWin::~ScreenCapturerWin() { |
214 } | 212 // Restore Aero. |
| 213 if (composition_func_ != NULL) { |
| 214 (*composition_func_)(DWM_EC_ENABLECOMPOSITION); |
| 215 } |
215 | 216 |
216 void ScreenCapturerWin::InvalidateRegion(const SkRegion& invalid_region) { | 217 delegate_ = NULL; |
217 helper_.InvalidateRegion(invalid_region); | |
218 } | 218 } |
219 | 219 |
220 void ScreenCapturerWin::CaptureFrame() { | 220 void ScreenCapturerWin::CaptureFrame() { |
221 base::Time capture_start_time = base::Time::Now(); | 221 base::Time capture_start_time = base::Time::Now(); |
222 | 222 |
223 // Request that the system not power-down the system, or the display hardware. | 223 // Request that the system not power-down the system, or the display hardware. |
224 if (!SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED)) { | 224 if (!SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED)) { |
225 if (!set_thread_execution_state_failed_) { | 225 if (!set_thread_execution_state_failed_) { |
226 set_thread_execution_state_failed_ = true; | 226 set_thread_execution_state_failed_ = true; |
227 LOG_GETLASTERROR(WARNING) | 227 LOG_GETLASTERROR(WARNING) |
(...skipping 19 matching lines...) Expand all Loading... |
247 differ_.reset(new Differ(current_buffer->dimensions().width(), | 247 differ_.reset(new Differ(current_buffer->dimensions().width(), |
248 current_buffer->dimensions().height(), | 248 current_buffer->dimensions().height(), |
249 ScreenCaptureData::kBytesPerPixel, | 249 ScreenCaptureData::kBytesPerPixel, |
250 current_buffer->bytes_per_row())); | 250 current_buffer->bytes_per_row())); |
251 } | 251 } |
252 | 252 |
253 // Calculate difference between the two last captured frames. | 253 // Calculate difference between the two last captured frames. |
254 SkRegion region; | 254 SkRegion region; |
255 differ_->CalcDirtyRegion(last_buffer->pixels(), current_buffer->pixels(), | 255 differ_->CalcDirtyRegion(last_buffer->pixels(), current_buffer->pixels(), |
256 ®ion); | 256 ®ion); |
257 InvalidateRegion(region); | 257 helper_.InvalidateRegion(region); |
258 } else { | 258 } else { |
259 // No previous frame is available. Invalidate the whole screen. | 259 // No previous frame is available. Invalidate the whole screen. |
260 helper_.InvalidateScreen(current_buffer->dimensions()); | 260 helper_.InvalidateScreen(current_buffer->dimensions()); |
261 } | 261 } |
262 | 262 |
263 // Wrap the captured frame into ScreenCaptureData structure and invoke | 263 // Wrap the captured frame into ScreenCaptureData structure and invoke |
264 // the completion callback. | 264 // the completion callback. |
265 SkRegion invalid_region; | 265 SkRegion invalid_region; |
266 helper_.SwapInvalidRegion(&invalid_region); | 266 helper_.SwapInvalidRegion(&invalid_region); |
267 CaptureRegion(invalid_region, capture_start_time); | 267 CaptureRegion(invalid_region, capture_start_time); |
(...skipping 20 matching lines...) Expand all Loading... |
288 } | 288 } |
289 | 289 |
290 // Vote to disable Aero composited desktop effects while capturing. Windows | 290 // Vote to disable Aero composited desktop effects while capturing. Windows |
291 // will restore Aero automatically if the process exits. This has no effect | 291 // will restore Aero automatically if the process exits. This has no effect |
292 // under Windows 8 or higher. See crbug.com/124018. | 292 // under Windows 8 or higher. See crbug.com/124018. |
293 if (composition_func_ != NULL) { | 293 if (composition_func_ != NULL) { |
294 (*composition_func_)(DWM_EC_DISABLECOMPOSITION); | 294 (*composition_func_)(DWM_EC_DISABLECOMPOSITION); |
295 } | 295 } |
296 } | 296 } |
297 | 297 |
298 void ScreenCapturerWin::Stop() { | |
299 // Restore Aero. | |
300 if (composition_func_ != NULL) { | |
301 (*composition_func_)(DWM_EC_ENABLECOMPOSITION); | |
302 } | |
303 | |
304 delegate_ = NULL; | |
305 } | |
306 | |
307 void ScreenCapturerWin::PrepareCaptureResources() { | 298 void ScreenCapturerWin::PrepareCaptureResources() { |
308 // Switch to the desktop receiving user input if different from the current | 299 // Switch to the desktop receiving user input if different from the current |
309 // one. | 300 // one. |
310 scoped_ptr<Desktop> input_desktop = Desktop::GetInputDesktop(); | 301 scoped_ptr<Desktop> input_desktop = Desktop::GetInputDesktop(); |
311 if (input_desktop.get() != NULL && !desktop_.IsSame(*input_desktop)) { | 302 if (input_desktop.get() != NULL && !desktop_.IsSame(*input_desktop)) { |
312 // Release GDI resources otherwise SetThreadDesktop will fail. | 303 // Release GDI resources otherwise SetThreadDesktop will fail. |
313 desktop_dc_.reset(); | 304 desktop_dc_.reset(); |
314 memory_dc_.Set(NULL); | 305 memory_dc_.Set(NULL); |
315 | 306 |
316 // If SetThreadDesktop() fails, the thread is still assigned a desktop. | 307 // If SetThreadDesktop() fails, the thread is still assigned a desktop. |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 void ScreenCapturer::Delegate::ReleaseSharedBuffer( | 590 void ScreenCapturer::Delegate::ReleaseSharedBuffer( |
600 scoped_refptr<SharedBuffer> buffer) { | 591 scoped_refptr<SharedBuffer> buffer) { |
601 } | 592 } |
602 | 593 |
603 // static | 594 // static |
604 scoped_ptr<ScreenCapturer> ScreenCapturer::Create() { | 595 scoped_ptr<ScreenCapturer> ScreenCapturer::Create() { |
605 return scoped_ptr<ScreenCapturer>(new ScreenCapturerWin()); | 596 return scoped_ptr<ScreenCapturer>(new ScreenCapturerWin()); |
606 } | 597 } |
607 | 598 |
608 } // namespace media | 599 } // namespace media |
OLD | NEW |