Site Tools


Sidebar

software:wayland_screenbeam

What is here?

Note: As of late November 2023, HDMI output got supported on the Macbook pro 2023, so I do no longer need the below.

How to best beam the screen of a Wayland system to a different system? Use case: Asahi-fedora remix does not yet support video output via usb-c. So, workaround: have the Macbooks screen encoded, sent over network, and shown on a monitor connected via HDMI to a linux box. Might also be a Raspi.

+--------------+               +--------------+            +-------+
|Asahi remixbox| -- network -- |Raspi/Thinkpad| -- HDMI -- |monitor|
+--------------+               +--------------+            +-------+

How bad will the latency be?

Using a Raspberry Pi to add a second HDMI port to a laptop

First setup, 7sec latency

On Thinkpad with Fedora
sudo dnf install -y mpv

# now run the client, in listen mode
mpv --hwdec=drm "tcp://192.168.0.3:1234?listen"
On Mac, with Sway/Fedora
# install packages
sudo dnf install v4l2loopback wf-recorder wlr-randr \
    akmod-v4l2loopback kmod-v4l2loopback

# On the mac, above did not make the v4l2loopback module
# available.  Let's compile it.    
sudo dnf install kernel-16k-devel
git clone https://github.com/umlaeute/v4l2loopback
cd v4l2loopback && make && sudo make install
sudo modprobe v4l2loopback

# find out which device loopback uses, for next command
v4l2-ctl --list-devices
# In my case, /dev/video0 is webcam, and new device is video1

# start recording screen, using v4l2 loopback device.
wf-recorder --muxer=v4l2 --codec=rawvideo \
  --file=/dev/video1 --pixel-format yuyv422

# optionally for testing, following shows locally the screen
# mplayer tv:// -tv driver=v4l2:device=/dev/video1

# now let's send over the network
ffmpeg -framerate 5 -i /dev/video1 -f mpegts tcp://192.168.0.3:1234

Second setup, 0.20sec latency

mpv --gpu-context=drm --input-cursor=no --input-vo-keyboard=no \
  --input-default-bindings=no --hwdec=drm --untimed --no-cache \
  --profile=low-latency --opengl-glfinish=yes \
  --opengl-swapinterval=0 --drm-draw-plane=overlay \
  --drm-drmprime-video-plane=primary --framedrop=no --speed=1.01 \
  --video-latency-hacks=yes --opengl-glfinish=yes \
  --opengl-swapinterval=0 tcp://192.168.0.3:1234:1234\?listen

ffmpeg -framerate 60 -i /dev/video1 -preset ultrafast \
  -tune zerolatency -f mpegts tcp://192.168.0.3:1234

Third setup, 0.18sec latency, ffplay

ffplay -autoexit -flags low_delay -framedrop \
  -strict experimental -tcp_nodelay 1 -probesize 32 \
  -sync ext -vf setpts=0 "tcp://192.168.0.3:1234?listen"

ffmpeg -framerate 60 -i /dev/video1 -preset ultrafast \
  -tune zerolatency -f mpegts tcp://192.168.0.3:1234
# with downscaling to 1080p
ffmpeg -framerate 60 -i /dev/video1 -s 1920x1080 \
  -preset ultrafast \
  -tune zerolatency -f mpegts tcp://192.168.0.3:1234

Forth setup, 0.18sec latency, ffplay udp

ffplay -autoexit -flags low_delay -framedrop \
  -strict experimental -probesize 32 \
  -sync ext -vf setpts=0 "udp://192.168.0.3:1234?listen"

# with downscaling to 1080p
ffmpeg -framerate 60 -i /dev/video1 -s 1920x1080 \
  -preset ultrafast -tune zerolatency \
  -f mpegts udp://192.168.0.3:1234
software/wayland_screenbeam.txt ยท Last modified: 2023/12/04 06:56 by chris