Patch release. Five fixes on top of 5.0.0, no API changes.
Fixed
- Split MPEG-TS PGS display sets reassemble before decode (#112). On Blu-ray MPEG-TS a PGS display set spans several PES packets (PCS, WDS, PDS, ODS, END). The packet-tap store kept one entry per harvested packet keyed by unique PTS, so segments without a PTS died at the NOPTS guard and segments sharing one collapsed in the same-PTS replace; the decoder never saw the palette and object definitions and every set failed at its END segment ("Invalid palette id"). The store now reassembles armed streams' chunks into one self-contained entry at the PCS presentation PTS. Arming comes from the demuxer (PGS streams in an mpegts container) through both hosts' tap sinks; Matroska stays on the per-packet path.
- iOS route-sharing policy no longer blocks host PiP (#116). The shared
AVAudioSessiondeclared.longFormAudioon every platform. On iOS that marks the process a long-form audio client, which pinsAVPictureInPictureController.isPictureInPicturePossibletofalsefor any host-built PiP controller around the engine's player layer. The policy is now platform-split: tvOS keeps.longFormAudio(HDMI route negotiation), iOS declares.default. - Dolby Vision first frame no longer waits out a fixed 5 s poll (#117).
waitForSwitch()polledisDisplayModeSwitchInProgressfor a fixed 5 s and never watched the OS mode-switch notifications, so on panels where a DV switch is unobservable to the app it ran the full timeout every time, andload()waits twice, roughly 10 s to first frame. It now settles the instant the panel reports done (AVDisplayManagerModeSwitchStart/End, or EDR headroom rising) and otherwise caps the wait at ~2 s. Observable panels settle immediately; SDR and rate-only loads are unaffected. LoadOptions.httpHeadersreaches the nativeRemoteHLS path (#119). The remote-HLS bypass built itsAVURLAssetwithout an options dictionary, silently dropping the headers, so header-enforcing IPTV origins (per-stream Referer / User-Agent / Authorization) answered 403 and those channels could not play at all. The headers now ride the asset viaAVURLAssetHTTPHeaderFieldsKey, and the remote-HLS audio tap fetcher (#95) sends the same headers on its own playlist, segment, and AES-key requests.- Pre-bound surfaces show video on
loadRemoteHLS(#120). The lean remote-HLS bypass assigned its host and early-returned without presenting the player layer, so a surface bound before load (the usual SwiftUI order: view appears, then the load task fires) never attachedplayerLayerand every remote-HLS live channel played audio over black video. The layer is now presented right after the host is assigned, mirroringloadNative.
Thanks to ijuniorfu and dlev02 for the reports and logs, and to thatcube for PR #118.
Full diff: 5.0.0...5.0.1