Skip to content

4.5.2

Choose a tag to compare

@superuser404notfound superuser404notfound released this 26 Jun 20:13

One bug fix for the native loopback-HLS VOD path. No public API change; safe patch upgrade from any 4.5.x (and the recommended upgrade for anyone on 4.2.2–4.5.1 who hit the pause wedge).

Fixed

A user pause was misread as a backpressure wedge, deadlocking the loopback-HLS VOD path (#65)

The 4.2.2 fix for #65 added a backpressure wedge-breaker: when the consumer's segment-fetch target freezes while the producer is parked ahead of it, the engine re-anchors the producer onto AVPlayer's real position to break the stall.

A paused AVPlayer freezes that fetch target legitimately, it issues no forward segment request by design. With no play-intent awareness the breaker could not tell that apart from a real wedge, so a pause longer than ~24s on a bridged-audio loopback-HLS title (TrueHD, DTS-HD MA, or any codec that routes through the FLAC / EAC3 bridge, putting it on the native loopback path) tripped it. The re-anchor loop then ran against a player that cannot advance because it is paused, exhausted its attempts, and left the producer re-anchored ahead of a buffer stranded behind the playhead, a state resume could not recover. The result was a permanent wedge that needed a force-quit, fired by an ordinary pause rather than the sustained dueling-scrub the original #65 needed.

Wedge detection now gates on play intent. The engine mirrors AVPlayer's timeControlStatus to the off-main producer pump; while the player is paused the wedge detector suspends and re-baselines, so a pause of any length never trips it and the detection window after resume starts fresh. A genuine starved wedge, where the player wants to play but is buffer-starved (waitingToPlay), still counts as play intent and still trips, so the original #65 scrub-burst protection is unchanged. The seek-deadline reconcile path gets the same pause guard, so a scrub while paused is not mistaken for a starved seek.

Thanks to rrgomes and reckloon for the independent 4.5.1 captures, the clean ledger evidence (drift=0 ruled out content drift and pointed straight at the Piece-A detector), and the precise play-intent-vs-pause discriminator.


Full diff: 4.5.1...4.5.2