summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/moz-patch-stack/0105.patch
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/moz-patch-stack/0105.patch')
-rw-r--r--third_party/libwebrtc/moz-patch-stack/0105.patch136
1 files changed, 18 insertions, 118 deletions
diff --git a/third_party/libwebrtc/moz-patch-stack/0105.patch b/third_party/libwebrtc/moz-patch-stack/0105.patch
index 1db996311f..d3ccb0bbd2 100644
--- a/third_party/libwebrtc/moz-patch-stack/0105.patch
+++ b/third_party/libwebrtc/moz-patch-stack/0105.patch
@@ -1,127 +1,27 @@
From: Jan Grulich <jgrulich@redhat.com>
-Date: Tue, 13 Feb 2024 13:12:00 +0000
-Subject: Bug 1879752 - WebRTC backport: Video capture PipeWire - simplify
- thread and lock annotations r=pehrsons,webrtc-reviewers
+Date: Tue, 5 Mar 2024 08:38:00 +0000
+Subject: Bug 1615282 - WebRTC backport: PipeWire capturer - set capturer as
+ failed when session is closed r=pehrsons,webrtc-reviewers
This is a simple backport of an WebRTC upstream change.
-Upstream commit: 541f202354e2b4906935c8db6e54386aa8bc8d1f
+Upstream commit: 058bfe3ae37a7a245f9c8c6c03f4f7ac48fe179d
-Differential Revision: https://phabricator.services.mozilla.com/D201328
-Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/dc12e6eecaa8dc91ee0a517cfd27570691c441b9
+Differential Revision: https://phabricator.services.mozilla.com/D202788
+Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/633149c5da9337f67b6659e5d5bead2233027460
---
- .../linux/video_capture_pipewire.cc | 25 ++++++++++++-------
- .../linux/video_capture_pipewire.h | 14 +++++------
- 2 files changed, 22 insertions(+), 17 deletions(-)
+ modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc | 1 +
+ 1 file changed, 1 insertion(+)
-diff --git a/modules/video_capture/linux/video_capture_pipewire.cc b/modules/video_capture/linux/video_capture_pipewire.cc
-index fb813e331f..8af483636a 100644
---- a/modules/video_capture/linux/video_capture_pipewire.cc
-+++ b/modules/video_capture/linux/video_capture_pipewire.cc
-@@ -121,7 +121,6 @@ static spa_pod* BuildFormat(spa_pod_builder* builder,
-
- int32_t VideoCaptureModulePipeWire::StartCapture(
- const VideoCaptureCapability& capability) {
-- RTC_CHECK_RUNS_SERIALIZED(&capture_checker_);
- RTC_DCHECK_RUN_ON(&api_checker_);
-
- if (initialized_) {
-@@ -134,10 +133,17 @@ int32_t VideoCaptureModulePipeWire::StartCapture(
-
- uint8_t buffer[1024] = {};
-
-+ // We don't want members above to be guarded by capture_checker_ as
-+ // it's meant to be for members that are accessed on the API thread
-+ // only when we are not capturing. The code above can be called many
-+ // times while sharing instance of VideoCapturePipeWire between
-+ // websites and therefore it would not follow the requirements of this
-+ // checker.
-+ RTC_CHECK_RUNS_SERIALIZED(&capture_checker_);
-+ PipeWireThreadLoopLock thread_loop_lock(session_->pw_main_loop_);
-+
- RTC_LOG(LS_VERBOSE) << "Creating new PipeWire stream for node " << node_id_;
-
-- PipeWireThreadLoopLock thread_loop_lock(session_->pw_main_loop_);
-- RTC_CHECK_RUNS_SERIALIZED(&pipewire_checker_);
- pw_properties* reuse_props =
- pw_properties_new_string("pipewire.client.reuse=1");
- stream_ = pw_stream_new(session_->pw_core_, "camera-stream", reuse_props);
-@@ -188,11 +194,13 @@ int32_t VideoCaptureModulePipeWire::StartCapture(
- }
-
- int32_t VideoCaptureModulePipeWire::StopCapture() {
-- RTC_CHECK_RUNS_SERIALIZED(&capture_checker_);
- RTC_DCHECK_RUN_ON(&api_checker_);
-
- PipeWireThreadLoopLock thread_loop_lock(session_->pw_main_loop_);
-- RTC_CHECK_RUNS_SERIALIZED(&pipewire_checker_);
-+ // PipeWireSession is guarded by API checker so just make sure we do
-+ // race detection when the PipeWire loop is locked/stopped to not run
-+ // any callback at this point.
-+ RTC_CHECK_RUNS_SERIALIZED(&capture_checker_);
- if (stream_) {
- pw_stream_destroy(stream_);
- stream_ = nullptr;
-@@ -225,14 +233,14 @@ void VideoCaptureModulePipeWire::OnStreamParamChanged(
- VideoCaptureModulePipeWire* that =
- static_cast<VideoCaptureModulePipeWire*>(data);
- RTC_DCHECK(that);
-- RTC_CHECK_RUNS_SERIALIZED(&that->pipewire_checker_);
-+ RTC_CHECK_RUNS_SERIALIZED(&that->capture_checker_);
-
- if (format && id == SPA_PARAM_Format)
- that->OnFormatChanged(format);
+diff --git a/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc b/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
+index 40764de7ae..81caa9bd2d 100644
+--- a/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
++++ b/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc
+@@ -112,6 +112,7 @@ void BaseCapturerPipeWire::OnScreenCastSessionClosed() {
+ if (!capturer_failed_) {
+ options_.screencast_stream()->StopScreenCastStream();
+ }
++ capturer_failed_ = true;
}
- void VideoCaptureModulePipeWire::OnFormatChanged(const struct spa_pod* format) {
-- RTC_CHECK_RUNS_SERIALIZED(&pipewire_checker_);
-+ RTC_CHECK_RUNS_SERIALIZED(&capture_checker_);
-
- uint32_t media_type, media_subtype;
-
-@@ -331,7 +339,6 @@ void VideoCaptureModulePipeWire::OnStreamStateChanged(
- VideoCaptureModulePipeWire* that =
- static_cast<VideoCaptureModulePipeWire*>(data);
- RTC_DCHECK(that);
-- RTC_CHECK_RUNS_SERIALIZED(&that->capture_checker_);
-
- MutexLock lock(&that->api_lock_);
- switch (state) {
-@@ -374,7 +381,7 @@ static VideoRotation VideorotationFromPipeWireTransform(uint32_t transform) {
- }
-
- void VideoCaptureModulePipeWire::ProcessBuffers() {
-- RTC_CHECK_RUNS_SERIALIZED(&pipewire_checker_);
-+ RTC_CHECK_RUNS_SERIALIZED(&capture_checker_);
-
- while (pw_buffer* buffer = pw_stream_dequeue_buffer(stream_)) {
- struct spa_meta_header* h;
-diff --git a/modules/video_capture/linux/video_capture_pipewire.h b/modules/video_capture/linux/video_capture_pipewire.h
-index 5d6794ed65..eeb3b9497c 100644
---- a/modules/video_capture/linux/video_capture_pipewire.h
-+++ b/modules/video_capture/linux/video_capture_pipewire.h
-@@ -43,18 +43,16 @@ class VideoCaptureModulePipeWire : public VideoCaptureImpl {
- void OnFormatChanged(const struct spa_pod* format);
- void ProcessBuffers();
-
-- rtc::RaceChecker pipewire_checker_;
--
- const rtc::scoped_refptr<PipeWireSession> session_
-- RTC_GUARDED_BY(capture_checker_);
-+ RTC_GUARDED_BY(api_checker_);
-+ bool initialized_ RTC_GUARDED_BY(api_checker_);
-+ bool started_ RTC_GUARDED_BY(api_lock_);
- int node_id_ RTC_GUARDED_BY(capture_checker_);
- VideoCaptureCapability configured_capability_
-- RTC_GUARDED_BY(pipewire_checker_);
-- bool initialized_ RTC_GUARDED_BY(capture_checker_);
-- bool started_ RTC_GUARDED_BY(api_lock_);
-+ RTC_GUARDED_BY(capture_checker_);
-
-- struct pw_stream* stream_ RTC_GUARDED_BY(pipewire_checker_) = nullptr;
-- struct spa_hook stream_listener_ RTC_GUARDED_BY(pipewire_checker_);
-+ struct pw_stream* stream_ RTC_GUARDED_BY(capture_checker_) = nullptr;
-+ struct spa_hook stream_listener_ RTC_GUARDED_BY(capture_checker_);
- };
- } // namespace videocapturemodule
- } // namespace webrtc
+ void BaseCapturerPipeWire::UpdateResolution(uint32_t width, uint32_t height) {