mirror of
https://github.com/zoriya/v10.git
synced 2026-08-15 10:23:32 +00:00
The model timeline (an averageDuration×sequence estimate) could drift from the SourceBuffer's native-PTS timeline across reloads. At ENDLIST the drifted model placed the final segments behind the playhead, so the loader skipped them and end-of-stream's isLastSegmentAppended never satisfied — playback stalled in `waiting`, duration stuck at Infinity, `ended` never fired. Pin the model to ground truth: once a segment is buffered, re-origin the track onto where it actually landed (anchorTrackToBufferedSegment), correlated via bufferedAnchorFor over the buffer actor's DOM-free snapshot. Pin once per track (the offset is constant under no-discontinuity); the parser's now-PDT-exact carry-forward maintains it. The sequence estimate stays the pre-buffer bootstrap. anchorLiveTracks stays DOM-free — the engine injects the resolver from the buffer actors; no timestampOffset (preserves A/V sync). The same pin serves non-zero-PTS VOD. Smoke-tested on a live Mux LL-HLS stream: durationchange → finite duration → plays out → `ended`, no stall. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>