From 958c9ac546f33716d097b5092515dcac705151d3 Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Mon, 29 Jan 2024 15:12:47 +0100 Subject: [PATCH] Allow VideoCaptureModulePipeWire to be shared with more consumers This allows to share an instance of VideoCaptureModulePipeWire which is what browsers usually do when the same camera is being shared with more than one consumer. This matches V4L2 implementation. Bug: webrtc:15211 Change-Id: I2ae466739c2649029e76a29e6f16aad1014e9d42 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/306964 Reviewed-by: Ilya Nikolaevskiy Commit-Queue: Jan Grulich Cr-Commit-Position: refs/heads/main@{#41639} --- .../video_capture/linux/video_capture_pipewire.cc | 15 ++++++++++++++- .../video_capture/linux/video_capture_pipewire.h | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/video_capture/linux/video_capture_pipewire.cc b/modules/video_capture/linux/video_capture_pipewire.cc index 9d47e3ddbf..fb813e331f 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( 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_); 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_; @@ -171,6 +182,8 @@ int32_t VideoCaptureModulePipeWire::StartCapture( } _requestedCapability = capability; + initialized_ = true; + return 0; } diff --git a/modules/video_capture/linux/video_capture_pipewire.h b/modules/video_capture/linux/video_capture_pipewire.h index 620ee520ca..5d6794ed65 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 { 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;