| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "remoting/host/capturer.h" | 5 #include "remoting/host/capturer.h" |
| 6 | 6 |
| 7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
| 8 #include <X11/Xutil.h> | 8 #include <X11/Xutil.h> |
| 9 #include <X11/extensions/Xdamage.h> | 9 #include <X11/extensions/Xdamage.h> |
| 10 | 10 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 | 72 |
| 73 bool Init(); // TODO(ajwong): Do we really want this to be synchronous? | 73 bool Init(); // TODO(ajwong): Do we really want this to be synchronous? |
| 74 | 74 |
| 75 // Capturer interface. | 75 // Capturer interface. |
| 76 virtual void ScreenConfigurationChanged() OVERRIDE; | 76 virtual void ScreenConfigurationChanged() OVERRIDE; |
| 77 virtual media::VideoFrame::Format pixel_format() const OVERRIDE; | 77 virtual media::VideoFrame::Format pixel_format() const OVERRIDE; |
| 78 virtual void ClearInvalidRegion() OVERRIDE; | 78 virtual void ClearInvalidRegion() OVERRIDE; |
| 79 virtual void InvalidateRegion(const SkRegion& invalid_region) OVERRIDE; | 79 virtual void InvalidateRegion(const SkRegion& invalid_region) OVERRIDE; |
| 80 virtual void InvalidateScreen(const SkISize& size) OVERRIDE; | 80 virtual void InvalidateScreen(const SkISize& size) OVERRIDE; |
| 81 virtual void InvalidateFullScreen() OVERRIDE; | 81 virtual void InvalidateFullScreen() OVERRIDE; |
| 82 virtual void CaptureInvalidRegion(CaptureCompletedCallback* callback) | 82 virtual void CaptureInvalidRegion( |
| 83 OVERRIDE; | 83 const CaptureCompletedCallback& callback) OVERRIDE; |
| 84 virtual const SkISize& size_most_recent() const OVERRIDE; | 84 virtual const SkISize& size_most_recent() const OVERRIDE; |
| 85 | 85 |
| 86 private: | 86 private: |
| 87 void InitXDamage(); | 87 void InitXDamage(); |
| 88 | 88 |
| 89 // Read and handle all currently-pending XEvents. | 89 // Read and handle all currently-pending XEvents. |
| 90 // In the DAMAGE case, process the XDamage events and store the resulting | 90 // In the DAMAGE case, process the XDamage events and store the resulting |
| 91 // damage rectangles in the CapturerHelper. | 91 // damage rectangles in the CapturerHelper. |
| 92 // In all cases, call ScreenConfigurationChanged() in response to any | 92 // In all cases, call ScreenConfigurationChanged() in response to any |
| 93 // ConfigNotify events. | 93 // ConfigNotify events. |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 void CapturerLinux::InvalidateScreen(const SkISize& size) { | 257 void CapturerLinux::InvalidateScreen(const SkISize& size) { |
| 258 helper_.InvalidateScreen(size); | 258 helper_.InvalidateScreen(size); |
| 259 } | 259 } |
| 260 | 260 |
| 261 void CapturerLinux::InvalidateFullScreen() { | 261 void CapturerLinux::InvalidateFullScreen() { |
| 262 helper_.InvalidateFullScreen(); | 262 helper_.InvalidateFullScreen(); |
| 263 last_buffer_ = NULL; | 263 last_buffer_ = NULL; |
| 264 } | 264 } |
| 265 | 265 |
| 266 void CapturerLinux::CaptureInvalidRegion( | 266 void CapturerLinux::CaptureInvalidRegion( |
| 267 CaptureCompletedCallback* callback) { | 267 const CaptureCompletedCallback& callback) { |
| 268 scoped_ptr<CaptureCompletedCallback> callback_deleter(callback); | |
| 269 | |
| 270 // TODO(lambroslambrou): In the non-DAMAGE case, there should be no need | 268 // TODO(lambroslambrou): In the non-DAMAGE case, there should be no need |
| 271 // for any X event processing in this class. | 269 // for any X event processing in this class. |
| 272 ProcessPendingXEvents(); | 270 ProcessPendingXEvents(); |
| 273 | 271 |
| 274 // Resize the current buffer if there was a recent change of | 272 // Resize the current buffer if there was a recent change of |
| 275 // screen-resolution. | 273 // screen-resolution. |
| 276 VideoFrameBuffer ¤t = buffers_[current_buffer_]; | 274 VideoFrameBuffer ¤t = buffers_[current_buffer_]; |
| 277 current.Update(display_, root_window_); | 275 current.Update(display_, root_window_); |
| 278 // Also refresh the Differ helper used by CaptureFrame(), if needed. | 276 // Also refresh the Differ helper used by CaptureFrame(), if needed. |
| 279 if (!use_damage_ && !last_buffer_) { | 277 if (!use_damage_ && !last_buffer_) { |
| 280 differ_.reset(new Differ(current.size().width(), current.size().height(), | 278 differ_.reset(new Differ(current.size().width(), current.size().height(), |
| 281 kBytesPerPixel, current.bytes_per_row())); | 279 kBytesPerPixel, current.bytes_per_row())); |
| 282 } | 280 } |
| 283 | 281 |
| 284 scoped_refptr<CaptureData> capture_data(CaptureFrame()); | 282 scoped_refptr<CaptureData> capture_data(CaptureFrame()); |
| 285 | 283 |
| 286 current_buffer_ = (current_buffer_ + 1) % kNumBuffers; | 284 current_buffer_ = (current_buffer_ + 1) % kNumBuffers; |
| 287 helper_.set_size_most_recent(capture_data->size()); | 285 helper_.set_size_most_recent(capture_data->size()); |
| 288 | 286 |
| 289 callback->Run(capture_data); | 287 callback.Run(capture_data); |
| 290 } | 288 } |
| 291 | 289 |
| 292 void CapturerLinux::ProcessPendingXEvents() { | 290 void CapturerLinux::ProcessPendingXEvents() { |
| 293 // Find the number of events that are outstanding "now." We don't just loop | 291 // Find the number of events that are outstanding "now." We don't just loop |
| 294 // on XPending because we want to guarantee this terminates. | 292 // on XPending because we want to guarantee this terminates. |
| 295 int events_to_process = XPending(display_); | 293 int events_to_process = XPending(display_); |
| 296 XEvent e; | 294 XEvent e; |
| 297 SkRegion invalid_region; | 295 SkRegion invalid_region; |
| 298 | 296 |
| 299 for (int i = 0; i < events_to_process; i++) { | 297 for (int i = 0; i < events_to_process; i++) { |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 Capturer* Capturer::Create() { | 507 Capturer* Capturer::Create() { |
| 510 CapturerLinux* capturer = new CapturerLinux(); | 508 CapturerLinux* capturer = new CapturerLinux(); |
| 511 if (!capturer->Init()) { | 509 if (!capturer->Init()) { |
| 512 delete capturer; | 510 delete capturer; |
| 513 capturer = NULL; | 511 capturer = NULL; |
| 514 } | 512 } |
| 515 return capturer; | 513 return capturer; |
| 516 } | 514 } |
| 517 | 515 |
| 518 } // namespace remoting | 516 } // namespace remoting |
| OLD | NEW |