The CLI 'rco' command now runs the full pipeline headlessly: parse RCO,
execute the VSMX script, invoke onAutoPlay, and decode the selected
stream via PlaybackEngine. Batman Begins autoplays playlist 3 (the
anti-piracy warning) and decodes 23 frames from stream 00003.
- NativeFunctionFactory resolves script method calls to native Java
methods via reflection; VsmxNativeFunction wraps them for the VM.
- Native objects: Controller, MoviePlayer, Resource, Math, Timer,
GlobalVariables, decoupled from the UI via a MenuHost interface.
- BaseNativeObject.callCallback invokes script callbacks like onAutoPlay.
- CLI 'rco' now wires the full menu and executes onAutoPlay headlessly.
- Validated against Batman Begins: onAutoPlay computes stream IDs and
issues play(playList=3, chapter=1, video=0xE000, audio=0xBD00,
audioFlag=1, subtitle=-1, subtitleFlag=0) — the anti-piracy warning
clip with English video/audio.
- VsmxInterpreter: stack machine executing all 74 VSMX opcodes
(arithmetic, comparisons, bitwise, jumps, calls, arrays, objects).
- Object model: VsmxBaseObject/Undefined/Null/Boolean/Number/String/
Object/Array/Function/Reference/LocalVarReference/Method/CallState/
NativeObject, plus BaseNativeObject for future native objects.
- CLI 'rco' now runs the menu script headlessly and prints the 172
resulting global variables (state, chapter/language config, focus).
- Validated against Batman Begins: script runs with zero unimplemented-
opcode warnings and defines all menu functions (on_cancel, mm_on_push,
trans_to_play, play_movie_beginning, ...).
- Lzr: RLZ decompressor ported from JPCSP (for compressed RCO data).
- RcoFile: parses RCO header, entry tree (labels, VSMX blob, image/
sound/font/object/animation tables, text), and event name table.
- RcoEntrySizes: fixed binary sizes of the 26 object and 11 animation
record types, needed to locate entries with entrySize=0.
- Vsmx: parses VSMX bytecode (code groups + string tables) and
disassembles to human-readable opcodes; VsmxCode holds the opcode
table.
- CLI 'rco' command dumps events, entry tree, and VSMX disassembly.
- Validated against Batman Begins EN/FR menus: full scene graph
(pages/planes/buttons/groups) and 5585-bytecode scripts decoded.
- AnnexBSplitter incrementally splits the Annex-B stream into access
units, holding partial slices across packet feeds.
- VideoDecoder exposes feedAccessUnit and the decoded frame rate.
- PlaybackEngine demuxes and decodes in lockstep, tagging video frames
and audio chunks with 90 kHz PTS (audio from PES headers, video from
PES anchors interpolated by decoder frame rate).
- CLI 'play' command runs the engine headlessly and reports A/V drift.
- Validated against Batman Begins: 95 frames in 4.0s, max drift -78.6 ms
(video trails audio at stream start), avg frame duration 3833.6 ticks.
- Tests for AnnexBSplitter.
- MpsDemuxer parses MPEG-PS packs (0x1BA) into video (0x1E0-0x1EF) and
audio (0x1BD) PES packets with PTS/DTS at the 90kHz clock.
- VideoDecoder decodes Annex-B H.264 via JavaCPP FFmpeg 8.1.2, splitting
the stream into access units (one slice NAL per packet) so each send
yields a frame.
- CLI 'decode' command dumps frame metadata (720x480 YUVJ420P).
- Validated against Batman Begins: 72 frames decoded.
- Parse PS packets, PES headers and PTS/DTS timestamps
- 'mps' CLI command samples packets from a stream
- Validated on Batman Begins 00001.MPS (Annex-B H.264 + 2-channel ATRAC3+)
- Add little-endian readers to UmdIsoFile
- Playlist parser (streams + chapter markers) ported from JPCSP
- dump command now lists streams, durations and chapter markers
- Unit test for chapter/timestamp mapping