4.5.3
One bug fix for the native loopback-HLS VOD path. No public API change; recommended patch upgrade for anyone on 4.2.2–4.5.2 who hit a scrub-burst wedge.
Fixed
A rapid scrub burst could leave the loopback-HLS VOD producer permanently anchored away from the playhead (#79)
The 4.2.2 seek-deadline recovery for #65 reconciles the engine clock to AVPlayer's real rendered position when a loopback seek can't land, and re-anchors the segment producer there so AVPlayer can resume from where it actually is.
Under a sustained bidirectional scrub burst on a bridged-audio title (TrueHD / DTS-HD MA / Dolby Vision + TrueHD, which route through the FLAC / EAC3 bridge onto the loopback path), that re-anchor was routed through the burst-coalescing restart path (#35). A later coalesced scrub target overwrote the recovery's pending re-anchor, so the producer settled at the stale scrub position (~3914 s in the reporter's trace) while the engine clock sat at AVPlayer's real rendered position (~5577 s). The resulting ~1660 s gap is one AVPlayer can never close: it stays starved behind a producer that is muxing the wrong part of the file, with no recovery. The ledger was clean throughout (drift=0), confirming this is the livelock class, not content/shift drift.
The recovery re-anchor is now authoritative: because it is computed from AVPlayer's real position (the ground truth the clock was just reconciled to), it wins the coalescer's pending slot over any in-flight scrub target, and a newer authoritative re-anchor still supersedes an older one. So the producer ends exactly where the clock was reconciled to, and AVPlayer recovers. The backpressure wedge breaker uses the same authoritative path; live segment-loss reopen is deliberately left non-authoritative.
Separately, when a restart found the old producer wedged in a blocking network read on the shared demuxer (which stop() cannot interrupt, it can't unblock a socket read), the new producer queued behind that read for the full ~20 s connection-stall timeout, producing the reporter's ~25 s restart. On the single-demuxer VOD path the engine now opens a fresh demuxer, aborts the wedged read, and hands the fresh demuxer to the new producer (installed only after session-epoch validation, with a clean fallback to the prior behaviour if the reopen fails). This also frees the wedged reader's AVIO buffers promptly instead of holding them for 20 s, trimming the restart-storm memory peak.
Thanks to reckloon for the frame-exact trace, the clean ledger evidence, and the precise root-cause analysis that separated the coalescer override from the wedged-read stall.
Full diff: 4.5.2...4.5.3