mux: FMTS reads only our-phase units (AacsKeyMap::read_plan)
An FMTS forensic segment interleaves our device group's variant with a foreign group's at the aligned-unit level. The mux was decrypting only our phase but leaving the alternate (foreign) units in the buffer as ciphertext, trusting the demux to 'drop untouched ciphertext cleanly'. It doesn't: random 0x47 bytes at the 192-byte stride hit tracked PIDs, mis-parse, and trip the demux's concealed-gap keyframe-resync — which drops GOOD frames of ours around every segment (349 resyncs / ~6391 packets on Stand by Me, visible as playback flaws). The map already knows which unit each LBA is and, for a forensic segment, which phase is ours. AacsKeyMap::read_plan turns that into the title's read plan: every default/CPS unit, plus inside a segment ONLY our-phase units. The alternate units are never fetched, decrypted, or handed to the demux — the demux sees one gapless our-variant stream. - read_plan is general (single-CPS, multi-CPS, FMTS): a map with no Even/Odd range returns the extents unchanged, so DVD/CSS, single-CPS UHD and multi-CPS Blu-ray read byte-for-byte as before. - Wired into build_iso_pipeline (the file-backed highway that muxes resumed ISOs). Producer re-anchors unit_base per extent, so per-unit segment reads stay unit-aligned and decrypt correctly. - Extent gains PartialEq/Eq for the read_plan tests. Tests: read_plan non-forensic unchanged; forensic omits exactly the alternate units, kept units match the decrypt gate unit-for-unit. All 2314 lib tests pass; precommit green on 1.86. Pending: end-to-end ISO re-mux validation (concealed gaps 349 -> ~0).
This commit is contained in:
+1
-1
@@ -457,7 +457,7 @@ pub(crate) fn chapter_name(i: usize) -> String {
|
||||
}
|
||||
|
||||
/// A contiguous range of sectors on disc.
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct Extent {
|
||||
pub start_lba: u32,
|
||||
pub sector_count: u32,
|
||||
|
||||
Reference in New Issue
Block a user