Revert "pipewire capturer: Reduce the amount of copying"

This reverts commit 8856410b6d.

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 <alcooper@chromium.org>
> Commit-Queue: Salman Malik <salmanmalik@chromium.org>
> 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 <mfoltz@chromium.org>
Commit-Queue: Alexander Cooper <alcooper@chromium.org>
Auto-Submit: Alexander Cooper <alcooper@chromium.org>
Reviewed-by: Mark Foltz <mfoltz@chromium.org>
Cr-Commit-Position: refs/heads/main@{#40123}
This commit is contained in:
Alexander Cooper 2023-05-23 16:14:46 +00:00 committed by WebRTC LUCI CQ
parent 2eacbbc03a
commit a7d10811cd

View file

@ -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<DesktopFrame> 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;
}