Skip to content

Releases

1.3.2

Choose a tag to compare

@github-actions github-actions released this 05 Nov 14:09

November 2026. No API change and no change to the libraries; upgrading is a
version bump.

Fixed

  • Dolby Vision profile 8.6 (base layer compatibility id 6) now plays.
    VideoToolbox refused a decoder for it (-12909 on an Apple TV 4K with
    tvOS 27), so the stream never started. Its dvvC now declares compatibility
    id 1, which is the same HDR10 base layer, and the RPUs pass through
    unchanged. A display without Dolby Vision plays the base layer as HDR10.
    Dolby Vision output from such a stream has not been checked on a Dolby
    Vision display yet.

1.3.1

Choose a tag to compare

@github-actions github-actions released this 05 Nov 12:46

November 2026. No API change and no change to the libraries; upgrading is a
version bump.

Fixed

  • An HLS stream whose master playlist lists subtitle renditions no longer
    waits on them to start. libavformat fetched each rendition's segments inside
    the audio and video read, so a server slow to produce subtitles held back
    the picture and the sound: on a Jellyfin remux with 35 renditions, 4 s at
    start with the subtitles cached and 32 s while the server extracted them.
    The renditions are still listed, so track ordinals do not move, but they are
    never read, and choosing one does not seek. Deliver HLS subtitles as
    external files instead.

1.3.0

Choose a tag to compare

@github-actions github-actions released this 23 Oct 11:56

October 2026. No API change. FFmpeg gains a second patch and is rebuilt, and
three native libraries move to newer releases under the same licences, so a
host that lists their versions updates them. Otherwise upgrading is a version
bump.

Changed

  • A resumed HLS playback asks for the segment holding the start position
    first, not segment 0. A server that starts its transcode at the first
    segment requested no longer runs a job from 0 before every resume: on a
    Jellyfin remux, the first packet arrived in 1.2–1.3 s instead of 2.0–2.5 s.
    Seeks after the resume, backwards ones included, land as they would after
    a first-segment open.
  • lcms2 2.19.1, up from 2.17, with memory-safety fixes for malformed ICC
    profiles.
  • FreeType 2.15.0, up from 2.14.3, and HarfBuzz 15.0.0, up from 14.5.0, inside
    Libass: overflow and font-parsing fixes, and a fix for a possible deadlock
    when a HarfBuzz font is destroyed. FreeType is built without Apple's HVF
    format, so Libass links no new system library.

1.2.1

Choose a tag to compare

@JJaks JJaks released this 15 Oct 17:23

October 2026. No API change and no change to the libraries; upgrading is a
version bump. Playback behaves as in 1.2.0: frame loss and CPU measured the
same on an Apple TV 4K.

Changed

  • The demuxer's open and its read loop run as named steps, and the engine's
    support types live in their own files. Nothing a host can reach moved.
  • Tests now cover stall and starvation recovery, the playback rate policy,
    audio renderer replacement, bounded downloads, failure detail and track
    naming, and external and ASS subtitle presentation.

1.2.0

Choose a tag to compare

@JJaks JJaks released this 05 Oct 08:00

October 2026. Adds API; nothing is removed and no library changes, so
upgrading is a version bump. PlayerEngine gains a requirement with a
default, so a host's own conformance still compiles.

Added

  • setHostInBackground(_:). A host calls it on every background and
    foreground transition, whether or not picture in picture or AirPlay still
    shows video. In the background, a decode session fault that a rebuild
    cannot fix suspends video until the host returns, instead of failing
    playback. Audio plays on and the return restarts the picture at the
    playhead. Reported as recovery: decodeSessionParked.
  • PlaybackBufferState.networkBytesPerSecond and
    PlaybackCacheMetrics.networkBytesPerSecond: what the link delivers while
    a request is in flight, over about the last ten seconds of transfers.
    Compared with the title's bitrate, it separates a link too slow for the
    title from anything else. bufferState is republished when a stall
    begins, so the figure is current then.

Fixed

  • A lost VideoToolbox session is rebuilt once per fault burst, not once per
    playback generation. A session the system took twice, minutes apart and
    with no seek between, used to be reported as .undecodable on the second
    loss, and a host would fall back to a transcode. Now only a rebuilt session
    that fails before decoding 48 pictures is a verdict.

1.1.3

Choose a tag to compare

@JJaks JJaks released this 30 Sep 16:46

September 2026. No API change and no change to the libraries; upgrading is a
version bump.

Changed

  • Unselected text subtitle streams (SubRip, ASS/SSA, WebVTT, mov_text) are
    now demuxed and decoded too, and the last 120 seconds of each (at most
    4,096 events) are kept. Bitmap streams (PGS, DVD, DVB) are still discarded
    until chosen.

Fixed

  • Choosing an embedded text subtitle track shows the line already on screen
    straight away. The engine used to seek back to re-read it: that missed any
    line that started before the keyframe it landed on, until the next line,
    and flushed the video on the main thread, 57–76 ms per switch on an Apple
    TV 4K. It now replays the stream's recent events without a seek. A bitmap
    track still seeks.
  • Styled subtitle events that arrive while libass is still starting are held
    and handed to it, instead of being dropped.

1.1.2

Choose a tag to compare

@JJaks JJaks released this 30 Sep 15:00

September 2026. No API change; upgrading is a version bump. Libass is
rebuilt from the same library versions.

Fixed

  • Styled subtitles keep to a memory budget. Each libass renderer caches at
    most 2,000 glyphs and 24 MB of bitmaps instead of libass's desktop
    defaults, and a file's attached fonts are kept up to 64 MB in all; a font
    past that is skipped and falls back to CoreText.
  • Choosing a subtitle track no longer blocks the main thread while libass
    starts, copies the fonts and parses a sidecar, or while the previous
    renderer finishes a frame. The plain text stays hidden meanwhile, so it
    never flashes up unstyled.
  • ASS drawings (\p1 … \p0) no longer reach currentSubtitleText or the
    fallback cues as vector commands, and a signs-only sidecar made of drawings
    loads for libass instead of being rejected as empty.
  • Libass no longer imports fstat: FreeType reads fonts through stdio and
    HarfBuzz is built without mmap, so neither calls a file-timestamp API
    covered by the privacy manifest. libavformat and libavutil still do, so a
    host's FileTimestamp declaration stays.

1.1.1

Choose a tag to compare

@JJaks JJaks released this 29 Sep 16:03

September 2026. No API change and no change to the libraries; upgrading is a
version bump.

Fixed

  • A bounded download (artwork, trickplay tiles, sidecar subtitles) that is
    redirected to another host no longer carries the original request's
    credential headers there. URLSession drops Authorization itself but
    forwarded any other header, such as a forward-auth proxy's service token
    from MediaRequestAuthorization.additionalHeaders. Only Accept,
    Accept-Language, Accept-Encoding, User-Agent, Range, If-Range
    and Cache-Control now follow a redirect off the host.

1.1.0

Choose a tag to compare

@JJaks JJaks released this 29 Sep 14:59

September 2026. Adds API and one native library, Libass; nothing is removed
or changed, so upgrading is a version bump. A host that credits its
dependencies adds libass, FreeType, FriBidi and HarfBuzz
(Artifacts/Libass.README.md has the licences).

Added

  • Styled ASS/SSA subtitles through libass 0.17.5, with FreeType, FriBidi and
    HarfBuzz: named styles, karaoke, \move, \fad, clips, rotation, borders
    and drawings, in the fonts the file carries as Matroska attachments, then
    CoreText's. Embedded tracks and sidecars alike. Frames arrive through
    currentSubtitleImages, as PGS bitmaps do, so an overlay that draws those
    needs no change; the text still feeds currentSubtitleText.
  • EngineTuning.rendersStyledSubtitles, on by default. Off falls back to the
    engine's own cue renderer.
  • MediaRequestAuthorization.additionalHeaders, for a server behind a
    forward-auth proxy (Cloudflare Access, Authelia, Authentik). They go with
    the credential to the server's origin only, and remove(from:) takes every
    one off a request that leaves it.
  • 10-bit H.264 (High 10) decodes in software, since no Apple hardware decoder
    accepts it. It is recognised from the stream itself, so one whose metadata
    names no profile no longer reaches VideoToolbox and fails.
  • A styledSubs field on the bench line: libass's render and composite cost
    per changed frame.
  • Releases attach FriBidi's corresponding source, as they do FFmpeg's.

Fixed

  • ASS and SSA sidecar files load. They were rejected as unsupported; their
    dialogue now parses with the same subset as embedded events.

1.0.12

Choose a tag to compare

@JJaks JJaks released this 28 Sep 12:40

September 2026. No API change and no change to the libraries; upgrading is a
version bump.

Fixed

  • MPEG-TS with AAC plays. ADTS AAC, which carries no AudioSpecificConfig, is
    decoded here instead of passed to CoreAudio, which never played it: the
    clock waited on the audio and playback stalled a second in, buffering, with
    no error. Decoded here, it also follows the stereo and 5.1 changes
    broadcast streams make.
  • Software-decoded video (VP9, AV1 without AV1 silicon, MPEG-2, VC-1, MPEG-4,
    interlaced H.264) that changes size mid-way, as broadcasts do between SD
    and HD, keeps playing. The decoder rebuilds its output for the new size in
    the mode chosen at open; a new size used to be .undecodable.
  • videoSize follows a decoded stream that changes size, so subtitles are
    laid out against the new picture. Progressive H.264 reaches the renderer
    compressed and keeps the size read at open.