14 Commits

Author SHA1 Message Date
Jan Grulich
a5d71009ac PipeWire camera: use better unique device name for camera devices
Originally we used node id from PipeWire as an unique device name and
while this works, it will change everytime PipeWire is restarted. This
has an impact on default camera selection, where for example Firefox can
automatically request a camera device that was used before, but this can
break with the next PipeWire restart.

Bug: webrtc:42225999
Change-Id: I9440ee065ffeaa1ffb911a4dc7c405d57c9416dc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/367880
Commit-Queue: Jan Grulich <grulja@gmail.com>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43387}
2024-11-11 19:01:34 +00:00
Jan Grulich
3aa47cfd30 PipeWire camera: get max FPS for each format when specified as list
In many cases, the framerate can be specified as list of possible values
and in that case, we would end up with max FPS to be set to 0 as this
case was not handled.

Bug: webrtc:42225999
Change-Id: I036af6db1da3309b1310b754504369e8fe392d09
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/362961
Commit-Queue: Jan Grulich <grulja@gmail.com>
Reviewed-by: Andreas Pehrson <apehrson@mozilla.com>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43057}
2024-09-20 06:35:22 +00:00
Jan Grulich
3881cb65cf PipeWire camera: make member variable with the PipeWire status updated
We keep information about the PipeWire camera status as a member of the
PipeWire session, but it's never updated and remains in uninitialized
state. Make sure it gets updated once PipeWire is initialized or when it
fails. There is currently no use for this member variable, but there is
a plan to use it so I'm rather keeping it instead of removing it.

Bug: webrtc:42225999
Change-Id: If409761b148be8f0724fd9ab7a1ed4cf0e459503
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/360922
Reviewed-by: Andreas Pehrson <apehrson@mozilla.com>
Commit-Queue: Jan Grulich <grulja@gmail.com>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42926}
2024-09-03 10:44:32 +00:00
Florent Castelli
8037fc6ffa Migrate absl::optional to std::optional
Bug: webrtc:342905193
No-Try: True
Change-Id: Icc968be43b8830038ea9a1f5f604307220457807
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/361021
Auto-Submit: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42911}
2024-09-02 12:16:47 +00:00
Jan Grulich
b4aba7834e PipeWire camera: filter out devices with no capabilities
Filter out devices that do not support any format supported by WebRTC.
This will for example be IR cameras that show as duplicated in the list
of cameras, but support only GRAY8 format and for that reason do not
work at all.

Bug: webrtc:42225999
Change-Id: Ic2905bc66b55c3f48b49ff4097167f10d17ad656
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/358864
Commit-Queue: Jan Grulich <grulja@gmail.com>
Reviewed-by: Andreas Pehrson <apehrson@mozilla.com>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42785}
2024-08-15 09:45:35 +00:00
Jan Grulich
9e755f0e19 PipeWire camera: Annotate functions with PipeWire calls to avoid CFI
Similar to PipeWire implementation of desktop capture, we have to avoid
CFI check for calls of dlopened PipeWire library. This avoid crashing
PipeWire camera backend when "is_official_build=true" option is used as
this turns on "is_cfi=true" enabling control flow integrity.

Bug: chromium:354776214
Change-Id: I7a9fc1c2d77c4ee0e8fe0586369b7246e0bb9180
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/358103
Commit-Queue: Jan Grulich <grulja@gmail.com>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Alexander Cooper <alcooper@chromium.org>
Cr-Commit-Position: refs/heads/main@{#42706}
2024-07-31 18:11:40 +00:00
Jan Grulich
b1ebcfbfd6 PipeWire camera: support additional formats and fix RGB/BGR mapping
Similar to BGRA/RGBA we added recently, formats from PipeWire are in
big-endian, while WebRTC (using libyuv) is little-endian, therefore we
have to map BGR to RGB and not RGB to RGB as colors would be off. Also
add some additional formats supported by libyuv.

Bug: webrtc:42225999
Change-Id: Iee8303f0922fe434069b2b3f88994abecf7d2cc5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/355860
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Jan Grulich <grulja@gmail.com>
Cr-Commit-Position: refs/heads/main@{#42609}
2024-07-09 09:58:37 +00:00
Jan Grulich
c3aeffd776 PipeWire camera: add support for BGRA/RGBA formats
Adds support for 32 bits formats needed for libcamera software ISP. This
is needed, because libcamera enforces 8 byte alignment and we only
support 3 byte alignment for RGB. This will make it work with 32 bits
aligned output formats recently added to libcamera.

Relevant libcamera patch: https://patchwork.libcamera.org/patch/20253/

This has been verified on an snapdragon device using libcamera and software ISP and on my machine using "vivid" virtual camera from libcamera and enforcing specific format.

Bug: webrtc:346808586
Change-Id: I8d89120660b2304b880d952c5acd7f5cd09b611e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/354400
Commit-Queue: Jan Grulich <grulja@gmail.com>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42474}
2024-06-13 13:16:00 +00:00
Jan Grulich
633a41ff8e PipeWire camera: check for node existence before adding it to the list
This avoids having duplicate camera entries presented to the user when
PipeWire camera is being used.

Bug: webrtc:346350844
Change-Id: I423db7fe0654cc1b1c91ee5264c6ba5dc4e24100
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/354320
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Andreas Pehrson <apehrson@mozilla.com>
Commit-Queue: Jan Grulich <grulja@gmail.com>
Cr-Commit-Position: refs/heads/main@{#42462}
2024-06-11 15:54:00 +00:00
Robert Mader
a717c7ada8 Video Capture PipeWire: Filter out non-camera nodes
This can be helpful in various situations, such as debugging with an
unrestricted Pipewire socket or for downstream projects like
B2G/Capyloon. Additionally it will help once we move from the camera
portal to the more generic device portal.

Original patch by Fabrice Desré <fabrice@desre.org>

Bug: webrtc:15464
Change-Id: Iae6802f242d68244bca85947cb15ef3eee923ab0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/318642
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40706}
2023-09-06 10:55:36 +00:00
Jan Grulich
666d707450 Video capture PipeWire: guard callback to avoid concurrent access
Make sure the callback is reset when tearing down the PipeWireSession
and that there is no concurrent access to it, which can potentially lead
to a crash.

Bug: webrtc:15386
Change-Id: I0b09002fe0479dc1cd946c80684bcc5d8754d54a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/311546
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Jan Grulich <grulja@gmail.com>
Cr-Commit-Position: refs/heads/main@{#40464}
2023-07-24 14:48:33 +00:00
Jan Grulich
9caef2a8b8 Use a constant for invalid PipeWire file descriptor
We use value -1 on over all the places through our code so it might be
better to define a constant and use it instead to make the code more
understandable on first look.

Bug: webrtc:15203
Change-Id: I4fc3e561bc7a7778c43ec6cfde7acebef2af79e8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/306620
Reviewed-by: Alexander Cooper <alcooper@chromium.org>
Commit-Queue: Jan Grulich <grulja@gmail.com>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40156}
2023-05-26 11:38:49 +00:00
Jan Grulich
56d126074e PipeWire video capture: split portal and PipeWire implementations
Allows to use camera portal separately in implementations where each
implementation needs to be called in different places.

This is targeted for Firefox support, where we need to ask for camera
access in the FF frontend code, otherwise making camera access requests
in the backend WebRTC code might result into presenting portal dialogs
asking for access from the javascript API.

Bug: webrtc:15202
Change-Id: Ida8b010bb93e08a9e5ddd9dd8a2a3549ee7fde8b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/305222
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Alexander Cooper <alcooper@chromium.org>
Commit-Queue: Jan Grulich <grulja@gmail.com>
Cr-Commit-Position: refs/heads/main@{#40148}
2023-05-25 17:04:53 +00:00
Michael Olbrich
f0be3bee1f Add pipewire/portal video capture support
This makes it possible to access cameras through xdg-desktop-portal and
pipewire.

For pipewire, a shared state is needed between the enumeration and the
creation of camera object. So a new API is needed with a shared options
object that holds the state and can be used to choose which backend to try.

Bug: webrtc:13177
Change-Id: Iaad2333b41e4e6fb112f4558ea4b623e59afcbd1
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/261620
Reviewed-by: Alexander Cooper <alcooper@chromium.org>
Commit-Queue: Alexander Cooper <alcooper@chromium.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39251}
2023-02-02 17:20:04 +00:00