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 "remoting/capturer/video_frame_capturer.h" | 5 #include "remoting/capturer/video_frame_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 #include <X11/extensions/Xfixes.h> | 10 #include <X11/extensions/Xfixes.h> |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 // Capture the cursor image and notify the delegate if it was captured. | 80 // Capture the cursor image and notify the delegate if it was captured. |
81 void CaptureCursor(); | 81 void CaptureCursor(); |
82 | 82 |
83 // Capture screen pixels, and return the data in a new CaptureData object, | 83 // Capture screen pixels, and return the data in a new CaptureData object, |
84 // to be freed by the caller. | 84 // to be freed by the caller. |
85 // In the DAMAGE case, the VideoFrameCapturerHelper already holds the list of | 85 // In the DAMAGE case, the VideoFrameCapturerHelper already holds the list of |
86 // invalid rectangles from ProcessPendingXEvents(). | 86 // invalid rectangles from ProcessPendingXEvents(). |
87 // In the non-DAMAGE case, this captures the whole screen, then calculates | 87 // In the non-DAMAGE case, this captures the whole screen, then calculates |
88 // some invalid rectangles that include any differences between this and the | 88 // some invalid rectangles that include any differences between this and the |
89 // previous capture. | 89 // previous capture. |
90 CaptureData* CaptureScreen(); | 90 scoped_refptr<CaptureData> CaptureScreen(); |
91 | 91 |
92 // Called when the screen configuration is changed. |root_window_size| | 92 // Called when the screen configuration is changed. |root_window_size| |
93 // specifies size the most recent size of the root window. | 93 // specifies size the most recent size of the root window. |
94 void ScreenConfigurationChanged(const SkISize& root_window_size); | 94 void ScreenConfigurationChanged(const SkISize& root_window_size); |
95 | 95 |
96 // Synchronize the current buffer with |last_buffer_|, by copying pixels from | 96 // Synchronize the current buffer with |last_buffer_|, by copying pixels from |
97 // the area of |last_invalid_rects|. | 97 // the area of |last_invalid_rects|. |
98 // Note this only works on the assumption that kNumBuffers == 2, as | 98 // Note this only works on the assumption that kNumBuffers == 2, as |
99 // |last_invalid_rects| holds the differences from the previous buffer and | 99 // |last_invalid_rects| holds the differences from the previous buffer and |
100 // the one prior to that (which will then be the current buffer). | 100 // the one prior to that (which will then be the current buffer). |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 uint32* dst = reinterpret_cast<uint32*>(string_as_array(&cursor->data)); | 388 uint32* dst = reinterpret_cast<uint32*>(string_as_array(&cursor->data)); |
389 uint32* dst_end = dst + (img->width * img->height); | 389 uint32* dst_end = dst + (img->width * img->height); |
390 while (dst < dst_end) { | 390 while (dst < dst_end) { |
391 *dst++ = static_cast<uint32>(*src++); | 391 *dst++ = static_cast<uint32>(*src++); |
392 } | 392 } |
393 XFree(img); | 393 XFree(img); |
394 | 394 |
395 delegate_->OnCursorShapeChanged(cursor.Pass()); | 395 delegate_->OnCursorShapeChanged(cursor.Pass()); |
396 } | 396 } |
397 | 397 |
398 CaptureData* VideoFrameCapturerLinux::CaptureScreen() { | 398 scoped_refptr<CaptureData> VideoFrameCapturerLinux::CaptureScreen() { |
399 VideoFrame* current = queue_.current_frame(); | 399 VideoFrame* current = queue_.current_frame(); |
400 DataPlanes planes; | 400 DataPlanes planes; |
401 planes.data[0] = current->pixels(); | 401 planes.data[0] = current->pixels(); |
402 planes.strides[0] = current->bytes_per_row(); | 402 planes.strides[0] = current->bytes_per_row(); |
403 | 403 |
404 CaptureData* capture_data = new CaptureData(planes, current->dimensions(), | 404 scoped_refptr<CaptureData> capture_data( |
405 media::VideoFrame::RGB32); | 405 new CaptureData(planes, current->dimensions(), media::VideoFrame::RGB32)); |
406 | 406 |
407 // Pass the screen size to the helper, so it can clip the invalid region if it | 407 // Pass the screen size to the helper, so it can clip the invalid region if it |
408 // expands that region to a grid. | 408 // expands that region to a grid. |
409 helper_.set_size_most_recent(capture_data->size()); | 409 helper_.set_size_most_recent(capture_data->size()); |
410 | 410 |
411 // In the DAMAGE case, ensure the frame is up-to-date with the previous frame | 411 // In the DAMAGE case, ensure the frame is up-to-date with the previous frame |
412 // if any. If there isn't a previous frame, that means a screen-resolution | 412 // if any. If there isn't a previous frame, that means a screen-resolution |
413 // change occurred, and |invalid_rects| will be updated to include the whole | 413 // change occurred, and |invalid_rects| will be updated to include the whole |
414 // screen. | 414 // screen. |
415 if (use_damage_ && queue_.previous_frame()) | 415 if (use_damage_ && queue_.previous_frame()) |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 NOTIMPLEMENTED(); | 628 NOTIMPLEMENTED(); |
629 return scoped_ptr<VideoFrameCapturer>(); | 629 return scoped_ptr<VideoFrameCapturer>(); |
630 } | 630 } |
631 | 631 |
632 // static | 632 // static |
633 void VideoFrameCapturer::EnableXDamage(bool enable) { | 633 void VideoFrameCapturer::EnableXDamage(bool enable) { |
634 g_should_use_x_damage = enable; | 634 g_should_use_x_damage = enable; |
635 } | 635 } |
636 | 636 |
637 } // namespace remoting | 637 } // namespace remoting |
OLD | NEW |