A focused Wayland video player. It uses FFmpeg 8 or newer, decodes supported codecs directly with Vulkan Video when available, renders with libplacebo to a Vulkan Wayland swapchain, and plays audio through PipeWire.
Prebuilt Debian packages and binary tarballs are available from the GitHub releases.
Install a downloaded Debian package with apt so its declared runtime
dependencies are resolved automatically:
sudo apt install ./undefined-player_*.debThe binary tarball is dynamically linked and requires compatible shared libraries on the system. Extract it and run its user-local installer:
tar -xzf undefined-player-*-linux-*.tar.gz
cd undefined-player-*-linux-*
./install.shSource-building, custom FFmpeg, packaging, diagnostics, and release checks are documented in DEVELOPMENT.md.
Running requires a Wayland session, the Vulkan loader and a working Vulkan driver, SDL3 with its Wayland and PipeWire backends, libplacebo, the Wayland client library, Pango/Cairo, GIO, and compatible FFmpeg 8 or newer shared libraries. Vulkan Video support enables hardware decoding; unsupported codecs fall back to software decoding but still use Vulkan for presentation.
When the player is built against Ubuntu 26.04's packaged libraries, the base runtime packages can be installed with:
sudo apt install libvulkan1 libsdl3-0 libplacebo360 libwayland-client0 \
libpangocairo-1.0-0 libcairo2 pipewire-audioThe GPU vendor's Vulkan driver is an additional runtime requirement. On Arch
Linux with an AMD Radeon GPU, that driver is vulkan-radeon.
Open a video from the command line:
undefined-player ~/Videos/example.mp4HTTP and HTTPS URLs are also supported. The server should support byte-range requests so seeking and containers that read metadata from the end of the file work correctly:
undefined-player 'http://127.0.0.1:8000/example.mp4'For an HLS master playlist, the player selects the decodable rendition with the largest resolution, then the highest frame rate and bitrate, and keeps that quality fixed during playback.
The player starts playing immediately. The focused video window accepts:
F— toggle fullscreenC— toggle automatic cropping of encoded black bordersZ— toggle zoom to fill the window, using autocrop firstD— cycle deinterlacing: Auto (default), On, OffI— toggle video/color details, deinterlacing status, cropped resolution, FPS / shown / dropped frames, and playback positionA— switch to the next audio trackM— mute or unmute audioL— toggle looping the videoLeft/Right— seek backward or forward 10 seconds,/.— jump to the previous or next chapterSpace— pause or resumeS— toggle subtitlesJ— switch to the next embedded subtitle trackQ— quit
Auto deinterlacing checks motion across decoded pictures, so film stored with
interlacing flags can retain its original detail. It takes a few frames to settle
and falls back to the flags when analysis is unavailable. Progressive hardware
video keeps its fast path without readback. D still provides forced On and Off.
For files with chapters, dots on the timeline mark each chapter's start.
Chapter navigation keeps the current pause state and stops at the first or last
chapter; files without chapters leave these keys inactive.
After a chapter jump, its number and title appear in the top bar for three
seconds. Hovering a chapter dot shows its title there too. The I overlay lists
the current chapter at the top right, alongside embedded title and artist tags
when available. Untitled chapters show only their number.
The current file is also exported through MPRIS. GNOME and other desktop media controls show its embedded title, artist, and cover image when available, falling back to the filename for untitled media. They support play, pause, stop, and seek; previous/next buttons navigate chapters and disable at their respective ends.
The borderless Wayland window can be dragged from anywhere with the left mouse button. Drag an edge or corner to resize it; the client-area aspect ratio is free, while the video itself retains its display aspect ratio with black bars where needed. Double-click anywhere to toggle fullscreen. Its custom title bar fades after 1.5 seconds without mouse movement and whenever the window loses focus. Its close button is at the top-right. The minimum window size is 320x180. The bottom timeline appears with the controls; click it or drag its handle to seek. Timeline, keyboard, and MPRIS seeking target the requested position; FFmpeg resolves its nearest usable preceding keyframe. Decoding continues in the background so the window remains responsive, and audio and video resume together once buffered data is ready. Audio tracks that begin later stay silent until their starting timestamp.
File reads run ahead in the background to absorb short network stalls, including files on mounted network shares. The player's file reader buffers up to 4 MiB ahead and retains 4 MiB for backward reads without increasing the decoded-frame queues. At 10 Mb/s this provides roughly three seconds of read-ahead once filled; longer outages or a connection slower than the video bitrate can still stutter.
Autocrop starts disabled. Press C to detect stable black borders in the video;
press it again to restore the complete frame. Detection samples frames in a
background worker and preserves the video's pixel aspect ratio. It ignores
black frames and very dark scenes, so allow a few visible frames for detection.
When paused, it scans the current frame. Borders required by the window's own
aspect ratio can remain after encoded bars are removed.
Zoom fills the current window (or the screen in fullscreen) without stretching.
It first enables autocrop, then trims the center of the remaining picture to the
window's aspect ratio. Wider pictures lose content at the sides; narrower pictures
lose content at the top and bottom. Integer scaling is bypassed while filling.
Press Z again to restore normal fitting and your previous autocrop setting.
C can override cropping during zoom; leaving zoom still restores the earlier
setting. The I panel shows ZOOM: FILL, FIT, or FILL (DETECTING) while
waiting for a reliable border sample. Dark scenes retain the last detected crop;
if border sampling is unsupported, zoom uses the full frame. Both controls work
while paused.
Deinterlacing starts in Auto mode and follows each decoded frame's interlacing
flag and field order. Press D to force it On for incorrectly flagged files,
again to turn it Off, and again to return to Auto. On assumes top-field-first
when the frame has no interlacing flag. Changes also apply while paused.
Filtering runs on the GPU at the source frame rate (not doubled field rate).
Auto uses decoder metadata; it does not scan the picture for combing.
The player accepts one local media path or HTTP(S) URL on the command line. Local files use the bounded Rust read-ahead buffer; network inputs use FFmpeg's protocol and buffering support. Hardware video decode covers the codecs and profiles exposed by both the selected FFmpeg build and the installed Vulkan driver. If Vulkan decoder initialization or initial decoding fails, playback restarts with FFmpeg's software decoder and uploads frames for Vulkan presentation. HDR metadata is retained from FFmpeg through libplacebo, which supplies the matching colorspace hint to the Vulkan swapchain for an HDR-enabled compositor. Small square-pixel videos (up to 640×480, or 480×640 in portrait) use the largest integer scale that fits, with nearest-neighbour filtering and centered black borders. If the video needs shrinking, normal aspect-preserving scaling applies. Other sources up to 1920×1080 (or 1080×1920 in portrait) use libplacebo's GPU EWA Lanczos-sharp upscaler with mild anti-ringing for cleaner enlargement to 4K. Larger sources use the normal Lanczos path.
The current platform scope is:
- Wayland only (
SDL_VIDEODRIVER=wayland) - PipeWire only (
SDL_AUDIODRIVER=pipewire) - a Vulkan-capable GPU
- FFmpeg 8 or newer shared libraries
- system SDL3 and libplacebo
- system Pango/Cairo and Wayland client libraries
The default embedded subtitle track is preselected, but subtitles start hidden;
S shows them and J cycles through all decodable embedded tracks while
briefly showing the selected number.
DVD/PGS bitmap subtitles retain their authored placement. Text and ASS dialogue
use a compact bold monospace Pango font with Unicode shaping and automatic font
fallback; advanced ASS styling is ignored. There is no playlist or audio-stream
selection menu yet; audio tracks are cycled with A.
undefined-player is free software licensed under the GNU General Public License
version 3 or later. See LICENSE.