5.0.4
Bugfix release.
Fixed
Subtitle cues no longer pace ahead of a frozen picture during a queued seek chase (#123)
Under sustained queued skip bursts on a heavy 4K Dolby Vision asset (a new burst of presses issued into an unfinished settle), the engine's reported clock adopted each new target immediately while the underlying player rebuilt, and sourceTime parked tens of seconds ahead of the picture for continuous stretches of 14 to 33 s. sourceTime is the on-screen frame axis (it holds the picture across a seek and is not the scrub target, #49), so a host pacing subtitle cues off it rendered cues for positions 10 to 30 s ahead over a still frame until convergence. On screen this read as the picture frozen at the old position with dialogue from elsewhere playing across it in captions, then everything snapping together.
Root cause: the VOD seek finalize (clock.sourceTime = landedSourcePTS) and the native host's seek completion (renderedTime = landed) stamped sourceTime/renderedTime onto the target unconditionally at landing. During a queued-burst chase the player sits in waitingToPlayAtSpecifiedRate with the picture frozen behind the target, and the 100 ms periodic observer that would walk the clock back to the rendered frame is silent while buffering (the timebase is not advancing), so the target stamp stuck for the whole chase.
Fix: both stamps are now gated on whether the landed frame is actually presented. A playing or paused landing shows the target frame and settles onto it immediately, so isolated scrubs and paused scrubs (#122) are unchanged. A landing still buffering toward the target holds sourceTime on the rendered frame; the $renderedTime sink settles it onto the target when playback resumes and the frame is delivered. Cues glued to sourceTime stay glued to the picture through the chase, and abs(currentTime - sourceTime) stays honest as a converging gap a host can gate cue rendering on.
The phase logs ruled out the producer restart coalescer as a lever: nine cheap restarts across roughly 107 seeks (worst 96 ms, entirely in stop-wait, decode build never above 1 ms), and the long divergence stretches contained zero rebuilds and were pure player buffering of 4K Dolby Vision from a keyframe out to a moving target.
Thanks to rrgomes for the triangulated three-clock traces (real player position, engine sourceTime, engine currentTime) and the per-restart phase breakdown that isolated the finalize stamp.
Verification
556 tests pass, strict-concurrency (-strict-concurrency=complete) clean, tvOS-simulator build succeeds.
Full changelog: 5.0.3...5.0.4