Blob Blame History Raw
diff --git a/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.h b/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.h
--- a/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.h
+++ b/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.h
@@ -48,10 +48,11 @@
   const rtc::scoped_refptr<PipeWireSession> session_
       RTC_GUARDED_BY(capture_checker_);
   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_);

   struct pw_stream* stream_ RTC_GUARDED_BY(pipewire_checker_) = nullptr;
   struct spa_hook stream_listener_ RTC_GUARDED_BY(pipewire_checker_);
 };
diff --git a/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.cc b/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.cc
--- a/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.cc
+++ b/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.cc
@@ -46,11 +46,14 @@
   return VideoType::kUnknown;
 }

 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_);

   StopCapture();
@@ -119,10 +122,18 @@
 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();
+    }
+  }
+
   uint8_t buffer[1024] = {};

   RTC_LOG(LS_VERBOSE) << "Creating new PipeWire stream for node " << node_id_;

   PipeWireThreadLoopLock thread_loop_lock(session_->pw_main_loop_);
@@ -169,10 +180,12 @@
                       << spa_strerror(res);
     return -1;
   }

   _requestedCapability = capability;
+  initialized_ = true;
+
   return 0;
 }

 int32_t VideoCaptureModulePipeWire::StopCapture() {
   RTC_CHECK_RUNS_SERIALIZED(&capture_checker_);