Skip to content

AetherEngine 5.18.2

Choose a tag to compare

@superuser404notfound superuser404notfound released this 21 Jul 18:41

Patch release: two user-seek races on the VOD loopback-HLS path, both reported with a precise code-level analysis by @YangHanqing in #178.

Fixed

Seeks during the initial load window are no longer silently dropped (#178, mechanism 1)

seek(to:) no-oped for the whole state == .loading window (probe, native load, readiness gate; several seconds on slow sources) with no queuing or replay. Hosts that render the seek target optimistically watched playback snap back to the pre-seek position once the pending target cleared.

The latest loading-window seek is now stashed, published optimistically to the scrub clock, and replayed through the normal seek(to:) path once the session settles into a playable state; clamp and live-DVR guards re-run at replay against the then-known session. This covers autostart paths too, where readiness fires while state is still .loading (the pre-existing #127 replay could never trigger there). A load that dies discards the stash. The .loading spinner hold is unchanged.

An ordinary seek no longer lands on a stale recovery position while an authoritative restart is pending (#178, mechanism 2)

Once a seek-deadline reconcile parked an authoritative recovery re-anchor in the restart coalescer's pending slot (#79), a subsequent user seek's segment-driven producer restart was dropped outright. The provider's bookkeeping already recorded the fire, so its own "AVPlayer re-requests" recovery was suppressed by the same-index guard, and the producer stayed anchored on the recovery position (~13 s off the requested target in the field log) until the seek deadline reconciled the clock back to the rendered position.

A new user seek now releases the superseded authoritative claim before the host seek is dispatched, so its restart takes the pending slot normally. The #79 protection is unchanged for the case it was built for: without a fresh user seek, stale burst-tail scrubs are still blocked from clobbering an authoritative re-anchor, and live-reopen anchors are untouched.

Tests

Issue178LoadingSeekStashTests (stash, latest-wins, replay-on-settle, discard-on-death, resolution policy matrix) and extended RestartCoalescerTests (supersede semantics; all pre-existing #35/#79 expectations unchanged). Full suite: 933 tests green.

No public API changes.