Number vendor label streams by STN slot, not by parsed entry
Sweep of every parser in src/labels/ for the numbering bug fixed in
pixelogic: a blob lists one entry per STN slot, but the parser advances
its per-kind counter only for entries it can use, so every entry it
skips shifts all later labels onto the wrong stream.
Three parsers were affected; the rest key each label off a number the
blob states outright and are immune.
* paramount — `aud` / `sub` are the STN-ordered stream lists, and
`forced_sub` / `*_com1_idx` index those same cells. A cell with an
empty language was skipped without consuming its slot, so every
label behind it bound one stream early while the vendor's own
positional indices still pointed at the raw cell. `stream_number`
is now the cell's 1-based position. The forced flag is the payload
here, so the shift lands `forced` on a full-dialogue track.
* mpls_universal — its counters must agree with the stream list
`disc::bluray` builds from the same STN entries, since that list is
what `apply_labels` counts against. They disagreed twice: a
`coding_type == 0` padding entry was counted here and dropped
there, and a PG coding_type in an audio STN slot (a layout
`mpls::parse_stream_entry` has a dedicated arm for) was counted as
audio here and built as a subtitle there. Both rules now live in
one `label_type_for`.
* deluxe — a binding construction whose Language `getstatic` did not
resolve was skipped outright. It is still an STN slot; it just has
nothing to label. It now advances the counter, with the list it
belongs to taken from its CodingType argument or, failing that,
from what its binding type's resolved siblings showed.
Two paramount tests asserted the renumbering as if it were the spec
(`empty_middle_slot_does_not_inflate_stream_number`,
`audio_stream_numbering_skips_empty_slots`) and are rewritten. Immunity
pins added for ctrm, dbp and criterion so the property cannot rot.
Also scrubs two commercial disc titles from the menu-graphic filename
examples in png_filenames and vocab.
This commit is contained in:
@@ -272,6 +272,44 @@ mod tests {
|
||||
assert_eq!(sub.qualifier, LabelQualifier::Sdh);
|
||||
}
|
||||
|
||||
/// Immunity pin. Every dbp label states its own slot in the `AudioN` /
|
||||
/// `SubtitleN` token, so the numbering survives gaps and skipped entries
|
||||
/// intact. Nothing here counts positionally, which is what keeps this
|
||||
/// parser out of the failure mode where a skipped entry pulls every later
|
||||
/// label one stream forward.
|
||||
///
|
||||
/// Mutation: number by iteration order → `Audio4` becomes 2 and
|
||||
/// `Subtitle3` becomes 1, silently rebinding both to other streams.
|
||||
#[test]
|
||||
fn stream_numbers_come_from_the_token_not_iteration_order() {
|
||||
let class_bytes = build_class(&[
|
||||
"LTextField,Audio1,English Dolby Atmos,Fontstrip_Composite,296,763",
|
||||
// Slots 2 and 3 have no menu TextField authored.
|
||||
"LTextField,Audio4,French 5.1 Dolby Digital,Fontstrip_Composite,296,803",
|
||||
// Not a stream: the disable-subtitles button.
|
||||
"ATextField,Subtitle0,None,Fontstrip_Composite,1312,843",
|
||||
// Unparseable slot token — dropped, and must shift nothing.
|
||||
"HTextField,SubtitleX,German,Fontstrip_Composite,1312,883",
|
||||
"HTextField,Subtitle3,English SDH,Fontstrip_Composite,1312,763",
|
||||
]);
|
||||
let mut archive = build_jar(&[("com/dbp/Menu.class", class_bytes)]);
|
||||
|
||||
let labels = scan_jar(&mut archive);
|
||||
let nums: Vec<(StreamLabelType, u16)> = labels
|
||||
.iter()
|
||||
.map(|l| (l.stream_type, l.stream_number))
|
||||
.collect();
|
||||
assert_eq!(
|
||||
nums,
|
||||
vec![
|
||||
(StreamLabelType::Audio, 1),
|
||||
(StreamLabelType::Audio, 4),
|
||||
(StreamLabelType::Subtitle, 3),
|
||||
],
|
||||
"unlabelled and unusable slots leave the authored numbers alone"
|
||||
);
|
||||
}
|
||||
|
||||
/// A `CONSTANT_Utf8_info` carries a `u16` length (JVMS §4.4.7), so one
|
||||
/// crafted constant contributes up to 65535 bytes and the `u16` stream
|
||||
/// keyspace admits 65536 slots per type — ~4 GiB of retained `String` per
|
||||
|
||||
Reference in New Issue
Block a user