===== 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