From a7d10811cdf1a0a22760b2297fbd2502b49bd75f Mon Sep 17 00:00:00 2001 From: Alexander Cooper Date: Tue, 23 May 2023 16:14:46 +0000 Subject: [PATCH] Revert "pipewire capturer: Reduce the amount of copying" This reverts commit 8856410b6d54b546bdb3185587474f0f9b3a7c2e. Reason for revert: chromium:1447540 Original change's description: > pipewire capturer: Reduce the amount of copying > > Improves the capture latency by reducing the amount of > copying needed from the frame. We keep track of the > damaged region of previous frame and union it with > the damaged region of this frame and only copy this > union of the frame over. X11 capturer already has > such synchronization in place. > > The change is beneficial especially when there are > small changes on the screen (e.g. clock ticking). > For a 4k screen with 128 cores, I observed the > capture latencies drop from 5 - 8 ms to 0 ms when the > system is left idle. This is in line with the X11 > capturer. > > Bug: chromium:1291247 > Change-Id: Iffb441f9e1902d2658031f5f35b5372ee8e94073 > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/299720 > Reviewed-by: Alexander Cooper > Commit-Queue: Salman Malik > Cr-Commit-Position: refs/heads/main@{#39968} Bug: chromium:1291247 Change-Id: Id1bfd3fc39fea2bb1f232cad5218f90e144920e7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/306263 Commit-Queue: Mark Foltz Commit-Queue: Alexander Cooper Auto-Submit: Alexander Cooper Reviewed-by: Mark Foltz Cr-Commit-Position: refs/heads/main@{#40123} --- .../linux/wayland/shared_screencast_stream.cc | 47 ++++--------------- 1 file changed, 8 insertions(+), 39 deletions(-) diff --git a/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc b/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc index b2ad7adea8..17c895088a 100644 --- a/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc +++ b/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc @@ -144,7 +144,6 @@ class SharedScreenCastStreamPrivate { uint32_t frame_rate_ = 60; bool use_damage_region_ = true; - DesktopRegion last_damage_region_; // Specifies whether the pipewire stream has been initialized with a request // to embed cursor into the captured frames. @@ -159,9 +158,7 @@ class SharedScreenCastStreamPrivate { void ProcessBuffer(pw_buffer* buffer); bool ProcessMemFDBuffer(pw_buffer* buffer, DesktopFrame& frame, - const DesktopFrame* previous_frame, - const DesktopVector& offset, - bool effectively_new_frame); + const DesktopVector& offset); bool ProcessDMABuffer(pw_buffer* buffer, DesktopFrame& frame, const DesktopVector& offset); @@ -828,22 +825,17 @@ void SharedScreenCastStreamPrivate::ProcessBuffer(pw_buffer* buffer) { } } - bool effectively_new_frame = false; if (!queue_.current_frame() || !queue_.current_frame()->size().equals(frame_size_)) { std::unique_ptr frame(new BasicDesktopFrame( DesktopSize(frame_size_.width(), frame_size_.height()))); queue_.ReplaceCurrentFrame(SharedDesktopFrame::Wrap(std::move(frame))); - effectively_new_frame = true; } - UpdateFrameUpdatedRegions(spa_buffer, *queue_.current_frame()); - bool bufferProcessed = false; if (spa_buffer->datas[0].type == SPA_DATA_MemFd) { - bufferProcessed = ProcessMemFDBuffer(buffer, *queue_.current_frame(), - queue_.previous_frame(), offset, - effectively_new_frame); + bufferProcessed = + ProcessMemFDBuffer(buffer, *queue_.current_frame(), offset); } else if (spa_buffer->datas[0].type == SPA_DATA_DmaBuf) { bufferProcessed = ProcessDMABuffer(buffer, *queue_.current_frame(), offset); } @@ -870,6 +862,7 @@ void SharedScreenCastStreamPrivate::ProcessBuffer(pw_buffer* buffer) { observer_->OnDesktopFrameChanged(); } + UpdateFrameUpdatedRegions(spa_buffer, *queue_.current_frame()); queue_.current_frame()->set_may_contain_cursor(is_cursor_embedded_); if (callback_) { @@ -885,9 +878,7 @@ RTC_NO_SANITIZE("cfi-icall") bool SharedScreenCastStreamPrivate::ProcessMemFDBuffer( pw_buffer* buffer, DesktopFrame& frame, - const DesktopFrame* previous_frame, - const DesktopVector& offset, - bool effectively_new_frame) { + const DesktopVector& offset) { spa_buffer* spa_buffer = buffer->buffer; ScopedBuf map; uint8_t* src = nullptr; @@ -913,31 +904,9 @@ bool SharedScreenCastStreamPrivate::ProcessMemFDBuffer( uint8_t* updated_src = src + (src_stride * offset.y()) + (kBytesPerPixel * offset.x()); - const int stride = src_stride - (kBytesPerPixel * offset.x()); - - if (effectively_new_frame || !previous_frame || !use_damage_region_ || - damage_region_.is_empty()) { - frame.CopyPixelsFrom( - updated_src, stride, - DesktopRect::MakeWH(frame.size().width(), frame.size().height())); - } else { - for (DesktopRegion::Iterator it(last_damage_region_); !it.IsAtEnd(); - it.Advance()) { - const DesktopRect& r = it.rect(); - frame.CopyPixelsFrom(*previous_frame, r.top_left(), r); - } - - for (DesktopRegion::Iterator it(damage_region_); !it.IsAtEnd(); - it.Advance()) { - const auto& rect = it.rect(); - frame.CopyPixelsFrom(src + rect.top() * stride + - rect.left() * DesktopFrame::kBytesPerPixel, - stride, - DesktopRect::MakeXYWH(rect.left(), rect.top(), - rect.width(), rect.height())); - } - } - last_damage_region_ = damage_region_; + frame.CopyPixelsFrom( + updated_src, (src_stride - (kBytesPerPixel * offset.x())), + DesktopRect::MakeWH(frame.size().width(), frame.size().height())); return true; }