diff --git a/README.html b/README.html
index 346eba1..baa1ebe 100644
--- a/README.html
+++ b/README.html
@@ -1965,6 +1965,9 @@ decrypted h264/5 video to an external renderer (e.g., OBS Studio), and
encoding. New option -lang fr:es:en to specify language
preferences for YouTube HLS videos when they offer a choice. New option
-mp4 for recording to a mp4 file (Mirror and Audio mode, not HLS)
+1.72.3 2025-12-20 Fix bug reported in CVE-2025-60458 whereby a
+specially-crafted client TEARDOWN request can crash UxPlay (denial of
+service attack).
1.72.2 2025-07-07 Fix bug (typo) in DNS_SD advertisement introduced
with -pw option. Update llhttp to v 9.3.0
1.72.1 2025-06-06 minor update: fix regression in -reg option; add
@@ -2260,2265 +2263,3 @@ Inc) and contributors: Created an http parsing library called llhttp. Located at
lib/llhttp/. License: MIT
-
UxPlay
-1.73: AirPlay-Mirror and AirPlay-Audio server for Linux, macOS, and Unix
-(also runs on Windows).
-Now
-developed at the GitHub site https://github.com/FDH2/UxPlay (where ALL user issues
-should be posted, and latest versions can be found).
-
-NEW in v1.73 (January 2026):
-Some YouTube app HLS videos now offer alternative language tracks
-(generated by AI dubbing). Language choices will be made in order of
-preferences set with option -lang (or by environment variable $LANGUAGE,
-which “-lang” overrides). Format is -lang fr:es:en, where
-French (“fr”) is the first choice, if available, then Spanish (“es”),
-etc. $LANGUAGE has the same format: -lang (by itself)
-suppresses playing of dubbed audio if $LANGUAGE is set.
-Support for recording Mirror-mode/Audio-mode (but not HLS) Audio
-and Video to mp4 file (new option -mp4 [fn]).
-Support for service discovery using a Bluetooth LE
-“beacon” for both Linux/*BSD and Windows (as an alternative to
-Bonjour/Rendezvous DNS-SD service discovery). This can be used
-on networks that do not allow the user to run a DNS_SD service.
-The user must run a Bluetooth LE “beacon”, (a USB 4.0 or later “dongle”
-can be used). The beacon is managed by a Python3 script
-uxplay-beacon.py (available in two versions, a BlueZ/DBus
-version for Linux/*BSD, and a winrt version for Windows). The beacon
-runs independently of UxPlay: while UxPlay is running, it regularly
-broadcasts a Bluetooth LE (“Low Energy”) 46 byte legacy-type
-advertisement informing nearby iOS/macOS devices of the local IPv4
-network address of the UxPlay server, and which TCP port to contact
-UxPlay on. Instructions are given
-below.
-option -vrtp <rest-of-pipeline> bypasses
-rendering by UxPlay, and instead transmits rtp packets of decrypted h264
-or h265 video to an external renderer (e.g. OBS Studio) at an address
-specified in rest-of-pipeline. Similarly,
--artp <rest-of-pipeline> forwards decoded audio as
-L16 RTP packets. Both options can be used together to forward video and
-audio (as separate concurrent streams) to external applications. See Usage for more details and sample Gstreamer receiver
-pipelines.
-(for Linux/*BSD Desktop Environments using D-Bus). New option
--scrsv <n> provides screensaver inhibition (e.g., to
-prevent screensaver function while watching mirrored videos without
-keyboard or mouse activity): n = 0 (off) n=1 (on during video activity)
-n=2 (always on while UxPlay is running). Tested on
-Gnome/KDE/Cinnamon/Mate/Xfce 4: may need adjustment for other Desktop
-Environments (please report). (watch output of dbus-monitor
-to verify that inhibition is working). Might not work on
-Wayland.
-option -ca (with no filename given) will now render Apple Music
-cover art (in audio-only mode) inside UxPlay. (-ca
-<filename> will continue to export cover art for
-display by an external viewer).
-Improved Support for (YouTube) HLS (HTTP Live Streaming) video
-with the new “-hls” option (introduced in 1.71).* Only streaming
-from the YouTube iOS app (in "m3u8" protocol) is currently
-supported: (streaming using the AirPlay icon in a browser
-window is not yet supported).Click on the airplay icon
-in the YouTube app to stream video. Please report any issues
-with this new feature of UxPlay.
-The default video player for HLS is GStreamer playbin v3: use
-“-hls 2” to revert to the older GStreamer player playbin v2 if some
-videos fail to play.
-user-requested features: added support for setting a password (as
-an alternative to on-screen pin codes) to control client access (-pw
-option, see “man pw” or this README for details); added support for
-setting initial client audio-streaming volume (-vol option), and output
-of audio-mode metadata to file (for display by some external process,
--md option).
-
-Highlights:
-
-- GPLv3, open source.
-- Originally supported only AirPlay Mirror protocol, now has added
-support for AirPlay Audio-only (Apple Lossless ALAC) streaming from
-current iOS/iPadOS clients. Now with support for Airplay HLS
-video-streaming (currently only YouTube video).
-- macOS computers (2011 or later, both Intel and “Apple Silicon” M1/M2
-systems) can act either as AirPlay clients, or as the server running
-UxPlay. Using AirPlay, UxPlay can emulate a second display for macOS
-clients.
-- Support for older iOS clients (such as 32-bit iPad 2nd gen., iPod
-Touch 5th gen. and iPhone 4S, when upgraded to iOS 9.3.5, or later
-64-bit devices), plus a Windows AirPlay-client emulator, AirMyPC.
-- Uses GStreamer plugins for audio and video rendering (with options
-to select different hardware-appropriate output “videosinks” and
-“audiosinks”, and a fully-user-configurable video streaming
-pipeline).
-- Support for server behind a firewall.
-- Raspberry Pi support both with and without hardware video
-decoding by the Broadcom GPU. Tested on Raspberry Pi Zero 2
-W, 3 Model B+, 4 Model B, and 5.
-- Support for running on Microsoft Windows (builds with the MinGW-64
-compiler in the unix-like MSYS2 environment).
-
-Note: AirPlay2 multi-room audio streaming is not supported: use shairport-sync
-for that.
-Packaging status
-(Linux and *BSD distributions)
-
.
-
-Install uxplay on Debian-based Linux systems with
-“sudo apt install uxplay”; on FreeBSD with
-“sudo pkg install uxplay”; on OpenBSD with
-“doas pkg_add uxplay”. Also available on Arch-based systems
-through AUR. Since v. 1.66, uxplay is now also packaged in RPM format by
-Fedora 38 (“sudo dnf install uxplay”).
-For other RPM-based distributions which have not yet packaged
-UxPlay, a RPM “specfile” uxplay.spec is now provided
-with recent releases (see their
-“Assets”), and can also be found in the UxPlay source top directory. See
-the section on using this specfile for building an installable RPM
-package.
-If your distribution does not supply UxPlay, or you want the
-latest version, it is very easy to build it yourself: see the very detailed instructions for building
-UxPlay from source. later in this document.
-
-After installation:
-
-(On Linux and *BSD): if a firewall is active on the server
-hosting UxPlay, make sure the default network port (UDP 5353) for
-mDNS/DNS-SD queries is open (see Troubleshooting below for more details);
-also open three UDP and three TCP ports for Uxplay, and use the “uxplay
--p ” option (see “man uxplay” or
-“uxplay -h”).
-Even if you install your distribution’s pre-compiled uxplay
-binary package, you may need to read the instructions below for running UxPlay to see which of your
-distribution’s GStreamer plugin packages you should
-also install.
-For Audio-only mode (Apple Music, etc.) best quality is obtained
-with the option “uxplay -async”, but there is then a 2 second latency
-imposed by iOS. Use option “uxplay -ca” to display any “Cover Art” that
-accompanies the audio.
-If you are using UxPlay just to mirror the client’s screen
-(without showing videos that need audio synchronized with video), it is
-best to use the option “uxplay -vsync no”.
-Add any UxPlay options you want to use as defaults to a startup
-file ~/.uxplayrc (see “man uxplay” or
-“uxplay -h” for format and other possible locations; the
-location can also be set with “uxplay -rc location”). In
-particular, if your system uses PipeWire audio or Wayland video systems,
-you may wish to add “as pipewiresink” or “vs waylandsink” as defaults to
-the file. (Output from terminal commands “ps waux | grep pulse” or
-“pactl info” will contain “pipewire” if your Linux/BSD system uses
-it).
-For Linux/*BSD systems using D-Bus, the option
--scrsv 1 inhibits the screensaver while there is video
-activity on UxPlay (-scrsv 2 inhibits it whenever UxPlay is
-running).
-For Linux systems using systemd, there is a
-systemd service file uxplay.service
-found in the UxPlay top directory of the distribution, and also
-installed in <DOCDIR>/uxplay/systemd/ (where DOCDIR
-is usually /usr/local/share/doc), that allows users to
-start their own instance of UxPlay as a rootless daemon: it should
-either be added to the directory /etc/systemd/user, or the user can just
-create their own systemd directory ~/.config/systemd/user/
-and then copy uxplay.service into it. To save uxplay terminal output to
-a file ~/uxplay.log, uncomment the StandardOutput entry in
-uxplay.service. Then
-systemctl --user [start/stop/enable/disable/status] uxplay
-can be used to control the daemon. If it is enabled, the daemon will
-start at the user’s first login and stop when they no longer have any
-open sessions. See
-https://www.baeldung.com/linux/systemd-create-user-services for more
-about systemd user services. If more than one user might simultaneously
-run uxplay this way, they should specify distinct -p and -m options
-(ports and deviceID) in their startup files. Note: it is NOT
-recommended to run UxPlay as a root service.
-On Raspberry Pi: models using hardware h264 video decoding by the
-Broadcom GPU (models 4B and earlier) may require the uxplay option
--bt709. If you use Ubuntu 22.10 or earlier, GStreamer must be patched
-to use hardware video decoding by the Broadcom GPU (also recommended but
-optional for Raspberry Pi OS (Bullseye): the patched GStreamer does not
-need option ” -bt709`“. The need for -bt709 when hardware video decoding
-is used seems to have reappeared starting with GStreamer-1.22.
-If UxPlay is used in a public space, there are security options
-for requiring an AppleTV-style one-time pin (displayed on the terminal)
-to be entered, or a password, and for barring/permitting client access
-by their device ID. See options -pin, -reg, -pw, -restrict, -allow,
--block.
-
-Detailed description of
-UxPlay
-This project is a GPLv3 open source unix AirPlay2 Mirror server for
-Linux, macOS, and *BSD. It was initially developed by antimof using code from
-OpenMAX-based RPiPlay,
-which in turn derives from AirplayServer, shairplay, and playfair. (The
-antimof site is no longer involved in development, but periodically
-posts updates pulled from the new main UxPlay site).
-UxPlay is tested on a number of systems, including (among others)
-Debian (10 “Buster”, 11 “Bullseye”, 12 “Bookworm”), Ubuntu (20.04 LTS,
-22.04 LTS, 23.04 (also Ubuntu derivatives Linux Mint, Pop!_OS), Red Hat
-and clones (Fedora 38, Rocky Linux 9.2), openSUSE Leap 15.5, Mageia 9,
-OpenMandriva “ROME”, PCLinuxOS, Arch Linux, Manjaro, and should run on
-any Linux system. Also tested on macOS Catalina and Ventura (Intel) and
-Sonoma (M2), FreeBSD 14.0, Windows 10 and 11 (64 bit).
-On Raspberry Pi 4 model B, it is tested on Raspberry Pi OS (Bullseye
-and Bookworm) (32- and 64-bit), Ubuntu 22.04 LTS and 23.04, Manjaro RPi4
-23.02, and (without hardware video decoding) on openSUSE 15.5. Also
-tested on Raspberry Pi Zero 2 W, 3 model B+, and now 5.
-Its main use is to act like an AppleTV for screen-mirroring (with
-audio) of iOS/iPadOS/macOS clients (iPhone, iPod Touch, iPad, Mac
-computers) on the server display of a host running Linux, macOS, or
-other unix (and now also Microsoft Windows). UxPlay supports Apple’s
-AirPlay2 protocol using “Legacy Protocol”, but some features are
-missing. (Details of what is publicly known about Apple’s AirPlay 2
-protocol can be found here, here
-and here; see also
-pyatv which
-could be a resource for adding modern protocols.) While there is no
-guarantee that future iOS releases will keep supporting “Legacy
-Protocol”, iOS 17 continues support.
-The UxPlay server and its client must be on the same local area
-network, on which a Bonjour/Zeroconf mDNS/DNS-SD server
-is also running (only DNS-SD “Service Discovery” service is strictly
-necessary, it is not necessary that the local network also be of the
-“.local” mDNS-based type). On Linux and BSD Unix servers, this is
-usually provided by Avahi, through
-the avahi-daemon service, and is included in most Linux distributions
-(this service can also be provided by macOS, iOS or Windows servers).
-There is now an alternative Service discovery method, using a Bluetooth
-LE “beacon” See below for instructions.
-Connections to the UxPlay server by iOS/MacOS clients can be
-initiated both in AirPlay Mirror mode (which streams
-lossily-compressed AAC audio while mirroring the client screen, or in
-the alternative AirPlay Audio mode which streams Apple
-Lossless (ALAC) audio without screen mirroring. In
-Audio mode, metadata is displayed in the uxplay
-terminal; if UxPlay option -ca <name> is used, the
-accompanying cover art is also output to a periodically-updated file
-<name>, and can be viewed with a (reloading) graphics
-viewer of your choice. Switching between
-Mirror and Audio modes
-during an active connection is possible: in Mirror
-mode, stop mirroring (or close the mirror window) and start an
-Audio mode connection, switch back by initiating
-a Mirror mode connection; cover-art display
-stops/restarts as you leave/re-enter Audio
-mode.
-
-Note that Apple video-DRM (as found in “Apple TV app”
-content on the client) cannot be decrypted by UxPlay, and the Apple TV
-app cannot be watched using UxPlay’s AirPlay Mirror mode (only the
-unprotected audio will be streamed, in AAC format).
-With the new “-hls” option, UxPlay now also supports
-non-Mirror AirPlay video streaming (where the client controls a web
-server on the AirPlay server that directly receives HLS content to avoid
-it being decoded and re-encoded by the client). This currently only
-supports streaming of YouTube videos. Without the -hls option, using the
-icon for AirPlay video in apps such as the YouTube app will only send
-audio (in lossless ALAC format) without the accompanying
-video.
-
-Possibility
-for using hardware-accelerated h264/h265 video-decoding, if
-available.
-UxPlay uses GStreamer
-“plugins” for rendering audio and video. This means that video and audio
-are supported “out of the box”, using a choice of plugins. AirPlay
-streams video in h264 format: gstreamer decoding is plugin agnostic, and
-uses accelerated GPU hardware h264 decoders if available; if not,
-software decoding is used.
-
-VA-API for Intel and AMD integrated graphics, NVIDIA with
-“Nouveau” open-source driver
-With an Intel or AMD GPU, hardware decoding with the open-source
-VA-API gstreamer plugins is preferable. (Newer “va” versions of these
-plugins with names like “vah264dec” are recommended instead of older
-“vaapi” ones named like “vaapih264dec”.) The open-source “Nouveau”
-drivers for NVIDIA graphics are also in principle supported: see here,
-but this requires VAAPI to be supplemented with firmware extracted from
-the proprietary NVIDIA drivers.
-NVIDIA with proprietary drivers
-The nvh264dec plugin (included in
-gstreamer1.0-plugins-bad since GStreamer-1.18.0) can be used for
-accelerated video decoding on the NVIDIA GPU after NVIDIA’s CUDA driver
-libcuda.so is installed. For GStreamer-1.16.3 or earlier,
-the plugin is called nvdec, and must be built
-by the user.
-Video4Linux2 support for h264 hardware decoding on
-Raspberry Pi (Pi 4B and older)
-Raspberry Pi (RPi) computers (tested on Pi 4 Model B) can now run
-UxPlay using software video decoding, but hardware-accelerated h264/h265
-decoding by firmware in the Pi’s Broadcom 2835 GPU is prefered. UxPlay
-accesses this using the GStreamer-1.22 Video4Linux2 (v4l2) plugin; Uses
-the out-of-mainline Linux kernel module bcm2835-codec maintained by
-Raspberry Pi, so far only included in Raspberry Pi OS, and two other
-distributions (Ubuntu, Manjaro) available with Raspberry Pi Imager.
-(For GStreamer < 1.22, see the UxPlay
-Wiki). Pi model 5 has no support for hardware H264 decoding, as
-its CPU is powerful enough for satisfactory software H264
-decoding
-Support for h265 (HEVC) hardware decoding on Raspberry Pi
-(Pi 4 model B and Pi 5)
-These Raspberry Pi models have a dedicated HEVC decoding block (not
-the GPU), with a driver “rpivid” which is not yet in the mainline Linux
-kernel (but is planned to be there in future). Unfortunately it produces
-decoded video in a non-standard pixel format (NC30 or “SAND”) which will
-not be supported by GStreamer until the driver is in the mainline
-kernel; without this support, UxPlay support for HEVC hardware decoding
-on Raspberry Pi will not work.
-
-Note to packagers:
-UxPlay’s GPLv3 license does not have an added “GPL exception”
-explicitly allowing it to be distributed in compiled form when linked to
-OpenSSL versions prior to v. 3.0.0 (older versions of
-OpenSSL have a license clause incompatible with the GPL unless OpenSSL
-can be regarded as a “System Library”, which it is in *BSD). Many Linux
-distributions treat OpenSSL as a “System Library”, but some
-(e.g. Debian) do not: in this case, the issue is solved by linking with
-OpenSSL-3.0.0 or later.
-Building UxPlay from source
-Either download and unzip UxPlay-master.zip,
-or (if git is installed): “git clone https://github.com/FDH2/UxPlay”.
-You can also download a recent or earlier version listed in Releases.
-
-- A recent UxPlay can also be found on the original antimof site; that original
-project is inactive, but is usually kept current or almost-current with
-the active UxPlay github
-site (thank you antimof!).
-
-Building UxPlay on Linux (or
-*BSD):
-Debian-based systems:
-(Adapt these instructions for non-Debian-based Linuxes or *BSD; for
-macOS, see specific instruction below). See Troubleshooting below for help with any
-difficulties.
-You need a C/C++ compiler (e.g. g++) with the standard development
-libraries installed. Debian-based systems provide a package
-“build-essential” for use in compiling software. You also need
-pkg-config: if it is not found by “which pkg-config”,
-install pkg-config or its work-alike replacement pkgconf. Also make sure
-that cmake>=3.10 is installed: “sudo apt install cmake”
-(add build-essential and pkg-config (or
-pkgconf) to this if needed).
-Make sure that your distribution provides OpenSSL 1.1.1 or later, and
-libplist 2.0 or later. (This means Debian 10 “Buster” based systems
-(e.g, Ubuntu 18.04) or newer; on Debian 10 systems “libplist” is an
-older version, you need “libplist3”.) If it does not, you may need to
-build and install these from source (see instructions at the end of this
-README).
-If you have a non-standard OpenSSL installation, you may need to set
-the environment variable OPENSSL_ROOT_DIR (e.g. ,
-“export OPENSSL_ROOT_DIR=/usr/local/lib64” if that is where
-it is installed). Similarly, for non-standard (or multiple) GStreamer
-installations, set the environment variable GSTREAMER_ROOT_DIR to the
-directory that contains the “…/gstreamer-1.0/” directory of the
-gstreamer installation that UxPlay should use (if this is e.g.
-“~/my_gstreamer/lib/gstreamer-1.0/”, set this location with
-“export GSTREAMER_ROOT_DIR=$HOME/my_gstreamer/lib”).
-
-- Most users will use the GStreamer supplied by their distribution,
-but a few (in particular users of Raspberry Pi OS Lite Legacy (Buster)
-on a Raspberry Pi model 4B who wish to stay on that unsupported Legacy
-OS for compatibility with other apps) should instead build a newer
-Gstreamer from source following these
-instructions . Do this before building
-UxPlay.
-
-In a terminal window, change directories to the source directory of
-the downloaded source code (“UxPlay-*”, “*” = “master” or the release
-tag for zipfile downloads, “UxPlay” for “git clone” downloads), then
-follow the instructions below:
-Note: By default UxPlay will be built with
-optimization for the computer it is built on; when this is not the case,
-as when you are packaging for a distribution, use the cmake option
--DNO_MARCH_NATIVE=ON.
-If you use X11 Windows on Linux or *BSD, and wish to toggle in/out of
-fullscreen mode with a keypress (F11 or Alt_L+Enter) UxPlay needs to be
-built with a dependence on X11. Starting with UxPlay-1.59, this will be
-done by default IF the X11 development libraries are
-installed and detected. Install these with
-“sudo apt install libx11-dev”. If GStreamer < 1.20 is
-detected, a fix needed by screen-sharing apps (e.g., Zoom) will
-also be made.
-
-- If X11 development libraries are present, but you wish to build
-UxPlay without any X11 dependence, use the cmake option
-
-DNO_X11_DEPS=ON.
-
-
-sudo apt install libssl-dev libplist-dev“. (unless
-you need to build OpenSSL and libplist from source).
-sudo apt install libavahi-compat-libdnssd-dev
-sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev.
-(*Skip if you built Gstreamer from source)
-cmake . (For a cleaner build, which is useful if
-you modify the source, replace this by
-“mkdir build; cd build; cmake ..”: you can then delete
-the contents of the build directory if needed, without
-affecting the source.) Also add any cmake “-D” options
-here as needed (e.g, -DNO_X11_DEPS=ON or
--DNO_MARCH_NATIVE=ON).
-make
-sudo make install (you can afterwards uninstall with
-sudo make uninstall in the same directory in which this was
-run).
-
-This installs the executable file “uxplay” to
-/usr/local/bin, (and installs a manpage to somewhere
-standard like /usr/local/share/man/man1 and README files to
-somewhere like /usr/local/share/doc/uxplay). (If “man
-uxplay” fails, check if $MANPATH is set: if so, the path to the manpage
-(usually /usr/local/share/man/) needs to be added to $MANPATH .) The
-uxplay executable can also be found in the build directory after the
-build process, if you wish to test before installing (in which case the
-GStreamer plugins must first be installed).
-Building on non-Debian
-Linux and *BSD
-**For those with RPM-based distributions, a RPM spec file uxplay.spec
-is also available: see Building an installable rpm
-package.
-
-Red Hat, or clones like CentOS (now continued as Rocky
-Linux or Alma Linux): (sudo dnf install, or sudo yum install)
-openssl-devel libplist-devel avahi-compat-libdns_sd-devel
-gstreamer1-devel gstreamer1-plugins-base-devel (+libX11-devel for
-fullscreen X11) (some of these may be in the “CodeReady” add-on
-repository, called “PowerTools” by clones)
-Mageia, PCLinuxOS, OpenMandriva: Same as Red
-Hat, except for name changes: (Mageia) “gstreamer1.0-devel”,
-“gstreamer-plugins-base1.0-devel”; (OpenMandriva) “libopenssl-devel”,
-“gstreamer-devel”, “libgst-plugins-base1.0-devel”. PCLinuxOS: same as
-Mageia, but uses synaptic (or apt) as its package manager.
-openSUSE: (sudo zypper install)
-libopenssl-3-devel (formerly libopenssl-devel) libplist-2_0-devel
-(formerly libplist-devel) avahi-compat-mDNSResponder-devel
-gstreamer-devel gstreamer-plugins-base-devel (+ libX11-devel for
-fullscreen X11).
-Arch Linux (Also available as a package in
-AUR): (sudo pacman -Syu) openssl libplist avahi
-gst-plugins-base.
-FreeBSD: (sudo pkg install) libplist gstreamer1.
-Either avahi-libdns or mDNSResponder must also be installed to provide
-the dns_sd library. OpenSSL is already installed as a System
-Library.
-OpenBSD: (doas pkg_add) libplist
-gstreamer1-plugins-base. avahi-libs must also be installed to provide
-the dns_sd library; (avahi-main must also be installed). OpenSSL is
-already installed as a System Library.
-
-Building an installable
-RPM package
-First-time RPM builders should first install the rpm-build and
-rpmdevtools packages, then create the rpmbuild tree with
-“rpmdev-setuptree”. Then download and copy uxplay.spec into
-~/rpmbuild/SPECS. In that directory, run
-“rpmdev-spectool -g -R uxplay.spec” to download the
-corresponding source file uxplay-*.tar.gz into
-~/rpmbuild/SOURCES (“rpmdev-spectool” may also be just
-called “spectool”); then run “rpmbuild -ba uxplay.spec”
-(you will need to install any required dependencies this reports). This
-should create the uxplay RPM package in a subdirectory of
-~/rpmbuild/RPMS. (uxplay.spec is tested on
-Fedora 38, Rocky Linux 9.2, openSUSE Leap 15.5, Mageia 9, OpenMandriva,
-PCLinuxOS; it can be easily modified to include dependency lists for
-other RPM-based distributions.)
-Running UxPlay
-Installing
-plugins (Debian-based Linux distributions, including Ubuntu and
-Raspberry Pi OS) (skip if you built a complete GStreamer from
-source)
-Next install the GStreamer plugins that are needed with
-sudo apt install gstreamer1.0-<plugin>. Values of
-<plugin> required are:
-
-- “plugins-base”
-- “libav” (for sound),
-- “plugins-good” (for v4l2 hardware h264
-decoding)
-- “plugins-bad” (for h264 decoding).
-
-Debian-based distributions split some of the plugin packages
-into smaller pieces: some that may also be needed include
-“gl” for OpenGL support (this provides the “-vs
-glimagesink” videosink, which can be very useful in many systems
-(including Raspberry Pi), and should always be used when using h264/h265
-decoding by a NVIDIA GPU), “gtk3” (which provides the
-“-vs gtksink” videosink), and “x” for X11 support,
-although these may already be installed. If sound is not working,
-“alsa”“,”pulseaudio”, or
-“pipewire” plugins may need to be installed, depending
-on how your audio is set up.
-
-A package “vaapi” is available for
-hardware-accelerated h264 video decoding by Intel or AMD graphics (but
-not for use with NVIDIA using proprietary drivers). However this package
-contains older drivers (vaapisink, vaapih264dec, etc) that are no longer
-developed, and should not be installed unless these
-needed. The “va” plugins (vah264dec, etc.) that replace the
-“vaapi” plugins are provided in “plugins-bad”: and use
-standard videosinks (xvimagesink, glimagesink, etc.) instead of the
-special videosink “vaapisink” used by “vaapi” plugins.
-Also install “gstreamer1.0-tools” to get the
-utility gst-inspect-1.0 for examining the GStreamer
-installation.
-
-Installing
-plugins (Non-Debian-based Linux or *BSD) (skip if you built a
-complete GStreamer from source)
-In some cases, because of patent issues, the libav plugin feature
-avdec_aac needed for decoding AAC audio in mirror mode
-is not provided in the official distribution: get it from community
-repositories for those distributions. _Note: the (deprecated) “vaapi”
-packages listed below are no longer recommended: newer “va” versions of
-the VA-API plugins for Intel/AMD graphics are provided by
-*-plugins-bad._
-
-Red Hat, or clones like CentOS (now continued as Rocky
-Linux or Alma Linux): Install gstreamer1-libav
-gstreamer1-plugins-bad-free (deprecated: gstreamer1-vaapi for
-Intel/AMD graphics). In recent Fedora, gstreamer1-libav is renamed
-gstreamer1-plugin-libav. To get avdec_aac, install packages from
-rpmfusion.org: (get
-ffmpeg-libs from rpmfusion; on RHEL or clones, but not recent Fedora,
-also get gstreamer1-libav from there).
-Mageia, PCLinuxOS, OpenMandriva: Install
-gstreamer1.0-libav gstreamer1.0-plugins-bad (deprecated:
-gstreamer1.0-vaapi for Intel/AMD graphics). On Mageia, to get
-avdec_aac, install ffmpeg from the “tainted” repository, (which
-also provides a more complete gstreamer1.0-plugins-bad).
-openSUSE: Install gstreamer-plugins-libav
-gstreamer-plugins-bad (deprecated: gstreamer-plugins-vaapi for
-Intel/AMD graphics). To get avdec_aac, install libav* packages
-for openSUSE from Packman
-“Essentials”; recommendation: after adding the Packman
-repository, use the option in YaST Software management to switch all
-system packages for multimedia to Packman).
-Arch Linux Install gst-plugins-good
-gst-plugins-bad gst-libav (deprecated: gstreamer-vaapi for
-Intel/AMD graphics).
-FreeBSD: Install gstreamer1-libav,
-gstreamer1-plugins, gstreamer1-plugins-* (* = core, good, bad, x, gtk,
-gl, vulkan, pulse, v4l2, …), (deprecated: gstreamer1-vaapi for
-Intel/AMD graphics).
-OpenBSD: Install gstreamer1-libav,
-gstreamer-plugins-* (* = core, bad, base, good).
-
-Starting and running UxPlay
-Since UxPlay-1.64, UxPlay can be started with options read from a
-configuration file, which will be the first found of (1) a file with a
-path given by environment variable $UXPLAYRC, (2)
-~/.uxplayrc in the user’s home directory (“~”), (3)
-~/.config/uxplayrc. The format is one option per line,
-omitting the initial "-" of the command-line option. Lines
-in the configuration file beginning with "#" are treated as
-comments and ignored.
-Run uxplay in a terminal window. On some systems,
-you can specify fullscreen mode with the -fs option, or
-toggle into and out of fullscreen mode with F11 or (held-down left
-Alt)+Enter keys. Use Ctrl-C (or close the window) to terminate it when
-done.
-If the UxPlay server is not seen by the iOS client’s drop-down
-“Screen Mirroring” panel, check that your DNS-SD server (usually
-avahi-daemon) is running: do this in a terminal window with
-systemctl status avahi-daemon. If this shows the
-avahi-daemon is not running, control it with
-sudo systemctl [start,stop,enable,disable] avahi-daemon (on
-non-systemd systems, such as *BSD, use
-sudo service avahi-daemon [status, start, stop, restart, ...]).
-If UxPlay is seen, but the client fails to connect when it is selected,
-there may be a firewall on the server that prevents UxPlay from
-receiving client connection requests unless some network ports are
-opened: if a firewall is active, also open UDP port 5353 (for
-mDNS queries) needed by Avahi. See Troubleshooting below for help with this or
-other problems.
-Note that there is now an alternative Service Discovery method using
-a Bluetooth LE beacon. See the instructions on Bluetooth beacon setup.
-
-Unlike an Apple TV, the UxPlay server does not by default require
-clients to initially “pair” with it using a pin code displayed by the
-server (after which the client “trusts” the server, and does not need to
-repeat this). Since v1.67, Uxplay offers such “pin-authentication” as an
-option: see “-pin” and “-reg” in Usage for details, if you wish to use it. Some
-clients with MDM (Mobile Device Management, often present on
-employer-owned devices) are required to use pin-authentication: UxPlay
-will provide this even when running without the pin option.
-Password authentication (-pw pwd) is also offered as an
-alternative solution to pin codes: users need to know the password
-pwd and enter it on their iOS/macOS device to access UxPlay,
-when prompted (if pwd is not set, a displayed random pin code
-must be entered at each new connection.)
-By default, UxPlay is locked to its current client until that
-client drops the connection; since UxPlay-1.58, the option
--nohold modifies this behavior so that when a new client
-requests a connection, it removes the current client and takes over.
-UxPlay 1.66 introduces a mechanism ( -restrict,
--allow <id>, -block <id>) to
-control which clients are allowed to connect, using their “deviceID”
-(which in Apple devices appears to be immutable).
-In Mirror mode, GStreamer has a choice of two
-methods to play video with its accompanying audio: prior to UxPlay-1.64,
-the video and audio streams were both played as soon as possible after
-they arrived (the GStreamer “sync=false” method), with a
-GStreamer internal clock used to try to keep them synchronized.
-Starting with UxPlay-1.64, the other method (GStreamer’s
-“sync=true” mode), which uses timestamps in the audio and video
-streams sent by the client, is the new default. On
-low-decoding-power UxPlay hosts (such as Raspberry Pi Zero W or 3 B+
-models) this will drop video frames that cannot be decoded in time to
-play with the audio, making the video jerky, but still
-synchronized.
-
-The older method which does not drop late video frames worked well on
-more powerful systems, and is still available with the UxPlay option
-“-vsync no”; this method is adapted to “live streaming”,
-and may be better when using UxPlay as a second monitor for a Mac
-computer, for example, while the new default timestamp-based method is
-best for watching a video, to keep lip movements and voices
-synchronized. (Without use of timestamps, video will eventually lag
-behind audio if it cannot be decoded fast enough: hardware-accelerated
-video-decoding helped to prevent this previously when timestamps were
-not being used.)
-
-- In Audio-only mode the GStreamer “sync=false” mode (not using
-timestamps) is still the default, but if you want to keep the audio
-playing on the server synchronized with the video showing on the client,
-use the
-async timestamp-based option. (An example might be
-if you want to follow the Apple Music lyrics on the client while
-listening to superior sound on the UxPlay server). This delays the video
-on the client to match audio on the server, so leads to a slight delay
-before a pause or track-change initiated on the client takes effect on
-the audio played by the server.
-
-AirPlay volume-control attenuates volume (gain) by up to -30dB: the
-decibel range -30:0 can be rescaled from Low:0, or
-Low:High, using the option -db (“-db
-Low” or “-db Low:High”), Low must be
-negative. Rescaling is linear in decibels. Note that GStreamer’s audio
-format will “clip” any audio gain above +20db, so keep High
-below that level. The option -taper provides a “tapered”
-AirPlay volume-control profile some users may prefer.
-The -vsync and -async options also allow an optional positive (or
-negative) audio-delay adjustment in milliseconds for
-fine-tuning : -vsync 20.5 delays audio relative to video by
-0.0205 secs; a negative value advances it.)
-
-you may find video is improved by the setting -fps 60 that allows
-some video to be played at 60 frames per second. (You can see what
-framerate is actually streaming by using -vs fpsdisplaysink, and/or
--FPSdata.) When using this, you should use the default timestamp-based
-synchronization option -vsync.
-You can now display (inside UxPlay) the accompanying “Cover Art”
-from sources like Apple Music in Audio-Only (ALAC) mode with the option
-uxplay -ca. The older method of exporting cover art to
-an external viewer remains available: run
-“uxplay -ca <name> &” in the background, then run
-a image viewer with an autoreload feature: an example is “feh”: run
-“feh -R 1 <name>” in the foreground; terminate feh
-and then Uxplay with “ctrl-C fg ctrl-C”.
-
-By default, GStreamer uses an algorithm to search for the best
-“videosink” (GStreamer’s term for a graphics driver to display images)
-to use. You can overide this with the uxplay option
--vs <videosink>. Which videosinks are available
-depends on your operating system and graphics hardware: use
-“gst-inspect-1.0 | grep sink | grep -e video -e Video -e image”
-to see what is available. Some possibilites on Linux/*BSD are:
-
-glimagesink (OpenGL),
-waylandsink
-xvimagesink, ximagesink
-(X11)
-kmssink, fbdevsink (console
-graphics without X11)
-vaapisink (deprecated,for Intel/AMD
-hardware-accelerated graphics) is obsolete: instead use
-glimagesink or xvmagesink (with
-hardware decoding by “vah264dec`, which may get selected automatically,
-but can be explicitly specified with the”-vd ” option.)
-for NVIDIA hardware graphics (with CUDA) use
-glimagesink combined with
-“-vd nvh264dec”.
-If the server is “headless” (no attached monitor, renders audio
-only) use -vs 0.
-
-Note that videosink options can set using quoted arguments to -vs:
-e.g., -vs "xvimagesink display=:0": ximagesink and
-xvimagesink allow an X11 display name to be specified, and waylandsink
-has a similar option. Videosink options (“properties”) can be found in
-their GStreamer description pages,such as
-https://gstreamer.freedesktop.org/documentation/xvimagesink .
-GStreamer also searches for the best “audiosink”; override its choice
-with -as <audiosink>. Choices on Linux include
-pulsesink, alsasink, pipewiresink, oss4sink; see what is available with
-gst-inspect-1.0 | grep sink | grep -e audio -e Audio.
-One common problem involves GStreamer attempting to use
-incorrectly-configured or absent accelerated hardware h264 video
-decoding (e.g., VAAPI). Try “uxplay -avdec” to force
-software video decoding; if this works you can then try to fix
-accelerated hardware video decoding if you need it, or just uninstall
-the GStreamer vaapi plugin if it is installed .
-See Usage for more run-time options.
-Special
-instructions for Raspberry Pi (tested on Raspberry Pi Zero 2 W, 3 Model
-B+, 4 Model B, and 5 only):
-
-For Framebuffer video (for Raspberry Pi OS “Lite” and other
-non-X11 distributions) use the KMS videosink “-vs kmssink” (the DirectFB
-framebuffer videosink “dfbvideosink” is broken on the Pi, and
-segfaults). In this case you should explicitly use the “-vs kmssink”
-option, as without it, autovideosink does not find the correct
-videosink.
-Raspberry Pi 5 does not provide hardware H264 decoding (and does
-not need it).
-Pi Zero 2 W, 3 Model B+ and 4 Model B should use hardware H264
-decoding by the Broadcom GPU, but it requires an out-of-mainstream
-kernel module bcm2835_codec maintained in the Raspberry Pi kernel
-tree; distributions that are known to supply it include Raspberry Pi
-OS, Ubuntu, and Manjaro-RPi4. Use software decoding (option -avdec) if
-this module is not available.
-Uxplay uses the Video4Linux2 (v4l2) plugin from GStreamer-1.22
-and later to access the GPU, if hardware H264 decoding is used. This
-should happen automatically. The option -v4l2 can be used, but it is
-usually best to just let GStreamer find the best video pipeline by
-itself.
-On older distributions (GStreamer < 1.22), the v4l2 plugin
-needs a patch: see the UxPlay
-Wiki. Legacy Raspberry Pi OS (Bullseye) has a partially-patched
-GStreamer-1.18.4 which needs the uxplay option -bt709 (and don’t use
--v4l2); it is still better to apply the full patch from the UxPlay Wiki
-in this case.
-It appears that when hardware h264 video decoding is
-used, the option -bt709 became needed again in GStreamer-1.22 and
-later.
-For “double-legacy” Raspberry Pi OS (Buster), there is no patch
-for GStreamer-1.14. Instead, first build a complete newer
-GStreamer-1.18.6 from source using these
-instructions before building UxPlay.
-Raspberry Pi 3 Model B+ running a 32 bit OS can also access the
-GPU with the GStreamer OMX plugin (use option
-“-vd omxh264dec”), but this is broken by Pi 4 Model B
-firmware. OMX support was removed from Raspberry Pi OS (Bullseye), but
-is present in Buster.
-H265 (4K) video is potentially supported by
-hardware decoding on Raspberry Pi 5 models, as well as on Raspberry Pi 4
-model B, using a dedicated HEVC decoding block, but the “rpivid” kernel
-driver for this is not yet supported by GStreamer (this driver decodes
-video into a non-standard format that cannot be supported by GStreamer
-until the driver is in the mainline Linux kernel). Raspberry Pi provides
-a version of ffmpeg that can use that format, but at present UxPlay
-cannot use this. The best solution would be for the driver to be
-“upstreamed” to the kernel, allowing GStreamer support. (Software HEVC
-decoding works, but does not seem to give satisfactory results on the
-Pi).
-
-Even with GPU video decoding, some frames may be dropped by the
-lower-power models to keep audio and video synchronized using
-timestamps. In Legacy Raspberry Pi OS (Bullseye), raspi-config
-“Performance Options” allows specifying how much memory to allocate to
-the GPU, but this setting appears to be absent in Bookworm (but it can
-still be set to e.g. 128MB by adding a line “gpu_mem=128” in
-/boot/config.txt). A Pi Zero 2 W (which has 512MB memory) worked well
-when tested in 32 bit Bullseye or Bookworm Lite with 128MB allocated to
-the GPU (default seems to be 64MB).
-The basic uxplay options for R Pi are
-uxplay [-vs <videosink>]. The choice
-<videosink> = glimagesink is sometimes
-useful. With the Wayland video compositor, use
-<videosink> = waylandsink. With
-framebuffer video, use <videosink> =
-kmssink.
-
-- Tip: to start UxPlay on a remote host (such as a Raspberry Pi) using
-ssh:
-
-ssh user@remote_host
- export DISPLAY=:0
- nohup uxplay [options] > FILE &
-Sound and video will play on the remote host; “nohup” will keep
-uxplay running if the ssh session is closed. Terminal output is saved to
-FILE (which can be /dev/null to discard it)
-Building
-UxPlay on macOS: (Intel X86_64 and “Apple Silicon” M1/M2
-Macs)
-Note: A native AirPlay Server feature is included in macOS since
-macOS 12 Monterey, but is restricted to recent hardware. As well as
-running on latest macOS, UxPlay can run on older macOS systems that will
-cannot run Monterey, or can run Monterey but not AirPlay.
-These instructions for macOS assume that the Xcode command-line
-developer tools are installed (if Xcode is installed, open the Terminal,
-type “sudo xcode-select –install” and accept the conditions).
-It is also assumed that CMake >= 3.13 is installed: this can be
-done with package managers MacPorts
-(sudo port install cmake), Homebrew (brew install cmake), or
-by a download from https://cmake.org/download/. Also install
-git if you will use it to fetch UxPlay.
-Next install libplist and openssl-3.x. Note that static versions of
-these libraries will be used in the macOS builds, so they can be
-uninstalled after building uxplay, if you wish.
-
-Otherwise, build libplist and openssl from source: see instructions
-near the end of this README; requires development tools (autoconf,
-automake, libtool, etc.) to be installed.
-Next get the latest macOS release of GStreamer-1.0.
-Using “Official” GStreamer (Recommended for both MacPorts and
-Homebrew users): install the GStreamer release for macOS from
-https://gstreamer.freedesktop.org/download/. (This
-release contains its own pkg-config, so you don’t have to install one.)
-Install both the gstreamer-1.0 and gstreamer-1.0-devel packages. After
-downloading, Shift-Click on them to install (they install to
-/Library/FrameWorks/GStreamer.framework). Homebrew or MacPorts users
-should not install (or should uninstall) the GStreamer
-supplied by their package manager, if they use the “official”
-release.
-
-- Since GStreamer v1.22, the “Official” (gstreamer.freedesktop.org)
-macOS binaries require a wrapper “gst_macos_main” around the actual main
-program (uxplay). This should have been applied during the UxPlay
-compilation process, and the initial UxPlay terminal message should
-confirm it is being used. (UxPlay can also be built using “Official”
-GStreamer v.1.20.7 binaries, which work without the wrapper.)
-
-Using Homebrew’s GStreamer: pkg-config is needed:
-(“brew install pkg-config gstreamer”). This causes a large number of
-extra packages to be installed by Homebrew as dependencies. The Homebrew
-gstreamer installation has recently been reworked into a single
-“formula” named gstreamer, which now works without needing
-GST_PLUGIN_PATH to be set in the enviroment. Homebrew installs gstreamer
-to HOMEBREW_PREFIX/lib/gstreamer-1.0 where by default
-HOMEBREW_PREFIX/* is /opt/homebrew/* on Apple
-Silicon Macs, and /usr/local/* on Intel Macs; do not put
-any extra non-Homebrew plugins (that you build yourself) there, and
-instead set GST_PLUGIN_PATH to point to their location (Homebrew does
-not supply a complete GStreamer, but seems to have everything needed for
-UxPlay). New: the UxPlay build script will now also detect
-Homebrew installations in non-standard locations indicated by the
-environment variable $HOMEBREW_PREFIX.
-Using GStreamer installed from MacPorts: MacPorts is
-now providing recent GStreamer releases: install pkgconf (“sudo port
-install pkgconf”), then “sudo port install gstreamer1
-gstreamer1-gst-plugins-base gstreamer1-gst-plugins-good
-gstreamer1-gst-plugins-bad gstreamer1-gst-libav”. (The following may no
-longer be relevant: For X11 support on macOS, compile UxPlay using a
-special cmake option -DUSE_X11=ON, and run it from an
-XQuartz terminal with -vs ximagesink; older non-retina macs require a
-lower resolution when using X11:
-uxplay -s 800x600.)
-After installing GStreamer, build and install uxplay: open a terminal
-and change into the UxPlay source directory (“UxPlay-master” for zipfile
-downloads, “UxPlay” for “git clone” downloads) and build/install with
-“cmake . ; make ; sudo make install” (same as for Linux).
-
-Running UxPlay while checking for GStreamer warnings (do this
-with “export GST_DEBUG=2” before runnng UxPlay) reveals that with the
-default (since UxPlay 1.64) use of timestamps for video synchonization,
-many video frames are being dropped (only on macOS), perhaps due to
-another error (about videometa) that shows up in the GStreamer warnings.
-Recommendation: use the UxPlay “no timestamp” option
-“-vsync no” (you can add a line “vsync no” in the
-uxplayrc configuration file).
-On macOS with this installation of GStreamer, the only videosinks
-available are glimagesink (default choice made by autovideosink) and
-osxvideosink. The window title does not show the Airplay server name,
-but the window can be shared on Zoom. Because of issues with
-glimagesink, you may find osxvideosink works better. The only available
-audiosink is osxaudiosink.
-The option -nc is currently used by default on macOS, This is a
-workaround for window-closing problems with GStreamer videosinks on
-macOS. This option can be canceled with “-nc no”, if not
-needed.
-In the case of glimagesink, the resolution settings “-s wxh” may
-not affect the (small) initial OpenGL mirror window size, but the window
-can be expanded using the mouse or trackpad.
-
-Building
-UxPlay on Microsoft Windows, using MSYS2 with the MinGW-64
-compiler.
-
-- tested on Windows 10 and 11, 64-bit.
-
-
-- Download and install Bonjour SDK for Windows v3.0.
-You can download the SDK without any registration at softpedia.com,
-or get it from the official Apple site https://developer.apple.com/download
-(Apple makes you register as a developer to access it from their site).
-This should install the Bonjour SDK as
-
C:\Program Files\Bonjour SDK.
-
-
-- NEW: while you still need to install the Bonjour SDK to
-build UxPlay, there is now an alternative method for Service Discovery
-using a Bluetooth Low Energy (BLE) beacon. A Windows-based python script
-for running the beacon is available for this. See instructions below.
-
-
-(This is for 64-bit Windows; a build for 32-bit Windows should be
-possible, but is not tested.) The unix-like MSYS2 build environment will
-be used: download and install MSYS2 from the official site https://www.msys2.org/. Accept the
-default installation location C:\mysys64.
-MSYS2 packages
-are installed with a variant of the “pacman” package manager used by
-Arch Linux. Open a “MSYS2” terminal from the MSYS2 tab in the Windows
-Start menu, and update the new MSYS2 installation with “pacman
--Syu”.
-
-- _NEW: MSYS2 now recommends using the newer UCRT64 terminal
-environment (which uses the newer Microsoft UCRT “Universal C RunTime
-Library”, included as part of the Windows OS since Windows 10) rather
-than the MINGW64 terminal environment (which uses the older Microsoft
-MSVCRT C library, which has “legacy” status, but is available on all
-Windows systems). If you wish to use the legacy MSVCRT library, to
-support older Windows versions, modify the instructions below as
-follows:
-
-
-- change the MSYS2 terminal type from UCRT64 to MINGW64; (2) modify
-mingw-w64-ucrt-x86_64-* package names to mingw-w64-x86_64-*, (just omit
-“-ucrt”);
-- replace
ucrt64 by mingw64 in directory
-names._
-
-Open a new MSYS2 UCRT64 terminal, and install the gcc compiler and
-cmake:
-pacman -S mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-gcc
-We will simply build UxPlay from the command line in the MSYS2
-environment (using “ninja” in place of “make”
-for the build system).
-Download the latest UxPlay from github (to use
-git, install it with pacman -S git, then
-“git clone https://github.com/FDH2/UxPlay”), then
-install UxPlay dependencies (openssl is already installed with
-MSYS2):
-`pacman -S mingw-w64-ucrt-x86_64-libplist mingw-w64-ucrt-x86_64-gstreamer mingw-w64-ucrt-x86_64-gst-plugins-base`
-If you are trying a different Windows build system, MSVC versions of
-GStreamer for Windows are available from the official GStreamer
-site, but only the MinGW 64-bit build on MSYS2 has been
-tested.
-cd to the UxPlay source directory, then
-“mkdir build” and “cd build”. The build
-process assumes that the Bonjour SDK is installed at
-C:\Program Files\Bonjour SDK. If it is somewhere else, set
-the enviroment variable BONJOUR_SDK_HOME to point to its location. Then
-build UxPlay with
-cmake ..
-ninja
-Assuming no error in either of these, you will have built the
-uxplay executable uxplay.exe in the current (“build”)
-directory. The “sudo make install” and “sudo make uninstall” features
-offered in the other builds are not available on Windows; instead, you
-can install the uxplay.exe executable in
-C:/msys64/ucrt64/bin (plus manpage and documentation in
-C:/msys64/ucrt64/share/...) with
-cmake --install . --prefix $HOME/../../ucrt64
-You can later uninstall uxplay by returning to the build directory
-and running
-ninja uninstall
-(This assumes that certain files in the build directory were not
-deleted since building UxPlay).
-To be able to view the manpage, you need to install the manpage
-viewer with “pacman -S man”.
-
-To run uxplay.exe you need to install some gstreamer
-plugin packages with
-pacman -S mingw-w64-ucrt-x86_64-gst-<plugin>, where
-the required ones have <plugin> given by
-
-- libav
-- plugins-good
-- plugins-bad
-
-Other possible MSYS2 gstreamer plugin packages you might use are
-listed in MSYS2
-packages.
-You also will need to grant permission to the uxplay executable
-uxplay.exe to access data through the Windows firewall. You may
-automatically be offered the choice to do this when you first run
-uxplay, or you may need to do it using Windows
-Settings->Update and Security->Windows Security->Firewall &
-network protection -> allow an app through firewall. If your
-virus protection flags uxplay.exe as “suspicious” (but without a true
-malware signature) you may need to give it an exception.
-Now test by running “uxplay” (in a MSYS2 UCRT64 terminal
-window. If you need to specify the audiosink, there are two main choices
-on Windows: the older DirectSound plugin
-“-as directsoundsink”, and the more modern Windows Audio
-Session API (wasapi) plugin “-as wasapisink”, which
-supports additional
-options such as
-uxplay -as 'wasapisink device=\"<guid>\"'
-where <guid> specifies an available audio device
-by its GUID, which can be found using
-“gst-device-monitor-1.0 Audio”: <guid>
-has a form like
-\{0.0.0.00000000\}.\{98e35b2b-8eba-412e-b840-fd2c2492cf44\}.
-If “device” is not specified, the default audio device is
-used.
-If you wish to specify the videosink using the
--vs <videosink> option, some choices for
-<videosink> are d3d12videosink,
-d3d11videosink, d3dvideosink,
-glimagesink, gtksink,
-autovideosink. There have been reports of segfaults of
-the newer d3d12 videodecoder on certain older Nvidia cards when the
-image resolution changes, e.g., when the iOS client is rotated between
-portrait and landcape modes: this was a GStreamer issue that is
-apparently now fixed (a workaround is to use d3d11).
-
-- On Windows, with Direct3D 11.0 or greater, various options can be
-set using e.g.
-vs "d3d11videosink <options>" (see
-the gstreamer videosink documentation for these videosinks). For
-convenience, if no <options> are set, the option to
-toggle in and out of fullscreen mode with the Alt-Enter key combination
-is added. It is recommended that Windows users add a line
--vs d3d12videosink in their UxPlay startup file, to get
-this toggle option (autovideosink will usually select d3d12videosink,
-but will not provide the toggle option).
-
-The executable uxplay.exe can also be run without the MSYS2
-environment, in the Windows Terminal, with
-C:\msys64\ucrt64\bin\uxplay.
-There is a new modernized Windows Terminal application available from
-Microsoft that provides various terminals, and can be customized to also
-provide the MSYS2 terminals. See https://www.msys2.org/docs/terminals/
-(to make those instructions clearer: in the dropdown “Settings” menu,
-there is a second “settings” icon in the lower left corner: click on
-that to edit the settings.json file as described).
-The server name (-n option) can be given in internationalized
-UTF-8 encoding: To enter UTF-8 characters in the MSYS2 or other Windows
-terminals, use the numerical keypad with “Num Lock” on: while holding
-down the “Alt” key, type “+” on the keypad, followed by the UTF-8 hex
-code for the character (using the keypad for numbers), then release the
-“Alt” key. (The UTF-8 hex codes have 4 hex digits: for example, the
-“copyright” symbol has hex code 00a9.) This method must be activated
-in the Windows Registry: using regedit, find the Registry section
-’HKEY_Current_User/Control Panel/Input Method”, and add a new Key
-“EnableHexNumpad” with value “1”, then reboot the computer.
-Usage
-Options:
-
-- These can also be written (one option per line, without the initial
-“
-” character) in the UxPlay startup file (either given by
-environment variable $UXPLAYRC, or ~/.uxplayrc
-or ~/.config/uxplayrc); lines begining with
-“#” are treated as comments, and ignored. Command line
-options supersede options in the startup file.
-
--rc file can also be used to specify the
-startup file location: this overrides $UXPLAYRC,
-~/.uxplayrc, etc.
--n server_name (Default: UxPlay);
-server_name@_hostname_ will be the name that appears offering AirPlay
-services to your iPad, iPhone etc, where hostname is the name
-of the server running uxplay. This will also now be the name shown above
-the mirror display (X11) window. Internationalized server names
-encoded as UTF-8 are accepted.
--nh Do not append “@_hostname_” at the end of the AirPlay
-server name.
--h265 Activate “ScreenMultiCodec” support (AirPlay
-“Features” bit 42) for accepting h265 (4K/HEVC) video in addition to
-h264 video (1080p) in screen-mirror mode. When this option is used, two
-“video pipelines” (one for h264, one for h265) are created. If any
-GStreamer plugins in the pipeline are specific for h264 or h265, the
-correct version will be used in each pipeline. A wired Client-Server
-ethernet connection is preferred over Wifi for 4K video, and might be
-required by the client. Only recent Apple devices (M1/M2 Macs or iPads,
-and some iPhones) can send h265 video if a resolution “-s wxh” with h
-> 1080 is requested. The “-h265” option changes the default
-resolution (“-s” option) from 1920x1080 to 3840x2160, and leaves default
-maximum framerate (“-fps” option) at 30fps.
--mp4 [fn] Record mirror-mode and audio-mode
-audio/video to a mp4 file, while watching/listening. File name is
-fn.n.(format).mp4, (default “fn” = “recording”). The number
-n = 1,2,… increments with each new connection. “format”
-(e.g. “H264.AAC”) indicates H264/H265 video, AAC/ALAC audio.
--hls [v] Activate HTTP Live Streaming support. With
-this option YouTube videos can be streamed directly from YouTube servers
-to UxPlay (without passing through the client) by clicking on the
-AirPlay icon in the YouTube app. Optional [v] (allowed values 2 or 3,
-default: 3) allows selection of the version of GStreamer’s "playbin"
-video player to use for playing HLS video. (Playbin v3 is the
-recommended player, but if some videos fail to play, you can try with
-version 2.)
--lang [list] Specify language preferences for
-YouTube app HLS videos, some of which now which offer a choice of
-language (based on AI dubbing). If this option is not used, preferences
-will be taken from environment variable $LANGUAGE, if set. Both methods
-specify the preference order by a list: e.g., fr:es:en, for
-French (first choice), Spanish (second choice), and English (third
-choice). If option -lang is not followed by a list (or
--list 0 is used), $LANGUAGE is ignored and undubbed audio
-is played.
--scrsv n. (since 1.73) (So far, only implemented on
-Linux/*BSD systems using D-Bus). Inhibit the screensaver in the absence
-of keyboard input (e.g., while watching video), using the
-org.freedesktop.ScreenSaver D-Bus service: n = 0: (off) n= 1 (on during
-video activity) n=2 (always on). Note: to verify this feature is
-working, you can use dbus-monitor to view events on the
-D-Bus; depending on the Desktop Environment, commands like
-gnome-session-inhibit -l,
-xfce4-screensaver-commannd -q, etc., should list UxPlay
-when it is inhibiting the screensaver.
--pin [nnnn]: (since v1.67) use Apple-style
-(one-time) “pin” authentication when a new client connects for the first
-time: a four-digit pin code is displayed on the terminal, and the client
-screen shows a login prompt for this to be entered. When “-pin” is used
-by itself, a new random pin code is chosen for each authentication; if
-“-pin nnnn” (e.g., “-pin 3939”) is used, this will set an unchanging
-fixed code. Authentication adds the server to the client’s list of
-“trusted servers” and the client will not need to reauthenticate
-provided that the client and server public keys remain unchanged. (By
-default since v1.68, the server public key is generated from the MAC
-address, which can be changed with the -m option; see the -key option
-for an alternative method of key generation). (Add a line “pin” in
-the UxPlay startup file if you wish the UxPlay server to use the pin
-authentication protocol).
--reg [filename]: (since v1.68). If “-pin”
-is used, this option maintains a register of pin-authenticated “trusted
-clients” in $HOME/.uxplay.register (or optionally, in
-filename). Without this option, returning clients that skip
-pin-authentication are trusted and not checked. This option may be
-useful if UxPlay is used in a more public environment, to record client
-details; the register is text, one line per client, with client’s public
-key (base-64 format), Device ID, and Device name; commenting out (with
-“#”) or deleting a line deregisters the corresponding client (see
-options -restrict, -block, -allow for more ways to control client
-access). (Add a line “reg” in the startup file if you wish to use
-this feature.)
--pw [pwd]. (since 1.72). As an alternative
-to -pin, client access can be controlled with a password. If a password
-pwd (of length at least six characters) is set when uxplay
-starts (usually set in the startup file, where it is stored as
-cleartext), all users must know this password to connect to UxPlay (the
-client prompts for it). This method uses HTTP md5 Digest authentication,
-which is now regarded as providing weak security, but it is only used to
-validate the uxplay password, and no user credentials are exposed. After
-a successful authentication, the client stores the password, and will
-use it initially for future authentications without prompting, so long
-as the UxPlay deviceID has not changed (this initial authentication will
-fail if the UxPlay password has changed). If pwd is
-not specified with the -pw option when UxPlay starts, a
-new random 4-digit pin code is generated and displayed on the UxPlay
-terminal for each new connection, and must be entered
-on the client (there are three chances to enter it, before it is
-changed). Note: -pin and -pw are alternatives: if both are specified
-at startup, the earlier of these two options is discarded.
--vsync [x] (In Mirror mode:) this option
-(now the default) uses timestamps to synchronize audio
-with video on the server, with an optional audio delay in (decimal)
-milliseconds (x = “20.5” means 0.0205 seconds delay: positive
-or negative delays less than a second are allowed.) It is needed on
-low-power systems such as Raspberry Pi without hardware video
-decoding.
--vsync no (In Mirror mode:) this switches off
-timestamp-based audio-video synchronization, restoring the default
-behavior prior to UxPlay-1.64. Standard desktop systems seem to work
-well without use of timestamps: this mode is appropriate for “live
-streaming” such as using UxPlay as a second monitor for a mac computer,
-or monitoring a webcam; with it, no video frames are dropped.
--async [x] (In Audio-Only (ALAC) mode:) this option
-uses timestamps to synchronize audio on the server with video on the
-client, with an optional audio delay in (decimal) milliseconds
-(x = “20.5” means 0.0205 seconds delay: positive or negative
-delays less than a second are allowed.) Because the client adds a video
-delay to account for latency, the server in -async mode adds an
-equivalent audio delay, which means that audio changes such as a pause
-or a track-change will not take effect immediately. This might in
-principle be mitigated by using the -al audio latency
-setting to change the latency (default 0.25 secs) that the server
-reports to the client, but at present changing this does not seem to
-have any effect.
--async no. This is the still the default behavior in
-Audio-only mode, but this option may be useful as a command-line option
-to switch off a -async option set in a “uxplayrc”
-configuration file.
--db low[:high] Rescales the
-AirPlay volume-control attenuation (gain) from -30dB:0dB to
-low:0dB or low:high. The lower limit
-low must be negative (attenuation); the upper limit
-high can be either sign. (GStreamer restricts
-volume-augmentation by high so that it cannot exceed +20dB).
-The rescaling is “flat”, so that for -db -50:10, a change in Airplay
-attenuation by -7dB is translated to a -7 x (60/30) = -14dB attenuation,
-and the maximum volume (AirPlay 0dB) is a 10dB augmentation, and Airplay
--30dB would become -50dB. Note that the minimum AirPlay value (-30dB
-exactly) is translated to “mute”.
--taper Provides a “tapered” Airplay volume-control
-profile (matching the one called “dasl-tapering” in shairport-sync):
-each time the length of the volume slider (or the number of steps above
-mute, where 16 steps = full volume) is reduced by 50%, the perceived
-volume is halved (a 10dB attenuation). (This is modified at low volumes,
-to use the “untapered” volume if it is louder.)
--vol v Sets initial audio-streaming volume
-(on client): range is [0:1], with 0.0 = mute, 1.0 = full volume
-(v is a decimal number).
--s wxh e.g. -s 1920x1080 (= “1080p”), the default
-width and height resolutions in pixels for h264 video. (The default
-becomes 3840x2160 (= “4K”) when the -h265 option is used.) This is just
-a request made to the AirPlay client, and perhaps will not be the final
-resolution you get. w and h are whole numbers with four digits or less.
-Note that the height pixel size is the controlling one
-used by the client for determining the streaming format; the width is
-dynamically adjusted to the shape of the image (portrait or landscape
-format, depending on how an iPad is held, for example).
--s wxh@r As above, but also informs the AirPlay
-client about the screen refresh rate of the display. Default is r=60 (60
-Hz); r must be a whole number less than 256.
--o turns on an “overscanned” option for the display
-window. This reduces the image resolution by using some of the pixels
-requested by option -s wxh (or their default values 1920x1080) by adding
-an empty boundary frame of unused pixels (which would be lost in a
-full-screen display that overscans, and is not displayed by gstreamer).
-Recommendation: don’t use this option unless there is
-some special reason to use it.
--fs uses fullscreen mode, but currently only works
-with X11, Wayland, vaapi, kms and D3D11 (Windows).
--p allows you to select the network ports used by
-UxPlay (these need to be opened if the server is behind a firewall). By
-itself, -p sets “legacy” ports TCP 7100, 7000, 7001, UDP 6000, 6001,
-7011. -p n (e.g. -p 35000) sets TCP and UDP ports n, n+1, n+2. -p
-n1,n2,n3 (comma-separated values) sets each port separately; -p n1,n2
-sets ports n1,n2,n2+1. -p tcp n or -p udp n sets just the TCP or UDP
-ports. Ports must be in the range [1024-65535].
-If the -p option is not used, the ports are chosen dynamically
-(randomly), which will not work if a firewall is running.
--avdec forces use of software h264 decoding using
-Gstreamer element avdec_h264 (libav h264 decoder). This option should
-prevent autovideosink choosing a hardware-accelerated videosink plugin
-such as vaapisink.
--vp parser choses the GStreamer pipeline’s
-h264 parser element, default is h264parse. Using quotes “…” allows
-options to be added.
--vd decoder chooses the GStreamer
-pipeline’s h264 decoder element, instead of the default value
-“decodebin” which chooses it for you. Software decoding is done by
-avdec_h264; various hardware decoders include: vah264dec (replacement
-for vaapih264dec), nvdec, nvh264dec, v4l2h264dec (these require that the
-appropriate hardware is available). Using quotes “…” allows some
-parameters to be included with the decoder name.
--vc converter chooses the GStreamer
-pipeline’s videoconverter element, instead of the default value
-“videoconvert”. When using Video4Linux2 hardware-decoding by a
-GPU,-vc v4l2convert will also use the GPU for video
-conversion. Using quotes “…” allows some parameters to be included with
-the converter name.
--vs videosink chooses the GStreamer
-videosink, instead of the default value “autovideosink” which chooses it
-for you. Some videosink choices are: ximagesink, xvimagesink, vaapisink
-(for intel graphics), gtksink, glimagesink, waylandsink, osxvideosink
-(for macOS), kmssink (for systems without X11, like Raspberry Pi OS
-lite) or fpsdisplaysink (which shows the streaming framerate in fps).
-Using quotes “…” allows some parameters to be included with the
-videosink name. For example, fullscreen mode is
-supported by the vaapisink plugin, and is obtained using
--vs "vaapisink fullscreen=true"; this also works with
-waylandsink. The syntax of such options is specific to a
-given plugin (see GStreamer documentation), and some choices of
-videosink might not work on your system. Note that vaapisink has
-been labeled “deprecated” (obsolete) and is no longer
-recommended.
--vs 0 suppresses display of streamed video. In
-mirror mode, the client’s screen is still mirrored at a reduced rate of
-1 frame per second, but is not rendered or displayed. This option should
-always be used if the server is “headless” (with no attached screen to
-display video), and only used to render audio, which will be AAC
-lossily-compressed audio in mirror mode with unrendered video, and
-superior-quality ALAC Apple Lossless audio in Airplay audio-only
-mode.
--vrtp pipeline: forward rtp packets of
-decrypted video to somewhere else, without rendering. Uses rtph264pay or
-rtph265pay as appropriate: pipeline should start with any
-rtph26xpay options (such as config_interval= or aggregate-mode =),
-followed by a sending method: e.g.,
-"config-interval=1 ! udpsink host=127.0.0.1 port=XXXX“. A
-gstreamer-based test receiver is
-gst-launch-1.0 -v \
-udpsrc port=XXXX \
-! 'application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96' \
-! rtph264depay ! h264parse ! decodebin ! videoconvert !
-autovideosink sync=false
-
-_(Replace XXXX by the port you will use: make sure it is not blocked by a firewall; replace "264" by "265" if you are
-streaming h265 video)._
-
-- To use the -vrtp option with with OBS-studio, install the obs-gstreamer plugin;
-after the plugin installation, the “+” icon in the OBS-studio “Sources”
-window will show an entry “GStreamer Source” where you should add the
-gstreamer decoder pipeline
-“
udpsrc port=XXXX ! application/x-rtp,media=video,encoding-name=H264,payload=96 ! rtph264depay ! decodebin ! videoconvert ! video.”.
-
--artp pipeline: forward decoded audio as
-L16 RTP packets (PCM format S16BE) to somewhere else, without rendering.
-Uses rtpL16pay (16-bit signed big-endian PCM, 44100Hz stereo):
-pipeline should start with any rtpL16pay options (such as
-pt=96), followed by a sending method: e.g.,
-"pt=96 ! udpsink host=127.0.0.1 port=5002". iOS volume
-control still works over RTP. A gstreamer-based test receiver that plays
-the stream is
-gst-launch-1.0 -v \
-udpsrc port=5002 \
-! application/x-rtp, media=audio, payload=96, clock-rate=44100, encoding-name=L16, format=S16BE, channels=2 \
-! rtpL16depay ! audioconvert !
-autoaudiosink sync=false
--v4l2 Video settings for hardware h264 video
-decoding in the GPU by Video4Linux2. Equivalent to
--vd v4l2h264dec -vc v4l2convert.
--bt709 A workaround for the failure of the older
-Video4Linux2 plugin to recognize Apple’s use of an uncommon (but
-permitted) “full-range color” variant of the bt709 color standard for
-digital TV. This was no longer needed by GStreamer-1.20.4 and backports
-from it, but appears to again be required in GStreamer-1.22 and
-later.
--srgb A workaround for a failure to display
-full-range 8-bit color [0-255], and instead restrict to limited range
-[16-235] “legal BT709” HDTV format. The workaround works on x86_64
-desktop systems, but does not yet work on Raspberry Pi. The issue may be
-fixed in a future GStreamer release: it only occurs in Linux and
-*BSD.
--srbg no. Disables the -srgb option, which is
-enabled by default in Linux and *BSD, but may be useless on Raspberry
-Pi, and may be unwanted, as it adds extra processing load.
--as audiosink chooses the GStreamer
-audiosink, instead of letting autoaudiosink pick it for you. Some
-audiosink choices are: pulsesink, alsasink, pipewiresink, osssink,
-oss4sink, jackaudiosink, osxaudiosink (for macOS), wasapisink,
-directsoundsink (for Windows). Using quotes “…” might allow some
-optional parameters (e.g. -as "alsasink device=..." to
-specify a non-default output device). The syntax of such options is
-specific to a given plugin (see GStreamer documentation), and some
-choices of audiosink might not work on your system.
--as 0 (or just -a) suppresses
-playing of streamed audio, but displays streamed video.
--al x specifies an audio latency x
-in (decimal) seconds in Audio-only (ALAC), that is reported to the
-client. Values in the range [0.0, 10.0] seconds are allowed, and will be
-converted to a whole number of microseconds. Default is 0.25 sec (250000
-usec). (However, the client appears to ignore this reported latency,
-so this option seems non-functional.)
--ca (without specifying a filename) now displays
-“cover art” that accompanies Apple Music when played in “Audio-only”
-(ALAC) mode.
--ca filename provides a file (where
-filename can include a full path) used for output of “cover
-art” (from Apple Music, etc.,) in audio-only ALAC mode. This
-file is overwritten with the latest cover art as it arrives. Cover art
-(jpeg format) is discarded if this option is not used. Use with a image
-viewer that reloads the image if it changes, or regularly (e.g.
-once per second.). To achieve this, run
-“uxplay -ca [path/to/]filename &” in the background,
-then run the the image viewer in the foreground. Example, using
-feh as the viewer: run
-“feh -R 1 [path/to/]filename” (in the same terminal window
-in which uxplay was put into the background). To quit, use
-ctrl-C fg ctrl-C to terminate the image viewer, bring
-uxplay into the foreground, and terminate it too.
--md filename Like the -ca option, but
-exports audio metadata text (Artist, Title, Genre, etc.) to file for
-possible display by a process that watches the file for changes.
-Previous text is overwritten as new metadata is received, and the file
-is deleted when uxplay terminates.
--reset n sets a limit of n consecutive
-failures of the client to send feedback requests (these “heartbeat
-signals” are sent by the client once per second to ask for a response
-showing that the server is still online). After n missing
-signals, the client will be presumed to be offline, and the connection
-will be reset to allow a new connection. The default value of n
-is 15 seconds; the value n = 0 means “no limit”.
--nofreeze closes the video window after a reset due
-to client going offline (default is to leave window open to allow a
-smoother reconection to the same client). This option may be useful in
-fullscreen mode.
--nc maintains previous UxPlay < 1.45 behavior
-that does not close the video window when the the
-client sends the “Stop Mirroring” signal. This option is currently
-used by default in macOS, as the window created in macOS by GStreamer
-does not terminate correctly (it causes a segfault) if it is still open
-when the GStreamer pipeline is closed.
--nohold Drops the current connection when a new
-client attempts to connect. Without this option, the current client
-maintains exclusive ownership of UxPlay until it disconnects.
--restrict Restrict clients allowed to connect to
-those specified by -allow <deviceID>. The deviceID
-has the form of a MAC address which is displayed by UxPlay when the
-client attempts to connect, and appears to be immutable. It has the
-format XX:XX:XX:XX:XX:XX, X = 0-9,A-F, and is possibly the
-“true” hardware MAC address of the device. Note that iOS clients
-generally expose different random “private Wi_Fi addresses” (“fake” MAC
-addresses) to different networks (for privacy reasons, to prevent
-tracking), which may change, and do not correpond to the deviceID.
--restrict no Remove restrictions (default). This is
-useful as a command-line argument to overide restrictions set in the
-Startup file.
--allow id Adds the deviceID = id
-to the list of allowed clients when client restrictions are being
-enforced. Usually this will be an entry in the uxplayrc startup
-file.
--block id Always block clients with
-deviceID = id, even when client restrictions are not being
-enforced generally. Usually this will be an entry in the uxplayrc
-startup file.
--FPSdata Turns on monitoring of regular reports
-about video streaming performance that are sent by the client. These
-will be displayed in the terminal window if this option is used. The
-data is updated by the client at 1 second intervals.
--fps n sets a maximum frame rate (in frames per
-second) for the AirPlay client to stream video; n must be a whole number
-less than 256. (The client may choose to serve video at any frame rate
-lower than this; default is 30 fps.) A setting of 60 fps may give you
-improved video but is not recommended on Raspberry Pi. A setting below
-30 fps might be useful to reduce latency if you are running more than
-one instance of uxplay at the same time. This setting is only an
-advisory to the client device, so setting a high value will not force a
-high framerate. (You can test using “-vs fpsdisplaysink” to see
-what framerate is being received, or use the option -FPSdata which
-displays video-stream performance data continuously sent by the client
-during video-streaming.)
--f {H|V|I} implements “videoflip” image transforms:
-H = horizontal flip (right-left flip, or mirror image); V = vertical
-flip ; I = 180 degree rotation or inversion (which is the combination of
-H with V).
--r {R|L} 90 degree Right (clockwise) or Left
-(counter-clockwise) rotations; these image transforms are carried out
-after any -f transforms.
--m [mac] changes the MAC address (Device ID) used by
-UxPlay (default is to use the true hardware MAC address reported by the
-host computer’s network card). (Different server_name, MAC addresses,
-and network ports are needed for each running uxplay if you attempt to
-run more than one instance of uxplay on the same computer.) If [mac] (in
-form xx:xx:xx:xx:xx:xx, 6 hex octets) is not given, a random MAC address
-is generated. If UxPlay fails to find the true MAC address of a network
-card, (more specifically, the MAC address used by the first active
-network interface detected) a random MAC address will be used even if
-option -m was not specified. (Note that a random MAC
-address will be different each time UxPlay is started).
--key [filename]: This (more secure) option
-for generating and storing a persistant public key (needed for the -pin
-option) has been replaced by default with a (less secure) method which
-generates a key from the server’s “device ID” (MAC address, which can be
-changed with the -m option, conveniently as a startup file option). When
-the -key option is used, a securely generated keypair is generated and
-stored in $HOME/.uxplay.pem, if that file does not exist,
-or read from it, if it exists. (Optionally, the key can be stored in
-filename.) This method is more secure than the new default
-method, (because the Device ID is broadcast in the DNS_SD announcement)
-but still leaves the private key exposed to anyone who can access the
-pem file. This option should be set in the UxPlay startup file as a line
-“key” or “key filename” (no initial “-”), where
-filename is a full path which should be enclosed in quotes
-("....") if it contains any blank spaces. Because
-the default method is simpler, and security of client access to uxplay
-is unlikely to be an important issue, the -key option is no longer
-recommended.
--dacp [filename]: Export current client
-DACP-ID and Active-Remote key to file: default is $HOME/.uxplay.dacp.
-(optionally can be changed to filename). Can be used by remote
-control applications. File is transient: only exists while client is
-connected.
--vdmp Dumps h264 video to file videodump.h264. -vdmp
-n dumps not more than n NAL units to videodump.x.h264; x= 1,2,…
-increases each time a SPS/PPS NAL unit arrives. To change the name
-videodump, use -vdmp [n] filename.
--admp Dumps audio to file audiodump.x.aac (AAC-ELD
-format audio), audiodump.x.alac (ALAC format audio) or audiodump.x.aud
-(other-format audio), where x = 1,2,3… increases each time the audio
-format changes. -admp n restricts the number of packets dumped
-to a file to n or less. To change the name audiodump,
-use -admp [n] filename. Note that (unlike dumped video) the
-dumped audio is currently only useful for debugging, as it is not
-containerized to make it playable with standard audio players.
--ble [filename]. Enable Bluetooth beacon
-Service Discovery. The port, PID and process name of the UxPlay process
-is recorded by default in ~/.uxplay.ble : (this file is
-created when UxPlay starts and deleted when it stops.) Optionally the
-file filename, which must be the full path to a writeable file
-can instead be used. See below for beacon setup
-instructions.
--d [n] Enable debug output; optional argument n=1
-suppresses audio/video packet data in debug output. Note: this does not
-show GStreamer error or debug messages. To see GStreamer error and
-warning messages, set the environment variable GST_DEBUG with “export
-GST_DEBUG=2” before running uxplay. To see GStreamer information
-messages, set GST_DEBUG=4; for DEBUG messages, GST_DEBUG=5; increase
-this to see even more of the GStreamer inner workings.
-Bluetooth LE beacon setup
-The python>=3.6 script for running a Bluetooth-LE Service
-Discovery beacon is uxplay-beacon.py. It comes in two versions, one (for
-Linux and *BSD) is only installed on systems which support DBUS, and
-another only for Windows 10/11. Bluetooth >= 4.0 hardware on the host
-computer is required: a cheap USB bluetooth dongle can be used.
-On Linux/*BSD, Bluetooth support (BlueZ) must be installed (on
-Debian-based systems: sudo apt install bluez bluez-tools;
-recent Ubuntu releases provide bluez as a snap package). In addition to
-standard Python3 libraries, you may need to install the gi, dbus, and
-psutil Python libraries used by uxplay-beacon.py. On Debian-based
-systems:
-sudo apt install python3-gi python3-dbus python3-psutil
-For Windows support on MSYS2 UCRT systems, use pacman -S to install
-mingw-w64-ucrt-x86_64-python,
-*-python-gobject, *-python-psutil, and
-*-python-pip. Then install winrt bindings:
-“pip install winrt-Windows.Foundation.Collections”, also
-winrt-Windows.Devices.Bluetooth.Advertisement and
-winrt-Windows.Storage.Streams.
-If uxplay will be run with option “uxplay -ble” (so it
-writes data for the Bluetooth beacon in the default BLE data file
-~/.uxplay.ble), just run uxplay-beacon.py in a
-separate terminal. The python script will start Bluetooth LE
-Service-Discovery advertising when it detects that UxPlay is running by
-checking if the BLE data file exists, and stop when it no longer detects
-a running UxPlay plus this file (it will restart advertising if UxPlay
-later reappears). The script will remain active until stopped with
-Ctrl+C in its terminal window (or its terminal window is closed).
-The beacon script can be more finely controlled using certain
-options: these can be given on the command line, or read from a
-configuration file ~/.uxplay.beacon, if it exists.
-Configuration file entries are like the command line forms, one per line
-(e.g., --ipv4 192.168.1.100). Lines commented out with an
-initial # are ignored. Command line options override the
-configuration file options. Get help with man uxplay-beacon
-or uxplay-beacon.py --help. Options are
-
---file <config file> read beacon options from
-<config file> instead of
-~/.uxplay.beacon.
---ipv4 <ipv4 address>. This option can be
-used to specify the ipv4 address at which the UxPlay server should be
-contacted by the client. If it is not given, an address will be obtained
-automatically (specify the address with the option if automatic
-selection fails). Only ipv4 addresses are supported.
---path <BLE data file>. This overrides the
-default choice of BLE data file (~/.uxplay.ble) that is
-monitored by the beacon script. This also requires that uxplay is run
-with option “uxplay -ble <BLE data file>”.
-
-The BlueZ/Dbus version has thee more options not offered by the
-Windows version (the Windows operating system chooses their values):
-
---AdvMin x, --AdvMax y. These controls
-the interval between BLE advertisement broadcasts. This interval is in
-the range [x, y], given in units of msecs. Allowed ranges are 100 <=
-x <= y <= 10240. If AdvMin=AdvMax, the interval is fixed: if
-AdvMin < AdvMax it is chosen flexibly in this range to avoid
-interfering with other tasks the Bluetooth device is carrying out. The
-default values are AdvMin = AdvMax = 100. The advertisement is broadcast
-on all three Bluetooth LE advertising channels: 37,38,39.
---index x (default x = 0, x >= 0). This can be
-used by the DBus to distinguish between multiple simultaneous instances
-of uxplay-beacon.py that are running to support multiple instances of
-UxPlay. Each instance must have its own BLE Data file (just as each
-instance of UxPlay must also have its own MAC address and ports).
-Note: running multiple beacons simultaneously on the same host has
-not been tested, and this option might not be useful or
-needed.
-
-If you wish to test Bluetooth LE Service Discovery on Linux/*BSD, you
-can disable DNS_SD Service discovery by the avahi-daemon with
-$ sudo systemctl mask avahi-daemon.socket
-$ sudo systemctl stop avahi-daemon
-To restore DNS_SD Service discovery, replace “mask” by “unmask”, and
-“stop” by “start”.
-On Windows, the Bonjour Service is controlled using Services
-Management: press “Windows + R” to open the Run dialog, run
-services.msc, and click on Bonjour Service
-in the alphabetic list. This will show links for it to be stopped and
-restarted.
-For more information, see the wiki
-page
-
-- Note that Bluetooth LE AirPlay Service Discovery only
-supports broadcast of IPv4 addresses.
-
-Troubleshooting
-Note: uxplay is run from a terminal command line, and
-informational messages are written to the terminal.
-0. Problems in compiling
-UxPlay.
-One user (on Ubuntu) found compilation failed with messages about
-linking to “usr/local/lib/libcrypto.a” and “zlib”. This was because (in
-addition to the standard ubuntu installation of libssl-dev), the user
-was unaware that a second installation with libcrypto in /usr/local was
-present. Solution: when more than one installation of OpenSSL is
-present, set the environment variable OPEN_SSL_ROOT_DIR to point to the
-correct one; on 64-bit Ubuntu, this is done by running
-export OPENSSL_ROOT_DIR=/usr/lib/X86_64-linux-gnu/ before
-running cmake.
-1. Avahi/DNS_SD
-Bonjour/Zeroconf issues
-The DNS_SD Service-Discovery (“Bonjour” or “Zeroconf”) service is
-required for UxPlay to work. On Linux, it will be usually provided by
-Avahi, and to troubleshoot this, you should use the tool
-avahi-browse. (You may need to install a separate package
-with a name like avahi-utils to get this.)
-On Linux, make sure Avahi is installed, and start the avahi-daemon
-service on the system running uxplay (your distribution will document
-how to do this, for example:
-sudo systemctl <cmd> avahi-daemon or
-sudo service avahi-daemon <cmd>, with
-<cmd> one of enable, disable, start, stop, status.
-You might need to edit the avahi-daemon.conf file (it is typically in
-/etc/avahi/, find it with
-“sudo find /etc -name avahi-daemon.conf”): make sure that
-“disable-publishing” is not a selected option). Some
-systems may instead use the mdnsd daemon as an alternative to provide
-DNS-SD service. (FreeBSD offers both alternatives, but only Avahi was
-tested; see here.)
-
-- uxplay starts, but either stalls or stops after “Initialized
-server socket(s)” appears (without the server name showing on the
-client).
-
-If UxPlay stops with the “No DNS-SD Server found” message, this means
-that your network does not have a running Bonjour/zeroconf
-DNS-SD server. Before v1.60, UxPlay used to stall silently if
-DNS-SD service registration failed, but now stops with an error message
-returned by the DNSServiceRegister function: kDNSServiceErr_Unknown if
-no DNS-SD server was found: (A NixOS user found that in NixOS, this
-error can also occur if avahi-daemon service IS running with publishing
-enabled, but reports “the error disappeared on NixOS by setting
-services.avahi.openFirewall to true”.) Other mDNS error codes are
-in the range FFFE FF00 (-65792) to FFFE FFFF (-65537), and are listed in
-the dnssd.h file. An older version of this (the one used by avahi) is
-found here.
-A few additional error codes are defined in a later version from Apple.
-If UxPlay stalls without an error message and without
-the server name showing on the client, this is a network
-problem (if your UxPlay version is older than 1.60, it is also
-the behavior when no DNS-SD server is found.)
-A useful tool for examining such network problems from the client end
-is the (free) Discovery DNS-SD browser available
-in the Apple App Store for both iOS (works on iPadOS too) and
-macOS.
-
-- Some users using dual-band (2.4GHz/5GHz) routers have reported that
-clients using the 5GHz band (sometimes) “fail to see UxPlay” (i.e., do
-not get a response to their mDNS queries), but the 2.4GHz band works.
-Other projects using Bonjour/mDNS have had similar reports; the issue
-seems to be router-specific, perhaps related to “auto” rather than fixed
-channel selection (5GHz has many more channels to switch between), or
-channel width selections; one speculation is that since mDNS uses UDP
-protocol (where “lost” messages are not resent), a mDNS query might get
-lost if channel switching occurs during the query.
-
-If your router has this problem, a reported “fix” is to (at least on
-5GHz) use fixed channel and/or fixed (not dynamic) channel width.
-
-- Avahi works at first, but new clients do not see UxPlay, or
-clients that initially saw it stop doing so after they
-disconnect.
-
-This is usually because Avahi is only using the “loopback” network
-interface, and is not receiving mDNS queries from new clients that were
-not listening when UxPlay started.
-To check this, after starting uxplay, use the utility
-avahi-browse -a -t in a different terminal
-window on the server to verify that the UxPlay AirTunes and
-AirPlay services are correctly registered (only the AirTunes service is
-used in the “Legacy” AirPlay Mirror mode used by UxPlay, but the AirPlay
-service is used for the initial contact).
-The results returned by avahi-browse should show entries for uxplay
-like
-+ eno1 IPv6 UxPlay AirPlay Remote Video local
-+ eno1 IPv4 UxPlay AirPlay Remote Video local
-+ lo IPv4 UxPlay AirPlay Remote Video local
-+ eno1 IPv6 863EA27598FE@UxPlay AirTunes Remote Audio local
-+ eno1 IPv4 863EA27598FE@UxPlay AirTunes Remote Audio local
-+ lo IPv4 863EA27598FE@UxPlay AirTunes Remote Audio local
-If only the loopback (“lo”) entries are shown, a firewall on the
-UxPlay host is probably blocking full DNS-SD service, and you need to
-open the default UDP port 5353 for mDNS requests, as loopback-based
-DNS-SD service is unreliable.
-If the UxPlay services are listed by avahi-browse as above, but are
-not seen by the client, the problem is likely to be a problem with the
-local network.
-2.
-uxplay starts, but stalls after “Initialized server socket(s)” appears,
-with the server name showing on the client (but the client
-fails to connect when the UxPlay server is selected).
-This shows that a DNS-SD service is working, clients hear
-UxPlay is available, but the UxPlay server is not receiving the response
-from the client. This is usually because a firewall on the server is
-blocking the connection request from the client. (One user who insisted
-that the firewall had been turned off turned out to have had
-two active firewalls (firewalld and ufw)
-both running on the server!) If possible, either turn off the
-firewall to see if that is the problem, or get three consecutive network
-ports, starting at port n, all three in the range 1024-65535, opened for
-both tcp and udp, and use “uxplay -p n” (or open UDP 7011,6001,6000 TCP
-7100,7000,7001 and use “uxplay -p”).
-If you are really sure there is no firewall, you may need to
-investigate your network transmissions with a tool like netstat, but
-almost always this is a firewall issue.
-3.
-Problems after the client-server connection has been made:
-If you do not see the message
-raop_rtp_mirror starting mirroring, something went wrong
-before the client-server negotiations were finished. For such problems,
-use “uxplay -d” (debug log option) to see what is happening: it will
-show how far the connection process gets before the failure occurs. You
-can compare your debug output to that from a successful start of UxPlay
-in the UxPlay
-Wiki.
-If UxPlay reports that mirroring started, but you get no
-video or audio, the problem is probably from a GStreamer plugin that
-doesn’t work on your system (by default, GStreamer uses the
-“autovideosink” and “autoaudiosink” algorithms to guess what are the
-“best” plugins to use on your system). A different reason for no audio
-occurred when a user with a firewall only opened two udp network ports:
-three are required (the third one receives the audio
-data).
-Raspberry Pi devices (Pi 4B+ and earlier: this
-does not apply to the Pi 5, which does not provide hardware h264
-decoding, and does not need it) work best with hardware GPU h264
-video decoding if the Video4Linux2 plugin in GStreamer v1.20.x or
-earlier has been patched (see the UxPlay Wiki
-for patches). This is fixed in GStreamer-1.22, and by backport patches
-from this in distributions such as Raspberry Pi OS (Bullseye):
-use option -bt709 with the GStreamer-1.18.4 from
-Raspberry Pi OS. This also needs the bcm2835-codec kernel
-module that is not in the standard Linux kernel (it is available in
-Raspberry Pi OS, Ubuntu and Manjaro).
-
-- If this kernel module is not available in your Raspberry Pi
-operating system, or if GStreamer < 1.22 is not patched, use option
-
-avdec for software h264-decoding.
-
-Sometimes “autovideosink” may select the OpenGL renderer
-“glimagesink” which may not work correctly on your system. Try the
-options “-vs ximagesink” or “-vs xvimagesink” to see if using one of
-these fixes the problem.
-Other reported problems are connected to the obsolete GStreamer VAAPI
-plugin (for hardware-accelerated Intel graphics, but not NVIDIA
-graphics). Use the option “-avdec” to force software h264 video
-decoding: this should prevent autovideosink from selecting the vaapisink
-videosink. Alternatively, find out if the gstreamer1.0-vaapi plugin is
-installed, and if so, uninstall it. (If this does not fix the problem,
-you can reinstall it.)
-There are some reports of other GStreamer problems with
-hardware-accelerated Intel HD graphics. One user (on Debian) solved this
-with “sudo apt install intel-media-va-driver-non-free”. This is a driver
-for 8’th (or later) generation “*-lake” Intel chips, that seems to be
-related to VAAPI accelerated graphics.
-If you do have Intel HD graphics, and have installed the
-obsolete vaapi plugin, but -vs vaapisink does not work,
-check that vaapi is not “blacklisted” in your GStreamer installation:
-run gst-inspect-1.0 vaapi, if this reports
-0 features, you need to
-export GST_VAAPI_ALL_DRIVERS=1 before running uxplay, or
-set this in the default environment. The recommended decoders are the
-newer “va” decoders such as vah264dec, which should be automatically
-used by GStreamer, but can be specified with the -vd
-option.
-You can try to fix audio or video problems by using the
-“-as <audiosink>” or
-“-vs <videosink>” options to choose the GStreamer
-audiosink or videosink , rather than letting GStreamer choose one for
-you. (See above, in Starting and
-running UxPlay for choices of <audiosink> or
-<videosink>.)
-The “OpenGL renderer” window created on Linux by “-vs glimagesink”
-sometimes does not close properly when its “close” button is clicked.
-(this is a GStreamer issue). You may need to terminate uxplay with
-Ctrl-C to close a “zombie” OpenGl window. If similar problems happen
-when the client sends the “Stop Mirroring” signal, try the no-close
-option “-nc” that leaves the video window open.
-4. GStreamer issues
-(missing plugins, etc.):
-
-- clearing the user’s GStreamer cache with
-
rm -rf ~/.cache/gstreamer-1.0/* may be the solution to
-problems where gst-inspect-1.0 does not show a plugin that you believe
-is installed. The cache will be regenerated next time GStreamer is
-started. This is the solution to puzzling problems that turn out
-to come from corruption of the cache, and should be tried
-first.
-
-If UxPlay fails to start, with a message that a required GStreamer
-plugin (such as “libav”) was not found, first check with the GStreamer
-tool gst-inspect-1.0 to see what GStreamer knows is available. (You may
-need to install some additional GStreamer “tools” package to get
-gst-inspect-1.0). For, e.g. a libav problem, check with
-“gst-inspect-1.0 libav”. If it is not shown as available to
-GStreamer, but your package manager shows the relevant package as
-installed (as one user found), try entirely removing and reinstalling
-the package. That user found that a solution to a “Required
-gstreamer plugin ‘libav’ not found” message that kept recurring
-was to clear the user’s gstreamer cache.
-If it fails to start with an error like
-‘no element "avdec_aac"’ this is because even though
-gstreamer-libav is installed. it is incomplete because some plugin
-features are missing: “gst-inspect-1.0 | grep avdec_aac”
-will show if avdec_aac is available. Unlike other GStreamer plugins, the
-libav plugin is a front end to FFmpeg codecs which provide avdec_*.
-
-Some distributions (RedHat, SUSE, etc) provide incomplete
-versions of FFmpeg because of patent issues with codecs used by certain
-plugins. In those cases there will be some “extra package” provider like
-RPM fusion (RedHat), packman (SUSE) where you can
-get complete packages (your distribution will usually provide
-instructions for this, Mageia puts them in an optional “tainted” repo).
-The packages needed may be “ffmpeg*” or “libav*” packages: the GStreamer
-libav plugin package does not contain any codecs itself, it just
-provides a way for GStreamer to use ffmpeg/libav codec libraries which
-must be installed separately. For similar reasons, distributions may
-ship incomplete packages of GStreamer “plugins-bad”. Use user on Fedora
-thought they had installed from rpmfusion, but the system had not
-obeyed: “Adding –allowerasing to the dnf command fixed it after a
-restart”.
-starting with release UxPlay-1.65.3, UxPlay will continue to
-function, but without audio in mirror mode, if avdec_aac is
-missing.
-
-To troubleshoot GStreamer execute “export GST_DEBUG=2” to set the
-GStreamer debug-level environment-variable in the terminal where you
-will run uxplay, so that you see warning and error messages; see GStreamer
-debugging tools for how to see much more of what is happening inside
-GStreamer. Run “gst-inspect-1.0” to see which GStreamer plugins are
-installed on your system.
-Some extra GStreamer packages for special plugins may need to be
-installed (or reinstalled: a user using a Wayland display system as an
-alternative to X11 reported that after reinstalling Lubuntu 18.4, UxPlay
-would not work until gstreamer1.0-x was installed, presumably for
-Wayland’s X11-compatibility mode). Different distributions may break up
-GStreamer 1.x into packages in different ways; the packages listed above
-in the build instructions should bring in other required GStreamer
-packages as dependencies, but will not install all possible plugins.
-The GStreamer video pipeline, which is shown in the initial output
-from uxplay -d, has the default form
-appsrc name=video_source ! queue ! h264parse ! decodebin ! videoconvert ! autovideosink name=video_sink sync=false
-The pipeline is fully configurable: default elements “h264parse”,
-“decodebin”, “videoconvert”, and “autovideosink” can respectively be
-replaced by using uxplay options -vp, -vd,
--vc, and -vs, if there is any need to modify
-it (entries can be given in quotes “…” to include options).
-5. Mirror screen
-freezes (a network problem):
-This can happen if the TCP video stream from the client stops
-arriving at the server, probably because of network problems (the UDP
-audio stream may continue to arrive). At 3-second intervals, UxPlay
-checks that the client is still connected by sending it a request for a
-NTP time signal. If a reply is not received from the client within a 0.3
-sec time-window, an “ntp timeout” is registered. If a certain number
-(currently 5) of consecutive ntp timeouts occur, UxPlay assumes that the
-client is “dead”, and resets the connection, becoming available for
-connection to a new client, or reconnection to the previous one.
-Sometimes the connection may recover before the timeout limit is
-reached, and if the default limit is not right for your network, it can
-be modified using the option “-reset n”, where n is
-the desired timeout-limit value (n = 0 means “no limit”). If
-the connection starts to recover after ntp timeouts, a corrupt video
-packet from before the timeout may trigger a “connection reset by peer”
-error, which also causes UxPlay to reset the connection.
-
-- When the connection is reset, the “frozen” mirror screen of the
-previous connection is left in place, but does not
-block new connections, and will be taken over by a new client connection
-when it is made.
-
-6.
-Protocol issues (with decryption of the encrypted audio and video
-streams sent by the client).
-A protocol failure may trigger an unending stream of error messages,
-and means that the audio decryption key (also used in video decryption)
-was not correctly extracted from data sent by the client.
-The protocol was modifed in UxPlay-1.65 after it was discovered that
-the client-server “pairing” step could be avoided (leading to a much
-quicker connection setup, without a 5 second delay) by disabling
-“Supports Legacy Pairing” (bit 27) in the “features” code UxPlay
-advertises on DNS-SD Service Discovery. Most clients will then not
-attempt the setup of a “shared secret key” when pairing, which is used
-by AppleTV for simultaneous handling of multiple clients (UxPlay only
-supports one client at a time). This change is now well-tested,
-but in case it causes any protocol failures, UxPlay can be reverted to
-the previous behavior by uncommenting the previous “FEATURES_1” setting
-(and commenting out the new one) in lib/dnssdint.h, and then rebuilding
-UxPlay. (“Pairing” is re-enabled when the new Apple-style
-one-time “pin” authentication is activated by running UxPlay with the
-“-pin” option introduced in UxPlay 1.67.)
-Protocol failure should not happen for iOS 9.3 or later clients.
-However, if a client uses the same older version of the protocol that is
-used by the Windows-based AirPlay client emulator AirMyPC, the
-protocol can be switched to the older version by the setting
-OLD_PROTOCOL_CLIENT_USER_AGENT_LIST in
-UxPlay/lib/global.h. UxPlay reports the client’s “User
-Agent” string when it connects. If some other client also fails to
-decrypt all audio and video, try adding its “User Agent” string in place
-of “xxx” in the entry “AirMyPC/2.0;xxx” in global.h and rebuild
-uxplay.
-Note that for DNS-SD Service Discovery, Uxplay declares itself to be
-an AppleTV3,2 (a 32 bit device) with a sourceVersion 220.68; this can
-also be changed in global.h. UxPlay also works if it declares itself as
-an AppleTV6,2 with sourceVersion 380.20.1 (an AppleTV 4K 1st gen,
-introduced 2017, running tvOS 12.2.1), so it does not seem to matter
-what version UxPlay claims to be.
-Changelog
-1.73 2026-01-25 Render Audio cover-art inside UxPlay with -ca option
-(no file specified). (D-Bus based) option -scrsv to inhibit
-screensaver while UxPlay is running (Linux/*BSD only). Add password
-support (-pw) using a displayed pin code as a password that changes
-every time (and not as a one-time pin). Add support for Service
-Discovery using a Bluetooth LE beacon. Add -vrtp option for forwarding
-decrypted h264/5 video to an external renderer (e.g., OBS Studio), and
--artp for audio. Check that option input strings have valid UTF-8
-encoding. New option -lang fr:es:en to specify language
-preferences for YouTube HLS videos when they offer a choice. New option
--mp4 for recording to a mp4 file (Mirror and Audio mode, not HLS)
-1.72.2 2025-07-07 Fix bug (typo) in DNS_SD advertisement introduced
-with -pw option. Update llhttp to v 9.3.0
-1.72.1 2025-06-06 minor update: fix regression in -reg option; add
-option -rc to specify initialization file; add “-nc no” to
-unset “-nc” option (for macOS users, where -nc is default); add
-user-installable systemd script for running UxPlay as an
-always-available “rootless daemon”
-1.72 2025-05-07. Improved HLS Live Streaming (YouTube) support,
-including “scrub”. Add requested options -md <filename> to output
-audio metadata text to a file for possible display (complements -ca
-option), and -vol option to set initial audio-streaming volume. Add
-support password user access control with HTTP digest Authentication
-(-pw [pwd]). If no pwd is set, a random pin is displayed for entry at
-each new connection.
-1.71 2024-12-13 Add support for HTTP Live Streaming (HLS), initially
-only for YouTube movies. Fix issue with NTP timeout on Windows.
-1.70 2024-10-04 Add support for 4K (h265) video (resolution 3840 x
-2160). Fix issue with GStreamer >= 1.24 when client sleeps, then
-wakes.
-1.69 2024-08-09 Internal improvements (e.g. in -nohold option,
-identifying GStreamer videosink selected by autovideosink, finding X11
-display) in anticipation of future HLS video support. New -nofreeze
-option to not leave frozen video in place when a network connection is
-reset. Fixes for GStreamer-1.24.x changes.
-1.68 2023-12-31 New simpler (default) method for generating a
-persistent public key from the server MAC address (which can now be set
-with the -m option). (The previous method is still available with -key
-option). New option -reg to maintain a register of pin-authenticated
-clients. Corrected volume-control: now interprets AirPlay volume range
--30dB:0dB as decibel gain attenuation, with new option -db low[:high]
-for “flat” rescaling of the dB range. Add -taper option for a “tapered”
-AirPlay volume-control profile.
-1.67 2023-11-30 Add support for Apple-style one-time pin
-authentication of clients with option “-pin”: (uses SRP6a authentication
-protocol and public key persistence). Detection with error message of
-(currently) unsupported H265 video when requesting high resolution over
-wired ethernet. Removed rpi* options (which are not valid with new
-Raspberry Pi model 5, and can be replaced by combinations of other
-options). Added optional argument “mac” to “-m” option, to specify a
-replacement MAC address/Device ID. Update llhttp to v. 9.1.3. Add -dacp
-option for exporting current client DACP info (for remotes).
-1.66 2023-09-05 Fix IPV6 support. Add option to restrict clients to
-those on a list of allowed deviceIDs, or to block connections from
-clients on a list of blocked deviceIDs. Fix for #207 from @thiccaxe (screen lag in
-vsync mode after client wakes from sleep).
-1.65.3 2023-07-23 Add RPM spec file; add warning if required
-gstreamer libav feature “avdec_aac” is missing: (this occurs in
-RPM-based distributions that ship an incomplete FFmpeg for Patent or
-License reasons, and rely on users installing an externally-supplied
-complete FFmpeg). Mirror-mode airplay will now work without audio if
-avdec_aac is missing.
-1.65 2023-06-03 Eliminate pair_setup part of connection protocol to
-allow faster connections with clients (thanks to @shuax #176 for this discovery); to revert,
-uncomment a line in lib/dnssdint.h. Disconnect from audio device when
-connection closes, to not block its use by other apps if uxplay is
-running but not connected. Fix for AirMyPC client (broken since 1.60),
-so its older non-NTP timestamp protocol works with -vsync. Corrected
-parsing of configuration file entries that were in quotes.
-1.64 2023-04-23 Timestamp-based synchronization of audio and video is
-now the default in Mirror mode. (Use “-vsync no” to restore previous
-behavior.) A configuration file can now be used for startup options.
-Also some internal cleanups and a minor bugfix that fixes #192.
-1.63 2023-02-12 Reworked audio-video synchronization, with new
-options -vsync (for Mirror mode) and -async (for Audio-Only mode, to
-sync with client video). Option -vsync makes software h264 decoding of
-streamed videos with option -avdec viable on some recent Raspberry Pi
-models. Internal change: all times are now processed in nanoseconds
-units. Removed -ao option introduced in 1.62.
-1.62 2023-01-18 Added Audio-only mode time offset -ao x to allow user
-synchronization of ALAC audio playing on the server with video, song
-lyrics, etc. playing on the client. x = 5.0 appears to be optimal in
-many cases. Quality fixes: cleanup in volume changes, timestamps, some
-bugfixes.
-1.61 2022-12-30 Removed -t option (workaround for an Avahi issue,
-correctly solved by opening network port UDP 5353 in firewall). Remove
--g debug flag from CMAKE_CFLAGS. Postpend (instead of prepend) build
-environment CFLAGS to CMAKE_CFLAGS. Refactor parts of uxplay.cpp
-1.60 2022-12-15 Added exit with error message if DNSServiceRegister
-fails (instead of just stalling). Test for Client’s attempt to using
-unsupported AirPlay 2 “REMOTE CONTROL” protocol (with no timing
-channel), and exit if this occurs. Reworked metadata processing to
-correctly parse DMAP header (previous version worked with DMAP messages
-currently received, but was not correct).
-1.59 2022-12-12 remove “ZOOMFIX” compile option and make compilation
-with X11-dependence the default if X11 development libraries are
-detected (this now also provides fullscreen mode with a F11 or Alt+Enter
-key toggle); ZOOMFIX is now automatically applied for GStreamer <
-1.20. New cmake option -DNO_X11_DEPS compiles uxplay without X11
-dependence. Reworked internal metadata handling. Fix segfault with “-vs
-0”.
-1.58 2022-10-29 Add option “-nohold” that will drop existing
-connections when a new client connects. Update llhttp to v8.1.0.
-1.57 2022-10-09 Minor fixes: (fix coredump on AUR on “stop
-mirroring”, occurs when compiled with AUR CFLAGS -DFORTIFY_SOURCE);
-graceful exit when required plugins are missing; improved support for
-builds on Windows. Include audioresample in GStreamer audio
-pipeline.
-1.56 2022-09-01 Added support for building and running UxPlay-1.56 on
-Windows (no changes to Unix (Linux, *BSD, macOS) codebase.)
-1.56 2022-07-30 Remove -bt709 from -rpi, -rpiwl, -rpifb as GStreamer
-is now fixed.
-1.55 2022-07-04 Remove the bt709 fix from -v4l2 and create a new
--bt709 option (previous “-v4l2” is now “-v4l2 -bt709”). This allows the
-currently-required -bt709 option to be used on its own on RPi without
--v4l2 (sometimes this give better results).
-1.54 2022-06-25 Add support for “Cover Art” display in Audio-only
-(ALAC) mode. Reverted a change that caused VAAPI to crash with AMD
-POLARIS graphics cards. Minor internal changes to plist code and uxplay
-option parsing.
-1.53 2022-06-13 Internal changes to audio sync code, revised
-documentation, Minor bugfix (fix assertion crash when resent audio
-packets are empty).
-1.52 2022-05-05 Cleaned up initial audio sync code, and reformatted
-streaming debug output (readable aligned timestamps with decimal points
-in seconds). Eliminate memory leaks (found by valgrind). Support for
-display of ALAC (audio-only) metadata (soundtrack artist names, titles
-etc.) in the uxplay terminal.
-1.51 2022-04-24 Reworked options forVideo4Linux2 support (new option
--v4l2) and short options -rpi, -rpifb, -rpiwl as synonyms for -v4l2,
--v4l2 -vs kmssink, and -v4l2 -vs waylandsink. Reverted a change from
-1.48 that broke reconnection after “Stop Mirroring” is sent by
-client.
-1.50 2022-04-22 Added -fs fullscreen option (for Wayland or VAAPI
-plugins only), Changed -rpi to be for framebuffer (“lite”) RPi systems
-and added -rpigl (OpenGL) and -rpiwl (Wayland) options for RPi Desktop
-systems. Also modified timestamps from “DTS” to “PTS” for latency
-improvement, plus internal cleanups.
-1.49 2022-03-28 Addded options for dumping video and/or audio to
-file, for debugging, etc. h264 PPS/SPS NALU’s are shown with -d. Fixed
-video-not-working for M1 Mac clients.
-1.48 2022-03-11 Made the GStreamer video pipeline fully configurable,
-for use with hardware h264 decoding. Support for Raspberry Pi.
-1.47 2022-02-05 Added -FPSdata option to display (in the terminal)
-regular reports sent by the client about video streaming performance.
-Internal cleanups of processing of video packets received from the
-client. Added -reset n option to reset the connection after n ntp
-timeouts (also reset after “connection reset by peer” error in video
-stream).
-1.46 2022-01-20 Restore pre-1.44 behavior (1.44 may have broken
-hardware acceleration): once again use decodebin in the video pipeline;
-introduce new option “-avdec” to force software h264 decoding by libav
-h264, if needed (to prevent selection of vaapisink by autovideosink).
-Update llhttp to v6.0.6. UxPlay now reports itself as AppleTV3,2.
-Restrict connections to one client at a time (second client must now
-wait for first client to disconnect).
-1.45 2022-01-10 New behavior: close video window when client requests
-“stop mirroring”. (A new “no close” option “-nc” is added for users who
-wish to retain previous behavior that does not close the video
-window).
-1.44 2021-12-13 Omit hash of aeskey with ecdh_secret for an AirMyPC
-client; make an internal rearrangement of where this hash is done. Fully
-report all initial communications between client and server in -d debug
-mode. Replace decodebin in GStreamer video pipeline by h264-specific
-elements.
-1.43 2021-12-07 Various internal changes, such as tests for
-successful decryption, uniform treatment of informational/debug
-messages, etc., updated README.
-1.42 2021-11-20 Fix MAC detection to work with modern Linux interface
-naming practices, MacOS and *BSD.
-1.41 2021-11-11 Further cleanups of multiple audio format support
-(internal changes, separated RAOP and GStreamer audio/video startup)
-1.40 2021-11-09 Cleanup segfault in ALAC support, manpage location
-fix, show request Plists in debug mode.
-1.39 2021-11-06 Added support for Apple Lossless (ALAC) audio
-streams.
-1.38 2021-10-8 Add -as audiosink option to allow user to
-choose the GStreamer audiosink.
-1.37 2021-09-29 Append “@hostname” to AirPlay Server name, where
-“hostname” is the name of the server running uxplay (reworked change in
-1.36).
-1.36 2021-09-29 Implemented suggestion (by @mrbesen and @PetrusZ) to use hostname of machine runing
-uxplay as the default server name
-1.35.1 2021-09-28 Added the -vs 0 option for streaming audio, but not
-displaying video.
-1.35 2021-09-10 now uses a GLib MainLoop, and builds on macOS (tested
-on Intel Mac, 10.15 ). New option -t timeout for relaunching
-server if no connections were active in previous timeout
-seconds (to renew Bonjour registration).
-1.341 2021-09-04 fixed: render logger was not being destroyed by
-stop_server()
-1.34 2021-08-27 Fixed “ZOOMFIX”: the X11 window name fix was only
-being made the first time the GStreamer window was created by uxplay,
-and not if the server was relaunched after the GStreamer window was
-closed, with uxplay still running. Corrected in v. 1.34
-Building OpenSSL >=
-1.1.1 from source.
-If you need to do this, note that you may be able to use a newer
-version (OpenSSL-3.0.1 is known to work). You will need the standard
-development toolset (autoconf, automake, libtool). Download the source
-code from https://www.openssl.org/source/. Install the downloaded
-openssl by opening a terminal in your Downloads directory, and unpacking
-the source distribution: (“tar -xvzf openssl-3.0.1.tar.gz ; cd
-openssl-3.0.1”). Then build/install with “./config ; make ; sudo make
-install_dev”. This will typically install the needed library
-libcrypto.*, either in /usr/local/lib or
-/usr/local/lib64.
-(Ignore the following for builds on MacOS:) On some systems
-like Debian or Ubuntu, you may also need to add a missing entry
-/usr/local/lib64 in /etc/ld.so.conf (or place a file
-containing “/usr/local/lib64/libcrypto.so” in /etc/ld.so.conf.d) and
-then run “sudo ldconfig”.
-Building libplist >=
-2.0.0 from source.
-(Note: on Debian 9 “Stretch” or Ubuntu 16.04 LTS editions, you
-can avoid this step by installing libplist-dev and libplist3 from Debian
-10 or Ubuntu 18.04.) As well as the usual build tools (autoconf,
-automake, libtool), you may need to also install some libpython*-dev
-package. Download the latest source with git from https://github.com/libimobiledevice/libplist, or get the
-source from the Releases section (use the *.tar.bz2 release,
-not the *.zip or *.tar.gz versions): download libplist-2.3.0,
-then unpack it (“tar -xvjf libplist-2.3.0.tar.bz2 ; cd libplist-2.3.0”),
-and build/install it: (“./configure ; make ; sudo make install”). This
-will probably install libplist-2.0.* in /usr/local/lib. The new
-libplist-2.3.0 release should be compatible with UxPlay; libplist-2.2.0
-is also available if there are any issues.
-(Ignore the following for builds on MacOS:) On some systems
-like Debian or Ubuntu, you may also need to add a missing entry
-/usr/local/lib in /etc/ld.so.conf (or place a file
-containing “/usr/local/lib/libplist-2.0.so” in /etc/ld.so.conf.d) and
-then run “sudo ldconfig”.
-Disclaimer
-All the resources in this repository are written using only freely
-available information from the internet. The code and related resources
-are meant for educational purposes only. It is the responsibility of the
-user to make sure all local laws are adhered to.
-This project makes use of a third-party GPL library for handling
-FairPlay. The legal status of that library is unclear. Should you be a
-representative of Apple and have any objections against the legality of
-the library and its use in this project, please contact the developers
-and the appropriate steps will be taken.
-Given the large number of third-party AirPlay receivers (mostly
-closed-source) available for purchase, it is our understanding that an
-open source implementation of the same functionality wouldn’t violate
-any of Apple’s rights either.
-UxPlay authors
-[adapted from fdraschbacher’s notes on RPiPlay
-antecedents]
-The code in this repository accumulated from various sources over
-time. Here is an attempt at listing the various authors and the
-components they created:
-UxPlay was initially created by antimof from
-RPiPlay, by replacing its Raspberry-Pi-adapted OpenMAX video and audio
-rendering system with GStreamer rendering for desktop Linux systems; the
-antimof work on code in renderers/ was later backported to
-RPiPlay, and the antimof project became dormant, but was later revived
-at the current GitHub site
-to serve a wider community of users.
-The previous authors of code included in UxPlay by inheritance from
-RPiPlay include:
-
-- EstebanKubata: Created a FairPlay library called PlayFair. Located
-in the
lib/playfair folder. License: GNU GPL
-- Juho Vähä-Herttua and contributors: Created an
-AirPlay audio server called ShairPlay, including
-support for Fairplay based on PlayFair. Most of the code in
-
lib/ originally stems from this project. License: GNU
-LGPLv2.1+
-- dsafa22: Created an AirPlay 2 mirroring server AirplayServer (seems
-gone now), for Android based on ShairPlay. Code is preserved here, and see here for the
-description of the analysis of the AirPlay 2 mirror protocol that made
-RPiPlay possible, by the AirplayServer author. All code in
-
lib/ concerning mirroring is dsafa22’s work. License: GNU
-LGPLv2.1+
-- Florian Draschbacher (FD-) and contributors:
-adapted dsafa22’s Android project for the Raspberry Pi, with extensive
-cleanups, debugging and improvements. The project RPiPlay is basically a port of
-dsafa22’s code to the Raspberry Pi, utilizing OpenMAX and OpenSSL for
-better performance on the Pi. License GPL v3. FD- has written an
-interesting note on the history of Airplay
-protocol versions, available at the RPiPlay github repository.
-
-Independent of UxPlay, but used by it and bundled with it:
-
-- Fedor Indutny (of Node.js, and formerly Joyent,
-Inc) and contributors: Created an http parsing library called llhttp. Located at
-
lib/llhttp/. License: MIT
-
diff --git a/README.md b/README.md
index 607a0a8..487ee74 100644
--- a/README.md
+++ b/README.md
@@ -1977,6 +1977,9 @@ option input strings have valid UTF-8 encoding. New option `-lang fr:es:en`
to specify language preferences for YouTube HLS videos when they offer a choice.
New option -mp4 for recording to a mp4 file (Mirror and Audio mode, not HLS)
+1.72.3 2025-12-20 Fix bug reported in CVE-2025-60458 whereby a specially-crafted
+client TEARDOWN request can crash UxPlay (denial of service attack).
+
1.72.2 2025-07-07 Fix bug (typo) in DNS_SD advertisement introduced with -pw
option. Update llhttp to v 9.3.0
diff --git a/README.txt b/README.txt
index ab6caa5..6bae3d2 100644
--- a/README.txt
+++ b/README.txt
@@ -2034,2377 +2034,9 @@ encoding. New option `-lang fr:es:en` to specify language preferences
for YouTube HLS videos when they offer a choice. New option -mp4 for
recording to a mp4 file (Mirror and Audio mode, not HLS)
-1.72.2 2025-07-07 Fix bug (typo) in DNS_SD advertisement introduced with
--pw option. Update llhttp to v 9.3.0
-
-1.72.1 2025-06-06 minor update: fix regression in -reg option; add
-option -rc ``{=html} to specify initialization file; add "-nc
-no" to unset "-nc" option (for macOS users, where -nc is default); add
-user-installable systemd script for running UxPlay as an
-always-available "rootless daemon"
-
-1.72 2025-05-07. Improved HLS Live Streaming (YouTube) support,
-including "scrub". Add requested options -md \ to output
-audio metadata text to a file for possible display (complements -ca
-option), and -vol ``{=html} option to set initial audio-streaming
-volume. Add support password user access control with HTTP digest
-Authentication (-pw \[pwd\]). If no pwd is set, a random pin is
-displayed for entry at each new connection.
-
-1.71 2024-12-13 Add support for HTTP Live Streaming (HLS), initially
-only for YouTube movies. Fix issue with NTP timeout on Windows.
-
-1.70 2024-10-04 Add support for 4K (h265) video (resolution 3840 x
-2160). Fix issue with GStreamer \>= 1.24 when client sleeps, then wakes.
-
-1.69 2024-08-09 Internal improvements (e.g. in -nohold option,
-identifying GStreamer videosink selected by autovideosink, finding X11
-display) in anticipation of future HLS video support. New -nofreeze
-option to not leave frozen video in place when a network connection is
-reset. Fixes for GStreamer-1.24.x changes.
-
-1.68 2023-12-31 New simpler (default) method for generating a persistent
-public key from the server MAC address (which can now be set with the -m
-option). (The previous method is still available with -key option). New
-option -reg to maintain a register of pin-authenticated clients.
-Corrected volume-control: now interprets AirPlay volume range -30dB:0dB
-as decibel gain attenuation, with new option -db low\[:high\] for "flat"
-rescaling of the dB range. Add -taper option for a "tapered" AirPlay
-volume-control profile.
-
-1.67 2023-11-30 Add support for Apple-style one-time pin authentication
-of clients with option "-pin": (uses SRP6a authentication protocol and
-public key persistence). Detection with error message of (currently)
-unsupported H265 video when requesting high resolution over wired
-ethernet. Removed rpi\* options (which are not valid with new Raspberry
-Pi model 5, and can be replaced by combinations of other options). Added
-optional argument "mac" to "-m" option, to specify a replacement MAC
-address/Device ID. Update llhttp to v. 9.1.3. Add -dacp option for
-exporting current client DACP info (for remotes).
-
-1.66 2023-09-05 Fix IPV6 support. Add option to restrict clients to
-those on a list of allowed deviceIDs, or to block connections from
-clients on a list of blocked deviceIDs. Fix for #207 from @thiccaxe
-(screen lag in vsync mode after client wakes from sleep).
-
-1.65.3 2023-07-23 Add RPM spec file; add warning if required gstreamer
-libav feature "avdec_aac" is missing: (this occurs in RPM-based
-distributions that ship an incomplete FFmpeg for Patent or License
-reasons, and rely on users installing an externally-supplied complete
-FFmpeg). Mirror-mode airplay will now work without audio if avdec_aac is
-missing.
-
-1.65 2023-06-03 Eliminate pair_setup part of connection protocol to
-allow faster connections with clients (thanks to @shuax #176 for this
-discovery); to revert, uncomment a line in lib/dnssdint.h. Disconnect
-from audio device when connection closes, to not block its use by other
-apps if uxplay is running but not connected. Fix for AirMyPC client
-(broken since 1.60), so its older non-NTP timestamp protocol works with
--vsync. Corrected parsing of configuration file entries that were in
-quotes.
-
-1.64 2023-04-23 Timestamp-based synchronization of audio and video is
-now the default in Mirror mode. (Use "-vsync no" to restore previous
-behavior.) A configuration file can now be used for startup options.
-Also some internal cleanups and a minor bugfix that fixes #192.
-
-1.63 2023-02-12 Reworked audio-video synchronization, with new options
--vsync (for Mirror mode) and -async (for Audio-Only mode, to sync with
-client video). Option -vsync makes software h264 decoding of streamed
-videos with option -avdec viable on some recent Raspberry Pi models.
-Internal change: all times are now processed in nanoseconds units.
-Removed -ao option introduced in 1.62.
-
-1.62 2023-01-18 Added Audio-only mode time offset -ao x to allow user
-synchronization of ALAC audio playing on the server with video, song
-lyrics, etc. playing on the client. x = 5.0 appears to be optimal in
-many cases. Quality fixes: cleanup in volume changes, timestamps, some
-bugfixes.
-
-1.61 2022-12-30 Removed -t option (workaround for an Avahi issue,
-correctly solved by opening network port UDP 5353 in firewall). Remove
--g debug flag from CMAKE_CFLAGS. Postpend (instead of prepend) build
-environment CFLAGS to CMAKE_CFLAGS. Refactor parts of uxplay.cpp
-
-1.60 2022-12-15 Added exit with error message if DNSServiceRegister
-fails (instead of just stalling). Test for Client's attempt to using
-unsupported AirPlay 2 "REMOTE CONTROL" protocol (with no timing
-channel), and exit if this occurs. Reworked metadata processing to
-correctly parse DMAP header (previous version worked with DMAP messages
-currently received, but was not correct).
-
-1.59 2022-12-12 remove "ZOOMFIX" compile option and make compilation
-with X11-dependence the default if X11 development libraries are
-detected (this now also provides fullscreen mode with a F11 or Alt+Enter
-key toggle); ZOOMFIX is now automatically applied for GStreamer \< 1.20.
-New cmake option -DNO_X11_DEPS compiles uxplay without X11 dependence.
-Reworked internal metadata handling. Fix segfault with "-vs 0".
-
-1.58 2022-10-29 Add option "-nohold" that will drop existing connections
-when a new client connects. Update llhttp to v8.1.0.
-
-1.57 2022-10-09 Minor fixes: (fix coredump on AUR on "stop mirroring",
-occurs when compiled with AUR CFLAGS -DFORTIFY_SOURCE); graceful exit
-when required plugins are missing; improved support for builds on
-Windows. Include audioresample in GStreamer audio pipeline.
-
-1.56 2022-09-01 Added support for building and running UxPlay-1.56 on
-Windows (no changes to Unix (Linux, \*BSD, macOS) codebase.)
-
-1.56 2022-07-30 Remove -bt709 from -rpi, -rpiwl, -rpifb as GStreamer is
-now fixed.
-
-1.55 2022-07-04 Remove the bt709 fix from -v4l2 and create a new -bt709
-option (previous "-v4l2" is now "-v4l2 -bt709"). This allows the
-currently-required -bt709 option to be used on its own on RPi without
--v4l2 (sometimes this give better results).
-
-1.54 2022-06-25 Add support for "Cover Art" display in Audio-only (ALAC)
-mode. Reverted a change that caused VAAPI to crash with AMD POLARIS
-graphics cards. Minor internal changes to plist code and uxplay option
-parsing.
-
-1.53 2022-06-13 Internal changes to audio sync code, revised
-documentation, Minor bugfix (fix assertion crash when resent audio
-packets are empty).
-
-1.52 2022-05-05 Cleaned up initial audio sync code, and reformatted
-streaming debug output (readable aligned timestamps with decimal points
-in seconds). Eliminate memory leaks (found by valgrind). Support for
-display of ALAC (audio-only) metadata (soundtrack artist names, titles
-etc.) in the uxplay terminal.
-
-1.51 2022-04-24 Reworked options forVideo4Linux2 support (new option
--v4l2) and short options -rpi, -rpifb, -rpiwl as synonyms for -v4l2,
--v4l2 -vs kmssink, and -v4l2 -vs waylandsink. Reverted a change from
-1.48 that broke reconnection after "Stop Mirroring" is sent by client.
-
-1.50 2022-04-22 Added -fs fullscreen option (for Wayland or VAAPI
-plugins only), Changed -rpi to be for framebuffer ("lite") RPi systems
-and added -rpigl (OpenGL) and -rpiwl (Wayland) options for RPi Desktop
-systems. Also modified timestamps from "DTS" to "PTS" for latency
-improvement, plus internal cleanups.
-
-1.49 2022-03-28 Addded options for dumping video and/or audio to file,
-for debugging, etc. h264 PPS/SPS NALU's are shown with -d. Fixed
-video-not-working for M1 Mac clients.
-
-1.48 2022-03-11 Made the GStreamer video pipeline fully configurable,
-for use with hardware h264 decoding. Support for Raspberry Pi.
-
-1.47 2022-02-05 Added -FPSdata option to display (in the terminal)
-regular reports sent by the client about video streaming performance.
-Internal cleanups of processing of video packets received from the
-client. Added -reset n option to reset the connection after n ntp
-timeouts (also reset after "connection reset by peer" error in video
-stream).
-
-1.46 2022-01-20 Restore pre-1.44 behavior (1.44 may have broken hardware
-acceleration): once again use decodebin in the video pipeline; introduce
-new option "-avdec" to force software h264 decoding by libav h264, if
-needed (to prevent selection of vaapisink by autovideosink). Update
-llhttp to v6.0.6. UxPlay now reports itself as AppleTV3,2. Restrict
-connections to one client at a time (second client must now wait for
-first client to disconnect).
-
-1.45 2022-01-10 New behavior: close video window when client requests
-"stop mirroring". (A new "no close" option "-nc" is added for users who
-wish to retain previous behavior that does not close the video window).
-
-1.44 2021-12-13 Omit hash of aeskey with ecdh_secret for an AirMyPC
-client; make an internal rearrangement of where this hash is done. Fully
-report all initial communications between client and server in -d debug
-mode. Replace decodebin in GStreamer video pipeline by h264-specific
-elements.
-
-1.43 2021-12-07 Various internal changes, such as tests for successful
-decryption, uniform treatment of informational/debug messages, etc.,
-updated README.
-
-1.42 2021-11-20 Fix MAC detection to work with modern Linux interface
-naming practices, MacOS and \*BSD.
-
-1.41 2021-11-11 Further cleanups of multiple audio format support
-(internal changes, separated RAOP and GStreamer audio/video startup)
-
-1.40 2021-11-09 Cleanup segfault in ALAC support, manpage location fix,
-show request Plists in debug mode.
-
-1.39 2021-11-06 Added support for Apple Lossless (ALAC) audio streams.
-
-1.38 2021-10-8 Add -as *audiosink* option to allow user to choose the
-GStreamer audiosink.
-
-1.37 2021-09-29 Append "@hostname" to AirPlay Server name, where
-"hostname" is the name of the server running uxplay (reworked change in
-1.36).
-
-1.36 2021-09-29 Implemented suggestion (by @mrbesen and @PetrusZ) to use
-hostname of machine runing uxplay as the default server name
-
-1.35.1 2021-09-28 Added the -vs 0 option for streaming audio, but not
-displaying video.
-
-1.35 2021-09-10 now uses a GLib MainLoop, and builds on macOS (tested on
-Intel Mac, 10.15 ). New option -t *timeout* for relaunching server if no
-connections were active in previous *timeout* seconds (to renew Bonjour
-registration).
-
-1.341 2021-09-04 fixed: render logger was not being destroyed by
-stop_server()
-
-1.34 2021-08-27 Fixed "ZOOMFIX": the X11 window name fix was only being
-made the first time the GStreamer window was created by uxplay, and not
-if the server was relaunched after the GStreamer window was closed, with
-uxplay still running. Corrected in v. 1.34
-
-### Building OpenSSL \>= 1.1.1 from source.
-
-If you need to do this, note that you may be able to use a newer version
-(OpenSSL-3.0.1 is known to work). You will need the standard development
-toolset (autoconf, automake, libtool). Download the source code from
-. Install the downloaded openssl by
-opening a terminal in your Downloads directory, and unpacking the source
-distribution: ("tar -xvzf openssl-3.0.1.tar.gz ; cd openssl-3.0.1").
-Then build/install with "./config ; make ; sudo make install_dev". This
-will typically install the needed library `libcrypto.*`, either in
-/usr/local/lib or /usr/local/lib64.
-
-*(Ignore the following for builds on MacOS:)* On some systems like
-Debian or Ubuntu, you may also need to add a missing entry
-`/usr/local/lib64` in /etc/ld.so.conf (or place a file containing
-"/usr/local/lib64/libcrypto.so" in /etc/ld.so.conf.d) and then run "sudo
-ldconfig".
-
-### Building libplist \>= 2.0.0 from source.
-
-*(Note: on Debian 9 "Stretch" or Ubuntu 16.04 LTS editions, you can
-avoid this step by installing libplist-dev and libplist3 from Debian 10
-or Ubuntu 18.04.)* As well as the usual build tools (autoconf, automake,
-libtool), you may need to also install some libpython\*-dev package.
-Download the latest source with git from
-, or get the source from
-the Releases section (use the \*.tar.bz2 release, **not** the \*.zip or
-\*.tar.gz versions): download
-[libplist-2.3.0](https://github.com/libimobiledevice/libplist/releases/download/2.3.0/libplist-2.3.0.tar.bz2),
-then unpack it ("tar -xvjf libplist-2.3.0.tar.bz2 ; cd libplist-2.3.0"),
-and build/install it: ("./configure ; make ; sudo make install"). This
-will probably install libplist-2.0.\* in /usr/local/lib. The new
-libplist-2.3.0 release should be compatible with UxPlay;
-[libplist-2.2.0](https://github.com/libimobiledevice/libplist/releases/download/2.2.0/libplist-2.2.0.tar.bz2)
-is also available if there are any issues.
-
-*(Ignore the following for builds on MacOS:)* On some systems like
-Debian or Ubuntu, you may also need to add a missing entry
-`/usr/local/lib` in /etc/ld.so.conf (or place a file containing
-"/usr/local/lib/libplist-2.0.so" in /etc/ld.so.conf.d) and then run
-"sudo ldconfig".
-
-# Disclaimer
-
-All the resources in this repository are written using only freely
-available information from the internet. The code and related resources
-are meant for educational purposes only. It is the responsibility of the
-user to make sure all local laws are adhered to.
-
-This project makes use of a third-party GPL library for handling
-FairPlay. The legal status of that library is unclear. Should you be a
-representative of Apple and have any objections against the legality of
-the library and its use in this project, please contact the developers
-and the appropriate steps will be taken.
-
-Given the large number of third-party AirPlay receivers (mostly
-closed-source) available for purchase, it is our understanding that an
-open source implementation of the same functionality wouldn't violate
-any of Apple's rights either.
-
-# UxPlay authors
-
-*\[adapted from fdraschbacher's notes on RPiPlay antecedents\]*
-
-The code in this repository accumulated from various sources over time.
-Here is an attempt at listing the various authors and the components
-they created:
-
-UxPlay was initially created by **antimof** from RPiPlay, by replacing
-its Raspberry-Pi-adapted OpenMAX video and audio rendering system with
-GStreamer rendering for desktop Linux systems; the antimof work on code
-in `renderers/` was later backported to RPiPlay, and the antimof project
-became dormant, but was later revived at the [current GitHub
-site](http://github.com/FDH2/UxPlay) to serve a wider community of
-users.
-
-The previous authors of code included in UxPlay by inheritance from
-RPiPlay include:
-
-- **EstebanKubata**: Created a FairPlay library called
- [PlayFair](https://github.com/EstebanKubata/playfair). Located in
- the `lib/playfair` folder. License: GNU GPL
-- **Juho Vähä-Herttua** and contributors: Created an AirPlay audio
- server called [ShairPlay](https://github.com/juhovh/shairplay),
- including support for Fairplay based on PlayFair. Most of the code
- in `lib/` originally stems from this project. License: GNU LGPLv2.1+
-- **dsafa22**: Created an AirPlay 2 mirroring server
- [AirplayServer](https://github.com/dsafa22/AirplayServer) (seems
- gone now), for Android based on ShairPlay. Code is preserved
- [here](https://github.com/jiangban/AirplayServer), and [see
- here](https://github.com/FDH2/UxPlay/wiki/AirPlay2) for the
- description of the analysis of the AirPlay 2 mirror protocol that
- made RPiPlay possible, by the AirplayServer author. All code in
- `lib/` concerning mirroring is dsafa22's work. License: GNU
- LGPLv2.1+
-- **Florian Draschbacher** (FD-) and contributors: adapted dsafa22's
- Android project for the Raspberry Pi, with extensive cleanups,
- debugging and improvements. The project
- [RPiPlay](https://github.com/FD-/RPiPlay) is basically a port of
- dsafa22's code to the Raspberry Pi, utilizing OpenMAX and OpenSSL
- for better performance on the Pi. License GPL v3. FD- has written an
- interesting note on the history of [Airplay protocol
- versions](http://github.com/FD-/RPiPlay#airplay-protocol-versions),
- available at the RPiPlay github repository.
-
-Independent of UxPlay, but used by it and bundled with it:
-
-- **Fedor Indutny** (of Node.js, and formerly Joyent, Inc) and
- contributors: Created an http parsing library called
- [llhttp](https://github.com/nodejs/llhttp). Located at
- `lib/llhttp/`. License: MIT
-
-# UxPlay 1.73: AirPlay-Mirror and AirPlay-Audio server for Linux, macOS, and Unix (also runs on Windows).
-
-### **Now developed at the GitHub site (where ALL user issues should be posted, and latest versions can be found).**
-
-- **NEW in v1.73** (January 2026):
-
-- Some YouTube app HLS videos now offer alternative language tracks
- (generated by AI dubbing). Language choices will be made in order of
- preferences set with option -lang (or by environment variable
- \$LANGUAGE, which "-lang" overrides). Format is `-lang fr:es:en`,
- where French ("fr") is the first choice, if available, then Spanish
- ("es"), etc. \$LANGUAGE has the same format: `-lang` (by itself)
- suppresses playing of dubbed audio if \$LANGUAGE is set.
-
-- Support for recording Mirror-mode/Audio-mode (but not HLS) Audio and
- Video to mp4 file (new option -mp4 \[fn\]).
-
-- Support for **service discovery using a Bluetooth LE "beacon"** for
- both Linux/\*BSD and Windows (as an alternative to
- Bonjour/Rendezvous DNS-SD service discovery). **This can be used on
- networks that do not allow the user to run a DNS_SD service.** The
- user must run a Bluetooth LE "beacon", (a USB 4.0 or later "dongle"
- can be used). The beacon is managed by a Python3 script
- `uxplay-beacon.py` (available in two versions, a BlueZ/DBus version
- for Linux/\*BSD, and a winrt version for Windows). The beacon runs
- independently of UxPlay: while UxPlay is running, it regularly
- broadcasts a Bluetooth LE ("Low Energy") 46 byte legacy-type
- advertisement informing nearby iOS/macOS devices of the local IPv4
- network address of the UxPlay server, and which TCP port to contact
- UxPlay on. Instructions are [given
- below](#bluetooth-le-beacon-setup).
-
-- option `-vrtp ` bypasses rendering by UxPlay, and
- instead transmits rtp packets of decrypted h264 or h265 video to an
- external renderer (e.g. OBS Studio) at an address specified in
- `rest-of-pipeline`. Similarly, `-artp ` forwards
- decoded audio as L16 RTP packets. Both options can be used together
- to forward video and audio (as separate concurrent streams) to
- external applications. See [Usage](#usage) for more details and
- sample Gstreamer receiver pipelines.
-
-- (for Linux/\*BSD Desktop Environments using D-Bus). New option
- `-scrsv ` provides screensaver inhibition (e.g., to prevent
- screensaver function while watching mirrored videos without keyboard
- or mouse activity): n = 0 (off) n=1 (on during video activity) n=2
- (always on while UxPlay is running). Tested on
- Gnome/KDE/Cinnamon/Mate/Xfce 4: may need adjustment for other
- Desktop Environments (please report). (watch output of
- `dbus-monitor` to verify that inhibition is working). *Might not
- work on Wayland*.
-
-- option -ca (with no filename given) will now render Apple Music
- cover art (in audio-only mode) inside UxPlay. (-ca `` will
- continue to export cover art for display by an external viewer).
-
-- Improved Support for (YouTube) HLS (HTTP Live Streaming) video with
- the new "-hls" option (introduced in 1.71).\* **Only streaming from
- the YouTube iOS app (in \"m3u8\" protocol) is currently supported**:
- (streaming using the AirPlay icon in a browser window is **not** yet
- supported).Click on the airplay icon in the YouTube app to stream
- video. **Please report any issues with this new feature of UxPlay**.
-
- *The default video player for HLS is GStreamer playbin v3: use "-hls
- 2" to revert to the older GStreamer player playbin v2 if some videos
- fail to play*.
-
-- user-requested features: added support for setting a password (as an
- alternative to on-screen pin codes) to control client access (-pw
- option, see "man pw" or this README for details); added support for
- setting initial client audio-streaming volume (-vol option), and
- output of audio-mode metadata to file (for display by some external
- process, -md option).
-
-## Highlights:
-
-- GPLv3, open source.
-- Originally supported only AirPlay Mirror protocol, now has added
- support for AirPlay Audio-only (Apple Lossless ALAC) streaming from
- current iOS/iPadOS clients. **Now with support for Airplay HLS
- video-streaming (currently only YouTube video).**
-- macOS computers (2011 or later, both Intel and "Apple Silicon" M1/M2
- systems) can act either as AirPlay clients, or as the server running
- UxPlay. Using AirPlay, UxPlay can emulate a second display for macOS
- clients.
-- Support for older iOS clients (such as 32-bit iPad 2nd gen., iPod
- Touch 5th gen. and iPhone 4S, when upgraded to iOS 9.3.5, or later
- 64-bit devices), plus a Windows AirPlay-client emulator, AirMyPC.
-- Uses GStreamer plugins for audio and video rendering (with options
- to select different hardware-appropriate output "videosinks" and
- "audiosinks", and a fully-user-configurable video streaming
- pipeline).
-- Support for server behind a firewall.
-- Raspberry Pi support **both with and without hardware video
- decoding** by the Broadcom GPU. *Tested on Raspberry Pi Zero 2 W, 3
- Model B+, 4 Model B, and 5.*
-- Support for running on Microsoft Windows (builds with the MinGW-64
- compiler in the unix-like MSYS2 environment).
-
-Note: AirPlay2 multi-room audio streaming is not supported: use
-[shairport-sync](https://github.com/mikebrady/shairport-sync) for that.
-
-## Packaging status (Linux and \*BSD distributions)
-
-[](https://repology.org/project/uxplay/versions).
-
-- Install uxplay on Debian-based Linux systems with
- "`sudo apt install uxplay`"; on FreeBSD with
- "`sudo pkg install uxplay`"; on OpenBSD with
- "`doas pkg_add uxplay`". Also available on Arch-based systems
- through AUR. Since v. 1.66, uxplay is now also packaged in RPM
- format by Fedora 38 ("`sudo dnf install uxplay`").
-
-- For other RPM-based distributions which have not yet packaged
- UxPlay, a RPM "specfile" **uxplay.spec** is now provided with recent
- [releases](https://github.com/FDH2/UxPlay/releases) (see their
- "Assets"), and can also be found in the UxPlay source top directory.
- See the section on using this specfile for [building an installable
- RPM package](#building-an-installable-rpm-package).
-
-- If your distribution does not supply UxPlay, or you want the latest
- version, it is very easy to build it yourself: see the very
- [detailed instructions for building UxPlay from
- source](#building-uxplay-from-source). later in this document.
-
-## After installation:
-
-- (On Linux and \*BSD): if a firewall is active on the server hosting
- UxPlay, make sure the default network port (UDP 5353) for
- mDNS/DNS-SD queries is open (see [Troubleshooting](#troubleshooting)
- below for more details); also open three UDP and three TCP ports for
- Uxplay, and use the "uxplay -p ``{=html}" option (see
- "`man uxplay`" or "`uxplay -h`").
-
-- Even if you install your distribution's pre-compiled uxplay binary
- package, you may need to read the instructions below for [running
- UxPlay](#running-uxplay) to see which of your distribution's
- **GStreamer plugin packages** you should also install.
-
-- For Audio-only mode (Apple Music, etc.) best quality is obtained
- with the option "uxplay -async", but there is then a 2 second
- latency imposed by iOS. Use option "uxplay -ca" to display any
- "Cover Art" that accompanies the audio.
-
-- If you are using UxPlay just to mirror the client's screen (without
- showing videos that need audio synchronized with video), it is best
- to use the option "uxplay -vsync no".
-
-- Add any UxPlay options you want to use as defaults to a startup file
- `~/.uxplayrc` (see "`man uxplay`" or "`uxplay -h`" for format and
- other possible locations; the location can also be set with "uxplay
- -rc *location*"). In particular, if your system uses PipeWire audio
- or Wayland video systems, you may wish to add "as pipewiresink" or
- "vs waylandsink" as defaults to the file. *(Output from terminal
- commands "ps waux \| grep pulse" or "pactl info" will contain
- "pipewire" if your Linux/BSD system uses it).*
-
-- For Linux/\*BSD systems using D-Bus, the option `-scrsv 1` inhibits
- the screensaver while there is video activity on UxPlay (`-scrsv 2`
- inhibits it whenever UxPlay is running).
-
-- For Linux systems using systemd, there is a **systemd** service file
- **uxplay.service** found in the UxPlay top directory of the
- distribution, and also installed in `/uxplay/systemd/`
- (where DOCDIR is usually `/usr/local/share/doc`), that allows users
- to start their own instance of UxPlay as a rootless daemon: it
- should either be added to the directory /etc/systemd/user, or the
- user can just create their own systemd directory
- `~/.config/systemd/user/` and then copy uxplay.service into it. To
- save uxplay terminal output to a file \~/uxplay.log, uncomment the
- StandardOutput entry in uxplay.service. Then
-
- `systemctl --user [start/stop/enable/disable/status] uxplay`
-
- can be used to control the daemon. If it is enabled, the daemon will
- start at the user's first login and stop when they no longer have
- any open sessions. See
- https://www.baeldung.com/linux/systemd-create-user-services for more
- about systemd user services. If more than one user might
- simultaneously run uxplay this way, they should specify distinct -p
- and -m options (ports and deviceID) in their startup files. **Note:
- it is NOT recommended to run UxPlay as a root service.**
-
-- On Raspberry Pi: models using hardware h264 video decoding by the
- Broadcom GPU (models 4B and earlier) may require the uxplay option
- -bt709. If you use Ubuntu 22.10 or earlier, GStreamer must be
- [patched](https://github.com/FDH2/UxPlay/wiki/Gstreamer-Video4Linux2-plugin-patches)
- to use hardware video decoding by the Broadcom GPU (also recommended
- but optional for Raspberry Pi OS (Bullseye): the patched GStreamer
- does not need option " -bt709\`". The need for -bt709 when hardware
- video decoding is used seems to have reappeared starting with
- GStreamer-1.22.
-
-- If UxPlay is used in a public space, there are security options for
- requiring an AppleTV-style one-time pin (displayed on the terminal)
- to be entered, or a password, and for barring/permitting client
- access by their device ID. See options -pin, -reg, -pw, -restrict,
- -allow, -block.
-
-# Detailed description of UxPlay
-
-This project is a GPLv3 open source unix AirPlay2 Mirror server for
-Linux, macOS, and \*BSD. It was initially developed by
-[antimof](http://github.com/antimof/Uxplay) using code from
-OpenMAX-based [RPiPlay](https://github.com/FD-/RPiPlay), which in turn
-derives from [AirplayServer](https://github.com/KqsMea8/AirplayServer),
-[shairplay](https://github.com/juhovh/shairplay), and
-[playfair](https://github.com/EstebanKubata/playfair). (The antimof site
-is no longer involved in development, but periodically posts updates
-pulled from the new main [UxPlay site](https://github.com/FDH2/UxPlay)).
-
-UxPlay is tested on a number of systems, including (among others) Debian
-(10 "Buster", 11 "Bullseye", 12 "Bookworm"), Ubuntu (20.04 LTS, 22.04
-LTS, 23.04 (also Ubuntu derivatives Linux Mint, Pop!\_OS), Red Hat and
-clones (Fedora 38, Rocky Linux 9.2), openSUSE Leap 15.5, Mageia 9,
-OpenMandriva "ROME", PCLinuxOS, Arch Linux, Manjaro, and should run on
-any Linux system. Also tested on macOS Catalina and Ventura (Intel) and
-Sonoma (M2), FreeBSD 14.0, Windows 10 and 11 (64 bit).
-
-On Raspberry Pi 4 model B, it is tested on Raspberry Pi OS (Bullseye and
-Bookworm) (32- and 64-bit), Ubuntu 22.04 LTS and 23.04, Manjaro RPi4
-23.02, and (without hardware video decoding) on openSUSE 15.5. Also
-tested on Raspberry Pi Zero 2 W, 3 model B+, and now 5.
-
-Its main use is to act like an AppleTV for screen-mirroring (with audio)
-of iOS/iPadOS/macOS clients (iPhone, iPod Touch, iPad, Mac computers) on
-the server display of a host running Linux, macOS, or other unix (and
-now also Microsoft Windows). UxPlay supports Apple's AirPlay2 protocol
-using "Legacy Protocol", but some features are missing. (Details of what
-is publicly known about Apple's AirPlay 2 protocol can be found
-[here](https://openairplay.github.io/airplay-spec/),
-[here](https://github.com/SteeBono/airplayreceiver/wiki/AirPlay2-Protocol)
-and [here](https://emanuelecozzi.net/docs/airplay2); see also
-[pyatv](https://pyatv.dev/documentation/protocols) which could be a
-resource for adding modern protocols.) While there is no guarantee that
-future iOS releases will keep supporting "Legacy Protocol", iOS 17
-continues support.
-
-The UxPlay server and its client must be on the same local area network,
-on which a **Bonjour/Zeroconf mDNS/DNS-SD server** is also running (only
-DNS-SD "Service Discovery" service is strictly necessary, it is not
-necessary that the local network also be of the ".local" mDNS-based
-type). On Linux and BSD Unix servers, this is usually provided by
-[Avahi](https://www.avahi.org), through the avahi-daemon service, and is
-included in most Linux distributions (this service can also be provided
-by macOS, iOS or Windows servers). There is now an alternative Service
-discovery method, using a Bluetooth LE "beacon" See below for
-[instructions](#bluetooth-le-beacon-setup).
-
-Connections to the UxPlay server by iOS/MacOS clients can be initiated
-both in **AirPlay Mirror** mode (which streams lossily-compressed AAC
-audio while mirroring the client screen, or in the alternative **AirPlay
-Audio** mode which streams Apple Lossless (ALAC) audio without screen
-mirroring. In **Audio** mode, metadata is displayed in the uxplay
-terminal; if UxPlay option `-ca ` is used, the accompanying cover
-art is also output to a periodically-updated file ``, and can be
-viewed with a (reloading) graphics viewer of your choice. *Switching
-between* **Mirror** *and* **Audio** *modes during an active connection
-is possible: in* **Mirror** *mode, stop mirroring (or close the mirror
-window) and start an* **Audio** *mode connection, switch back by
-initiating a* **Mirror** *mode connection; cover-art display
-stops/restarts as you leave/re-enter* **Audio** *mode.*
-
-- **Note that Apple video-DRM (as found in "Apple TV app" content on
- the client) cannot be decrypted by UxPlay, and the Apple TV app
- cannot be watched using UxPlay's AirPlay Mirror mode (only the
- unprotected audio will be streamed, in AAC format).**
-
-- **With the new "-hls" option, UxPlay now also supports non-Mirror
- AirPlay video streaming (where the client controls a web server on
- the AirPlay server that directly receives HLS content to avoid it
- being decoded and re-encoded by the client). This currently only
- supports streaming of YouTube videos. Without the -hls option, using
- the icon for AirPlay video in apps such as the YouTube app will only
- send audio (in lossless ALAC format) without the accompanying
- video.**
-
-### Possibility for using hardware-accelerated h264/h265 video-decoding, if available.
-
-UxPlay uses [GStreamer](https://gstreamer.freedesktop.org) "plugins" for
-rendering audio and video. This means that video and audio are supported
-"out of the box", using a choice of plugins. AirPlay streams video in
-h264 format: gstreamer decoding is plugin agnostic, and uses accelerated
-GPU hardware h264 decoders if available; if not, software decoding is
-used.
-
-- **VA-API for Intel and AMD integrated graphics, NVIDIA with
- "Nouveau" open-source driver**
-
- With an Intel or AMD GPU, hardware decoding with the open-source
- VA-API gstreamer plugins is preferable. (Newer "va" versions of
- these plugins with names like "vah264dec" are recommended instead of
- older "vaapi" ones named like "vaapih264dec".) The open-source
- "Nouveau" drivers for NVIDIA graphics are also in principle
- supported: see
- [here](https://nouveau.freedesktop.org/VideoAcceleration.html), but
- this requires VAAPI to be supplemented with firmware extracted from
- the proprietary NVIDIA drivers.
-
-- **NVIDIA with proprietary drivers**
-
- The `nvh264dec` plugin (included in gstreamer1.0-plugins-bad since
- GStreamer-1.18.0) can be used for accelerated video decoding on the
- NVIDIA GPU after NVIDIA's CUDA driver `libcuda.so` is installed. For
- GStreamer-1.16.3 or earlier, the plugin is called `nvdec`, and must
- be [built by the
- user](https://github.com/FDH2/UxPlay/wiki/NVIDIA-nvdec-and-nvenc-plugins).
-
-- **Video4Linux2 support for h264 hardware decoding on Raspberry Pi
- (Pi 4B and older)**
-
- Raspberry Pi (RPi) computers (tested on Pi 4 Model B) can now run
- UxPlay using software video decoding, but hardware-accelerated
- h264/h265 decoding by firmware in the Pi's Broadcom 2835 GPU is
- prefered. UxPlay accesses this using the GStreamer-1.22 Video4Linux2
- (v4l2) plugin; Uses the out-of-mainline Linux kernel module
- bcm2835-codec maintained by Raspberry Pi, so far only included in
- Raspberry Pi OS, and two other distributions (Ubuntu, Manjaro)
- available with Raspberry Pi Imager. *(For GStreamer \< 1.22, see the
- [UxPlay
- Wiki](https://github.com/FDH2/UxPlay/wiki/Gstreamer-Video4Linux2-plugin-patches))*.
- Pi model 5 has no support for hardware H264 decoding, as its CPU is
- powerful enough for satisfactory software H264 decoding
-
-- **Support for h265 (HEVC) hardware decoding on Raspberry Pi (Pi 4
- model B and Pi 5)**
-
- These Raspberry Pi models have a dedicated HEVC decoding block (not
- the GPU), with a driver "rpivid" which is not yet in the mainline
- Linux kernel (but is planned to be there in future). Unfortunately
- it produces decoded video in a non-standard pixel format (NC30 or
- "SAND") which will not be supported by GStreamer until the driver is
- in the mainline kernel; without this support, UxPlay support for
- HEVC hardware decoding on Raspberry Pi will not work.
-
-### Note to packagers:
-
-UxPlay's GPLv3 license does not have an added "GPL exception" explicitly
-allowing it to be distributed in compiled form when linked to OpenSSL
-versions **prior to v. 3.0.0** (older versions of OpenSSL have a license
-clause incompatible with the GPL unless OpenSSL can be regarded as a
-"System Library", which it is in \*BSD). Many Linux distributions treat
-OpenSSL as a "System Library", but some (e.g. Debian) do not: in this
-case, the issue is solved by linking with OpenSSL-3.0.0 or later.
-
-# Building UxPlay from source
-
-Either download and unzip
-[UxPlay-master.zip](https://github.com/FDH2/UxPlay/archive/refs/heads/master.zip),
-or (if git is installed): "git clone https://github.com/FDH2/UxPlay".
-You can also download a recent or earlier version listed in
-[Releases](https://github.com/FDH2/UxPlay/releases).
-
-- A recent UxPlay can also be found on the original [antimof
- site](https://github.com/antimof/UxPlay); that original project is
- inactive, but is usually kept current or almost-current with the
- [active UxPlay github site](https://github.com/FDH2/UxPlay) (thank
- you antimof!).
-
-## Building UxPlay on Linux (or \*BSD):
-
-### Debian-based systems:
-
-(Adapt these instructions for non-Debian-based Linuxes or \*BSD; for
-macOS, see specific instruction below). See
-[Troubleshooting](#troubleshooting) below for help with any
-difficulties.
-
-You need a C/C++ compiler (e.g. g++) with the standard development
-libraries installed. Debian-based systems provide a package
-"build-essential" for use in compiling software. You also need
-pkg-config: if it is not found by "`which pkg-config`", install
-pkg-config or its work-alike replacement pkgconf. Also make sure that
-cmake\>=3.10 is installed: "`sudo apt install cmake`" (add
-`build-essential` and `pkg-config` (or `pkgconf`) to this if needed).
-
-Make sure that your distribution provides OpenSSL 1.1.1 or later, and
-libplist 2.0 or later. (This means Debian 10 "Buster" based systems
-(e.g, Ubuntu 18.04) or newer; on Debian 10 systems "libplist" is an
-older version, you need "libplist3".) If it does not, you may need to
-build and install these from source (see instructions at the end of this
-README).
-
-If you have a non-standard OpenSSL installation, you may need to set the
-environment variable OPENSSL_ROOT_DIR (*e.g.* ,
-"`export OPENSSL_ROOT_DIR=/usr/local/lib64`" if that is where it is
-installed). Similarly, for non-standard (or multiple) GStreamer
-installations, set the environment variable GSTREAMER_ROOT_DIR to the
-directory that contains the ".../gstreamer-1.0/" directory of the
-gstreamer installation that UxPlay should use (if this is *e.g.*
-"\~/my_gstreamer/lib/gstreamer-1.0/", set this location with
-"`export GSTREAMER_ROOT_DIR=$HOME/my_gstreamer/lib`").
-
-- Most users will use the GStreamer supplied by their distribution,
- but a few (in particular users of Raspberry Pi OS Lite Legacy
- (Buster) on a Raspberry Pi model 4B who wish to stay on that
- unsupported Legacy OS for compatibility with other apps) should
- instead build a newer Gstreamer from source following [these
- instructions](https://github.com/FDH2/UxPlay/wiki/Building-latest-GStreamer-from-source-on-distributions-with-older-GStreamer-(e.g.-Raspberry-Pi-OS-).)
- . **Do this *before* building UxPlay**.
-
-In a terminal window, change directories to the source directory of the
-downloaded source code ("UxPlay-\*", "\*" = "master" or the release tag
-for zipfile downloads, "UxPlay" for "git clone" downloads), then follow
-the instructions below:
-
-**Note:** By default UxPlay will be built with optimization for the
-computer it is built on; when this is not the case, as when you are
-packaging for a distribution, use the cmake option
-`-DNO_MARCH_NATIVE=ON`.
-
-If you use X11 Windows on Linux or \*BSD, and wish to toggle in/out of
-fullscreen mode with a keypress (F11 or Alt_L+Enter) UxPlay needs to be
-built with a dependence on X11. Starting with UxPlay-1.59, this will be
-done by default **IF** the X11 development libraries are installed and
-detected. Install these with "`sudo apt install libx11-dev`". If
-GStreamer \< 1.20 is detected, a fix needed by screen-sharing apps
-(*e.g.*, Zoom) will also be made.
-
-- If X11 development libraries are present, but you wish to build
- UxPlay *without* any X11 dependence, use the cmake option
- `-DNO_X11_DEPS=ON`.
-
-1. `sudo apt install libssl-dev libplist-dev`". (*unless you need to
- build OpenSSL and libplist from source*).
-2. `sudo apt install libavahi-compat-libdnssd-dev`
-3. `sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev`.
- (\**Skip if you built Gstreamer from source*)
-4. `cmake .` (*For a cleaner build, which is useful if you modify the
- source, replace this by* "`mkdir build; cd build; cmake ..`": *you
- can then delete the contents of the `build` directory if needed,
- without affecting the source.*) Also add any cmake "`-D`" options
- here as needed (e.g, `-DNO_X11_DEPS=ON` or `-DNO_MARCH_NATIVE=ON`).
-5. `make`
-6. `sudo make install` (you can afterwards uninstall with
- `sudo make uninstall` in the same directory in which this was run).
-
-This installs the executable file "`uxplay`" to `/usr/local/bin`, (and
-installs a manpage to somewhere standard like
-`/usr/local/share/man/man1` and README files to somewhere like
-`/usr/local/share/doc/uxplay`). (If "man uxplay" fails, check if
-\$MANPATH is set: if so, the path to the manpage (usually
-/usr/local/share/man/) needs to be added to \$MANPATH .) The uxplay
-executable can also be found in the build directory after the build
-process, if you wish to test before installing (in which case the
-GStreamer plugins must first be installed).
-
-### Building on non-Debian Linux and \*BSD
-
-\*\*For those with RPM-based distributions, a RPM spec file uxplay.spec
-is also available: see [Building an installable rpm
-package](#building-an-installable-rpm-package).
-
-- **Red Hat, or clones like CentOS (now continued as Rocky Linux or
- Alma Linux):** (sudo dnf install, or sudo yum install) openssl-devel
- libplist-devel avahi-compat-libdns_sd-devel gstreamer1-devel
- gstreamer1-plugins-base-devel (+libX11-devel for fullscreen X11)
- *(some of these may be in the "CodeReady" add-on repository, called
- "PowerTools" by clones)*
-
-- **Mageia, PCLinuxOS, OpenMandriva:** Same as Red Hat, except for
- name changes: (Mageia) "gstreamer1.0-devel",
- "gstreamer-plugins-base1.0-devel"; (OpenMandriva)
- "libopenssl-devel", "gstreamer-devel",
- "libgst-plugins-base1.0-devel". PCLinuxOS: same as Mageia, but uses
- synaptic (or apt) as its package manager.
-
-- **openSUSE:** (sudo zypper install) libopenssl-3-devel (formerly
- libopenssl-devel) libplist-2_0-devel (formerly libplist-devel)
- avahi-compat-mDNSResponder-devel gstreamer-devel
- gstreamer-plugins-base-devel (+ libX11-devel for fullscreen X11).
-
-- **Arch Linux** (*Also available as a package in AUR*): (sudo pacman
- -Syu) openssl libplist avahi gst-plugins-base.
-
-- **FreeBSD:** (sudo pkg install) libplist gstreamer1. Either
- avahi-libdns or mDNSResponder must also be installed to provide the
- dns_sd library. OpenSSL is already installed as a System Library.
-
-- **OpenBSD:** (doas pkg_add) libplist gstreamer1-plugins-base.
- avahi-libs must also be installed to provide the dns_sd library;
- (avahi-main must also be installed). OpenSSL is already installed as
- a System Library.
-
-#### Building an installable RPM package
-
-First-time RPM builders should first install the rpm-build and
-rpmdevtools packages, then create the rpmbuild tree with
-"`rpmdev-setuptree`". Then download and copy uxplay.spec into
-`~/rpmbuild/SPECS`. In that directory, run
-"`rpmdev-spectool -g -R uxplay.spec`" to download the corresponding
-source file `uxplay-*.tar.gz` into `~/rpmbuild/SOURCES`
-("rpmdev-spectool" may also be just called "spectool"); then run
-"`rpmbuild -ba uxplay.spec`" (you will need to install any required
-dependencies this reports). This should create the uxplay RPM package in
-a subdirectory of `~/rpmbuild/RPMS`. (**uxplay.spec** is tested on
-Fedora 38, Rocky Linux 9.2, openSUSE Leap 15.5, Mageia 9, OpenMandriva,
-PCLinuxOS; it can be easily modified to include dependency lists for
-other RPM-based distributions.)
-
-## Running UxPlay
-
-### Installing plugins (Debian-based Linux distributions, including Ubuntu and Raspberry Pi OS) (*skip if you built a complete GStreamer from source*)
-
-Next install the GStreamer plugins that are needed with
-`sudo apt install gstreamer1.0-`. Values of `` required
-are:
-
-1. "**plugins-base**"
-2. "**libav**" (for sound),
-3. "**plugins-good**" (for v4l2 hardware h264 decoding)
-4. "**plugins-bad**" (for h264 decoding).
-
-**Debian-based distributions split some of the plugin packages into
-smaller pieces:** some that may also be needed include "**gl**" for
-OpenGL support (this provides the "-vs glimagesink" videosink, which can
-be very useful in many systems (including Raspberry Pi), and should
-always be used when using h264/h265 decoding by a NVIDIA GPU),
-"**gtk3**" (which provides the "-vs gtksink" videosink), and "**x**" for
-X11 support, although these may already be installed. If sound is not
-working, "**alsa**"","**pulseaudio**", or "**pipewire**" plugins may
-need to be installed, depending on how your audio is set up.
-
-- A package "**vaapi**" is available for hardware-accelerated h264
- video decoding by Intel or AMD graphics (but not for use with NVIDIA
- using proprietary drivers). However this package contains older
- drivers (vaapisink, vaapih264dec, etc) that are no longer developed,
- **and should not be installed unless these needed**. The "va"
- plugins (vah264dec, etc.) that replace the "vaapi" plugins are
- provided in "**plugins-bad**": and use standard videosinks
- (xvimagesink, glimagesink, etc.) instead of the special videosink
- "vaapisink" used by "vaapi" plugins.
-
-- Also install "**gstreamer1.0-tools**" to get the utility
- gst-inspect-1.0 for examining the GStreamer installation.
-
-### Installing plugins (Non-Debian-based Linux or \*BSD) (*skip if you built a complete GStreamer from source*)
-
-In some cases, because of patent issues, the libav plugin feature
-**avdec_aac** needed for decoding AAC audio in mirror mode is not
-provided in the official distribution: get it from community
-repositories for those distributions. \_Note: the (deprecated) "vaapi"
-packages listed below are no longer recommended: newer "va" versions of
-the VA-API plugins for Intel/AMD graphics are provided by
-\*-plugins-bad.\_
-
-- **Red Hat, or clones like CentOS (now continued as Rocky Linux or
- Alma Linux):** Install gstreamer1-libav gstreamer1-plugins-bad-free
- (*deprecated:* gstreamer1-vaapi for Intel/AMD graphics). In recent
- Fedora, gstreamer1-libav is renamed gstreamer1-plugin-libav. **To
- get avdec_aac, install packages from
- [rpmfusion.org](https://rpmfusion.org)**: (get ffmpeg-libs from
- rpmfusion; on RHEL or clones, but not recent Fedora, also get
- gstreamer1-libav from there).
-
-- **Mageia, PCLinuxOS, OpenMandriva:** Install gstreamer1.0-libav
- gstreamer1.0-plugins-bad (*deprecated:* gstreamer1.0-vaapi for
- Intel/AMD graphics). **On Mageia, to get avdec_aac, install ffmpeg
- from the "tainted" repository**, (which also provides a more
- complete gstreamer1.0-plugins-bad).
-
-- **openSUSE:** Install gstreamer-plugins-libav gstreamer-plugins-bad
- (*deprecated:* gstreamer-plugins-vaapi for Intel/AMD graphics). **To
- get avdec_aac, install libav\* packages for openSUSE from
- [Packman](https://ftp.gwdg.de/pub/linux/misc/packman/suse/)
- "Essentials"**; recommendation: after adding the Packman repository,
- use the option in YaST Software management to switch all system
- packages for multimedia to Packman).
-
-- **Arch Linux** Install gst-plugins-good gst-plugins-bad gst-libav
- (*deprecated:* gstreamer-vaapi for Intel/AMD graphics).
-
-- **FreeBSD:** Install gstreamer1-libav, gstreamer1-plugins,
- gstreamer1-plugins-\* (\* = core, good, bad, x, gtk, gl, vulkan,
- pulse, v4l2, ...), (*deprecated:* gstreamer1-vaapi for Intel/AMD
- graphics).
-
-- **OpenBSD:** Install gstreamer1-libav, gstreamer-plugins-\* (\* =
- core, bad, base, good).
-
-### Starting and running UxPlay
-
-Since UxPlay-1.64, UxPlay can be started with options read from a
-configuration file, which will be the first found of (1) a file with a
-path given by environment variable `$UXPLAYRC`, (2) `~/.uxplayrc` in the
-user's home directory ("\~"), (3) `~/.config/uxplayrc`. The format is
-one option per line, omitting the initial `"-"` of the command-line
-option. Lines in the configuration file beginning with `"#"` are treated
-as comments and ignored.
-
-**Run uxplay in a terminal window**. On some systems, you can specify
-fullscreen mode with the `-fs` option, or toggle into and out of
-fullscreen mode with F11 or (held-down left Alt)+Enter keys. Use Ctrl-C
-(or close the window) to terminate it when done.
-
-If the UxPlay server is not seen by the iOS client's drop-down "Screen
-Mirroring" panel, check that your DNS-SD server (usually avahi-daemon)
-is running: do this in a terminal window with
-`systemctl status avahi-daemon`. If this shows the avahi-daemon is not
-running, control it with
-`sudo systemctl [start,stop,enable,disable] avahi-daemon` (on
-non-systemd systems, such as \*BSD, use
-`sudo service avahi-daemon [status, start, stop, restart, ...]`). If
-UxPlay is seen, but the client fails to connect when it is selected,
-there may be a firewall on the server that prevents UxPlay from
-receiving client connection requests unless some network ports are
-opened: **if a firewall is active, also open UDP port 5353 (for mDNS
-queries) needed by Avahi**. See [Troubleshooting](#troubleshooting)
-below for help with this or other problems.
-
-Note that there is now an alternative Service Discovery method using a
-Bluetooth LE beacon. See the instructions on [Bluetooth beacon
-setup](#bluetooth-le-beacon-setup).
-
-- Unlike an Apple TV, the UxPlay server does not by default require
- clients to initially "pair" with it using a pin code displayed by
- the server (after which the client "trusts" the server, and does not
- need to repeat this). Since v1.67, Uxplay offers such
- "pin-authentication" as an option: see "`-pin`" and "`-reg`" in
- [Usage](#usage) for details, if you wish to use it. *Some clients
- with MDM (Mobile Device Management, often present on employer-owned
- devices) are required to use pin-authentication: UxPlay will provide
- this even when running without the pin option.* Password
- authentication (-pw *pwd*) is also offered as an alternative
- solution to pin codes: users need to know the password *pwd* and
- enter it on their iOS/macOS device to access UxPlay, when prompted
- (if *pwd* is not set, a displayed random pin code must be entered at
- **each** new connection.)
-
-- By default, UxPlay is locked to its current client until that client
- drops the connection; since UxPlay-1.58, the option `-nohold`
- modifies this behavior so that when a new client requests a
- connection, it removes the current client and takes over. UxPlay
- 1.66 introduces a mechanism ( `-restrict`, `-allow `,
- `-block `) to control which clients are allowed to connect,
- using their "deviceID" (which in Apple devices appears to be
- immutable).
-
-- In Mirror mode, GStreamer has a choice of **two** methods to play
- video with its accompanying audio: prior to UxPlay-1.64, the video
- and audio streams were both played as soon as possible after they
- arrived (the GStreamer "*sync=false*" method), with a GStreamer
- internal clock used to try to keep them synchronized. **Starting
- with UxPlay-1.64, the other method (GStreamer's "*sync=true*" mode),
- which uses timestamps in the audio and video streams sent by the
- client, is the new default**. On low-decoding-power UxPlay hosts
- (such as Raspberry Pi Zero W or 3 B+ models) this will drop video
- frames that cannot be decoded in time to play with the audio, making
- the video jerky, but still synchronized.
-
-The older method which does not drop late video frames worked well on
-more powerful systems, and is still available with the UxPlay option
-"`-vsync no`"; this method is adapted to "live streaming", and may be
-better when using UxPlay as a second monitor for a Mac computer, for
-example, while the new default timestamp-based method is best for
-watching a video, to keep lip movements and voices synchronized.
-(Without use of timestamps, video will eventually lag behind audio if it
-cannot be decoded fast enough: hardware-accelerated video-decoding
-helped to prevent this previously when timestamps were not being used.)
-
-- In Audio-only mode the GStreamer "sync=false" mode (not using
- timestamps) is still the default, but if you want to keep the audio
- playing on the server synchronized with the video showing on the
- client, use the `-async` timestamp-based option. (An example might
- be if you want to follow the Apple Music lyrics on the client while
- listening to superior sound on the UxPlay server). This delays the
- video on the client to match audio on the server, so leads to a
- slight delay before a pause or track-change initiated on the client
- takes effect on the audio played by the server.
-
-AirPlay volume-control attenuates volume (gain) by up to -30dB: the
-decibel range -30:0 can be rescaled from *Low*:0, or *Low*:*High*, using
-the option `-db` ("-db *Low*" or "-db *Low*:*High*"), *Low* must be
-negative. Rescaling is linear in decibels. Note that GStreamer's audio
-format will "clip" any audio gain above +20db, so keep *High* below that
-level. The option `-taper` provides a "tapered" AirPlay volume-control
-profile some users may prefer.
-
-The -vsync and -async options also allow an optional positive (or
-negative) audio-delay adjustment in *milliseconds* for fine-tuning :
-`-vsync 20.5` delays audio relative to video by 0.0205 secs; a negative
-value advances it.)
-
-- you may find video is improved by the setting -fps 60 that allows
- some video to be played at 60 frames per second. (You can see what
- framerate is actually streaming by using -vs fpsdisplaysink, and/or
- -FPSdata.) When using this, you should use the default
- timestamp-based synchronization option `-vsync`.
-
-- You can now display (inside UxPlay) the accompanying "Cover Art"
- from sources like Apple Music in Audio-Only (ALAC) mode with the
- option `uxplay -ca`. *The older method of exporting cover art to an
- external viewer remains available: run "`uxplay -ca &`" in
- the background, then run a image viewer with an autoreload feature:
- an example is "feh": run "`feh -R 1 `" in the foreground;
- terminate feh and then Uxplay with "`ctrl-C fg ctrl-C`"*.
-
-By default, GStreamer uses an algorithm to search for the best
-"videosink" (GStreamer's term for a graphics driver to display images)
-to use. You can overide this with the uxplay option `-vs `.
-Which videosinks are available depends on your operating system and
-graphics hardware: use
-"`gst-inspect-1.0 | grep sink | grep -e video -e Video -e image`" to see
-what is available. Some possibilites on Linux/\*BSD are:
-
-- **glimagesink** (OpenGL), **waylandsink**
-
-- **xvimagesink**, **ximagesink** (X11)
-
-- **kmssink**, **fbdevsink** (console graphics without X11)
-
-- **vaapisink** (*deprecated*,for Intel/AMD hardware-accelerated
- graphics) is obsolete: instead use **glimagesink** or **xvmagesink**
- (with hardware decoding by "vah264dec\`, which may get selected
- automatically, but can be explicitly specified with the"-vd "
- option.)
-
-- for NVIDIA hardware graphics (with CUDA) use **glimagesink**
- combined with "`-vd nvh264dec`".
-
-- If the server is "headless" (no attached monitor, renders audio
- only) use `-vs 0`.
-
-Note that videosink options can set using quoted arguments to -vs:
-*e.g.*, `-vs "xvimagesink display=:0"`: ximagesink and xvimagesink allow
-an X11 display name to be specified, and waylandsink has a similar
-option. Videosink options ("properties") can be found in their GStreamer
-description pages,such as
-https://gstreamer.freedesktop.org/documentation/xvimagesink .
-
-GStreamer also searches for the best "audiosink"; override its choice
-with `-as `. Choices on Linux include pulsesink, alsasink,
-pipewiresink, oss4sink; see what is available with
-`gst-inspect-1.0 | grep sink | grep -e audio -e Audio`.
-
-**One common problem involves GStreamer attempting to use
-incorrectly-configured or absent accelerated hardware h264 video
-decoding (e.g., VAAPI). Try "`uxplay -avdec`" to force software video
-decoding; if this works you can then try to fix accelerated hardware
-video decoding if you need it, or just uninstall the GStreamer vaapi
-plugin if it is installed .**
-
-See [Usage](#usage) for more run-time options.
-
-### **Special instructions for Raspberry Pi (tested on Raspberry Pi Zero 2 W, 3 Model B+, 4 Model B, and 5 only)**:
-
-- For Framebuffer video (for Raspberry Pi OS "Lite" and other non-X11
- distributions) use the KMS videosink "-vs kmssink" (the DirectFB
- framebuffer videosink "dfbvideosink" is broken on the Pi, and
- segfaults). *In this case you should explicitly use the "-vs
- kmssink" option, as without it, autovideosink does not find the
- correct videosink.*
-
-- Raspberry Pi 5 does not provide hardware H264 decoding (and does not
- need it).
-
-- Pi Zero 2 W, 3 Model B+ and 4 Model B should use hardware H264
- decoding by the Broadcom GPU, but it requires an out-of-mainstream
- kernel module bcm2835_codec maintained in the [Raspberry Pi kernel
- tree](https://github.com/raspberrypi/linux); distributions that are
- known to supply it include Raspberry Pi OS, Ubuntu, and
- Manjaro-RPi4. Use software decoding (option -avdec) if this module
- is not available.
-
-- Uxplay uses the Video4Linux2 (v4l2) plugin from GStreamer-1.22 and
- later to access the GPU, if hardware H264 decoding is used. This
- should happen automatically. The option -v4l2 can be used, but it is
- usually best to just let GStreamer find the best video pipeline by
- itself.
-
-- On older distributions (GStreamer \< 1.22), the v4l2 plugin needs a
- patch: see the [UxPlay
- Wiki](https://github.com/FDH2/UxPlay/wiki/Gstreamer-Video4Linux2-plugin-patches).
- Legacy Raspberry Pi OS (Bullseye) has a partially-patched
- GStreamer-1.18.4 which needs the uxplay option -bt709 (and don't use
- -v4l2); it is still better to apply the full patch from the UxPlay
- Wiki in this case.
-
-- **It appears that when hardware h264 video decoding is used, the
- option -bt709 became needed again in GStreamer-1.22 and later.**
-
-- For "double-legacy" Raspberry Pi OS (Buster), there is no patch for
- GStreamer-1.14. Instead, first build a complete newer
- GStreamer-1.18.6 from source using [these
- instructions](https://github.com/FDH2/UxPlay/wiki/Building-latest-GStreamer-from-source-on-distributions-with-older-GStreamer-(e.g.-Raspberry-Pi-OS-).)
- before building UxPlay.
-
-- Raspberry Pi 3 Model B+ running a 32 bit OS can also access the GPU
- with the GStreamer OMX plugin (use option "`-vd omxh264dec`"), but
- this is broken by Pi 4 Model B firmware. OMX support was removed
- from Raspberry Pi OS (Bullseye), but is present in Buster.
-
-- **H265 (4K)** video is potentially supported by hardware decoding on
- Raspberry Pi 5 models, as well as on Raspberry Pi 4 model B, using a
- dedicated HEVC decoding block, but the "rpivid" kernel driver for
- this is not yet supported by GStreamer (this driver decodes video
- into a non-standard format that cannot be supported by GStreamer
- until the driver is in the mainline Linux kernel). Raspberry Pi
- provides a version of ffmpeg that can use that format, but at
- present UxPlay cannot use this. The best solution would be for the
- driver to be "upstreamed" to the kernel, allowing GStreamer support.
- (Software HEVC decoding works, but does not seem to give
- satisfactory results on the Pi).
-
-Even with GPU video decoding, some frames may be dropped by the
-lower-power models to keep audio and video synchronized using
-timestamps. In Legacy Raspberry Pi OS (Bullseye), raspi-config
-"Performance Options" allows specifying how much memory to allocate to
-the GPU, but this setting appears to be absent in Bookworm (but it can
-still be set to e.g. 128MB by adding a line "gpu_mem=128" in
-/boot/config.txt). A Pi Zero 2 W (which has 512MB memory) worked well
-when tested in 32 bit Bullseye or Bookworm Lite with 128MB allocated to
-the GPU (default seems to be 64MB).
-
-The basic uxplay options for R Pi are `uxplay [-vs ]`. The
-choice `` = `glimagesink` is sometimes useful. With the
-Wayland video compositor, use `` = `waylandsink`. With
-framebuffer video, use `` = `kmssink`.
-
-- Tip: to start UxPlay on a remote host (such as a Raspberry Pi) using
- ssh:
-
-
-
- ssh user@remote_host
- export DISPLAY=:0
- nohup uxplay [options] > FILE &
-
-Sound and video will play on the remote host; "nohup" will keep uxplay
-running if the ssh session is closed. Terminal output is saved to FILE
-(which can be /dev/null to discard it)
-
-## Building UxPlay on macOS: **(Intel X86_64 and "Apple Silicon" M1/M2 Macs)**
-
-*Note: A native AirPlay Server feature is included in macOS since macOS
-12 Monterey, but is restricted to recent hardware. As well as running on
-latest macOS, UxPlay can run on older macOS systems that will cannot run
-Monterey, or can run Monterey but not AirPlay.*
-
-These instructions for macOS assume that the Xcode command-line
-developer tools are installed (if Xcode is installed, open the Terminal,
-type "sudo xcode-select --install" and accept the conditions).
-
-It is also assumed that CMake \>= 3.13 is installed: this can be done
-with package managers [MacPorts](http://www.macports.org)
-(`sudo port install cmake`), [Homebrew](http://brew.sh)
-(`brew install cmake`), or by a download from
-. Also install `git` if you will use it to
-fetch UxPlay.
-
-Next install libplist and openssl-3.x. Note that static versions of
-these libraries will be used in the macOS builds, so they can be
-uninstalled after building uxplay, if you wish.
-
-- If you use Homebrew: `brew install libplist openssl@3`
-
-- if you use MacPorts: `sudo port install libplist-devel openssl3`
-
-Otherwise, build libplist and openssl from source: see instructions near
-the end of this README; requires development tools (autoconf, automake,
-libtool, *etc.*) to be installed.
-
-Next get the latest macOS release of GStreamer-1.0.
-
-**Using "Official" GStreamer (Recommended for both MacPorts and Homebrew
-users)**: install the GStreamer release for macOS from
-. (This release contains
-its own pkg-config, so you don't have to install one.) Install both the
-gstreamer-1.0 and gstreamer-1.0-devel packages. After downloading,
-Shift-Click on them to install (they install to
-/Library/FrameWorks/GStreamer.framework). Homebrew or MacPorts users
-should **not** install (or should uninstall) the GStreamer supplied by
-their package manager, if they use the "official" release.
-
-- Since GStreamer v1.22, the "Official" (gstreamer.freedesktop.org)
- macOS binaries require a wrapper "gst_macos_main" around the actual
- main program (uxplay). This should have been applied during the
- UxPlay compilation process, and the initial UxPlay terminal message
- should confirm it is being used. (UxPlay can also be built using
- "Official" GStreamer v.1.20.7 binaries, which work without the
- wrapper.)
-
-**Using Homebrew's GStreamer**: pkg-config is needed: ("brew install
-pkg-config gstreamer"). This causes a large number of extra packages to
-be installed by Homebrew as dependencies. The [Homebrew gstreamer
-installation](https://formulae.brew.sh/formula/gstreamer#default) has
-recently been reworked into a single "formula" named `gstreamer`, which
-now works without needing GST_PLUGIN_PATH to be set in the enviroment.
-Homebrew installs gstreamer to `HOMEBREW_PREFIX/lib/gstreamer-1.0` where
-by default `HOMEBREW_PREFIX/*` is `/opt/homebrew/*` on Apple Silicon
-Macs, and `/usr/local/*` on Intel Macs; do not put any extra
-non-Homebrew plugins (that you build yourself) there, and instead set
-GST_PLUGIN_PATH to point to their location (Homebrew does not supply a
-complete GStreamer, but seems to have everything needed for UxPlay).
-**New: the UxPlay build script will now also detect Homebrew
-installations in non-standard locations indicated by the environment
-variable `$HOMEBREW_PREFIX`.**
-
-**Using GStreamer installed from MacPorts**: MacPorts is now providing
-recent GStreamer releases: install pkgconf ("sudo port install
-pkgconf"), then "sudo port install gstreamer1
-gstreamer1-gst-plugins-base gstreamer1-gst-plugins-good
-gstreamer1-gst-plugins-bad gstreamer1-gst-libav". (The following may no
-longer be relevant: *For X11 support on macOS, compile UxPlay using a
-special cmake option `-DUSE_X11=ON`, and run it from an XQuartz terminal
-with -vs ximagesink; older non-retina macs require a lower resolution
-when using X11: `uxplay -s 800x600`.)*
-
-After installing GStreamer, build and install uxplay: open a terminal
-and change into the UxPlay source directory ("UxPlay-master" for zipfile
-downloads, "UxPlay" for "git clone" downloads) and build/install with
-"cmake . ; make ; sudo make install" (same as for Linux).
-
-- Running UxPlay while checking for GStreamer warnings (do this with
- "export GST_DEBUG=2" before runnng UxPlay) reveals that with the
- default (since UxPlay 1.64) use of timestamps for video
- synchonization, many video frames are being dropped (only on macOS),
- perhaps due to another error (about videometa) that shows up in the
- GStreamer warnings. **Recommendation: use the UxPlay "no timestamp"
- option "`-vsync no`"** (you can add a line "vsync no" in the
- uxplayrc configuration file).
-
-- On macOS with this installation of GStreamer, the only videosinks
- available are glimagesink (default choice made by autovideosink) and
- osxvideosink. The window title does not show the Airplay server
- name, but the window can be shared on Zoom. Because of issues with
- glimagesink, you may find osxvideosink works better. The only
- available audiosink is osxaudiosink.
-
-- The option -nc is currently used by default on macOS, This is a
- workaround for window-closing problems with GStreamer videosinks on
- macOS. This option can be canceled with "-nc no", if not needed.
-
-- In the case of glimagesink, the resolution settings "-s wxh" may not
- affect the (small) initial OpenGL mirror window size, but the window
- can be expanded using the mouse or trackpad.
-
-## Building UxPlay on Microsoft Windows, using MSYS2 with the MinGW-64 compiler.
-
-- tested on Windows 10 and 11, 64-bit.
-
-1. Download and install **Bonjour SDK for Windows v3.0**. You can
- download the SDK without any registration at
- [softpedia.com](https://www.softpedia.com/get/Programming/SDK-DDK/Bonjour-SDK.shtml),
- or get it from the official Apple site
- [https://developer.apple.com/download](https://developer.apple.com/download/all/?q=Bonjour%20SDK%20for%20Windows)
- (Apple makes you register as a developer to access it from their
- site). This should install the Bonjour SDK as
- `C:\Program Files\Bonjour SDK`.
-
-- **NEW: while you still need to install the Bonjour SDK to build
- UxPlay, there is now an alternative method for Service Discovery
- using a Bluetooth Low Energy (BLE) beacon. A Windows-based python
- script for running the beacon is available for this.** See
- [instructions below](#bluetooth-le-beacon-setup).
-
-2. (This is for 64-bit Windows; a build for 32-bit Windows should be
- possible, but is not tested.) The unix-like MSYS2 build environment
- will be used: download and install MSYS2 from the official site
- [https://www.msys2.org/](https://www.msys2.org). Accept the default
- installation location `C:\mysys64`.
-
-3. [MSYS2 packages](https://packages.msys2.org/package/) are installed
- with a variant of the "pacman" package manager used by Arch Linux.
- Open a "MSYS2" terminal from the MSYS2 tab in the Windows Start
- menu, and update the new MSYS2 installation with "pacman -Syu".
-
- - \_NEW: MSYS2 now recommends using the newer UCRT64 terminal
- environment (which uses the newer Microsoft UCRT "Universal C
- RunTime Library", included as part of the Windows OS since
- Windows 10) rather than the MINGW64 terminal environment (which
- uses the older Microsoft MSVCRT C library, which has "legacy"
- status, but is available on all Windows systems). If you wish to
- use the legacy MSVCRT library, to support older Windows
- versions, modify the instructions below as follows:
-
- (1) change the MSYS2 terminal type from UCRT64 to MINGW64; (2)
- modify mingw-w64-ucrt-x86_64-\* package names to
- mingw-w64-x86_64-\*, (just omit "-ucrt");
- (2) replace `ucrt64` by `mingw64` in directory names.\_
-
- Open a new MSYS2 UCRT64 terminal, and install the gcc compiler and
- cmake:
-
- `pacman -S mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-gcc`
-
- We will simply build UxPlay from the command line in the MSYS2
- environment (using "`ninja`" in place of "`make`" for the build
- system).
-
-4. Download the latest UxPlay from github **(to use `git`, install it
- with `pacman -S git`, then
- "`git clone https://github.com/FDH2/UxPlay`")**, then install UxPlay
- dependencies (openssl is already installed with MSYS2):
-
- `pacman -S mingw-w64-ucrt-x86_64-libplist mingw-w64-ucrt-x86_64-gstreamer mingw-w64-ucrt-x86_64-gst-plugins-base`
-
- If you are trying a different Windows build system, MSVC versions of
- GStreamer for Windows are available from the [official GStreamer
- site](https://gstreamer.freedesktop.org/download/), but only the
- MinGW 64-bit build on MSYS2 has been tested.
-
-5. cd to the UxPlay source directory, then "`mkdir build`" and
- "`cd build`". The build process assumes that the Bonjour SDK is
- installed at `C:\Program Files\Bonjour SDK`. If it is somewhere
- else, set the enviroment variable BONJOUR_SDK_HOME to point to its
- location. Then build UxPlay with
-
- `cmake ..`
-
- `ninja`
-
-6. Assuming no error in either of these, you will have built the uxplay
- executable **uxplay.exe** in the current ("build") directory. The
- "sudo make install" and "sudo make uninstall" features offered in
- the other builds are not available on Windows; instead, you can
- install the uxplay.exe executable in `C:/msys64/ucrt64/bin` (plus
- manpage and documentation in `C:/msys64/ucrt64/share/...`) with
-
- `cmake --install . --prefix $HOME/../../ucrt64`
-
- You can later uninstall uxplay by returning to the build directory
- and running
-
- `ninja uninstall`
-
- (This assumes that certain files in the build directory were not
- deleted since building UxPlay).
-
- To be able to view the manpage, you need to install the manpage
- viewer with "`pacman -S man`".
-
-To run **uxplay.exe** you need to install some gstreamer plugin packages
-with `pacman -S mingw-w64-ucrt-x86_64-gst-`, where the required
-ones have `` given by
-
-1. **libav**
-2. **plugins-good**
-3. **plugins-bad**
-
-Other possible MSYS2 gstreamer plugin packages you might use are listed
-in [MSYS2 packages](https://packages.msys2.org/package/).
-
-You also will need to grant permission to the uxplay executable
-uxplay.exe to access data through the Windows firewall. You may
-automatically be offered the choice to do this when you first run
-uxplay, or you may need to do it using **Windows Settings-\>Update and
-Security-\>Windows Security-\>Firewall & network protection -\> allow an
-app through firewall**. If your virus protection flags uxplay.exe as
-"suspicious" (but without a true malware signature) you may need to give
-it an exception.
-
-Now test by running "`uxplay`" (in a MSYS2 UCRT64 terminal window. If
-you need to specify the audiosink, there are two main choices on
-Windows: the older DirectSound plugin "`-as directsoundsink`", and the
-more modern Windows Audio Session API (wasapi) plugin
-"`-as wasapisink`", which supports [additional
-options](https://gstreamer.freedesktop.org/documentation/wasapi/wasapisink.html)
-such as
-
- uxplay -as 'wasapisink device=\"\"'
-
-where `` specifies an available audio device by its GUID, which
-can be found using "`gst-device-monitor-1.0 Audio`": `` has a form
-like `\{0.0.0.00000000\}.\{98e35b2b-8eba-412e-b840-fd2c2492cf44\}`. If
-"`device`" is not specified, the default audio device is used.
-
-If you wish to specify the videosink using the `-vs ` option,
-some choices for `` are `d3d12videosink`, `d3d11videosink`,
-`d3dvideosink`, `glimagesink`, `gtksink`, `autovideosink`. *There have
-been reports of segfaults of the newer d3d12 videodecoder on certain
-older Nvidia cards when the image resolution changes, e.g., when the iOS
-client is rotated between portrait and landcape modes: this was a
-GStreamer issue that is apparently now fixed (a workaround is to use
-d3d11).*
-
-- On Windows, with Direct3D 11.0 or greater, various options can be
- set using e.g. `-vs "d3d11videosink "` (see the gstreamer
- videosink documentation for these videosinks). For convenience, if
- no `` are set, the option to toggle in and out of
- fullscreen mode with the Alt-Enter key combination is added. **It is
- recommended that Windows users add a line `-vs d3d12videosink` in
- their UxPlay startup file, to get this toggle option (autovideosink
- will usually select d3d12videosink, but will not provide the toggle
- option**).
-
-The executable uxplay.exe can also be run without the MSYS2 environment,
-in the Windows Terminal, with `C:\msys64\ucrt64\bin\uxplay`.
-
-There is a new modernized Windows Terminal application available from
-Microsoft that provides various terminals, and can be customized to also
-provide the MSYS2 terminals. See https://www.msys2.org/docs/terminals/
-(to make those instructions clearer: in the dropdown "Settings" menu,
-there is a second "settings" icon in the lower left corner: click on
-that to edit the settings.json file as described).
-
-The server name (-n ``{=html} option) can be given in
-internationalized UTF-8 encoding: To enter UTF-8 characters in the MSYS2
-or other Windows terminals, use the numerical keypad with "Num Lock" on:
-while holding down the "Alt" key, type "+" on the keypad, followed by
-the UTF-8 hex code for the character (using the keypad for numbers),
-then release the "Alt" key. (The UTF-8 hex codes have 4 hex digits: for
-example, the "copyright" symbol has hex code 00a9.) *This method must be
-activated in the Windows Registry: using regedit, find the Registry
-section 'HKEY_Current_User/Control Panel/Input Method", and add a new
-Key "EnableHexNumpad" with value "1", then reboot the computer.*
-
-# Usage
-
-Options:
-
-- These can also be written (one option per line, without the initial
- "`-`" character) in the UxPlay startup file (either given by
- environment variable `$UXPLAYRC`, or `~/.uxplayrc` or
- `~/.config/uxplayrc`); lines begining with "`#`" are treated as
- comments, and ignored. Command line options supersede options in the
- startup file.
-
-**-rc *file*** can also be used to specify the startup file location:
-this overrides `$UXPLAYRC`, `~/.uxplayrc`, etc.
-
-**-n server_name** (Default: UxPlay); server_name@\_hostname\_ will be
-the name that appears offering AirPlay services to your iPad, iPhone
-etc, where *hostname* is the name of the server running uxplay. This
-will also now be the name shown above the mirror display (X11) window.
-**Internationalized server names encoded as UTF-8 are accepted.**
-
-**-nh** Do not append "@_hostname_" at the end of the AirPlay server
-name.
-
-**-h265** Activate "ScreenMultiCodec" support (AirPlay "Features" bit
-42) for accepting h265 (4K/HEVC) video in addition to h264 video (1080p)
-in screen-mirror mode. When this option is used, two "video pipelines"
-(one for h264, one for h265) are created. If any GStreamer plugins in
-the pipeline are specific for h264 or h265, the correct version will be
-used in each pipeline. A wired Client-Server ethernet connection is
-preferred over Wifi for 4K video, and might be required by the client.
-Only recent Apple devices (M1/M2 Macs or iPads, and some iPhones) can
-send h265 video if a resolution "-s wxh" with h \> 1080 is requested.
-The "-h265" option changes the default resolution ("-s" option) from
-1920x1080 to 3840x2160, and leaves default maximum framerate ("-fps"
-option) at 30fps.
-
-**-mp4 \[fn\]** Record mirror-mode and audio-mode audio/video to a mp4
-file, while watching/listening. File name is fn.n.(format).mp4, (default
-"fn" = "recording"). The number `n` = 1,2,... increments with each new
-connection. "format" (e.g. "H264.AAC") indicates H264/H265 video,
-AAC/ALAC audio.
-
-**-hls \[v\]** Activate HTTP Live Streaming support. With this option
-YouTube videos can be streamed directly from YouTube servers to UxPlay
-(without passing through the client) by clicking on the AirPlay icon in
-the YouTube app. Optional \[v\] (allowed values 2 or 3, default: 3)
-allows selection of the version of GStreamer's \"playbin\" video player
-to use for playing HLS video. *(Playbin v3 is the recommended player,
-but if some videos fail to play, you can try with version 2.)*
-
-**-lang \[list\]** Specify language preferences for YouTube app HLS
-videos, some of which now which offer a choice of language (based on AI
-dubbing). If this option is not used, preferences will be taken from
-environment variable \$LANGUAGE, if set. Both methods specify the
-preference order by a list: e.g., `fr:es:en`, for French (first choice),
-Spanish (second choice), and English (third choice). If option `-lang`
-is not followed by a list (or `-list 0` is used), \$LANGUAGE is ignored
-and undubbed audio is played.
-
-**-scrsv n**. (since 1.73) (So far, only implemented on Linux/\*BSD
-systems using D-Bus). Inhibit the screensaver in the absence of keyboard
-input (e.g., while watching video), using the
-org.freedesktop.ScreenSaver D-Bus service: n = 0: (off) n= 1 (on during
-video activity) n=2 (always on). *Note: to verify this feature is
-working, you can use `dbus-monitor` to view events on the D-Bus;
-depending on the Desktop Environment, commands like
-`gnome-session-inhibit -l`, `xfce4-screensaver-commannd -q`, etc.,
-should list UxPlay when it is inhibiting the screensaver.*
-
-**-pin \[nnnn\]**: (since v1.67) use Apple-style (one-time) "pin"
-authentication when a new client connects for the first time: a
-four-digit pin code is displayed on the terminal, and the client screen
-shows a login prompt for this to be entered. When "-pin" is used by
-itself, a new random pin code is chosen for each authentication; if
-"-pin nnnn" (e.g., "-pin 3939") is used, this will set an unchanging
-fixed code. Authentication adds the server to the client's list of
-"trusted servers" and the client will not need to reauthenticate
-provided that the client and server public keys remain unchanged. (By
-default since v1.68, the server public key is generated from the MAC
-address, which can be changed with the -m option; see the -key option
-for an alternative method of key generation). *(Add a line "pin" in the
-UxPlay startup file if you wish the UxPlay server to use the pin
-authentication protocol).*
-
-**-reg \[*filename*\]**: (since v1.68). If "-pin" is used, this option
-maintains a register of pin-authenticated "trusted clients" in
-\$HOME/.uxplay.register (or optionally, in *filename*). Without this
-option, returning clients that skip pin-authentication are trusted and
-not checked. This option may be useful if UxPlay is used in a more
-public environment, to record client details; the register is text, one
-line per client, with client's public key (base-64 format), Device ID,
-and Device name; commenting out (with "\#") or deleting a line
-deregisters the corresponding client (see options -restrict, -block,
--allow for more ways to control client access). *(Add a line "reg" in
-the startup file if you wish to use this feature.)*
-
-**-pw** \[*pwd*\]. (since 1.72). As an alternative to -pin, client
-access can be controlled with a password. If a password *pwd* (of length
-at least six characters) is set when uxplay starts (usually set in the
-startup file, where it is stored as cleartext), all users must know this
-password to connect to UxPlay (the client prompts for it). This method
-uses HTTP md5 Digest authentication, which is now regarded as providing
-weak security, but it is only used to validate the uxplay password, and
-no user credentials are exposed. After a successful authentication, the
-client stores the password, and will use it initially for future
-authentications without prompting, so long as the UxPlay deviceID has
-not changed (this initial authentication will fail if the UxPlay
-password has changed). If *pwd* is **not** specified with the -pw option
-when UxPlay starts, a new random 4-digit pin code is generated and
-displayed on the UxPlay terminal for **each** new connection, and must
-be entered on the client (there are three chances to enter it, before it
-is changed). *Note: -pin and -pw are alternatives: if both are specified
-at startup, the earlier of these two options is discarded.*
-
-**-vsync \[x\]** (In Mirror mode:) this option (**now the default**)
-uses timestamps to synchronize audio with video on the server, with an
-optional audio delay in (decimal) milliseconds (*x* = "20.5" means
-0.0205 seconds delay: positive or negative delays less than a second are
-allowed.) It is needed on low-power systems such as Raspberry Pi without
-hardware video decoding.
-
-**-vsync no** (In Mirror mode:) this switches off timestamp-based
-audio-video synchronization, restoring the default behavior prior to
-UxPlay-1.64. Standard desktop systems seem to work well without use of
-timestamps: this mode is appropriate for "live streaming" such as using
-UxPlay as a second monitor for a mac computer, or monitoring a webcam;
-with it, no video frames are dropped.
-
-**-async \[x\]** (In Audio-Only (ALAC) mode:) this option uses
-timestamps to synchronize audio on the server with video on the client,
-with an optional audio delay in (decimal) milliseconds (*x* = "20.5"
-means 0.0205 seconds delay: positive or negative delays less than a
-second are allowed.) Because the client adds a video delay to account
-for latency, the server in -async mode adds an equivalent audio delay,
-which means that audio changes such as a pause or a track-change will
-not take effect immediately. *This might in principle be mitigated by
-using the `-al` audio latency setting to change the latency (default
-0.25 secs) that the server reports to the client, but at present
-changing this does not seem to have any effect*.
-
-**-async no**. This is the still the default behavior in Audio-only
-mode, but this option may be useful as a command-line option to switch
-off a `-async` option set in a "uxplayrc" configuration file.
-
-**-db *low*\[:*high*\]** Rescales the AirPlay volume-control attenuation
-(gain) from -30dB:0dB to *low*:0dB or *low*:*high*. The lower limit
-*low* must be negative (attenuation); the upper limit *high* can be
-either sign. (GStreamer restricts volume-augmentation by *high* so that
-it cannot exceed +20dB). The rescaling is "flat", so that for -db
--50:10, a change in Airplay attenuation by -7dB is translated to a -7 x
-(60/30) = -14dB attenuation, and the maximum volume (AirPlay 0dB) is a
-10dB augmentation, and Airplay -30dB would become -50dB. Note that the
-minimum AirPlay value (-30dB exactly) is translated to "mute".
-
-**-taper** Provides a "tapered" Airplay volume-control profile (matching
-the one called "dasl-tapering" in
-[shairport-sync](https://github.com/mikebrady/shairport-sync)): each
-time the length of the volume slider (or the number of steps above mute,
-where 16 steps = full volume) is reduced by 50%, the perceived volume is
-halved (a 10dB attenuation). (This is modified at low volumes, to use
-the "untapered" volume if it is louder.)
-
-**-vol *v*** Sets initial audio-streaming volume (on client): range is
-\[0:1\], with 0.0 = mute, 1.0 = full volume (*v* is a decimal number).
-
-**-s wxh** e.g. -s 1920x1080 (= "1080p"), the default width and height
-resolutions in pixels for h264 video. (The default becomes 3840x2160 (=
-"4K") when the -h265 option is used.) This is just a request made to the
-AirPlay client, and perhaps will not be the final resolution you get. w
-and h are whole numbers with four digits or less. Note that the
-**height** pixel size is the controlling one used by the client for
-determining the streaming format; the width is dynamically adjusted to
-the shape of the image (portrait or landscape format, depending on how
-an iPad is held, for example).
-
-**-s wxh@r** As above, but also informs the AirPlay client about the
-screen refresh rate of the display. Default is r=60 (60 Hz); r must be a
-whole number less than 256.
-
-**-o** turns on an "overscanned" option for the display window. This
-reduces the image resolution by using some of the pixels requested by
-option -s wxh (or their default values 1920x1080) by adding an empty
-boundary frame of unused pixels (which would be lost in a full-screen
-display that overscans, and is not displayed by gstreamer).
-Recommendation: **don't use this option** unless there is some special
-reason to use it.
-
-**-fs** uses fullscreen mode, but currently only works with X11,
-Wayland, vaapi, kms and D3D11 (Windows).
-
-**-p** allows you to select the network ports used by UxPlay (these need
-to be opened if the server is behind a firewall). By itself, -p sets
-"legacy" ports TCP 7100, 7000, 7001, UDP 6000, 6001, 7011. -p n (e.g. -p
-35000) sets TCP and UDP ports n, n+1, n+2. -p n1,n2,n3 (comma-separated
-values) sets each port separately; -p n1,n2 sets ports n1,n2,n2+1. -p
-tcp n or -p udp n sets just the TCP or UDP ports. Ports must be in the
-range \[1024-65535\].
-
-If the -p option is not used, the ports are chosen dynamically
-(randomly), which will not work if a firewall is running.
-
-**-avdec** forces use of software h264 decoding using Gstreamer element
-avdec_h264 (libav h264 decoder). This option should prevent
-autovideosink choosing a hardware-accelerated videosink plugin such as
-vaapisink.
-
-**-vp *parser*** choses the GStreamer pipeline's h264 parser element,
-default is h264parse. Using quotes "..." allows options to be added.
-
-**-vd *decoder*** chooses the GStreamer pipeline's h264 decoder element,
-instead of the default value "decodebin" which chooses it for you.
-Software decoding is done by avdec_h264; various hardware decoders
-include: vah264dec (replacement for vaapih264dec), nvdec, nvh264dec,
-v4l2h264dec (these require that the appropriate hardware is available).
-Using quotes "..." allows some parameters to be included with the
-decoder name.
-
-**-vc *converter*** chooses the GStreamer pipeline's videoconverter
-element, instead of the default value "videoconvert". When using
-Video4Linux2 hardware-decoding by a GPU,`-vc v4l2convert` will also use
-the GPU for video conversion. Using quotes "..." allows some parameters
-to be included with the converter name.
-
-**-vs *videosink*** chooses the GStreamer videosink, instead of the
-default value "autovideosink" which chooses it for you. Some videosink
-choices are: ximagesink, xvimagesink, vaapisink (for intel graphics),
-gtksink, glimagesink, waylandsink, osxvideosink (for macOS), kmssink
-(for systems without X11, like Raspberry Pi OS lite) or fpsdisplaysink
-(which shows the streaming framerate in fps). Using quotes "..." allows
-some parameters to be included with the videosink name. For example,
-**fullscreen** mode is supported by the vaapisink plugin, and is
-obtained using `-vs "vaapisink fullscreen=true"`; this also works with
-`waylandsink`. The syntax of such options is specific to a given plugin
-(see GStreamer documentation), and some choices of videosink might not
-work on your system. *Note that vaapisink has been labeled "deprecated"
-(obsolete) and is no longer recommended.*
-
-**-vs 0** suppresses display of streamed video. In mirror mode, the
-client's screen is still mirrored at a reduced rate of 1 frame per
-second, but is not rendered or displayed. This option should always be
-used if the server is "headless" (with no attached screen to display
-video), and only used to render audio, which will be AAC
-lossily-compressed audio in mirror mode with unrendered video, and
-superior-quality ALAC Apple Lossless audio in Airplay audio-only mode.
-
-**-vrtp *pipeline***: forward rtp packets of decrypted video to
-somewhere else, without rendering. Uses rtph264pay or rtph265pay as
-appropriate: *pipeline* should start with any rtph26xpay options (such
-as config_interval= or aggregate-mode =), followed by a sending method:
-*e.g.*, `"config-interval=1 ! udpsink host=127.0.0.1 port=XXXX`". A
-gstreamer-based test receiver is
-
- gst-launch-1.0 -v \
- udpsrc port=XXXX \
- ! 'application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96' \
- ! rtph264depay ! h264parse ! decodebin ! videoconvert !
- autovideosink sync=false
-
- _(Replace XXXX by the port you will use: make sure it is not blocked by a firewall; replace "264" by "265" if you are
- streaming h265 video)._
-
-- To use the -vrtp option with with OBS-studio, install the
- [obs-gstreamer](https://github.com/fzwoch/obs-gstreamer) plugin;
- after the plugin installation, the "+" icon in the OBS-studio
- "Sources" window will show an entry "GStreamer Source" where you
- should add the gstreamer decoder pipeline
- "`udpsrc port=XXXX ! application/x-rtp,media=video,encoding-name=H264,payload=96 ! rtph264depay ! decodebin ! videoconvert ! video.`".
-
-**-artp *pipeline***: forward decoded audio as L16 RTP packets (PCM
-format S16BE) to somewhere else, without rendering. Uses rtpL16pay
-(16-bit signed big-endian PCM, 44100Hz stereo): *pipeline* should start
-with any rtpL16pay options (such as pt=96), followed by a sending
-method: *e.g.*, `"pt=96 ! udpsink host=127.0.0.1 port=5002"`. iOS volume
-control still works over RTP. A gstreamer-based test receiver that plays
-the stream is
-
- gst-launch-1.0 -v \
- udpsrc port=5002 \
- ! application/x-rtp, media=audio, payload=96, clock-rate=44100, encoding-name=L16, format=S16BE, channels=2 \
- ! rtpL16depay ! audioconvert !
- autoaudiosink sync=false
-
-**-v4l2** Video settings for hardware h264 video decoding in the GPU by
-Video4Linux2. Equivalent to `-vd v4l2h264dec -vc v4l2convert`.
-
-**-bt709** A workaround for the failure of the older Video4Linux2 plugin
-to recognize Apple's use of an uncommon (but permitted) "full-range
-color" variant of the bt709 color standard for digital TV. This was no
-longer needed by GStreamer-1.20.4 and backports from it, but appears to
-again be required in GStreamer-1.22 and later.
-
-**-srgb** A workaround for a failure to display full-range 8-bit color
-\[0-255\], and instead restrict to limited range \[16-235\] "legal
-BT709" HDTV format. The workaround works on x86_64 desktop systems, but
-does not yet work on Raspberry Pi. The issue may be fixed in a future
-GStreamer release: it only occurs in Linux and \*BSD.
-
-**-srbg no**. Disables the -srgb option, which is enabled by default in
-Linux and \*BSD, but may be useless on Raspberry Pi, and may be
-unwanted, as it adds extra processing load.
-
-**-as *audiosink*** chooses the GStreamer audiosink, instead of letting
-autoaudiosink pick it for you. Some audiosink choices are: pulsesink,
-alsasink, pipewiresink, osssink, oss4sink, jackaudiosink, osxaudiosink
-(for macOS), wasapisink, directsoundsink (for Windows). Using quotes
-"..." might allow some optional parameters
-(e.g. `-as "alsasink device=..."` to specify a non-default output
-device). The syntax of such options is specific to a given plugin (see
-GStreamer documentation), and some choices of audiosink might not work
-on your system.
-
-**-as 0** (or just **-a**) suppresses playing of streamed audio, but
-displays streamed video.
-
-**-al *x*** specifies an audio latency *x* in (decimal) seconds in
-Audio-only (ALAC), that is reported to the client. Values in the range
-\[0.0, 10.0\] seconds are allowed, and will be converted to a whole
-number of microseconds. Default is 0.25 sec (250000 usec). *(However,
-the client appears to ignore this reported latency, so this option seems
-non-functional.)*
-
-**-ca** (without specifying a filename) now displays "cover art" that
-accompanies Apple Music when played in "Audio-only" (ALAC) mode.
-
-**-ca *filename*** provides a file (where *filename* can include a full
-path) used for output of "cover art" (from Apple Music, *etc.*,) in
-audio-only ALAC mode. This file is overwritten with the latest cover art
-as it arrives. Cover art (jpeg format) is discarded if this option is
-not used. Use with a image viewer that reloads the image if it changes,
-or regularly (*e.g.* once per second.). To achieve this, run
-"`uxplay -ca [path/to/]filename &`" in the background, then run the the
-image viewer in the foreground. Example, using `feh` as the viewer: run
-"`feh -R 1 [path/to/]filename`" (in the same terminal window in which
-uxplay was put into the background). To quit, use `ctrl-C fg ctrl-C` to
-terminate the image viewer, bring `uxplay` into the foreground, and
-terminate it too.
-
-**-md *filename*** Like the -ca option, but exports audio metadata text
-(Artist, Title, Genre, etc.) to file for possible display by a process
-that watches the file for changes. Previous text is overwritten as new
-metadata is received, and the file is deleted when uxplay terminates.
-
-**-reset n** sets a limit of *n* consecutive failures of the client to
-send feedback requests (these "heartbeat signals" are sent by the client
-once per second to ask for a response showing that the server is still
-online). After *n* missing signals, the client will be presumed to be
-offline, and the connection will be reset to allow a new connection. The
-default value of *n* is 15 seconds; the value *n* = 0 means "no limit".
-
-**-nofreeze** closes the video window after a reset due to client going
-offline (default is to leave window open to allow a smoother reconection
-to the same client). This option may be useful in fullscreen mode.
-
-**-nc** maintains previous UxPlay \< 1.45 behavior that does **not
-close** the video window when the the client sends the "Stop Mirroring"
-signal. *This option is currently used by default in macOS, as the
-window created in macOS by GStreamer does not terminate correctly (it
-causes a segfault) if it is still open when the GStreamer pipeline is
-closed.*
-
-**-nohold** Drops the current connection when a new client attempts to
-connect. Without this option, the current client maintains exclusive
-ownership of UxPlay until it disconnects.
-
-**-restrict** Restrict clients allowed to connect to those specified by
-`-allow `. The deviceID has the form of a MAC address which is
-displayed by UxPlay when the client attempts to connect, and appears to
-be immutable. It has the format `XX:XX:XX:XX:XX:XX`, X = 0-9,A-F, and is
-possibly the "true" hardware MAC address of the device. Note that iOS
-clients generally expose different random "private Wi_Fi addresses"
-("fake" MAC addresses) to different networks (for privacy reasons, to
-prevent tracking), which may change, and do not correpond to the
-deviceID.
-
-**-restrict no** Remove restrictions (default). This is useful as a
-command-line argument to overide restrictions set in the Startup file.
-
-**-allow *id*** Adds the deviceID = *id* to the list of allowed clients
-when client restrictions are being enforced. Usually this will be an
-entry in the uxplayrc startup file.
-
-**-block *id*** Always block clients with deviceID = *id*, even when
-client restrictions are not being enforced generally. Usually this will
-be an entry in the uxplayrc startup file.
-
-**-FPSdata** Turns on monitoring of regular reports about video
-streaming performance that are sent by the client. These will be
-displayed in the terminal window if this option is used. The data is
-updated by the client at 1 second intervals.
-
-**-fps n** sets a maximum frame rate (in frames per second) for the
-AirPlay client to stream video; n must be a whole number less than 256.
-(The client may choose to serve video at any frame rate lower than this;
-default is 30 fps.) A setting of 60 fps may give you improved video but
-is not recommended on Raspberry Pi. A setting below 30 fps might be
-useful to reduce latency if you are running more than one instance of
-uxplay at the same time. *This setting is only an advisory to the client
-device, so setting a high value will not force a high framerate.* (You
-can test using "-vs fpsdisplaysink" to see what framerate is being
-received, or use the option -FPSdata which displays video-stream
-performance data continuously sent by the client during
-video-streaming.)
-
-**-f {H\|V\|I}** implements "videoflip" image transforms: H = horizontal
-flip (right-left flip, or mirror image); V = vertical flip ; I = 180
-degree rotation or inversion (which is the combination of H with V).
-
-**-r {R\|L}** 90 degree Right (clockwise) or Left (counter-clockwise)
-rotations; these image transforms are carried out after any **-f**
-transforms.
-
-**-m \[mac\]** changes the MAC address (Device ID) used by UxPlay
-(default is to use the true hardware MAC address reported by the host
-computer's network card). (Different server_name, MAC addresses, and
-network ports are needed for each running uxplay if you attempt to run
-more than one instance of uxplay on the same computer.) If \[mac\] (in
-form xx:xx:xx:xx:xx:xx, 6 hex octets) is not given, a random MAC address
-is generated. If UxPlay fails to find the true MAC address of a network
-card, (more specifically, the MAC address used by the first active
-network interface detected) a random MAC address will be used even if
-option **-m** was not specified. (Note that a random MAC address will be
-different each time UxPlay is started).
-
-**-key \[*filename*\]**: This (more secure) option for generating and
-storing a persistant public key (needed for the -pin option) has been
-replaced by default with a (less secure) method which generates a key
-from the server's "device ID" (MAC address, which can be changed with
-the -m option, conveniently as a startup file option). When the -key
-option is used, a securely generated keypair is generated and stored in
-`$HOME/.uxplay.pem`, if that file does not exist, or read from it, if it
-exists. (Optionally, the key can be stored in *filename*.) This method
-is more secure than the new default method, (because the Device ID is
-broadcast in the DNS_SD announcement) but still leaves the private key
-exposed to anyone who can access the pem file. This option should be set
-in the UxPlay startup file as a line "key" or "key *filename*" (no
-initial "-"), where *filename* is a full path which should be enclosed
-in quotes (`"...."`) if it contains any blank spaces. **Because the
-default method is simpler, and security of client access to uxplay is
-unlikely to be an important issue, the -key option is no longer
-recommended**.
-
-**-dacp \[*filename*\]**: Export current client DACP-ID and
-Active-Remote key to file: default is \$HOME/.uxplay.dacp. (optionally
-can be changed to *filename*). Can be used by remote control
-applications. File is transient: only exists while client is connected.
-
-**-vdmp** Dumps h264 video to file videodump.h264. -vdmp n dumps not
-more than n NAL units to videodump.x.h264; x= 1,2,... increases each
-time a SPS/PPS NAL unit arrives. To change the name *videodump*, use
--vdmp \[n\] *filename*.
-
-**-admp** Dumps audio to file audiodump.x.aac (AAC-ELD format audio),
-audiodump.x.alac (ALAC format audio) or audiodump.x.aud (other-format
-audio), where x = 1,2,3... increases each time the audio format changes.
--admp *n* restricts the number of packets dumped to a file to *n* or
-less. To change the name *audiodump*, use -admp \[n\] *filename*. *Note
-that (unlike dumped video) the dumped audio is currently only useful for
-debugging, as it is not containerized to make it playable with standard
-audio players.*
-
-**-ble \[*filename*\]**. Enable Bluetooth beacon Service Discovery. The
-port, PID and process name of the UxPlay process is recorded by default
-in `~/.uxplay.ble` : (this file is created when UxPlay starts and
-deleted when it stops.) Optionally the file *filename*, which must be
-the full path to a writeable file can instead be used. **See below for
-beacon setup instructions.**
-
-**-d \[n\]** Enable debug output; optional argument n=1 suppresses
-audio/video packet data in debug output. Note: this does not show
-GStreamer error or debug messages. To see GStreamer error and warning
-messages, set the environment variable GST_DEBUG with "export
-GST_DEBUG=2" before running uxplay. To see GStreamer information
-messages, set GST_DEBUG=4; for DEBUG messages, GST_DEBUG=5; increase
-this to see even more of the GStreamer inner workings.
-
-# Bluetooth LE beacon setup
-
-The python\>=3.6 script for running a Bluetooth-LE Service Discovery
-beacon is uxplay-beacon.py. It comes in two versions, one (for Linux and
-\*BSD) is only installed on systems which support DBUS, and another only
-for Windows 10/11. Bluetooth \>= 4.0 hardware on the host computer is
-required: a cheap USB bluetooth dongle can be used.
-
-On Linux/\*BSD, Bluetooth support (BlueZ) must be installed (on
-Debian-based systems: `sudo apt install bluez bluez-tools`; recent
-Ubuntu releases provide bluez as a snap package). In addition to
-standard Python3 libraries, you may need to install the gi, dbus, and
-psutil Python libraries used by uxplay-beacon.py. On Debian-based
-systems:
-
- sudo apt install python3-gi python3-dbus python3-psutil
-
-For Windows support on MSYS2 UCRT systems, use pacman -S to install
-`mingw-w64-ucrt-x86_64-python`, `*-python-gobject`, `*-python-psutil`,
-and `*-python-pip`. Then install **winrt** bindings:
-"`pip install winrt-Windows.Foundation.Collections`", also
-`winrt-Windows.Devices.Bluetooth.Advertisement` and
-`winrt-Windows.Storage.Streams`.
-
-If uxplay will be run with option "`uxplay -ble`" (so it writes data for
-the Bluetooth beacon in the default BLE data file `~/.uxplay.ble`), just
-run `uxplay-beacon.py` in a separate terminal. The python script will
-start Bluetooth LE Service-Discovery advertising when it detects that
-UxPlay is running by checking if the BLE data file exists, and stop when
-it no longer detects a running UxPlay plus this file (it will restart
-advertising if UxPlay later reappears). The script will remain active
-until stopped with Ctrl+C in its terminal window (or its terminal window
-is closed).
-
-The beacon script can be more finely controlled using certain options:
-these can be given on the command line, or read from a configuration
-file `~/.uxplay.beacon`, if it exists. Configuration file entries are
-like the command line forms, one per line (e.g.,
-`--ipv4 192.168.1.100`). Lines commented out with an initial `#` are
-ignored. Command line options override the configuration file options.
-Get help with `man uxplay-beacon` or `uxplay-beacon.py --help`. Options
-are
-
-- `--file ` read beacon options from ``
- instead of `~/.uxplay.beacon`.
-
-- `--ipv4 `. This option can be used to specify the
- ipv4 address at which the UxPlay server should be contacted by the
- client. If it is not given, an address will be obtained
- automatically (specify the address with the option if automatic
- selection fails). Only ipv4 addresses are supported.
-
-- `--path `. This overrides the default choice of BLE
- data file (`~/.uxplay.ble`) that is monitored by the beacon script.
- This also requires that uxplay is run with option
- "`uxplay -ble `".
-
-The BlueZ/Dbus version has thee more options not offered by the Windows
-version (the Windows operating system chooses their values):
-
-- `--AdvMin x`, `--AdvMax y`. These controls the interval between BLE
- advertisement broadcasts. This interval is in the range \[x, y\],
- given in units of msecs. Allowed ranges are 100 \<= x \<= y
- \<= 10240. If AdvMin=AdvMax, the interval is fixed: if AdvMin \<
- AdvMax it is chosen flexibly in this range to avoid interfering with
- other tasks the Bluetooth device is carrying out. The default values
- are AdvMin = AdvMax = 100. The advertisement is broadcast on all
- three Bluetooth LE advertising channels: 37,38,39.
-
-- `--index x` (default x = 0, x \>= 0). This can be used by the DBus
- to distinguish between multiple simultaneous instances of
- uxplay-beacon.py that are running to support multiple instances of
- UxPlay. Each instance must have its own BLE Data file (just as each
- instance of UxPlay must also have its own MAC address and ports).
- *Note: running multiple beacons simultaneously on the same host has
- not been tested, and this option might not be useful or needed.*
-
-If you wish to test Bluetooth LE Service Discovery on Linux/\*BSD, you
-can disable DNS_SD Service discovery by the avahi-daemon with
-
- $ sudo systemctl mask avahi-daemon.socket
- $ sudo systemctl stop avahi-daemon
-
-To restore DNS_SD Service discovery, replace "mask" by "unmask", and
-"stop" by "start".
-
-On Windows, the Bonjour Service is controlled using **Services
-Management**: press "Windows + R" to open the Run dialog, run
-`services.msc`, and click on **Bonjour Service** in the alphabetic list.
-This will show links for it to be stopped and restarted.
-
-For more information, see the [wiki
-page](https://github.com/FDH2/UxPlay/wiki/Bluetooth_LE_beacon)
-
-- **Note that Bluetooth LE AirPlay Service Discovery only supports
- broadcast of IPv4 addresses**.
-
-# Troubleshooting
-
-Note: `uxplay` is run from a terminal command line, and informational
-messages are written to the terminal.
-
-### 0. Problems in compiling UxPlay.
-
-One user (on Ubuntu) found compilation failed with messages about
-linking to "usr/local/lib/libcrypto.a" and "zlib". This was because (in
-addition to the standard ubuntu installation of libssl-dev), the user
-was unaware that a second installation with libcrypto in /usr/local was
-present. Solution: when more than one installation of OpenSSL is
-present, set the environment variable OPEN_SSL_ROOT_DIR to point to the
-correct one; on 64-bit Ubuntu, this is done by running
-`export OPENSSL_ROOT_DIR=/usr/lib/X86_64-linux-gnu/` before running
-cmake.
-
-### 1. **Avahi/DNS_SD Bonjour/Zeroconf issues**
-
-The DNS_SD Service-Discovery ("Bonjour" or "Zeroconf") service is
-required for UxPlay to work. On Linux, it will be usually provided by
-Avahi, and to troubleshoot this, you should use the tool `avahi-browse`.
-(You may need to install a separate package with a name like
-`avahi-utils` to get this.)
-
-On Linux, make sure Avahi is installed, and start the avahi-daemon
-service on the system running uxplay (your distribution will document
-how to do this, for example: `sudo systemctl avahi-daemon` or
-`sudo service avahi-daemon `, with `` one of enable, disable,
-start, stop, status. You might need to edit the avahi-daemon.conf file
-(it is typically in /etc/avahi/, find it with
-"`sudo find /etc -name avahi-daemon.conf`"): make sure that
-"disable-publishing" is **not** a selected option). Some systems may
-instead use the mdnsd daemon as an alternative to provide DNS-SD
-service. (FreeBSD offers both alternatives, but only Avahi was tested;
-see [here](https://gist.github.com/reidransom/6033227).)
-
-- **uxplay starts, but either stalls or stops after "Initialized
- server socket(s)" appears (*without the server name showing on the
- client*)**.
-
-If UxPlay stops with the "No DNS-SD Server found" message, this means
-that your network **does not have a running Bonjour/zeroconf DNS-SD
-server.** Before v1.60, UxPlay used to stall silently if DNS-SD service
-registration failed, but now stops with an error message returned by the
-DNSServiceRegister function: kDNSServiceErr_Unknown if no DNS-SD server
-was found: *(A NixOS user found that in NixOS, this error can also occur
-if avahi-daemon service IS running with publishing enabled, but reports
-"the error disappeared on NixOS by setting services.avahi.openFirewall
-to true".)* Other mDNS error codes are in the range FFFE FF00 (-65792)
-to FFFE FFFF (-65537), and are listed in the dnssd.h file. An older
-version of this (the one used by avahi) is found
-[here](https://github.com/lathiat/avahi/blob/master/avahi-compat-libdns_sd/dns_sd.h).
-A few additional error codes are defined in a later version from
-[Apple](https://opensource.apple.com/source/mDNSResponder/mDNSResponder-544/mDNSShared/dns_sd.h.auto.html).
-
-If UxPlay stalls *without an error message* and *without the server name
-showing on the client*, **this is a network problem** (if your UxPlay
-version is older than 1.60, it is also the behavior when no DNS-SD
-server is found.)
-
-A useful tool for examining such network problems from the client end is
-the (free) Discovery DNS-SD browser [available in the Apple App
-Store](https://apps.apple.com/us/developer/lily-ballard/id305441020) for
-both iOS (works on iPadOS too) and macOS.
-
-- Some users using dual-band (2.4GHz/5GHz) routers have reported that
- clients using the 5GHz band (sometimes) "fail to see UxPlay" (i.e.,
- do not get a response to their mDNS queries), but the 2.4GHz band
- works. Other projects using Bonjour/mDNS have had similar reports;
- the issue seems to be router-specific, perhaps related to "auto"
- rather than fixed channel selection (5GHz has many more channels to
- switch between), or channel width selections; one speculation is
- that since mDNS uses UDP protocol (where "lost" messages are not
- resent), a mDNS query might get lost if channel switching occurs
- during the query.
-
-If your router has this problem, a reported "fix" is to (at least on
-5GHz) use fixed channel and/or fixed (not dynamic) channel width.
-
-- **Avahi works at first, but new clients do not see UxPlay, or
- clients that initially saw it stop doing so after they disconnect**.
-
-This is usually because Avahi is only using the "loopback" network
-interface, and is not receiving mDNS queries from new clients that were
-not listening when UxPlay started.
-
-To check this, after starting uxplay, use the utility
-`avahi-browse -a -t` **in a different terminal window** on the server to
-verify that the UxPlay AirTunes and AirPlay services are correctly
-registered (only the AirTunes service is used in the "Legacy" AirPlay
-Mirror mode used by UxPlay, but the AirPlay service is used for the
-initial contact).
-
-The results returned by avahi-browse should show entries for uxplay like
-
- + eno1 IPv6 UxPlay AirPlay Remote Video local
- + eno1 IPv4 UxPlay AirPlay Remote Video local
- + lo IPv4 UxPlay AirPlay Remote Video local
- + eno1 IPv6 863EA27598FE@UxPlay AirTunes Remote Audio local
- + eno1 IPv4 863EA27598FE@UxPlay AirTunes Remote Audio local
- + lo IPv4 863EA27598FE@UxPlay AirTunes Remote Audio local
-
-If only the loopback ("lo") entries are shown, a firewall on the UxPlay
-host is probably blocking full DNS-SD service, and you need to open the
-default UDP port 5353 for mDNS requests, as loopback-based DNS-SD
-service is unreliable.
-
-If the UxPlay services are listed by avahi-browse as above, but are not
-seen by the client, the problem is likely to be a problem with the local
-network.
-
-### 2. uxplay starts, but stalls after "Initialized server socket(s)" appears, *with the server name showing on the client* (but the client fails to connect when the UxPlay server is selected).
-
-This shows that a *DNS-SD* service is working, clients hear UxPlay is
-available, but the UxPlay server is not receiving the response from the
-client. This is usually because a firewall on the server is blocking the
-connection request from the client. (One user who insisted that the
-firewall had been turned off turned out to have had *two* active
-firewalls (*firewalld* and *ufw*) *both* running on the server!) If
-possible, either turn off the firewall to see if that is the problem, or
-get three consecutive network ports, starting at port n, all three in
-the range 1024-65535, opened for both tcp and udp, and use "uxplay -p n"
-(or open UDP 7011,6001,6000 TCP 7100,7000,7001 and use "uxplay -p").
-
-If you are *really* sure there is no firewall, you may need to
-investigate your network transmissions with a tool like netstat, but
-almost always this is a firewall issue.
-
-### 3. Problems *after* the client-server connection has been made:
-
-If you do *not* see the message `raop_rtp_mirror starting mirroring`,
-something went wrong before the client-server negotiations were
-finished. For such problems, use "uxplay -d" (debug log option) to see
-what is happening: it will show how far the connection process gets
-before the failure occurs. You can compare your debug output to that
-from a successful start of UxPlay in the [UxPlay
-Wiki](https://github.com/FDH2/UxPlay/wiki).
-
-**If UxPlay reports that mirroring started, but you get no video or
-audio, the problem is probably from a GStreamer plugin that doesn't work
-on your system** (by default, GStreamer uses the "autovideosink" and
-"autoaudiosink" algorithms to guess what are the "best" plugins to use
-on your system). A different reason for no audio occurred when a user
-with a firewall only opened two udp network ports: **three** are
-required (the third one receives the audio data).
-
-**Raspberry Pi** devices (*Pi 4B+ and earlier: this does not apply to
-the Pi 5, which does not provide hardware h264 decoding, and does not
-need it*) work best with hardware GPU h264 video decoding if the
-Video4Linux2 plugin in GStreamer v1.20.x or earlier has been patched
-(see the UxPlay
-[Wiki](https://github.com/FDH2/UxPlay/wiki/Gstreamer-Video4Linux2-plugin-patches)
-for patches). This is fixed in GStreamer-1.22, and by backport patches
-from this in distributions such as Raspberry Pi OS (Bullseye): **use
-option `-bt709` with the GStreamer-1.18.4 from Raspberry Pi OS**. This
-also needs the bcm2835-codec kernel module that is not in the standard
-Linux kernel (it is available in Raspberry Pi OS, Ubuntu and Manjaro).
-
-- **If this kernel module is not available in your Raspberry Pi
- operating system, or if GStreamer \< 1.22 is not patched, use option
- `-avdec` for software h264-decoding.**
-
-Sometimes "autovideosink" may select the OpenGL renderer "glimagesink"
-which may not work correctly on your system. Try the options "-vs
-ximagesink" or "-vs xvimagesink" to see if using one of these fixes the
-problem.
-
-Other reported problems are connected to the obsolete GStreamer VAAPI
-plugin (for hardware-accelerated Intel graphics, but not NVIDIA
-graphics). Use the option "-avdec" to force software h264 video
-decoding: this should prevent autovideosink from selecting the vaapisink
-videosink. Alternatively, find out if the gstreamer1.0-vaapi plugin is
-installed, and if so, uninstall it. (If this does not fix the problem,
-you can reinstall it.)
-
-There are some reports of other GStreamer problems with
-hardware-accelerated Intel HD graphics. One user (on Debian) solved this
-with "sudo apt install intel-media-va-driver-non-free". This is a driver
-for 8'th (or later) generation "\*-lake" Intel chips, that seems to be
-related to VAAPI accelerated graphics.
-
-If you *do* have Intel HD graphics, and have installed the obsolete
-vaapi plugin, but `-vs vaapisink` does not work, check that vaapi is not
-"blacklisted" in your GStreamer installation: run
-`gst-inspect-1.0 vaapi`, if this reports `0 features`, you need to
-`export GST_VAAPI_ALL_DRIVERS=1` before running uxplay, or set this in
-the default environment. The recommended decoders are the newer "va"
-decoders such as vah264dec, which should be automatically used by
-GStreamer, but can be specified with the `-vd` option.
-
-You can try to fix audio or video problems by using the
-"`-as `" or "`-vs `" options to choose the
-GStreamer audiosink or videosink , rather than letting GStreamer choose
-one for you. (See above, in [Starting and running
-UxPlay](#starting-and-running-uxplay) for choices of `` or
-``.)
-
-The "OpenGL renderer" window created on Linux by "-vs glimagesink"
-sometimes does not close properly when its "close" button is clicked.
-(this is a GStreamer issue). You may need to terminate uxplay with
-Ctrl-C to close a "zombie" OpenGl window. If similar problems happen
-when the client sends the "Stop Mirroring" signal, try the no-close
-option "-nc" that leaves the video window open.
-
-### 4. GStreamer issues (missing plugins, etc.):
-
-- clearing the user's GStreamer cache with
- `rm -rf ~/.cache/gstreamer-1.0/*` may be the solution to problems
- where gst-inspect-1.0 does not show a plugin that you believe is
- installed. The cache will be regenerated next time GStreamer is
- started. **This is the solution to puzzling problems that turn out
- to come from corruption of the cache, and should be tried first.**
-
-If UxPlay fails to start, with a message that a required GStreamer
-plugin (such as "libav") was not found, first check with the GStreamer
-tool gst-inspect-1.0 to see what GStreamer knows is available. (You may
-need to install some additional GStreamer "tools" package to get
-gst-inspect-1.0). For, *e.g.* a libav problem, check with
-"`gst-inspect-1.0 libav`". If it is not shown as available to GStreamer,
-but your package manager shows the relevant package as installed (as one
-user found), try entirely removing and reinstalling the package. That
-user found that a solution to a "**Required gstreamer plugin 'libav' not
-found**" message that kept recurring was to clear the user's gstreamer
-cache.
-
-If it fails to start with an error like '`no element "avdec_aac"`' this
-is because even though gstreamer-libav is installed. it is incomplete
-because some plugin features are missing:
-"`gst-inspect-1.0 | grep avdec_aac`" will show if avdec_aac is
-available. Unlike other GStreamer plugins, the libav plugin is a front
-end to FFmpeg codecs which provide avdec\_\*.
-
-- Some distributions (RedHat, SUSE, etc) provide incomplete versions
- of FFmpeg because of patent issues with codecs used by certain
- plugins. In those cases there will be some "extra package" provider
- like [RPM fusion](https://rpmfusion.org) (RedHat),
- [packman](http://packman.links2linux.org/) (SUSE) where you can get
- complete packages (your distribution will usually provide
- instructions for this, Mageia puts them in an optional "tainted"
- repo). The packages needed may be "ffmpeg\*" or "libav\*" packages:
- the GStreamer libav plugin package does not contain any codecs
- itself, it just provides a way for GStreamer to use ffmpeg/libav
- codec libraries which must be installed separately. For similar
- reasons, distributions may ship incomplete packages of GStreamer
- "plugins-bad". Use user on Fedora thought they had installed from
- rpmfusion, but the system had not obeyed: *"Adding --allowerasing to
- the dnf command fixed it after a restart"*.
-
-- starting with release UxPlay-1.65.3, UxPlay will continue to
- function, but without audio in mirror mode, if avdec_aac is missing.
-
-To troubleshoot GStreamer execute "export GST_DEBUG=2" to set the
-GStreamer debug-level environment-variable in the terminal where you
-will run uxplay, so that you see warning and error messages; see
-[GStreamer debugging
-tools](https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html)
-for how to see much more of what is happening inside GStreamer. Run
-"gst-inspect-1.0" to see which GStreamer plugins are installed on your
-system.
-
-Some extra GStreamer packages for special plugins may need to be
-installed (or reinstalled: a user using a Wayland display system as an
-alternative to X11 reported that after reinstalling Lubuntu 18.4, UxPlay
-would not work until gstreamer1.0-x was installed, presumably for
-Wayland's X11-compatibility mode). Different distributions may break up
-GStreamer 1.x into packages in different ways; the packages listed above
-in the build instructions should bring in other required GStreamer
-packages as dependencies, but will not install all possible plugins.
-
-The GStreamer video pipeline, which is shown in the initial output from
-`uxplay -d`, has the default form
-
- appsrc name=video_source ! queue ! h264parse ! decodebin ! videoconvert ! autovideosink name=video_sink sync=false
-
-The pipeline is fully configurable: default elements "h264parse",
-"decodebin", "videoconvert", and "autovideosink" can respectively be
-replaced by using uxplay options `-vp`, `-vd`, `-vc`, and `-vs`, if
-there is any need to modify it (entries can be given in quotes "..." to
-include options).
-
-### 5. Mirror screen freezes (a network problem):
-
-This can happen if the TCP video stream from the client stops arriving
-at the server, probably because of network problems (the UDP audio
-stream may continue to arrive). At 3-second intervals, UxPlay checks
-that the client is still connected by sending it a request for a NTP
-time signal. If a reply is not received from the client within a 0.3 sec
-time-window, an "ntp timeout" is registered. If a certain number
-(currently 5) of consecutive ntp timeouts occur, UxPlay assumes that the
-client is "dead", and resets the connection, becoming available for
-connection to a new client, or reconnection to the previous one.
-Sometimes the connection may recover before the timeout limit is
-reached, and if the default limit is not right for your network, it can
-be modified using the option "-reset *n*", where *n* is the desired
-timeout-limit value (*n* = 0 means "no limit"). If the connection starts
-to recover after ntp timeouts, a corrupt video packet from before the
-timeout may trigger a "connection reset by peer" error, which also
-causes UxPlay to reset the connection.
-
-- When the connection is reset, the "frozen" mirror screen of the
- previous connection is left in place, but does **not** block new
- connections, and will be taken over by a new client connection when
- it is made.
-
-### 6. Protocol issues (with decryption of the encrypted audio and video streams sent by the client).
-
-A protocol failure may trigger an unending stream of error messages, and
-means that the audio decryption key (also used in video decryption) was
-not correctly extracted from data sent by the client.
-
-The protocol was modifed in UxPlay-1.65 after it was discovered that the
-client-server "pairing" step could be avoided (leading to a much quicker
-connection setup, without a 5 second delay) by disabling "Supports
-Legacy Pairing" (bit 27) in the "features" code UxPlay advertises on
-DNS-SD Service Discovery. Most clients will then not attempt the setup
-of a "shared secret key" when pairing, which is used by AppleTV for
-simultaneous handling of multiple clients (UxPlay only supports one
-client at a time). **This change is now well-tested, but in case it
-causes any protocol failures, UxPlay can be reverted to the previous
-behavior by uncommenting the previous "FEATURES_1" setting (and
-commenting out the new one) in lib/dnssdint.h, and then rebuilding
-UxPlay.** ("Pairing" is re-enabled when the new Apple-style one-time
-"pin" authentication is activated by running UxPlay with the "-pin"
-option introduced in UxPlay 1.67.)
-
-Protocol failure should not happen for iOS 9.3 or later clients.
-However, if a client uses the same older version of the protocol that is
-used by the Windows-based AirPlay client emulator *AirMyPC*, the
-protocol can be switched to the older version by the setting
-`OLD_PROTOCOL_CLIENT_USER_AGENT_LIST` in `UxPlay/lib/global.h`. UxPlay
-reports the client's "User Agent" string when it connects. If some other
-client also fails to decrypt all audio and video, try adding its "User
-Agent" string in place of "xxx" in the entry "AirMyPC/2.0;xxx" in
-global.h and rebuild uxplay.
-
-Note that for DNS-SD Service Discovery, Uxplay declares itself to be an
-AppleTV3,2 (a 32 bit device) with a sourceVersion 220.68; this can also
-be changed in global.h. UxPlay also works if it declares itself as an
-AppleTV6,2 with sourceVersion 380.20.1 (an AppleTV 4K 1st gen,
-introduced 2017, running tvOS 12.2.1), so it does not seem to matter
-what version UxPlay claims to be.
-
-# Changelog
-
-1.73 2026-01-25 Render Audio cover-art inside UxPlay with -ca option (no
-file specified). (D-Bus based) option -scrsv ``{=html} to inhibit
-screensaver while UxPlay is running (Linux/\*BSD only). Add password
-support (-pw) using a displayed pin code as a password that changes
-every time (and not as a one-time pin). Add support for Service
-Discovery using a Bluetooth LE beacon. Add -vrtp option for forwarding
-decrypted h264/5 video to an external renderer (e.g., OBS Studio), and
--artp for audio. Check that option input strings have valid UTF-8
-encoding. New option `-lang fr:es:en` to specify language preferences
-for YouTube HLS videos when they offer a choice. New option -mp4 for
-recording to a mp4 file (Mirror and Audio mode, not HLS)
+1.72.3 2025-12-20 Fix bug reported in CVE-2025-60458 whereby a
+specially-crafted client TEARDOWN request can crash UxPlay (denial of
+service attack).
1.72.2 2025-07-07 Fix bug (typo) in DNS_SD advertisement introduced with
-pw option. Update llhttp to v 9.3.0