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.
Built as a fork of mrchrisster/MiSTer_MPEG2,
itself a MiSTer port of Koen De Vleeschauwer's mpeg2fpga hardware MPEG-2 decoder
(2007). The video decode datapath is theirs and is largely unmodified; this project adds
everything needed to turn a decoder into a player.
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 Known limitations.
📖 Read the manual — install, controls, every setting, CRT and captions, physical discs, troubleshooting.
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.
- DVD-Video from a decrypted
.iso— the disc's own menus, First Play, button highlights, chapters, subtitles, multi-angle and still frames, driven by a real DVD virtual machine validated against libdvdnav. - Physical discs and CSS-encrypted images with the optional
MiSTer_DVDcssadd-on — no PC decrypt step, and encrypted images need no optical drive at all. - Video — MPEG-2 and MPEG-1, NTSC and PAL auto-detected, progressive or native 480i/576i, 3:2 pulldown for film, and one clock for picture, sound, subtitles and captions — so lip sync holds across seeks, menus and mode changes.
- Audio — AC-3 (every channel mode) and MP2 and LPCM decoded entirely in fabric; AC-3 and DTS as IEC 61937 bitstream to a receiver — over optical S/PDIF, or over HDMI with the custom Main, so 5.1 needs no add-on board. Tracks with no bitstream format still play as PCM in that mode.
- Analog / CRT — a native 15 kHz 480i/576i raster 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 instead of being line-doubled. Engages from
MiSTer.inilike any other core. - Closed captions re-modulated onto line 21 of the analog output for your television to decode, exactly as a real player does.
- Video CD / SVCD — bin/cue rips play directly.
- Gamepad, keyboard or infrared remote — every transport action has a built-in key, so a USB IR receiver turns any remote you already own into a DVD remote with nothing to configure.
- The bare
.rbfplays decrypted images only. Physical discs and CSS-encrypted images needMiSTer_DVDcssplus a user-supplied libdvdcss — as do the Eject and Volume buttons, which the core cannot service by itself. - ISO9660 only — UDF-only images report
UNSUPPORTED IMAGE. - No DTS decode — passthrough to a receiver only.
- Bitstream passthrough over HDMI needs
MiSTer_DVDcss; over optical S/PDIF the bare.rbfis enough. - Closed captions are analog-only and need a television that decodes them. Roughly 1 disc in 6 carries any.
- Interactive DVD games are incomplete. Film and TV discs are the supported path.
Full list, with the reasoning →
-
Install — download
MiSTer_DVD_v<version>.zipfrom the latest release and extract it to the root of your SD card (/media/fat). -
Add two lines to
/media/fat/MiSTer.ini(add the section, don't replace the file):[DVD] main=MiSTer_DVDcss
-
Run
install_dvdcssonce from the MiSTer Scripts menu — it fetches the library that decrypts CSS, which nearly every commercial DVD uses.
Then launch DVD, and load a disc or an image from Load Video.
Steps 2 and 3 are one-time — updating later is just the new zip.
If a network share gives you a black screen and no error, it is mounted read-only. The framework opens images read-write regardless, so a read-only mount fails silently.
- User manual — everything above, properly. Source in
site/content/. docs/— engineering design notes: the why behind the RTL, including the long diagnostic hunts and the theories that turned out wrong. Not a manual.- Historical note:
fj#NNreferences and quoted commit SHAs come from a pre-publication private repository and do not resolve here.
Requires Quartus 17.0.2 exactly — newer versions break MiSTer project compatibility.
./build_release.sh --compile # native Quartus
USE_DOCKER=1 ./build_release.sh --compile # pinned containerThe build names itself after the dev-<slug> in CORE_VERSION, so the .rbf, the zip
and the OSD line all identify the same build.
Always use build_release.sh rather than quartus_cpf directly: MiSTer's loader needs a
compressed .rbf (~4.3 MB). An uncompressed one (~7 MB) silently fails to configure —
the core appears to load but produces no video on any output.
Module testbenches run under Icarus Verilog; see bench/dvd/.
Full build docs, including MiSTer_DVDcss and packaging →
The project as a whole is GPL-3.0-or-later — see LICENSE, with the component breakdown in NOTICE.
That falls out of what it is built from rather than being a preference:
| Component | Licence |
|---|---|
sys/ — MiSTer framework |
GPL, mixed "v2 or later" and "v3 or later" |
rtl/ — MPEG-2 decoder, © 2007 Koen De Vleeschauwer |
BSD (mpeg2fpga) |
dvd/, bench/dvd/, tools/, docs/, site/ |
Original to this project — GPL-3.0-or-later |
dvd/ac3/ — the AC-3 decoder |
Original RTL, but a derivative work of liba52 (GPL-2.0-or-later) — see NOTICE |
The sys/ files that are "v2 or later" can be taken to v3, but the "v3 or later" ones
cannot go down to v2, so the combination resolves to GPLv3-or-later. BSD is
GPL-compatible, so rtl/ folds in while remaining BSD in its own right; its copyright
headers must be retained.
One wrinkle worth recording: the
rtl/file headers as vendored carry only the BSD warranty disclaimer — the grant clauses are not reproduced in them, and no upstream distribution in the chain ships a LICENSE file. The licence is established by the author's own publication ofmpeg2fpgaon OpenCores, which states "License: BSD".
Patents are separate, and the MPEG-2 ones have expired. rtl/LICENSE-MPEG2 is a
patent notice, not a copyright licence, and it is retained from upstream unchanged. It
warns that commercial use may require a licence from MPEG LA — that warning is now
stale: the last US patent in MPEG LA's MPEG-2 portfolio expired in February 2018 and
the licensing programme was wound down, so there is no longer an MPEG-2 pool licence to
take. The other formats this core decodes are in the same position — the AC-3 (Dolby
Digital) patents ran out in 2017, and MPEG-1/MP2 earlier still. None of this is affected
by, and does not affect, the copyright position above.
This core is built on Koen De Vleeschauwer's mpeg2fpga
MPEG-2 decoder (2007), ported to MiSTer by mrchrisster as
MiSTer_MPEG2, on the MiSTer-devel
framework. Much of what looks like original engineering here is the result of having good
references — libdvdnav, libdvdread and others — to check against. The AC-3 decoder goes
further than checking: it follows liba52 closely enough to be a derivative work of it,
as NOTICE records.