-
Notifications
You must be signed in to change notification settings - Fork 133
Description
(Huge text chunk warning)
Sorta extending on #309 (and probably #278) - I am able to get UxPlay working on my wsl instance (Fedora 43) but have some issues. This should hopefully serve as both a status report and an issue report (or many)...
TLDR
- It can be almost OOTB usable with some minor tinkering required, and the hardest part is probably GStreamer setup/choice of sink.
- There are several working configurations, but exactly one sink exhibit different behavior depending on the launch method, and some more fails at different stages.
Configuration
- Source device: iPad Pro 11-inch (M4), iPadOS 26.1 (23B85), in same Wi-Fi with server
- Target device: Lenovo ThinkPad P15v, Intel Core i7-12700H, Iris Xe Graphics + Nvidia T600
- Target OS: WSL from Windows 11 25H2 (26200.7309)
- Fedora 43 on WSL 2.6.2
- uxplay-1.72.2-1.fc43.x86_64
gst-inspect-1.0 | grep sink | grep -e Video -e video -e imageoutput:
autodetect: autovideosink: Auto video sink
debugutilsbad: fakevideosink: Fake Video Sink
debugutilsbad: fpsdisplaysink: Measure and show framerate on videosink
debugutilsbad: videocodectestsink: Video CODEC Test Sink
fbdevsink: fbdevsink: fbdev video sink
gtk: gtkglsink: Gtk GL Video Sink
gtk: gtksink: Gtk Video Sink
gtkwayland: gtkwaylandsink: Gtk Wayland Video Sink
inter: intervideosink: Internal video sink
kms: kmssink: KMS video sink
opengl: glimagesink: GL Sink Bin
opengl: glimagesinkelement: OpenGL video sink
qmlgl: qmlglsink: Qt Video Sink
video4linux2: v4l2sink: Video (video4linux2) Sink
vulkan: vulkandevice1sink: Vulkan Video sink on Microsoft Direct3D12 (Intel(R) Iris(R) Xe Graphics)
vulkan: vulkandevice2sink: Vulkan Video sink on llvmpipe (LLVM 21.1.5, 256 bits)
vulkan: vulkansink: Vulkan Video sink on Microsoft Direct3D12 (NVIDIA T600 Laptop GPU)
waylandsink: waylandsink: wayland video sink
ximagesink: ximagesink: Video sink
xvimagesink: xvimagesink: Video sink
~/.config/uxplayrc:
p
pin [redacted]
vs [either the sink being tested or omitted, see below]
- Network mode set to "mirrored" in WSL Settings
- Dual monitor set to extend (which might explain some window placement issues)
- No firewall set up in WSL, but Windows firewall in place
Setup
Since I'm running a Fedora instance, installing UxPlay itself is trivial (sudo dnf install uxplay). Then I went through the steps for setting up rpmfusion and installing ffmpeg-libs from there, which reported conflicts possibly due to me having a free-component-only (?) ffmpeg installed. It was resolved by passing --allowerasing to dnf, which removes several packages that are presumably to be replaced by the rpmfusion ones.
I already have avahi-daemon installed as a dependency for something else, but it seems that avahi-browse is packaged separately in avahi-tools in Fedora repos, which I had to install manually.
On the networking side I have the network mode set to mirrored beforehand for unrelated purposes, which seems to not pose a problem here. I haven't tried NAT or other modes but my hunch is that it will create extra hoops in the process.
On the firewall side I opted to use -p with static predefined ports, and wrote manual rules on Windows' side to clear the six ports in question.
Sinks and results:
Tested: Initiating and ending screen mirroring to the server, via the control center.
(Erroring cases on systemd service may be less accurate due to Restart=on-failure)
| Sink | Working? | Detail | |
|---|---|---|---|
| systemd service (service file in repo) | direct launch (uxplay -vs [sink]) | ||
| autovideosink | ❌ | segfaults on server start | |
| fbdevsink | ❌ | error spam on server start | |
| gtkglsink | ❌ | connects but insta error spam, blank "Gtk+ GL renderer" Wayland window pops up on server start but vanishes on connect | |
| gtksink | ✅ | connects without issue, blank "Gtk+ Cairo renderer" Wayland window pops up on server start | |
| gtkwaylandsink | ✅ | connects without issue, blank "Gst GTK Wayland Sink" Wayland window pops up on server start | |
| kmssink | ❌ | connects but do not see display, slow error spam on server start, segfault on connect | |
| glimagesink | ✅⚠ | connects without issue, Wayland window pops up only on connect, but window is placed weirdly and not movable (no title bar), segfault on mirroring end | |
| glimagesinkelement | ❌ | connects but then insta segfaults | |
| qmlglsink | ❌ | error spam on server start | |
| v4l2sink | ❌ | ||
| vulkandevice1sink | ❌ | connects but then insta drops | |
| vulkandevice2sink | ❌ | ||
| vulkansink | ❌ | ||
| waylandsink | ✅⚠ | connects without issue, Wayland window pops up only on connect, is placed in a (mostly) normal way but is not movable (no title bar) | |
| ximagesink | ✅⚠ | server start fails, error spam | connects without issue, X window pops up only on connect |
| xvimagesink | ❌ | server start fails, error spam | |
Error output
Direct launch unless stated otherwise. Only initial errors and the spamming parts if applicable. No -d for now, but can add if necessary.
autovideosink
libEGL warning: failed to get driver name for fd -1
libEGL warning: MESA-LOADER: failed to retrieve device information
libEGL warning: failed to get driver name for fd -1
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
MESA: error: Zink requires the nullDescriptor feature of KHR/EXT robustness2.
libEGL warning: egl: failed to create dri2 screen
(segfaults)
fbdevsink
*** ERROR: Failed to initialize GStreamer video renderer 1
GStreamer error: fbdevsink_h264 GStreamer error: state change failed and some element failed to post a proper error message with the reason for the failure.
gtkglsink
*** ERROR: GStreamer gst_parse_launch failed to create video pipeline 1
*** error message from gst_parse_launch was:
could not link videoscale0 to gtkglsink_h264
launch string parsed was
[appsrc name=video_source ! queue ! h264parse ! decodebin ! videoconvert ! video/x-raw,colorimetry=sRGB,format=RGB ! videoconvert ! videoscale ! gtkglsink name=gtkglsink_h264 sync=true]
libEGL warning: failed to get driver name for fd -1
libEGL warning: MESA-LOADER: failed to retrieve device information
libEGL warning: failed to get driver name for fd -1
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
MESA: error: Zink requires the nullDescriptor feature of KHR/EXT robustness2.
libEGL warning: egl: failed to create dri2 screen
(establishes connection)
raop_rtp_mirror starting mirroring
Begin streaming to GStreamer video pipeline
GStreamer error: video_source Internal data stream error.
*** This is a generic GStreamer error that usually means that GStreamer
*** was unable to construct a working video pipeline.
*** If you are letting the default autovideosink select the videosink,
*** GStreamer may be trying to use non-functional hardware h264 video decoding.
*** Try using option -avdec to force software decoding or use -vs <videosink>
*** to select a videosink of your choice (see "man uxplay").
*** Raspberry Pi models 4B and earlier using Video4Linux2 may need "-bt709" uxplay option
(uxplay:16817): GStreamer-App-CRITICAL **: 10:58:48.473: gst_app_src_push_internal: assertion 'GST_IS_APP_SRC (appsrc)' failed
raop_rtp_mirror->running is no longer true
kmssink
on server start:
*** ERROR: Failed to initialize GStreamer video renderer 1
GStreamer error: kmssink_h264 Could not open DRM module (NULL)
on connect:
(uxplay:17820): GStreamer-CRITICAL **: 11:20:18.249:
Trying to dispose element pipeline6, but it is in PLAYING instead of the NULL state.
You need to explicitly set elements to the NULL state before
dropping the final reference, to allow them to clean up.
This problem may also be caused by a refcounting bug in the
application or some element.
(segfaults)
glimagesink
libEGL warning: failed to get driver name for fd -1
libEGL warning: MESA-LOADER: failed to retrieve device information
libEGL warning: failed to get driver name for fd -1
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
MESA: error: Zink requires the nullDescriptor feature of KHR/EXT robustness2.
libEGL warning: egl: failed to create dri2 screen
(establishes connection)
raop_rtp_mirror starting mirroring
Begin streaming to GStreamer video pipeline
(disconnects from source device)
raop_rtp_mirror->running is no longer true
Connection closed for socket 29
Connection closed for socket 29
(segfaults)
glimagesinkelement
*** ERROR: GStreamer gst_parse_launch failed to create video pipeline 1
*** error message from gst_parse_launch was:
could not link videoscale0 to glimagesinkelement_h264
launch string parsed was
[appsrc name=video_source ! queue ! h264parse ! decodebin ! videoconvert ! video/x-raw,colorimetry=sRGB,format=RGB ! videoconvert ! videoscale ! glimagesinkelement name=glimagesinkelement_h264 sync=true]
libEGL warning: failed to get driver name for fd -1
libEGL warning: MESA-LOADER: failed to retrieve device information
libEGL warning: failed to get driver name for fd -1
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
MESA: error: Zink requires the nullDescriptor feature of KHR/EXT robustness2.
libEGL warning: egl: failed to create dri2 screen
(establishes connection)
raop_rtp_mirror starting mirroring
Begin streaming to GStreamer video pipeline
GStreamer error: video_source Internal data stream error.
*** This is a generic GStreamer error that usually means that GStreamer
*** was unable to construct a working video pipeline.
*** If you are letting the default autovideosink select the videosink,
*** GStreamer may be trying to use non-functional hardware h264 video decoding.
*** Try using option -avdec to force software decoding or use -vs <videosink>
*** to select a videosink of your choice (see "man uxplay").
*** Raspberry Pi models 4B and earlier using Video4Linux2 may need "-bt709" uxplay option
(uxplay:18703): GStreamer-App-CRITICAL **: 11:27:42.739: gst_app_src_push_internal: assertion 'GST_IS_APP_SRC (appsrc)' failed
(segfaults)
qmlglsink
*** ERROR: GStreamer gst_parse_launch failed to create video pipeline 1
*** error message from gst_parse_launch was:
could not link videoscale0 to qmlglsink_h264
launch string parsed was
[appsrc name=video_source ! queue ! h264parse ! decodebin ! videoconvert ! video/x-raw,colorimetry=sRGB,format=RGB ! videoconvert ! videoscale ! qmlglsink name=qmlglsink_h264 sync=true]
*** ERROR: Failed to initialize GStreamer video renderer 1
GStreamer error: qmlglsink_h264 Failed to connect to Qt
v4l2sink
*** ERROR: Failed to initialize GStreamer video renderer 1
GStreamer error: v4l2sink_h264 Cannot identify device '/dev/video1'.
vulkan*sink
Same on the three sinks except for vulkandevice1sink/vulkandevice2sink/vulkansink.
*** ERROR: GStreamer gst_parse_launch failed to create video pipeline 1
*** error message from gst_parse_launch was:
could not link videoscale0 to vulkandevice1sink_h264
launch string parsed was
[appsrc name=video_source ! queue ! h264parse ! decodebin ! videoconvert ! video/x-raw,colorimetry=sRGB,format=RGB ! videoconvert ! videoscale ! vulkandevice1sink name=vulkandevice1sink_h264 sync=true]
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
WARNING: dzn is not a conformant Vulkan implementation, testing use only.
(establishes connection)
raop_rtp_mirror starting mirroring
Begin streaming to GStreamer video pipeline
GStreamer error: video_source Internal data stream error.
*** This is a generic GStreamer error that usually means that GStreamer
*** was unable to construct a working video pipeline.
*** If you are letting the default autovideosink select the videosink,
*** GStreamer may be trying to use non-functional hardware h264 video decoding.
*** Try using option -avdec to force software decoding or use -vs <videosink>
*** to select a videosink of your choice (see "man uxplay").
*** Raspberry Pi models 4B and earlier using Video4Linux2 may need "-bt709" uxplay option
(uxplay:19018): GStreamer-App-CRITICAL **: 11:34:50.218: gst_app_src_push_internal: assertion 'GST_IS_APP_SRC (appsrc)' failed
raop_rtp_mirror->running is no longer true
(connection dropped)
ximagesink (systemd service only, obtained from journalctl)
GStreamer error: ximagesink_h264 Could not initialise X output
*** ERROR: Failed to initialize GStreamer video renderer 1
xvimagesink
GStreamer error: xvimagesink_h264 Could not initialise Xv output
*** ERROR: Failed to initialize GStreamer video renderer 1
(spams for a few seconds)
Maximum number of clients reached
Issues?
Out of the usable sinks, the Wayland ones tend to have issues deciding when and how to show the window as needed, while the X one has trouble (presumably) interacting with systemd. Direct-hardware (?) sinks seem to all fail outright.
The fun part? I actually don't know exactly where the issue lies. Some sinks failing can probably be attributed directly to the inherent design of WSL, but anything else failing can easily be between something with UxPlay itself, WSL mechanics, library stuff, driver stuff, Wayland/X design, Fedora specifics (Wayland/X differences, for example), or some combination of these.
Having some configurations working is a good enough indicator to me that UxPlay itself is working as intended, but some pointers on what the outstanding issues here might be are welcome nevertheless. Thanks in advance.