AetherEngine 1.3.1
AetherEngine 1.3.1
Patch release on top of 1.3.0. Two production fixes plus one diagnostic.
Producer: empty-cache restart now fires after far scrubs
mediaSegment(at:)'s empty-cache decision used to fall back to a "wait for cold-start producer" branch whenever index ≤ 2, assuming the only context in which the cache became empty was right after a fresh producer launch at baseIndex 0. A scrub-forward followed by a scrub-back exposed the assumption: after the cache window slid away from the current producer (now at baseIndex 1314 after a forward scrub), a subsequent back-scrub to seg-0 hit an empty cache, fell into the "wait" branch, and AVPlayer timed out for 30 s before getting a 404 with CoreMediaErrorDomain -12938.
Fix tracks lastRestartIndex on the segment provider and restarts when |index − lastRestartIndex| > 2. Cold start (lastRestartIndex = 0, AVPlayer requests seg-0) still waits; back-scrubs to a position far from the producer trigger a clean restart at the requested index.
DV Profile 5: master playlist on HDR-ready non-DV panels
1.3.0 routed every non-DV-capable panel's DV5 source via the media playlist. That works on SDR-locked panels (where tvOS 26 rejects bare dvh1.05 master CODECS with -11868), but on an HDR-capable non-DV panel currently in HDR mode it forced a DV→SDR tonemap when DV→HDR10 would have been the better choice. Per DrHurt's #63 morning test on AetherEngine#4, the master path is accepted on HDR-capable non-DV panels and tonemaps to HDR10 properly.
New per-state matrix for DV5:
| Panel state | Routing |
|---|---|
| DV-capable in DV mode | master (unchanged) |
| DV-capable SDR-locked, match off | media (unchanged) |
| Non-DV in HDR mode | master (changed, was media) |
| Non-DV SDR-locked, match off | media (unchanged, master gets -11868) |
DV8.1 and DV8.4 dispatch unchanged.
Diagnostic: A/V gap at audio gate
The [HLSSegmentProducer] audio gate open: log line now reports the source-time gap between video's first kept packet and audio's first kept packet (gapMs=X.X). A separate WARNING line fires when the gap exceeds 50 ms, surfacing lip-sync drift in support logs without needing to read frame headers.
Engine pin
For Sodalite hosts: bump Package.resolved to 44c3a05 (or use the 1.3.1 tag).