A live channel hitches for a fraction of a second about every thirty seconds: the picture freezes, the layer drops out and comes back, and playback continues. The picture never jumps and the position is held, so it reads as a very short rebuffer rather than as a stall.
The device log names the whole mechanism. The producer cuts 3.000 s segments, and they finalize in PAIRS about 30 ms apart, one pair every 6.5 to 6.9 s:
15:55:34.708 live seg-17 finalized: start=51.033s dur=3.000s
15:55:34.736 live seg-18 finalized: start=54.033s dur=3.000s
15:55:41.251 live seg-19 finalized: start=57.033s dur=3.000s
15:55:41.277 live seg-20 finalized: start=60.033s dur=3.000s
15:55:47.864 live seg-21 ...
Measured gaps between bursts over one minute: 6.85, 6.52, 6.59, 6.50, 6.85, 6.53, 6.58, 6.77 s, with three short 3.4 to 3.6 s gaps mixed in. The upstream hands over roughly 6 s of media at a time and the cutter turns each delivery into two segments, so the source's own delivery interval is about 6.9 s at its widest. It is delivering 72 s of media in 64 s of wall clock, which is to say it is not behind at all.
TARGETDURATION is 4 s, so the client's unchanged-playlist patience, 1.5 x TD, is 6.0 s. That is the number sourceIsLateLocked uses to decide whether the SOURCE has stopped delivering, and every single ordinary burst gap is wider than it:
15:55:47.840 #446 the source has missed its cadence (quiet 6.56s, TARGETDURATION 4s); the consumer
is at 19 of 21 with 3.0s of runway, and the window stays live until 12.0s of silence,
or sooner if that runway would not carry the wait that far (5.4s of it left)
15:55:47.843 #446 the source stopped delivering with the consumer at 19 of 21 ... so the wait has
run out of content rather than out of clock); serving the rest of the window as a
finished asset (ENDLIST)
15:55:53.810 #2 didPlayToEndTime
15:55:53.810 #446 the window ran out and the source is delivering again; swapping the item
Then the same thing again at 15:56:17.90, and the same swap at 15:56:25.17. The item swaps land 31.4 s apart, which is the hitch the viewer sees. layer.isReadyForDisplay goes false for 47 ms and 134 ms across the two swaps.
So a healthy source is being judged by the client's patience. 1.5 x TARGETDURATION is the right threshold for withdrawing CAN-BLOCK-RELOAD, which is a statement about what AVPlayer will sit through, and it is the wrong one for "has the source stopped delivering", which is a statement about the source. Nothing in the session measures the source's own rhythm, so a source that is merely COARSER than its advertised target duration is indistinguishable from one that has died, and the close then costs an item swap every time it delivers normally.
The runway bound (AE#520) is not what fires here. It is asked only once the source is judged late, and with lateness read correctly none of these gaps reaches it.
Expected: a source that keeps its own steady rhythm never closes the window. An outage that misses that rhythm still does.
Reported on iOS 26.5, engine at the Sodalite#104 branch tip.
A live channel hitches for a fraction of a second about every thirty seconds: the picture freezes, the layer drops out and comes back, and playback continues. The picture never jumps and the position is held, so it reads as a very short rebuffer rather than as a stall.
The device log names the whole mechanism. The producer cuts 3.000 s segments, and they finalize in PAIRS about 30 ms apart, one pair every 6.5 to 6.9 s:
Measured gaps between bursts over one minute: 6.85, 6.52, 6.59, 6.50, 6.85, 6.53, 6.58, 6.77 s, with three short 3.4 to 3.6 s gaps mixed in. The upstream hands over roughly 6 s of media at a time and the cutter turns each delivery into two segments, so the source's own delivery interval is about 6.9 s at its widest. It is delivering 72 s of media in 64 s of wall clock, which is to say it is not behind at all.
TARGETDURATION is 4 s, so the client's unchanged-playlist patience,
1.5 x TD, is 6.0 s. That is the numbersourceIsLateLockeduses to decide whether the SOURCE has stopped delivering, and every single ordinary burst gap is wider than it:Then the same thing again at 15:56:17.90, and the same swap at 15:56:25.17. The item swaps land 31.4 s apart, which is the hitch the viewer sees.
layer.isReadyForDisplaygoes false for 47 ms and 134 ms across the two swaps.So a healthy source is being judged by the client's patience.
1.5 x TARGETDURATIONis the right threshold for withdrawingCAN-BLOCK-RELOAD, which is a statement about what AVPlayer will sit through, and it is the wrong one for "has the source stopped delivering", which is a statement about the source. Nothing in the session measures the source's own rhythm, so a source that is merely COARSER than its advertised target duration is indistinguishable from one that has died, and the close then costs an item swap every time it delivers normally.The runway bound (AE#520) is not what fires here. It is asked only once the source is judged late, and with lateness read correctly none of these gaps reaches it.
Expected: a source that keeps its own steady rhythm never closes the window. An outage that misses that rhythm still does.
Reported on iOS 26.5, engine at the Sodalite#104 branch tip.