6.19.1 - A line for what was delivered, not what was decoded
A diagnostic release. No behaviour changes on any playback path.
Why
A report of permanently starved PGS cue delivery (#357) rested on the absence of [applySubtitleEvent #N] lines after a few seeks. That line could not carry the claim. It was capped at 20 emissions per load(), so a session went quiet after the twentieth event and every later seek landed unobserved; it is emitted ahead of the stale-arrival gate, the reconstruction hold, the PGS trim and the sorted insert, so it witnesses a decode and never a delivery; and it skips events without cues, which is exactly the zero-object PGS clear whose job is to retire the visible line.
#250 subtitle-resolution does not answer it either, by design. Its decodedThrough rides the drain cursor, which advances over every packet handed to the decoder whether or not the decoder built anything from it. A window of undecodable packets therefore advances determination at full pace while the screen stays as it was, and nothing in the log distinguished that from healthy delivery.
Added
#357 subtitle-delivery. One line stating what a subtitle drain tick did with the packets it found.outcome=is one ofnoDecoder,empty,undecodable,held,duplicate,trimOnly,published, printed with the counts it was derived from (packets,events,cues,admitted,published,held,recon). Emitted on a change of outcome and on every post-seek reset tick, never per tick: the drainer runs at 2 Hz per channel and a line per tick buries the transitions.noDecoder. A channel holding a drain target for which no overlay decoder can be built delivers nothing for the rest of the session. The tick used to skip it without a word.
Changed
- The per-cue
[applySubtitleEvent]line is budgeted per seek generation instead of perload(). A seek sequence now stays observable to its end. The line also printssourceTimebesidecurrentTime, since cue timestamps are absolute source PTS and the two axes differ by the playlist shift. - The internal subtitle apply path returns admitted and published counts rather than a bare
changedflag. A gate hold and a store that already held the cue are indistinguishable through the flag and mean opposite things.
Reading the two lines together
#250 states how far determination reached. #357 states what came out of it. A tick that reports outcome=undecodable while #250 keeps advancing decodedThrough is the shape every "resolution keeps up but nothing renders" report has had, and it is now visible as such rather than inferred from silence.
Compatibility
No public API change, no behaviour change. Consumers on 6.19.0 can take this without adjustment.