RCO IMG entries hold PNG images (magic 89 50 4E 47), decodable directly
by ImageIO/JavaFX. RcoFile now reads pImgData and stores raw image
bytes in ImageObject; the CLI reports the first image's magic.
- Type system: BaseType (+Int/Float/Unknown) and BaseReferenceType
(+Event/Image/Text/Ref/Object/Model) for typed record fields.
- Object model: BaseObject/BasePositionObject and all 25 object classes
(Page, Plane, Button, UButton, Text, Model, Icon, Group, Action,
XMenu/XMList/XList/XItem, MList/MItem, LList/LItem, IList/IItem,
Progress, Scroll, Spin, ItemSpin, Edit, Clock) with reflection-based
field deserialization.
- ObjectFactory + RcoContext materialize 89 objects and 81 images from
the RCO; RcoFile resolves references and wires entry.obj/vsmxObject.
- Resource builds the live pagetable/animtable/soundtable/texturetable
into the VSMX tree; Controller tracks input focus.
- Validated on Batman Begins: onAutoPlay still drives playback
(stream 00003) with the object tree populated.
- 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