Skip to content

Repository files navigation

tivi — a small, native video player

A small, native video player that plays everything — GPU-fast decode, crisp subtitles, a warm Hi-Fi shell.

Release Downloads Platform C11 raylib FFmpeg libass License


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.

tivi playing the Sintel trailer

Features

  • 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 (E2 before E10); 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.

tivi settings — performance and subtitle options

Install

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.

Usage

  • Open: drag files or folders onto the window, click the + button, or press O.
  • 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)

Building

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.

Configuration

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.

Command line

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)

Project layout

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)

Credits

  • 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.

About

Small, native video player in C that plays everything - raylib + FFmpeg + libass, GPU-accelerated

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages