firefox/libwebrtc-video-capture-pipewire-drop-corrupted-buffers.patch

52 lines
2.0 KiB
Diff

From b7653310766909158a4781fe9def5fb8e9414d1a Mon Sep 17 00:00:00 2001
From: Jan Grulich <grulja@gmail.com>
Date: Mon, 06 May 2024 11:20:27 +0200
Subject: [PATCH] Video capture PipeWire: drop corrupted PipeWire buffers
Use SPA_CHUNK_FLAG_CORRUPTED and SPA_META_HEADER_FLAG_CORRUPTED flags to
determine corrupted buffers or corrupted buffer data. We used to only
rely on compositors setting chunk->size, but this doesn't make sense for
dmabufs where they have to make up arbitrary values. It also looks this
is not reliable and can cause glitches as we end up processing corrupted buffers.
Bug: webrtc:338232699
Change-Id: Ida0c6a5e7a37e19598c6d5884726200f81b94962
---
diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc
index 6998d65..f7feddd 100644
--- a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc
+++ b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc
@@ -323,6 +323,15 @@
return;
}
+ struct spa_meta_header* header =
+ static_cast<spa_meta_header*>(spa_buffer_find_meta_data(
+ buffer->buffer, SPA_META_Header, sizeof(*header)));
+ if (header && (header->flags & SPA_META_HEADER_FLAG_CORRUPTED)) {
+ RTC_LOG(LS_WARNING) << "Dropping corrupted buffer";
+ pw_stream_queue_buffer(that->pw_stream_, buffer);
+ return;
+ }
+
that->ProcessBuffer(buffer);
pw_stream_queue_buffer(that->pw_stream_, buffer);
@@ -709,7 +718,14 @@
}
}
- if (spa_buffer->datas[0].chunk->size == 0) {
+ if (spa_buffer->datas[0].chunk->flags & SPA_CHUNK_FLAG_CORRUPTED) {
+ RTC_LOG(LS_WARNING) << "Dropping buffer with corrupted data";
+ return;
+ }
+
+ if (spa_buffer->datas[0].type == SPA_DATA_MemFd &&
+ spa_buffer->datas[0].chunk->size == 0) {
+ RTC_LOG(LS_WARNING) << "Dropping buffer with empty data";
return;
}