Repository navigation
Releases
1.3.2
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. ItsdvvCnow 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
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
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, soLibasslinks no new system library.
1.2.1
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
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 asrecovery: decodeSessionParked.PlaybackBufferState.networkBytesPerSecondand
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.bufferStateis 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.undecodableon 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
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
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 reachcurrentSubtitleTextor the
fallback cues as vector commands, and a signs-only sidecar made of drawings
loads for libass instead of being rejected as empty. Libassno longer importsfstat: 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'sFileTimestampdeclaration stays.
1.1.1
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 dropsAuthorizationitself but
forwarded any other header, such as a forward-auth proxy's service token
fromMediaRequestAuthorization.additionalHeaders. OnlyAccept,
Accept-Language,Accept-Encoding,User-Agent,Range,If-Range
andCache-Controlnow follow a redirect off the host.
1.1.0
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 feedscurrentSubtitleText. 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, andremove(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
styledSubsfield 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
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. videoSizefollows 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.