We cherry-picked this in bug 2056029. Upstream commit: https://webrtc.googlesource.com/src/+/5da5a6e4e00c69ef60c7643e99ef34f65f7af51a video_capture: Implement buffer stride support for Pipewire Add optional buffer stride support to VideoCaptureImpl and use it in VideoCaptureModulePipeWire, allowing us to drop the requirement for unpadded buffers. This notably improves compatibility with libcamera, which supports a wider range of devices than the V4L2 backend - some having hardware requirements for stride-alignment. Extending `ConvertToI420()` in libyuv was rejected on the grounds that there are various approaches to stride handling - using a single stride value for multiple planes, having explicit values for each one etc. - as well as the fact that we might well want to extend the helper further in the future - e.g. in order to better handle color spaces such as BT709 (instead of always assuming BT601). Thus this patch now adds a local copy of `ConvertToI420()`, supporting implicit and a single explicit stride value for now. libyuv CL for context: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8146821 Bug: chromium:538875176 Change-Id: Ic5781709cf5f20e8c75b9ad09d7052a355fcbec7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/491680 Reviewed-by: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Jan Grulich <grulja@gmail.com> Commit-Queue: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/main@{#48353}
122 lines
6.5 KiB
Diff
122 lines
6.5 KiB
Diff
From: Jan Grulich <jgrulich@redhat.com>
|
|
Date: Thu, 30 Nov 2023 11:49:00 +0000
|
|
Subject: Bug 1844020 - Add option to DeviceInfo::GetDeviceName() identifying a
|
|
placeholder device r=pehrsons,webrtc-reviewers
|
|
|
|
Adds a new parameter "deviceIsPlaceholder" that will be set to true in
|
|
case the returned device is not a real device but a placeholder that is
|
|
just used to inform about camera device existence.
|
|
|
|
Differential Revision: https://phabricator.services.mozilla.com/D189929
|
|
Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/ed31b2acb5fbca3e2d0691a64bc52e65952070c0
|
|
---
|
|
modules/video_capture/linux/device_info_pipewire.cc | 4 +++-
|
|
modules/video_capture/linux/device_info_pipewire.h | 3 ++-
|
|
modules/video_capture/linux/device_info_v4l2.cc | 3 ++-
|
|
modules/video_capture/linux/device_info_v4l2.h | 3 ++-
|
|
modules/video_capture/video_capture.h | 3 ++-
|
|
modules/video_capture/windows/device_info_ds.cc | 3 ++-
|
|
modules/video_capture/windows/device_info_ds.h | 3 ++-
|
|
7 files changed, 15 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/modules/video_capture/linux/device_info_pipewire.cc b/modules/video_capture/linux/device_info_pipewire.cc
|
|
index 7748fcf08f..009e1408b9 100644
|
|
--- a/modules/video_capture/linux/device_info_pipewire.cc
|
|
+++ b/modules/video_capture/linux/device_info_pipewire.cc
|
|
@@ -44,8 +44,10 @@ int32_t DeviceInfoPipeWire::GetDeviceName(uint32_t deviceNumber,
|
|
uint32_t deviceUniqueIdUTF8Length,
|
|
char* productUniqueIdUTF8,
|
|
uint32_t productUniqueIdUTF8Length,
|
|
- pid_t* pid) {
|
|
+ pid_t* pid,
|
|
+ bool* deviceIsPlaceholder) {
|
|
RTC_CHECK(pipewire_session_);
|
|
+
|
|
if (deviceNumber >= NumberOfDevices())
|
|
return -1;
|
|
|
|
diff --git a/modules/video_capture/linux/device_info_pipewire.h b/modules/video_capture/linux/device_info_pipewire.h
|
|
index b3e6de6fee..354e309ff9 100644
|
|
--- a/modules/video_capture/linux/device_info_pipewire.h
|
|
+++ b/modules/video_capture/linux/device_info_pipewire.h
|
|
@@ -32,7 +32,8 @@ class DeviceInfoPipeWire : public DeviceInfoImpl {
|
|
uint32_t deviceUniqueIdUTF8Length,
|
|
char* productUniqueIdUTF8 = nullptr,
|
|
uint32_t productUniqueIdUTF8Length = 0,
|
|
- pid_t* pid = 0) override;
|
|
+ pid_t* pid = 0,
|
|
+ bool* deviceIsPlaceholder = 0) override;
|
|
/*
|
|
* Fills the membervariable _captureCapabilities with capabilites for the
|
|
* given device name.
|
|
diff --git a/modules/video_capture/linux/device_info_v4l2.cc b/modules/video_capture/linux/device_info_v4l2.cc
|
|
index 45de4c8a03..db53708781 100644
|
|
--- a/modules/video_capture/linux/device_info_v4l2.cc
|
|
+++ b/modules/video_capture/linux/device_info_v4l2.cc
|
|
@@ -232,7 +232,8 @@ int32_t DeviceInfoV4l2::GetDeviceName(uint32_t deviceNumber,
|
|
uint32_t deviceUniqueIdUTF8Length,
|
|
char* /*productUniqueIdUTF8*/,
|
|
uint32_t /*productUniqueIdUTF8Length*/,
|
|
- pid_t* /*pid*/) {
|
|
+ pid_t* /*pid*/,
|
|
+ bool* /*deviceIsPlaceholder*/) {
|
|
// Travel through /dev/video [0-63]
|
|
uint32_t count = 0;
|
|
char device[20];
|
|
diff --git a/modules/video_capture/linux/device_info_v4l2.h b/modules/video_capture/linux/device_info_v4l2.h
|
|
index db98a62bcc..0717ea05bd 100644
|
|
--- a/modules/video_capture/linux/device_info_v4l2.h
|
|
+++ b/modules/video_capture/linux/device_info_v4l2.h
|
|
@@ -37,7 +37,8 @@ class DeviceInfoV4l2 : public DeviceInfoImpl {
|
|
uint32_t deviceUniqueIdUTF8Length,
|
|
char* productUniqueIdUTF8 = 0,
|
|
uint32_t productUniqueIdUTF8Length = 0,
|
|
- pid_t* pid=0) override;
|
|
+ pid_t* pid = 0,
|
|
+ bool* deviceIsPlaceholder = 0) override;
|
|
/*
|
|
* Fills the membervariable _captureCapabilities with capabilites for the
|
|
* given device name.
|
|
diff --git a/modules/video_capture/video_capture.h b/modules/video_capture/video_capture.h
|
|
index e04211f2cd..6167277d1a 100644
|
|
--- a/modules/video_capture/video_capture.h
|
|
+++ b/modules/video_capture/video_capture.h
|
|
@@ -77,7 +77,8 @@ class VideoCaptureModule : public RefCountInterface {
|
|
uint32_t deviceUniqueIdUTF8Length,
|
|
char* productUniqueIdUTF8 = 0,
|
|
uint32_t productUniqueIdUTF8Length = 0,
|
|
- pid_t* pid = 0) = 0;
|
|
+ pid_t* pid = 0,
|
|
+ bool* deviceIsPlaceholder = 0) = 0;
|
|
|
|
// Returns the number of capabilities this device.
|
|
virtual int32_t NumberOfCapabilities(const char* deviceUniqueIdUTF8) = 0;
|
|
diff --git a/modules/video_capture/windows/device_info_ds.cc b/modules/video_capture/windows/device_info_ds.cc
|
|
index fcb9869f32..1a7098e3bf 100644
|
|
--- a/modules/video_capture/windows/device_info_ds.cc
|
|
+++ b/modules/video_capture/windows/device_info_ds.cc
|
|
@@ -173,7 +173,8 @@ int32_t DeviceInfoDS::GetDeviceName(uint32_t deviceNumber,
|
|
uint32_t deviceUniqueIdUTF8Length,
|
|
char* productUniqueIdUTF8,
|
|
uint32_t productUniqueIdUTF8Length,
|
|
- pid_t* pid) {
|
|
+ pid_t* pid,
|
|
+ bool* deviceIsPlaceholder) {
|
|
MutexLock lock(&_apiLock);
|
|
const int32_t result = GetDeviceInfo(
|
|
deviceNumber, deviceNameUTF8, deviceNameLength, deviceUniqueIdUTF8,
|
|
diff --git a/modules/video_capture/windows/device_info_ds.h b/modules/video_capture/windows/device_info_ds.h
|
|
index e6dfaed366..a9a1449b99 100644
|
|
--- a/modules/video_capture/windows/device_info_ds.h
|
|
+++ b/modules/video_capture/windows/device_info_ds.h
|
|
@@ -51,7 +51,8 @@ class DeviceInfoDS : public DeviceInfoImpl {
|
|
uint32_t deviceUniqueIdUTF8Length,
|
|
char* productUniqueIdUTF8,
|
|
uint32_t productUniqueIdUTF8Length,
|
|
- pid_t* pid) override;
|
|
+ pid_t* pid,
|
|
+ bool* deviceIsPlaceholder) override;
|
|
|
|
/*
|
|
* Display OS /capture device specific settings dialog
|