===== 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?
[[https://pierre-couy.dev/tinkering/2023/03/turning-rpi-into-external-monitor-driver.html|Using a Raspberry Pi to add a second HDMI port to a laptop]]
{{ :software:20231119_110450488_remote_delay_macb.jpg?400|}}
===== 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