diff --git a/modules/video_capture/linux/pipewire_session.cc b/modules/video_capture/linux/pipewire_session.cc index 2adb1cdb50..3f52b3dd61 100644 --- a/modules/video_capture/linux/pipewire_session.cc +++ b/modules/video_capture/linux/pipewire_session.cc @@ -232,7 +232,10 @@ PipeWireSession::~PipeWireSession() { } void PipeWireSession::Init(VideoCaptureOptions::Callback* callback, int fd) { - callback_ = callback; + { + webrtc::MutexLock lock(&callback_lock_); + callback_ = callback; + } if (fd != kInvalidPipeWireFd) { InitPipeWire(fd); @@ -374,6 +377,8 @@ void PipeWireSession::OnRegistryGlobalRemove(void* data, uint32_t id) { } void PipeWireSession::Finish(VideoCaptureOptions::Status status) { + webrtc::MutexLock lock(&callback_lock_); + if (callback_) { callback_->OnInitialized(status); callback_ = nullptr; @@ -381,6 +386,9 @@ void PipeWireSession::Finish(VideoCaptureOptions::Status status) { } void PipeWireSession::Cleanup() { + webrtc::MutexLock lock(&callback_lock_); + callback_ = nullptr; + StopPipeWire(); } diff --git a/modules/video_capture/linux/pipewire_session.h b/modules/video_capture/linux/pipewire_session.h index 982b468838..fdc06a6b2a 100644 --- a/modules/video_capture/linux/pipewire_session.h +++ b/modules/video_capture/linux/pipewire_session.h @@ -24,6 +24,7 @@ #include "modules/video_capture/linux/camera_portal.h" #include "modules/video_capture/video_capture.h" #include "modules/video_capture/video_capture_options.h" +#include "rtc_base/synchronization/mutex.h" namespace webrtc { namespace videocapturemodule { @@ -117,7 +118,9 @@ class PipeWireSession : public rtc::RefCountedNonVirtual { void Finish(VideoCaptureOptions::Status status); void Cleanup(); - VideoCaptureOptions::Callback* callback_ = nullptr; + webrtc::Mutex callback_lock_; + VideoCaptureOptions::Callback* callback_ RTC_GUARDED_BY(&callback_lock_) = + nullptr; VideoCaptureOptions::Status status_;