Skip to content

MiSTer DVD Player

A DVD player core for the MiSTer FPGA platform (DE10-Nano / Intel Cyclone V).

Put a decrypted DVD image on the SD card and it plays — with the disc's own menus, button highlights, chapters, subtitles, and multi-channel audio. Decoding and navigation run entirely in FPGA fabric, with no HPS-side daemon. On the bare core the ARM only serves SD blocks through the standard framework interface, exactly like any other core; the optional MiSTer_DVDcss Main adds physical discs, CSS decryption and HDMI bitstream audio on the ARM side.

Status: alpha

Film and TV playback is the supported path and is exercised across a library of hundreds of commercial discs. Interactive DVD games are known-incomplete — see Compatibility.

Start here

New to the core? Install it, then work out what you need for the discs you own.

Already installed? Get a movie onto it and load it.

Something not working? Troubleshooting covers the traps people actually hit, and On-screen messages decodes anything the core tells you.

Wondering if your disc will play? Compatibility is the honest list of what works and what does not.

What works

Video — MPEG-2 decode at full rate, plus MPEG-1 (the DVD spec's other permitted video format, 352×240 / 352×288). NTSC and PAL are auto-detected from the stream. Progressive and native 480i/576i output, and 3:2 pulldown handling for film. Picture, sound, subtitles and captions are all presented against one clock, so lip sync holds across seeks, menus and mode changes.

DVD navigation — the core reads an ISO directly, parses the IFOs, and runs a real DVD virtual machine validated command-by-command against libdvdnav's behaviour. The disc's authored menus work: First Play, root and title menus, PCI/HLI button highlights, D-pad navigation following the authored link graph, subpictures, chapters via the PTT tables, multi-angle, seamless-branch interleaved cells, still frames, and audio/subtitle/angle/language selection. Transport runs from a gamepad, a USB keyboard or an infrared remote, with an on-screen HUD and seek bar.

Audio — AC-3, DTS and MPEG-1 Layer II decoded entirely in fabric (every AC-3 channel mode and the DTS core up to 5.1, downmixed to stereo) to HDMI; 48 kHz LPCM; AC-3 and DTS as IEC 61937 bitstream to a receiver — over optical S/PDIF, or over HDMI itself with the custom Main, so 5.1 needs no add-on board. Tracks with no bitstream format — LPCM and MP2 — still play as PCM in that mode.

Physical discs and encrypted ISOs — with the optional MiSTer_DVDcss add-on, the core plays a physical DVD straight from a USB optical drive, and CSS-encrypted ISOs directly, decrypting on the fly with a user-supplied libdvdcss. No PC decrypt step. The bare .rbf plays decrypted ISOs on its own; the add-on is opt-in and additive.

Video CD / Super Video CD — bin/cue rips play directly: select the .cue (or the data-track .bin) and the core strips the raw CD sectors in fabric, demuxes the MPEG-1 (VCD) or MPEG-2 (SVCD) stream, and plays it with correct 44.1 kHz audio pitch, seek and pause.

Analog / CRT — a native 15 kHz 480i/576i raster on the analog pins, built from the disc's authored fields, with broadcast-standard composite sync — the presentation a set-top player feeds a TV. VCD and MPEG-1 SIF content gets a genuine 240p/288p raster of its own. It engages from MiSTer.ini alone, like any other core.

Closed captions — NTSC discs carry EIA-608 captions hidden in the MPEG-2 video stream, separately from subtitles. The core extracts them and re-modulates them onto line 21 of the analog output, exactly as a real DVD player does, so your television's own caption decoder displays them.

How this was built

The RTL in this repository was written by an LLM working under human direction. The human contribution was research, architecture direction, and hardware QA — reading the DVD-Video specification and libdvdnav's source to establish correct behaviour, deciding what to build and in what order, and then running each build on real hardware, finding what broke, and narrowing it down to a root cause.

That last part is the bulk of the work, and there has been a great deal of it since development began in June 2026. The docs/ directory records the reasoning behind most non-trivial decisions, including the long diagnostic hunts (A/V drift, film cadence, field-coded discs) where the root cause turned out to be several layers away from the symptom.

This is stated up front because it is a fair thing for anyone evaluating the code to know. It is not an endorsement of the approach — draw your own conclusions.