| Index: webrtc/modules/desktop_capture/screen_capturer_x11.cc
|
| diff --git a/webrtc/modules/desktop_capture/screen_capturer_x11.cc b/webrtc/modules/desktop_capture/screen_capturer_x11.cc
|
| index 65e682b6f8bdc1bd28ba99d515077122fc105adb..849d1a3802401961b85b7c3a171f677507e7cfae 100644
|
| --- a/webrtc/modules/desktop_capture/screen_capturer_x11.cc
|
| +++ b/webrtc/modules/desktop_capture/screen_capturer_x11.cc
|
| @@ -24,8 +24,9 @@
|
| #include "webrtc/modules/desktop_capture/desktop_capture_options.h"
|
| #include "webrtc/modules/desktop_capture/desktop_frame.h"
|
| #include "webrtc/modules/desktop_capture/differ.h"
|
| -#include "webrtc/modules/desktop_capture/screen_capture_frame_queue.h"
|
| +#include "webrtc/modules/desktop_capture/screen_capture_queue.h"
|
| #include "webrtc/modules/desktop_capture/screen_capturer_helper.h"
|
| +#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
|
| #include "webrtc/modules/desktop_capture/x11/x_server_pixel_buffer.h"
|
| #include "webrtc/system_wrappers/include/logging.h"
|
| #include "webrtc/system_wrappers/include/tick_util.h"
|
| @@ -106,7 +107,7 @@ class ScreenCapturerLinux : public ScreenCapturer,
|
| ScreenCapturerHelper helper_;
|
|
|
| // Queue of the frames buffers.
|
| - ScreenCaptureFrameQueue queue_;
|
| + ScreenCaptureQueue<SharedDesktopFrame> queue_;
|
|
|
| // Invalid region from the previous capture. This is used to synchronize the
|
| // current with the last buffer used.
|
| @@ -236,7 +237,8 @@ void ScreenCapturerLinux::Start(Callback* callback) {
|
| void ScreenCapturerLinux::Capture(const DesktopRegion& region) {
|
| TickTime capture_start_time = TickTime::Now();
|
|
|
| - queue_.MoveToNextFrame();
|
| + queue_.MoveToNext();
|
| + RTC_DCHECK(!queue_.current() || !queue_.current()->IsShared());
|
|
|
| // Process XEvents for XDamage and cursor shape tracking.
|
| options_.x_display()->ProcessPendingXEvents();
|
| @@ -253,14 +255,14 @@ void ScreenCapturerLinux::Capture(const DesktopRegion& region) {
|
| // If the current frame is from an older generation then allocate a new one.
|
| // Note that we can't reallocate other buffers at this point, since the caller
|
| // may still be reading from them.
|
| - if (!queue_.current_frame()) {
|
| + if (!queue_.current()) {
|
| std::unique_ptr<DesktopFrame> frame(
|
| new BasicDesktopFrame(x_server_pixel_buffer_.window_size()));
|
| - queue_.ReplaceCurrentFrame(frame.release());
|
| + queue_.ReplaceCurrent(SharedDesktopFrame::Wrap(std::move(frame)));
|
| }
|
|
|
| // Refresh the Differ helper used by CaptureFrame(), if needed.
|
| - DesktopFrame* frame = queue_.current_frame();
|
| + DesktopFrame* frame = queue_.current();
|
| if (!use_damage_ && (
|
| !differ_.get() ||
|
| (differ_->width() != frame->size().width()) ||
|
| @@ -308,7 +310,7 @@ bool ScreenCapturerLinux::HandleXEvent(const XEvent& event) {
|
| }
|
|
|
| DesktopFrame* ScreenCapturerLinux::CaptureScreen() {
|
| - DesktopFrame* frame = queue_.current_frame()->Share();
|
| + DesktopFrame* frame = queue_.current()->Share();
|
| assert(x_server_pixel_buffer_.window_size().equals(frame->size()));
|
|
|
| // Pass the screen size to the helper, so it can clip the invalid region if it
|
| @@ -319,13 +321,13 @@ DesktopFrame* ScreenCapturerLinux::CaptureScreen() {
|
| // if any. If there isn't a previous frame, that means a screen-resolution
|
| // change occurred, and |invalid_rects| will be updated to include the whole
|
| // screen.
|
| - if (use_damage_ && queue_.previous_frame())
|
| + if (use_damage_ && queue_.previous())
|
| SynchronizeFrame();
|
|
|
| DesktopRegion* updated_region = frame->mutable_updated_region();
|
|
|
| x_server_pixel_buffer_.Synchronize();
|
| - if (use_damage_ && queue_.previous_frame()) {
|
| + if (use_damage_ && queue_.previous()) {
|
| // Atomically fetch and clear the damage region.
|
| XDamageSubtract(display(), damage_handle_, None, damage_region_);
|
| int rects_num = 0;
|
| @@ -358,12 +360,12 @@ DesktopFrame* ScreenCapturerLinux::CaptureScreen() {
|
| DesktopRect screen_rect = DesktopRect::MakeSize(frame->size());
|
| x_server_pixel_buffer_.CaptureRect(screen_rect, frame);
|
|
|
| - if (queue_.previous_frame()) {
|
| + if (queue_.previous()) {
|
| // Full-screen polling, so calculate the invalid rects here, based on the
|
| // changed pixels between current and previous buffers.
|
| RTC_DCHECK(differ_.get() != NULL);
|
| - RTC_DCHECK(queue_.previous_frame()->data());
|
| - differ_->CalcDirtyRegion(queue_.previous_frame()->data(),
|
| + RTC_DCHECK(queue_.previous()->data());
|
| + differ_->CalcDirtyRegion(queue_.previous()->data(),
|
| frame->data(), updated_region);
|
| } else {
|
| // No previous buffer, so always invalidate the whole screen, whether
|
| @@ -397,10 +399,10 @@ void ScreenCapturerLinux::SynchronizeFrame() {
|
| // TODO(hclam): We can reduce the amount of copying here by subtracting
|
| // |capturer_helper_|s region from |last_invalid_region_|.
|
| // http://crbug.com/92354
|
| - RTC_DCHECK(queue_.previous_frame());
|
| + RTC_DCHECK(queue_.previous());
|
|
|
| - DesktopFrame* current = queue_.current_frame();
|
| - DesktopFrame* last = queue_.previous_frame();
|
| + DesktopFrame* current = queue_.current();
|
| + DesktopFrame* last = queue_.previous();
|
| RTC_DCHECK(current != last);
|
| for (DesktopRegion::Iterator it(last_invalid_region_);
|
| !it.IsAtEnd(); it.Advance()) {
|
|
|