A Rust-native HDMV navigation and menu engine for Blu-ray Disc.
HDMV ("HD Movie mode") is the non-Java interactive application model in the Blu-ray Disc ecosystem. It provides button-driven navigation, pop-up menus, and disc-level control logic through a small, deterministic, register-based command language ("movie objects") and a page-based interactive graphics scene model ("Interactive Graphics streams").
libhdmv is a Rust workspace that implements the HDMV stack as a reusable library:
- Parse BDMV disc structures (
index.bdmv,MovieObject.bdmv, playlists, clip info,sound.bdmv) - Author complete BDMV disc structures with a high-level
DiscBuilderAPI - Execute HDMV movie object command sequences in a deterministic VM
- Decode Interactive Graphics (IGS) and Presentation Graphics (PGS) streams
- Navigate BD menus with a scene engine (focus, activation, page transitions, popup toggle)
- Render menu overlays as RGBA images for preview and inspection
- Inspect disc structures from the command line with
hdmv-inspect
It is designed to be consumed by Spindle (a desktop disc authoring workstation) via a Tauri v2 plugin, but can also be used standalone from CLI tools, other applications, or for fuzzing and testing.
libhdmv-workspace/
crates/
bdmv-io/ # Filesystem abstraction (folder/ISO/UDF), path resolver
bdmv-parse/ # index.bdmv, MovieObject.bdmv, MPLS, CLPI, sound.bdmv parsers & writers
hdmv-insn/ # Instruction enums and 12-byte command word decoder
hdmv-vm/ # VM executor, register file, event emission
igs/ # IGS bitstream decode → pages/BOGs/buttons/effects
pgs/ # PGS decode → palette + RLE overlay objects
hdmv-scene/ # UI-agnostic menu scene model (focus, nav, timers)
hdmv-render/ # Renderer traits + reference CPU compositor
libhdmv/ # Umbrella crate re-exporting the stable API + DiscBuilder
examples/
hdmv-inspect/ # CLI tool for dumping/disassembling BDMV structures
bdmv-io → bdmv-parse → hdmv-insn → hdmv-vm ─┐
├─→ hdmv-scene → libhdmv
bdmv-parse → igs, pgs ────┘
└─→ hdmv-render → libhdmv
- Parsing all BDMV control files (standard BD and UHD BD, versions 0100–0300)
- HDMV VM execution with event emission (deterministic, no side effects)
- IGS decode: pages, button overlap groups, button states (Normal/Selected/Activated), navigation commands, effects, timeouts
- PGS decode: palette, RLE bitmap, composition state, window positioning
- Menu scene engine: focus navigation, activation, popup toggle, timers, hit testing
- Reference CPU renderer producing RGBA overlay frames
- UHD BD-aware data models: HEVC stream type (0x24), VideoFormat 2160p, DynamicRangeType, ColorSpace, HDR flags
- DRM/AACS/BD+ — operates on decrypted disc folders/ISOs only
- BD-J — the Java-based BD application model is a separate runtime with fundamentally different threading and security characteristics
- A/V codec decoding — delegate to ffmpeg/GStreamer/mpv
- Disc playback — libhdmv is a navigation/menu engine, not a media player
libhdmv is consumed by Spindle through a thin Tauri v2 plugin:
liminal-hq/libhdmv ← this repo (pure Rust, no Tauri dependency)
↑
liminal-hq/tauri-plugins-workspace
└─ tauri-plugin-hdmv ← thin Tauri command/event surface
↑
liminal-hq/spindle ← desktop authoring app
Alpha. Core parsing, writing, VM execution, IGS/PGS decoding, menu scene navigation, rendering, and disc authoring are implemented with 98 tests passing. See IMPLEMENTATION_PLAN.md for the phased development roadmap.
Licensed under the Apache License, Version 2.0. See LICENSE for details.
Copyright 2026 Liminal HQ.