| 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 | 
|---|