Files
libfreemkv/docs/pgs.md
T
Matthew Jackson 6e14fc0c0c libfreemkv: 1.7.0 groundwork — sector-recycle soundness + CI hardening
Security
- Remove the unsafe Vec::set_len over recycled sector buffers — UB reachable
  from safe code (GHSA-j8ww-f5fg-9pmh, low). Uses Vec::resize; pooling unchanged.

CI / tooling
- clippy on stable with the MSRV single-sourced from Cargo.toml; cargo-deny
  dependency-audit gate with first-party git sources allowed (#15); audience-based
  comment-guard (#17).

Docs
- README (keydb ownership, BD-J parser count), drive-access transport/reset
  notes, mux timeline module-doc links.
2026-09-02 12:40:55 -07:00

72 lines
3.8 KiB
Markdown

# HDMV PGS subtitle parser (`src/mux/codec/pgs.rs`)
## Module overview: why display sets need a synthesized duration
For Matroska output the parser collapses a display PCS / clear PCS pair into
one block with `BlockDuration` set to `clear_pts - display_pts`. Without a
duration, hardware players linger on the last bitmap until the next subtitle
replaces it — which can be many seconds, and on a disc where the final
subtitle has no follower, until end of file.
## `display_set_is_forced`
The mux uses this to detect a *forced-narrative track* (every displayed
subtitle forced) without relying on the disc's vendor label metadata, so
forced subs are flagged `FlagForced` even on discs that carry no such blob.
## `demotable`
Full rationale and measured track shapes:
* Promotion (0 → 1) needs no gate: it rests on positive evidence (every
display set carried `forced_on_flag`). Demotion rests on an ABSENCE, and an
absence is only meaningful if the flag is in use at all. Measured: discs
exist on which NO track carries `forced_on_flag`; there, "this track has no
forced display sets" is a fact about the authoring house, not about the
track, and demoting on it would strip a correct forced label from every
track on the disc.
* `DEMOTE_MIN_DISPLAY_SETS`: a track must have shown at least this many
display sets before "none of them was forced" is allowed to contradict a
vendor forced label. Absence is weak evidence on a handful of sets: a
genuine forced-narrative track is SMALL (measured shape: tens of display
sets for a whole feature), so a couple of unflagged sets is exactly what
one looks like on a disc whose authoring never sets the flag.
* `DEMOTE_MIN_DISPLAY_SHARE_DIVISOR`: the track must also carry at least this
fraction (1/N) of the display sets of the busiest subtitle track on the
disc. Measured: a dedicated forced track carries a low-tens count of
display sets for a whole feature, a full dialogue track carries one to two
thousand — two orders of magnitude apart. A track sitting within a quarter
of the busiest track's count is a full track, whatever its label says; a
track at one percent of it is the forced-narrative track its label claims
and must keep that label.
* A track that itself mixes forced and non-forced display sets is the
stronger form of "flag in use": it shows the authoring house making that
distinction deliberately. The shape test still applies to it — a SMALL
track with a couple of flagged sets is a forced track whose authoring
flagged some of its signs, and demoting it would be exactly the mistake the
shape test exists to prevent.
See also `docs/pgs-forced-probe.md` for the `info`-time probe that reuses
this same classifier.
## Test notes
`observed_stays_false_until_a_real_display_set_is_seen`: `observed()` is the
probe's "did I actually see any PGS content?" signal. When false the track's
forced state is UNKNOWN and the probe leaves whatever flag the disc's own
metadata supplied alone; when true, the probe overwrites that flag with its
own verdict. A tracker that always claims to have observed something would
let an unread or undecrypted subtitle track — where `is_forced()` is
vacuously false — overwrite a correct vendor "forced" flag with "not forced".
`a_mixed_track_corroborates_the_flag_itself`: a track that itself mixes
forced and non-forced display sets needs no corroboration from a sibling —
the flag is demonstrably in use ON THIS TRACK. Models a busy track labelled
forced that flags one or two of its hundred-odd display sets.
`a_lone_segment_emitted_directly_still_carries_provenance`: a lone non-PCS
segment with a PTS is emitted straight through rather than accumulated, and
it must still carry provenance. This path was missed on the first pass and
showed up on a real disc as a subtitle track with no source offset — the one
track out of forty that could not be placed by byte.