From d8bbc7858622b6d9c278469aab701ca0b609cddf Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 15 May 2024 05:35:49 +0200 Subject: Merging upstream version 126.0. Signed-off-by: Daniel Baumann --- third_party/libwebrtc/moz-patch-stack/0105.patch | 145 ++++++++++++++++------- 1 file changed, 102 insertions(+), 43 deletions(-) (limited to 'third_party/libwebrtc/moz-patch-stack/0105.patch') diff --git a/third_party/libwebrtc/moz-patch-stack/0105.patch b/third_party/libwebrtc/moz-patch-stack/0105.patch index fd05008507..1db996311f 100644 --- a/third_party/libwebrtc/moz-patch-stack/0105.patch +++ b/third_party/libwebrtc/moz-patch-stack/0105.patch @@ -1,68 +1,127 @@ From: Jan Grulich -Date: Fri, 2 Feb 2024 11:47:00 +0000 -Subject: Bug 1876896 - WebRTC backport: Allow VideoCaptureModulePipeWire to be - shared with more consumers r=pehrsons,webrtc-reviewers +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 This is a simple backport of an WebRTC upstream change. -Upstream commit: 958c9ac546f33716d097b5092515dcac705151d3 +Upstream commit: 541f202354e2b4906935c8db6e54386aa8bc8d1f -Differential Revision: https://phabricator.services.mozilla.com/D200142 -Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/2ba2ef65280b2e6f246fed24d6986718981744f5 +Differential Revision: https://phabricator.services.mozilla.com/D201328 +Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/dc12e6eecaa8dc91ee0a517cfd27570691c441b9 --- - .../video_capture/linux/video_capture_pipewire.cc | 15 ++++++++++++++- - .../video_capture/linux/video_capture_pipewire.h | 1 + - 2 files changed, 15 insertions(+), 1 deletion(-) + .../linux/video_capture_pipewire.cc | 25 ++++++++++++------- + .../linux/video_capture_pipewire.h | 14 +++++------ + 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/modules/video_capture/linux/video_capture_pipewire.cc b/modules/video_capture/linux/video_capture_pipewire.cc -index 9d47e3ddbf..fb813e331f 100644 +index fb813e331f..8af483636a 100644 --- a/modules/video_capture/linux/video_capture_pipewire.cc +++ b/modules/video_capture/linux/video_capture_pipewire.cc -@@ -48,7 +48,10 @@ VideoType VideoCaptureModulePipeWire::PipeWireRawFormatToVideoType( +@@ -121,7 +121,6 @@ static spa_pod* BuildFormat(spa_pod_builder* builder, - VideoCaptureModulePipeWire::VideoCaptureModulePipeWire( - VideoCaptureOptions* options) -- : VideoCaptureImpl(), session_(options->pipewire_session()) {} -+ : VideoCaptureImpl(), -+ session_(options->pipewire_session()), -+ initialized_(false), -+ started_(false) {} - - VideoCaptureModulePipeWire::~VideoCaptureModulePipeWire() { - RTC_DCHECK_RUN_ON(&api_checker_); -@@ -121,6 +124,14 @@ int32_t VideoCaptureModulePipeWire::StartCapture( - RTC_CHECK_RUNS_SERIALIZED(&capture_checker_); + int32_t VideoCaptureModulePipeWire::StartCapture( + const VideoCaptureCapability& capability) { +- RTC_CHECK_RUNS_SERIALIZED(&capture_checker_); RTC_DCHECK_RUN_ON(&api_checker_); -+ if (initialized_) { -+ if (capability == _requestedCapability) { -+ return 0; -+ } else { -+ StopCapture(); -+ } -+ } -+ + 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_; -@@ -171,6 +182,8 @@ int32_t VideoCaptureModulePipeWire::StartCapture( - } - _requestedCapability = capability; -+ initialized_ = true; -+ - return 0; +- 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(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); } + 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(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 620ee520ca..5d6794ed65 100644 +index 5d6794ed65..eeb3b9497c 100644 --- a/modules/video_capture/linux/video_capture_pipewire.h +++ b/modules/video_capture/linux/video_capture_pipewire.h -@@ -50,6 +50,7 @@ class VideoCaptureModulePipeWire : public VideoCaptureImpl { +@@ -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 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(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 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 -- cgit v1.2.3