The engine cannot tell that the media server went away underneath it, and after that it never recovers on its own.
Field report, Apple TV 4K 3rd gen (AppleTV14,1), tvOS 27.0 (24J361), engine 7.10.1, an H.264 title with E-AC-3 5.1 passthrough to an Atmos receiver. Playback was running when the television was switched off, and the box came back about an hour later. The session then failed, and afterwards nothing on the whole box would play until it was rebooted.
The whole-box part is probably not ours, and the qualifier matters. The same shape is widely reported across Netflix, HBO Max, Paramount+, Prime and others on this hardware generation, Apple Support has called it a known issue, and the reported workarounds (a reboot, reseating HDMI, or setting Sleep After to Never) point at a wake-from-sleep HDMI handshake rather than at any one app. Those reports are on tvOS 26 and 26.0.1; this one is on 27.0, so either it survived the release or this is a different fault wearing the same shape. Worth knowing either way: several of those reports describe it happening after an idle hour with nothing playing at all, which no client can be blamed for. What is ours is everything in this issue: the engine is blind to it, it keeps using objects that are already dead, and one of its own mechanisms then wedges permanently.
What the log shows
09:35:23.179 [AVKitLayer] isReadyForDisplay=true t+4577.15s after attach
09:35:23.193 #2 item.videoTrack codec='avc1' enabled=true dim=1920x1080 (readyToPlay)
09:35:23.847 #2 failedToPlayToEndTime CoreMediaErrorDomain/1852797029
09:35:26.945 #93 item death (failedToPlayToEndTime) at 271.14s; reloading (attempt 1)
09:35:27.160 #3 item.videoTrack codec='?' enabled=false (readyToPlay)
09:35:27.162 #3 failedToPlayToEndTime CoreMediaErrorDomain/1852797029
09:35:32.756 #4 item.videoTrack codec='?' enabled=false (readyToPlay)
The layer had been attached for 4577 s, so the session crossed the suspension whole. 1852797029 is the FourCC 'nope'. From the second item onward AVFoundation reports readyToPlay with no usable tracks at all, which is what a media server that can no longer serve the process looks like from the client side.
Four defects behind that
1. No mediaServicesWereReset / mediaServicesWereLost observer exists. Zero occurrences in the package. Apple's contract is that every audio and video object a process holds is invalid after a reset and has to be rebuilt. The engine keeps its AVPlayer deliberately across a background teardown (keepNativeHost: true), so after a reset it reuses exactly the object the platform has already invalidated, and every recovery rung reloads onto it.
2. ItemDiagnosticReadPool wedges for the lifetime of the process. Diagnostics/AVPlayerItemDiagnostics.swift:128-145 dispatches synchronous XPC reads to mediaserverd on a bare thread. If one never returns, its continuation never resumes, runningCount never decrements, and the shared pool admits no further reads ever again, pinning up to two AVPlayerItems. cancel() cannot undo it and says so at :205. The #93 recovery ladder queues one more such read per rung, against the very server that is not answering.
3. RemoteHLSSubtitleProxy is never torn down on the background path. It owns its own HLSLocalServer (Native/RemoteHLSSubtitleProxy.swift:25, started at :84 and :140), and tearDown() is called only from load and from the public stop (AetherEngine.swift:3669, :5718). stopInternal does not touch it, and the tvOS background teardown goes through stopInternal. So a listen socket bound to 0.0.0.0, its accept thread and up to 32 connection threads cross the suspension, and the return builds a second one on a fresh port rather than reusing it. The engine names this failure mode itself one line above the stop() site at :5716.
4. An HDMI route that disappears is invisible. No AVAudioSession.routeChangeNotification observer exists either. On the tvOS background path the shared audio session is deliberately never deactivated (finalTeardown: false, keepNativeHost: true), so an E-AC-3 passthrough render ring is held against a sink that has gone away, for as long as the box sleeps. The engine's own comment at AetherEngine.swift:6487 describes exactly that as what strands a passthrough ring, and :6526 records that reactivating such a route costs a ~0.5 s XPC round trip.
Scope note on the trigger
The teardown that would have released any of this has one trigger on tvOS, didEnterBackground (AetherEngine.swift:6823). The host documents that the tvOS screensaver and the app switcher reach only willResignActive, and a playing session holds the idle timer off. Whether the field session backgrounded at all is not in the capture, because the diagnostic log is a 300 line ring and the hour rolled out of it. That question is worth settling separately; it does not change any of the four defects above, each of which is wrong on its own terms.
The engine cannot tell that the media server went away underneath it, and after that it never recovers on its own.
Field report, Apple TV 4K 3rd gen (AppleTV14,1), tvOS 27.0 (24J361), engine 7.10.1, an H.264 title with E-AC-3 5.1 passthrough to an Atmos receiver. Playback was running when the television was switched off, and the box came back about an hour later. The session then failed, and afterwards nothing on the whole box would play until it was rebooted.
The whole-box part is probably not ours, and the qualifier matters. The same shape is widely reported across Netflix, HBO Max, Paramount+, Prime and others on this hardware generation, Apple Support has called it a known issue, and the reported workarounds (a reboot, reseating HDMI, or setting Sleep After to Never) point at a wake-from-sleep HDMI handshake rather than at any one app. Those reports are on tvOS 26 and 26.0.1; this one is on 27.0, so either it survived the release or this is a different fault wearing the same shape. Worth knowing either way: several of those reports describe it happening after an idle hour with nothing playing at all, which no client can be blamed for. What is ours is everything in this issue: the engine is blind to it, it keeps using objects that are already dead, and one of its own mechanisms then wedges permanently.
What the log shows
The layer had been attached for 4577 s, so the session crossed the suspension whole.
1852797029is the FourCC'nope'. From the second item onward AVFoundation reportsreadyToPlaywith no usable tracks at all, which is what a media server that can no longer serve the process looks like from the client side.Four defects behind that
1. No
mediaServicesWereReset/mediaServicesWereLostobserver exists. Zero occurrences in the package. Apple's contract is that every audio and video object a process holds is invalid after a reset and has to be rebuilt. The engine keeps itsAVPlayerdeliberately across a background teardown (keepNativeHost: true), so after a reset it reuses exactly the object the platform has already invalidated, and every recovery rung reloads onto it.2.
ItemDiagnosticReadPoolwedges for the lifetime of the process.Diagnostics/AVPlayerItemDiagnostics.swift:128-145dispatches synchronous XPC reads to mediaserverd on a bare thread. If one never returns, its continuation never resumes,runningCountnever decrements, and the shared pool admits no further reads ever again, pinning up to twoAVPlayerItems.cancel()cannot undo it and says so at:205. The#93recovery ladder queues one more such read per rung, against the very server that is not answering.3.
RemoteHLSSubtitleProxyis never torn down on the background path. It owns its ownHLSLocalServer(Native/RemoteHLSSubtitleProxy.swift:25, started at:84and:140), andtearDown()is called only fromloadand from the publicstop(AetherEngine.swift:3669,:5718).stopInternaldoes not touch it, and the tvOS background teardown goes throughstopInternal. So a listen socket bound to0.0.0.0, its accept thread and up to 32 connection threads cross the suspension, and the return builds a second one on a fresh port rather than reusing it. The engine names this failure mode itself one line above thestop()site at:5716.4. An HDMI route that disappears is invisible. No
AVAudioSession.routeChangeNotificationobserver exists either. On the tvOS background path the shared audio session is deliberately never deactivated (finalTeardown: false, keepNativeHost: true), so an E-AC-3 passthrough render ring is held against a sink that has gone away, for as long as the box sleeps. The engine's own comment atAetherEngine.swift:6487describes exactly that as what strands a passthrough ring, and:6526records that reactivating such a route costs a ~0.5 s XPC round trip.Scope note on the trigger
The teardown that would have released any of this has one trigger on tvOS,
didEnterBackground(AetherEngine.swift:6823). The host documents that the tvOS screensaver and the app switcher reach onlywillResignActive, and a playing session holds the idle timer off. Whether the field session backgrounded at all is not in the capture, because the diagnostic log is a 300 line ring and the hour rolled out of it. That question is worth settling separately; it does not change any of the four defects above, each of which is wrong on its own terms.