On 9/21/23 00:10, Abhishek Ojha wrote:
This is an proof of concept for pipewire grab to enable screen capture
on wayland. Add a new Linux capture based on [1] PipeWire and the
[2] Desktop portal.
This new capture starts by asking the Desktop portal for a screencapture
session.There are quite a few D-Bus calls involved in this, but the key
points are:
1. A connection to org.freedesktop.portal.ScreenCast is estabilished,
and the available cursor modes are updated. Currently only embedded
and hidden currsor mode enabled.
2. Call CreateSession via dbus call. This is the first step of the
communication. Response callback return the status of created
session.
3. Call SelectSources . This is when a system dialog pops up asking
the user to either select a monitor (desktop capture).Only monitor
capture is enabled in current implementation.
4. Call Start . This signals the compositor that it can setup a PipeWire
stream, and start sending buffers.
Above flow is implemented as per the [2] xdg-desktop-portal. Once flow
is completed, pipewire fd is received and using this pipewire stream is
created and receive buffer from the created stream.
For cursor implementation, embedded cursor mode is enabled that means
cursor metadata is not handled in current implementation and has no
control over the cursor bitmap.
gdbus/pipewire logic, this is based on obs-xdg, gstpipewire and
pipewire examples, and initial pipewire grab logic, this is based on
libavdevice/xcbgrab and libavdevice/v4l2
This implementation shows the skeleton implementation and enables basic
functionality. I'd like to hear opinions and suggestions to improve and
properly use this.
[1] https://pipewire.org/
[2] https://github.com/flatpak/xdg-desktop-portal/
Below are the arguments for pipewiregrab.
ffplay -f pipewiregrab -draw_mouse 1 -i :0.0
Signed-off-by: Abhishek Ojha <abhishek.o...@savoirfairelinux.com>
---
configure | 9 +
libavdevice/Makefile | 1 +
libavdevice/alldevices.c | 1 +
libavdevice/pipewiregrab.c | 1836 ++++++++++++++++++++++++++++++++++++
4 files changed, 1847 insertions(+)
create mode 100644 libavdevice/pipewiregrab.c
diff --git a/configure b/configure
index e40dcce09e..325b10484f 100755
--- a/configure
+++ b/configure
@@ -299,6 +299,7 @@ External library support:
--enable-libxcb-shm enable X11 grabbing shm communication [autodetect]
--enable-libxcb-xfixes enable X11 grabbing mouse rendering [autodetect]
--enable-libxcb-shape enable X11 grabbing shape rendering [autodetect]
+ --enable-libpipewire enable screen grabbing using pipewire [autodetect]
--enable-libxvid enable Xvid encoding via xvidcore,
native MPEG-4/Xvid encoder exists [no]
--enable-libxml2 enable XML parsing using the C library libxml2,
needed
@@ -1788,6 +1789,8 @@ EXTERNAL_AUTODETECT_LIBRARY_LIST="
libxcb_shm
libxcb_shape
libxcb_xfixes
+ libpipewire
+ libgio_unix
lzma
mediafoundation
metal
@@ -3621,6 +3624,7 @@ v4l2_outdev_suggest="libv4l2"
vfwcap_indev_deps="vfw32 vfwcap_defines"
xcbgrab_indev_deps="libxcb"
xcbgrab_indev_suggest="libxcb_shm libxcb_shape libxcb_xfixes"
+pipewiregrab_indev_deps="libpipewire libgio_unix pthreads"
xv_outdev_deps="xlib_xv xlib_x11 xlib_xext"
# protocols
@@ -7041,6 +7045,11 @@ if enabled libxcb; then
enabled libxcb_xfixes && check_pkg_config libxcb_xfixes xcb-xfixes
xcb/xfixes.h xcb_xfixes_get_cursor_image
fi
+enabled libpipewire && check_pkg_config libpipewire "libpipewire-0.3 >= 0.3.40" pipewire/pipewire.h pw_init
+if enabled libpipewire; then
+ enabled libgio_unix && check_pkg_config libgio_unix gio-unix-2.0 gio/gio.h
g_main_loop_new
+fi
+
I just tried this and it failed to build due to missing locale_t and
other locale related issues in pipewire's spa library. Upon further
inspection, it seems Pipewire wants _XOPEN_SOURCE=700 but ffmpeg's
configure sets _XOPEN_SOURCE=600. Not sure who's at fault here but I was
able to get it to build after explicitly setting that.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".