Skip to content

5.0.0

Choose a tag to compare

@superuser404notfound superuser404notfound released this 09 Jul 21:15

Major release. The embedded subtitle overlay pipeline was rebuilt from the ground up, and one public symbol was renamed.

Breaking

  • setNativeSubtitleForPiP(_:) is now setNativeSubtitleRendering(_:). The native WebVTT legible rendition is selected whenever the video leaves the host's own view hierarchy (a PiP window, an AirPlay receiver, or a wired external display), not just PiP. Pure rename, no behavior change: update the call site and you are done.

Changed

  • Embedded subtitle overlay pipeline reworked: packet tap replaces the side-demuxer readers (#112). The overlay path used to open a second demuxer per selected embedded subtitle track and seek it around to reconstruct stateful PGS lines after seeks, fast-forwards, and audio switches. That model needed eleven rounds of hardening and still regressed on index-starved remote sources. The producer now retains every embedded subtitle stream it already demuxes in a compressed SubtitlePacketStore (300 s / 32 MB), and a playhead-paced drainer decodes cues from the store, running the same stale-arrival gate, successor trim, and retention rules as before. The software host feeds the store through its own tap. The side readers, reuse pool, re-arm coalescing, condemned latch, and cross-thread read-abort chain are deleted (~1350 lines). No extra connections, no reconstruction seeks: post-seek recovery is bounded by decode speed, not remote I/O.

Added

  • bufferedPosition for host scrub bars (#33). Reports the disk cache's contiguous read-ahead frontier on native direct play so hosts can draw a buffered band.
  • Interlaced live TV (#107). Interlaced H.264 routes to the software path with bwdif deinterlacing; DVB teletext decodes through libzvbi into WebVTT cues.
  • Cache-backed VOD scrub stills (#106). Single-connection VOD sources render scrub thumbnails from the segment cache instead of opening a second origin connection.
  • Remote-HLS audio tap delivery (#95). installAudioTap() now delivers on the remote-HLS path (VOD and live), with audioTapHasDeliverySource for host fail-loud and aetherctl audiotap --remote for verification.
  • Subtitle-preserving reduced-master fallback (#98). Display-rejection fallback stages master to reduced to media, keeping HDR and subtitle renditions; nativeSubtitleRenditionsServed is published for host external-subtitle windows.
  • SubtitleImage.canvasSize (#112). Bitmap cues carry their composition canvas size so hosts can map them onto the rendered video rect (defaulted, source-compatible).
  • Stats surface. Declared source video bitrate (Matroska BPS fallback), nominal frame rate, audio bitrate, and bridge output.

Fixed

  • Multi-clip / multi-title Blu-ray timeline (#105). Fold on observed clip bases rather than MPLS inTime, 0-based display axis, decoy-playlist defeat, MPLS duration trust, selected-title stills.
  • DV P5 still tone-map (#103). Matches libplacebo BT.2390 and applies the RPU reshaping curves.
  • Backward-scrub cold read reconnects fast (#93, #96). The starved detour fetch is bounded to a ~4 s budget instead of riding the 15/35 s socket timeouts.
  • Stall-recovery nudge reads the rendered frame (#115), instead of a stale pre-grace capture that skipped VOD playback backward on re-engage.
  • AVAudioSession category declared off-main (#114), clearing the hang-risk diagnostic from the engine constructor.
  • Cold DV/HDR master start gates on real track readiness (#35), and the backpressure wedge detector is suspended until the first rendered frame.
  • Resolved content lengths shared across demuxer opens (#112) via SourceContentLengthCache, so a starved size probe no longer collapses an open to forward-only streaming.
  • Synthetic PGS END flush gated on a complete object (#112), clearing "Invalid object id 0" on split m2ts.
  • Native legible renditions (Sodalite#38): no FORCED=YES on host-managed renditions, deselected in fullscreen until the host selects. The deselect is pinned unconditionally as soon as the legible group loads and re-asserted on a 40 ms cadence for the first second, so a system caption preference no longer flashes cues for up to ~0.5 s at video start on iOS.
  • Wired HDMI external display keeps loopback + master (Sodalite#34).

Thanks to ijuniorfu, dlev02, fubag, tresby, and rrgomes for the reports, logs, and retests that drove this release.

Full diff: 4.12.1...5.0.0