5.20.5 - Stable and bounded live startup timing
Fixed
Stable live playlist timing (#209)
Live loopback sessions now keep one immutable TARGETDURATION and matching HOLD-BACK for the complete provider lifetime.
The first-manifest gate previously captured cadence once, while later playlist refreshes independently recomputed timing from mutable cadence and segment duration. A session could therefore change from TARGETDURATION:1 / HOLD-BACK=3 to TARGETDURATION:2 / HOLD-BACK=6 after AVPlayer was already ready and buffered.
The provider now owns one shared timing seal. The startup gate re-reads cadence until release and seals that decision; every later playlist build uses the same value.
Bounded fastZap startup (#208)
Explicit .fastZap sessions now have a bounded first-manifest wait on strict-realtime origins.
- Full holdback remains preferred.
- At least two finalized segments are always required.
- After that threshold,
.fastZapwaits one observed-segment grace clamped to 0.5...2.0 seconds before allowing a shallow first window. .standardretains the full-holdback guarantee.
The bounded path intentionally accepts the possibility of one early -16832 or a short rebuffer while the live window deepens.
Verification
- deterministic AE#208 and AE#209 regression suites
- full macOS test suite
- strict Swift concurrency build with warnings as errors
- iOS Simulator CI
- tvOS Simulator CI
Issues #208 and #209 remain open for physical Apple TV retests.