The VMG's 0xC4 is TT_SRPT, not VMGM_C_ADT

The placement code skips that field for the Video Manager, which is
right, but said it was skipping it because the field is the menu cell
address table. It is the title search pointer table, and it is an offset
inside the IFO rather than a pointer to another file — which is the
actual reason it constrains nothing. ifo.rs reads the same offset under
the correct name, so the two would have drifted.
This commit is contained in:
Matthew Jackson
2026-08-05 17:03:19 -07:00
parent ffbc1d8399
commit 3980aa8976
+6 -2
View File
@@ -399,8 +399,12 @@ fn place_video_ts(vts: &mut DirNode, start: u32) -> Result<u32> {
if menu != 0 { if menu != 0 {
menu_req.insert(c.group, lba.saturating_add(menu)); menu_req.insert(c.group, lba.saturating_add(menu));
} }
// Only a VTS IFO carries a title VOBS pointer at 0xC4; the VMG's // Only a VTS IFO carries a title VOBS pointer at 0xC4. In the VMG
// 0xC4 is a different field entirely (VMGM_C_ADT). // (`VIDEO_TS.IFO`) that offset is TT_SRPT, the title search pointer
// table — a sector offset INSIDE the IFO, not a pointer to another
// file, so treating it as one would place `VIDEO_TS.VOB` at a
// meaningless address. (`ifo.rs::parse_vmg` reads the same field as
// TT_SRPT; the two must not drift.)
if c.group > 0 { if c.group > 0 {
let title = be_u32(&head, 0xC4).unwrap_or(0); let title = be_u32(&head, 0xC4).unwrap_or(0);
if title != 0 { if title != 0 {