A small, native video player that plays everything — GPU-fast decode, crisp subtitles, a warm Hi-Fi shell.
Built on raylib for the window and GPU, FFmpeg for demux/decode, and libass for subtitles — styled after Timp. Every codec FFmpeg supports, hardware-accelerated decode, styled subtitles, video adjustments, and track switching, wrapped in a borderless, fluid interface.
- Plays everything — demux + decode through FFmpeg's
libav*: H.264 / HEVC / AV1 / VP9 / MPEG-2/4, VC-1, ProRes, Theora, … with AAC / AC-3 / E-AC-3 / DTS / Opus / Vorbis / MP3 / FLAC / TrueHD audio. - GPU-accelerated — hardware decode (D3D11VA on Windows, VideoToolbox on macOS) with automatic software fallback, plus shader-side YUV→RGB color conversion (8-bit NV12 and 10-bit P010). Smooth 1080p x265 10-bit on modest CPUs, with toggles and a live decode-path readout in Settings.
- Subtitles, done right — embedded and external
.srt/.ass/.ssa/.vtt/.sub, image subs (PGS / VOBSUB / DVB), full ASS/SSA styling. Rasterized at display resolution for crisp anti-aliasing, with font, size, color, outline and shadow options for plain-text subs — authored ASS styling is respected. - Pitch-preserving speed — 0.25–2× playback with VLC-style time-stretch, so voices stay natural at 1.5×; the classic pitch-shifting mode is a toggle away.
- Precise seeking — arrow-key seeks land exactly on target even on WEB-DLs with 10–20 s keyframe gaps.
- Auto-queue — open one episode and the rest of the folder queues behind it in natural
order (
E2beforeE10); toggleable in Settings. - Adjustments and themes — brightness, contrast, saturation, hue and gamma applied live on the GPU; five color themes plus an Adaptive theme that tints the UI from the playing video.
- Volume boost — software amplification up to 200% for quiet media, with a 100% notch on the slider.
- Native feel — borderless resizable window, rounded corners and shadow (Win11 DWM / macOS layer), aero snap on Windows, fullscreen, always-on-top, right-click context menu, pinnable control bar.
- A/V sync that holds — audio-master clock with starvation freewheel, background decode thread, late-frame scheduling.
- System integration — system-wide media keys, single-instance file handoff, snapshots to the Desktop, settings that autosave as you change them.
Windows — grab tivi-Setup-<version>.exe from the latest release
and run it — fully self-contained (FFmpeg, libass and raylib bundled), registers in
Add/Remove Programs, ships its own uninstaller. Silent install: Setup.exe /S.
macOS (arm64) — grab tivi-<version>-macos-arm64.zip from the
releases, unzip and run tivi.app — same
self-contained deal (FFmpeg, libass and raylib bundled, no Homebrew needed). First
launch: right-click → Open (the app is ad-hoc signed). Finder "Open With" works once
the app sits in /Applications.
Settings live in %APPDATA%\tivi (macOS: ~/.tivi-config.ini) and survive uninstall.
- Open: drag files or folders onto the window, click the
+button, or pressO. - Subtitles: drag a subtitle file onto the window, or CC panel › Load subtitle file…
- Resize: drag any window edge or corner. Move: drag the top bar.
- Click the video to play/pause, double-click for fullscreen, right-click for the context menu.
| Key | Action | Key | Action |
|---|---|---|---|
| Space | Play / pause | F / dbl-click |
Fullscreen |
| ← / → | Seek −5 s / +5 s | J / L |
Seek −10 s / +10 s |
| ↑ / ↓ | Volume up / down | M |
Mute |
N / B |
Next / previous | S |
Snapshot |
C |
Cycle subtitle track | X |
Cycle audio track |
[ / ] or - / + |
Slower / faster | \ |
Reset speed |
Q |
Playlist panel | A |
Adjustments panel |
G |
Settings panel | T |
Always on top |
R |
Cycle repeat | Esc | Back / exit fullscreen |
| Media keys | Play/Pause, Stop, Prev, Next (system-wide) |
Windows (MSYS2 / MinGW-w64):
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-pkgconf `
mingw-w64-x86_64-raylib mingw-w64-x86_64-ffmpeg mingw-w64-x86_64-libass.\build.ps1
.\build\tivi.exe "C:\path\to\movie.mkv"macOS (Homebrew):
brew install pkgconf raylib ffmpeg libass
sh build-macos.sh
./build/tivi ~/Movies/movie.mkv| Script | Does |
|---|---|
build.ps1 |
Compiles + links build\tivi.exe. |
bundle.ps1 |
Stages a standalone dist\win-x64\ (exe + full DLL closure — copy anywhere). |
installer.ps1 |
Packages dist\win-x64\ into a Windows Setup.exe via Forge. |
build-macos.sh |
Compiles + links build/tivi (clang, Homebrew deps, the *_mac.m Cocoa backends). |
bundle-macos.sh |
Assembles the self-contained dist/macos-arm64/tivi.app — .icns, Finder file associations, full dylib closure, ad-hoc codesign. |
config.ini lives in %APPDATA%\tivi\ (macOS: ~/.tivi-config.ini). Settings autosave as you change them — a crash or
kill can't lose them. Persisted: volume, always-on-top, theme, subtitle settings, hardware
decode / GPU conversion toggles, auto-queue, pinned controls, keep-pitch, the five video
adjustments, and window geometry.
tivi [files...] Open and play (multiple files queue up)
tivi -h | --help Show help
tivi -v | --version Show version
tivi --probe FILE Decode self-test: print stream info (diagnostic)
src/
main.c window, borderless chrome, UI, panels, input, drawing
player.c FFmpeg engine — demux/decode thread, D3D11VA / VideoToolbox, A/V sync, precise seek
yuvtex.c raw-GL Y/UV plane textures for shader color conversion (NV12/P010)
audio_out.c raylib AudioStream + lock-free PCM ring (audio clock = master)
subs.c libass subtitle rendering (embedded + external, style overrides)
playlist.c queue / index management
osvideo.c native dialogs, DWM corners/shadow, UTF-8 args, dir scan, console (Windows)
osvideo_mac.m NSOpenPanel dialogs, corners/shadow, work area, Finder "Open With" (macOS)
viconfig.c persistent settings (%APPDATA% / ~/.tivi-config.ini)
mediakeys.c system-wide media-key hotkeys (Windows)
mediakeys_mac.m media keys via MPRemoteCommandCenter (macOS)
singleinst.c single-instance (forward files to the running window) — Win32 mutex / Unix socket
assets/tivi.ico embedded Windows executable icon (assets/tivi-icon.svg is the source)
- raylib — window, input, GPU rendering, audio output (zlib)
- FFmpeg (
libav*) — demux / decode / filter / resample / scale (LGPL/GPL) - libass — ASS/SSA/SRT subtitle rendering (ISC)
- Visual design after Timp by Şamil Bülbül.
- Screenshots show the Sintel trailer — © Blender Foundation, durian.blender.org, CC-BY 3.0.
All code written for this project is released into the public domain.

