4.5.6 — Failed VOD probe no longer degrades video to audio-only (#78)
Fixed
A video file silently degraded to the audio-only backend when its probe lost to a transient origin error (#78)
A remote 4K HEVC VOD played audio with no picture for the rest of the session. The Live state showed Backend audio, resolution 0x0, and the log read:
[AetherEngine] probe failed (openFailed(code: -1094995529)); proceeding without criteria
[AetherEngine] audio dispatch: codec=0 -> FFmpeg
[Demuxer] Opened: 43 streams ... stream[0] type=video codec=hevc 3840x2160 # video was there all along
Root cause. The open-time probe is reused as the session demuxer, so a transient origin failure (a 429 whose error body parses as AVERROR_INVALIDDATA, -1094995529) aborted the probe before it read the streams. On that failure probeOpened stayed false, so hasVideoStream (probeOpened && videoStreamIndex >= 0) was false. Not because the file lacks video, but because we never looked. shouldUseAudioOnlyPath then read that as "no video" and dispatched the audio-only path. Once connections recovered, the demux open enumerated stream[0] type=video codec=hevc 3840x2160, but the audio-only decision was already locked in. Custom and live sources already fail-fast on a failed probe; only the URL / VOD path silently degraded.
Fix. The audio-only path is now reserved for an explicit audioOnly request or a successful probe that genuinely found no video. shouldUseAudioOnlyPath distinguishes "probe failed" from "probe found no video", so a failed probe on a non-audioOnly URL source no longer routes to audio. It falls through to the native video path with the codec left unknown and no preopened demuxer, so HLSVideoEngine reopens the source and discovers the stream (it demonstrably can once connections recover). Display criteria stay at their SDR default and AVKit fires the real criteria from the AVPlayerItem format description once the reopened stream lands.
Reported by the AetherPlayer community.
Full diff: 4.5.5...4.5.6