Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
449 commits
Select commit Hold shift + click to select a range
6f99bd0
fix(core): an audio or title rebuild honours the media services reset…
Sep 30, 2026
9f77ab8
fix(network): separate allowing a fetch from granting credentials (au…
Sep 30, 2026
9af630b
fix(core): an audio or custom rebuild keeps the session's transport (…
Sep 30, 2026
bd0600a
fix(live): wire replacement live producers into the playlist (audit H…
Sep 30, 2026
6f7e1bf
fix(plan): bound the segment plan's duration and index inputs (audit …
Sep 30, 2026
55d4579
fix(core): a backgrounding owed during a load waits for the load to r…
Sep 30, 2026
f2d8f8f
fix(demux): convert seek targets and byte estimates through checked h…
Sep 30, 2026
1891ca2
fix(hls): a superseded producer's report or delayed revive leaves the…
Sep 30, 2026
4d8157b
fix(disc): cap a DVD subpicture unit at 1 MiB and join it in place (a…
Sep 30, 2026
9440d09
fix(producer): cap the pre-gate audio buffer by entries as well as by…
Sep 30, 2026
c71bdc1
fix(segments): a stopped pump drops the read it had in flight (audit …
Sep 30, 2026
f609a54
fix(core): a callback from an ended session no longer reaches its suc…
Sep 30, 2026
90acbac
fix(live): make the live window sizing total over the host's DVR wind…
Sep 30, 2026
bbbefd0
fix(demux): bound every demuxed timestamp once, at the Demuxer (audit…
Sep 30, 2026
6b3951f
fix(native): range-check the parsed audio sample rate before converti…
Sep 30, 2026
53b6010
fix(subtitles): make every cue-time conversion total (audit FEA-101, …
Sep 30, 2026
844d5e4
fix(h264): refuse a #409 re-anchor whose arithmetic leaves Int64 (aud…
Sep 30, 2026
4ff033c
fix(segment): cap the NOPTS walk and make the output timestamp guards…
Sep 30, 2026
b8cecf8
fix(display): switch waits end with their load and share one observed…
Sep 30, 2026
3462554
fix(cli): bound aetherctl's numeric flags so huge or negative values …
Sep 30, 2026
7e9f349
fix(subs): drop a non-finite ASS position or play resolution (audit S…
Sep 30, 2026
a4dcba8
fix(diagnostics): redact credentials through percent escapes and insi…
Sep 30, 2026
f12d582
fix(native): an in-place swap waits for the fresh item's own roll (au…
Sep 30, 2026
c42457b
fix(diag): check the pktdump dts delta for overflow (audit SUB-112)
Sep 30, 2026
2ac8828
fix(network): keep the local server's session token out of the log (a…
Sep 30, 2026
8f5b6c6
fix(core): the probe publishes the source geometry after its generati…
Sep 30, 2026
5a97881
Merge branch 'fix/audit-0929-p3-traps' into fix/audit-0929-integration
Sep 30, 2026
28c51c6
fix(segments): the end-of-file bridge flush follows the video cutter …
Sep 30, 2026
e191b80
refactor(demuxer): judge index entries by the packet funnel's plausib…
Sep 30, 2026
8c5a420
fix(network): throttle and escape what a tokenless LAN peer can put i…
Sep 30, 2026
d8ab091
fix(mux): the BIT-1 framing verdict belongs to the session, not to on…
Sep 30, 2026
f4eda52
fix(network): the first-request header dump prints no credential valu…
Sep 30, 2026
9c07d8f
Merge branch 'fix/audit-0929-p2-core' into fix/audit-0929-integration
Sep 30, 2026
868903c
test(segments): read the finished playlist without a captured mutable…
Sep 30, 2026
429f3f8
fix(cli): aetherctl banners carry the redacted source URL (audit OPS-…
Sep 30, 2026
2853217
Merge branch 'fix/audit-0929-p1-live' into fix/audit-0929-integration
Sep 30, 2026
2d50593
Merge branch 'fix/audit-0929-p5-cred' into fix/audit-0929-integration
Sep 30, 2026
7e51c3b
fix(ci): the manual DMG workflow builds the tag it uploads to (audit …
Sep 30, 2026
5431ac2
docs: Xcode floor, server exposure, header scoping, cli flags and cur…
Sep 30, 2026
9553ee7
fix(audio): live bytes telemetry reads a published snapshot, not the …
Sep 30, 2026
45404c1
fix(audio): a flush retires in-flight audio buffers atomically with t…
Sep 30, 2026
e5f71f0
fix(subtitles): override blocks strip in one forward pass and a cue i…
Sep 30, 2026
10958b9
fix(demuxer): a Range-ignoring origin plays forward-only instead of e…
Sep 30, 2026
86f4847
fix(demuxer): close the disc reader the demuxer built for a remote di…
Sep 30, 2026
8090ffc
fix(live): every undecodable audio stream stays marked, not just the …
Sep 30, 2026
1be5775
fix(dovitest): the probe walks the source's own framing and fails lou…
Sep 30, 2026
3f939ef
perf(demuxer): the forward-only streaming buffer trims without copyin…
Sep 30, 2026
44c7c31
fix(recording): a stop joins a scheduled teardown, and a start re-che…
Sep 30, 2026
004dd76
fix(cli): seektest reads its counters under the handler lock and exit…
Sep 30, 2026
d2aff55
perf(live): spool the software DVR ring into chunk files with a byte …
Sep 30, 2026
f6d84ea
test: skip instead of pass, wait instead of poll, keep scratch files …
Sep 30, 2026
7224c45
fix(demo): the notarized demo drops its two hardened-runtime exceptio…
Sep 30, 2026
4dc30a5
fix(stills): no-base-layer Dolby Vision cache stills stay off VideoTo…
Sep 30, 2026
532f704
fix(subtitles): an injected rendition is matched on its playlist iden…
Sep 30, 2026
ad8c26d
fix(atmos): close the reader fork the confirmation pass only nil-test…
Sep 30, 2026
a7e7588
fix(audio): the audio-only host anchors its clock at the first sample…
Sep 30, 2026
ce3f7f3
fix(decode): the software decoder's output format follows the decoded…
Sep 30, 2026
11f6f17
fix(hls): attribute scans a tag line once, lines cap at 64 KiB, dates…
Sep 30, 2026
689f729
fix(subtitles): the packet store appends in place and counts unfinish…
Sep 30, 2026
f0dfd33
docs(recording): a stop inside a failing teardown reports the failure…
Sep 30, 2026
6ba2b0c
perf(renderer): hold one frame for presentation-order decoders and gu…
Sep 30, 2026
154871c
Merge branch 'fix/audit-0929-p9-ops' into fix/audit-0929-integration
Sep 30, 2026
6c4d873
fix(io): the remote disc reader judges a range answer at the response…
Sep 30, 2026
1cde224
fix(demuxer): markClosed reaches the connect, local reads and parked …
Sep 30, 2026
8e7273e
test(live): ring tests remove their scratch directories themselves (a…
Sep 30, 2026
66af52f
perf(software): park the demux loop on a timed condition wait instead…
Sep 30, 2026
7e8dac0
Merge branch 'fix/audit-0929-p7-decode' into fix/audit-0929-integration
Sep 30, 2026
e0a88e2
fix(demuxer): the streaming hard cap ends the read with a typed cause…
Sep 30, 2026
dc17828
fix(demuxer): a closed demuxer never reports the source's end of file…
Sep 30, 2026
950ecaa
fix(ingest): segment, key and audio tap bodies are bounded while they…
Sep 30, 2026
fb9cd2a
perf(relay): never park the session's delegate queue for a consumer t…
Sep 30, 2026
0fd16c5
fix(demuxer): a detour block takes one origin ticket, not two (audit …
Sep 30, 2026
ff7c341
fix(demuxer): track accessors never walk the live streams array, and …
Sep 30, 2026
4678411
fix(live): the subtitle rendition loop fetches and parses off the mai…
Sep 30, 2026
fff5b96
perf(dovi): rebuild a P7 packet with one copy instead of two (audit P…
Sep 30, 2026
2d2b89a
perf(demuxer): idle detour blocks are released instead of living unti…
Sep 30, 2026
fd5e9c0
fix(demuxer): the held connection's chunked decoder bounds a size or …
Sep 30, 2026
96c63b6
fix(disc): recognition bounds what a disc image can make it read and …
Sep 30, 2026
e79c088
perf(software): spool a packet with one writev and read it back witho…
Sep 30, 2026
996cd31
fix(dv): the RPU walk arms an input byte budget like the HDR10+ and A…
Sep 30, 2026
673044f
test(demuxer): write the hostile sidecar fixture to the temporary dir…
Sep 30, 2026
19ee344
fix(demuxer): a forward-only source keeps the packets its start-up pr…
Sep 30, 2026
cefa020
test(ingest): the chunked accumulation timing bar takes the best of t…
Sep 30, 2026
150d8f3
Merge branch 'fix/audit-0929-p6b-demuxer' into fix/audit-0929-integra…
Sep 30, 2026
4276d4a
chore: drop a build log that slipped into the SUB-101 commit
Sep 30, 2026
e2ba236
Merge branch 'fix/audit-0929-p4-dos' into fix/audit-0929-integration
Sep 30, 2026
b57252e
test(live): bound the ring index footprint by its flat minimum, not a…
Sep 30, 2026
c1613c3
test(live): LiveDvrRetentionTests close their segment caches (audit P…
Sep 30, 2026
506157b
fix(demuxer): a refused or slow cold open no longer hides an origin t…
Sep 30, 2026
e16abf6
fix(audio): the AE#549 auto-flush runs off the posting thread so it c…
Sep 30, 2026
c0ef396
fix(audio): the DVR ring audio path honours the flush epoch too (audi…
Sep 30, 2026
6e9eeb5
Merge branch 'fix/audit-0929-p6-origin' into fix/audit-0929-integration
Sep 30, 2026
97479ad
Merge branch 'fix/audit-0929-p7-decode' into fix/audit-0929-integration
Sep 30, 2026
7255137
fix(live): the ring evicts and retries only for a full volume or quot…
Sep 30, 2026
d3129e0
fix(renderer): the late-frame guard records a frame when it leaves th…
Sep 30, 2026
7e1d0a0
Merge branch 'fix/audit-0929-p8-perf' into fix/audit-0929-integration
Sep 30, 2026
9dcfc5e
test(ingest): measure the bounded fetch against a plain fetch in the …
Sep 30, 2026
aca2420
docs(changelog): list the 2026-09-29 audit fixes under Unreleased
Sep 30, 2026
9d65906
Merge branch 'fix/audit-0929-integration': audit 2026-09-29 fixes
Sep 30, 2026
8ac93f9
test(live): type the WebVTT timestamp expectations apart so Swift 6.2…
Sep 30, 2026
25c7a5c
test(core): serialize the suites that park a load's reader on the coo…
Sep 30, 2026
ab20023
test(support): capture engine log lines through one fan-out instead o…
Sep 30, 2026
c7d257a
test(demuxer): the trim test reads until a chunk is released instead …
Sep 30, 2026
4f2406b
test(demuxer): the detour ticket test witnesses the pump on the link,…
Sep 30, 2026
fdff590
Merge pull request #673 from superuser404notfound/fix/ci-log-capture-…
superuser404notfound Sep 30, 2026
3fb969b
test(demuxer): bound the hard-cap test's peak by the body, not by a g…
Sep 30, 2026
04ed821
ci: five macOS jobs without a queue, and one compile per simulator job
Sep 30, 2026
8ed6089
ci: test on the Xcode 27 toolchain only
Sep 30, 2026
8d8fd20
Merge pull request #675 from superuser404notfound/ci/faster-lanes
superuser404notfound Sep 30, 2026
cb439e8
chore(release): prep 7.23.0 - the second full audit's fixes
Sep 30, 2026
0d3dc68
fix(live): fastZap seals headroom over the GOPs it cuts (#676)
superuser404notfound Sep 30, 2026
fb7afb2
chore(release): prep 7.23.1 - fastZap seals headroom over the GOPs it…
Sep 30, 2026
cd579ab
Cap the declared HEVC level at 5.1, and derive DV CODECS from the hvcC
gonkowonko Sep 30, 2026
c415e2d
fix(video): cap the fallback HEVC level too, and pin AE#674 in tests
Sep 30, 2026
0f8fb1b
Merge pull request #677 from superuser404notfound/fix/674-hevc-level-cap
superuser404notfound Sep 30, 2026
95b7c31
chore(release): prep 7.23.2 - HEVC level declared in the master is ca…
Sep 30, 2026
d6f4d39
fix(live): the ingest join carries the loopback cushion, and the inge…
Sep 30, 2026
75f81a3
fix(live): known HLS URLs skip the raw probe, criteria cleared by the…
Sep 30, 2026
5f97e19
Merge pull request #679 from superuser404notfound/fix/fastzap-ingest-…
superuser404notfound Sep 30, 2026
9bd0096
chore(release): prep 7.24.0 - fastZap ingest joins the cushion it sea…
Sep 30, 2026
9702802
Merge pull request #680 from superuser404notfound/feat/aetherctl-vtt-…
superuser404notfound Sep 30, 2026
3179aec
feat(engine): sharedOutputRole keeps a secondary engine off the panel…
Oct 1, 2026
63f2df5
docs(api): name sharedOutputRole (Sodalite#175)
Oct 1, 2026
8360388
feat(engine): SharedOutputCoordinator tracks who still uses the proce…
Oct 1, 2026
e04caa8
fix(engine): a stop releases the session and resets the panel only wh…
Oct 1, 2026
b838d55
fix(engine): an engine released without stop() no longer holds the sh…
Oct 1, 2026
27ac608
docs(api): running several engines at once (Sodalite#175)
Oct 1, 2026
4a1f718
fix(engine): a secondary engine never clears the panel, waits for a c…
Oct 1, 2026
a385673
docs(api): what counts as playing, logTag and the role's lifetime for…
Oct 1, 2026
736072f
Merge pull request #681 from superuser404notfound/feat/shared-output-…
superuser404notfound Oct 1, 2026
7e036dd
chore(release): prep 7.25.0 - several engines in one process share th…
Oct 1, 2026
a729779
fix(engine): cancelling the task that awaits load() ends the load at …
Oct 1, 2026
65a6e42
fix(engine): a cancelled load leaves the session the way a newer load…
Oct 1, 2026
155540a
fix(engine): a cancelled software-path rebuild ends with its nested r…
Oct 1, 2026
80ce5a5
Merge pull request #683 from superuser404notfound/fix/cancellable-load
superuser404notfound Oct 1, 2026
8f3e73c
chore(release): prep 7.25.1 - cancelling the task that awaits load() …
Oct 1, 2026
bfecd2d
fix(live): an ingest seals its TARGETDURATION over the upstream segme…
Oct 1, 2026
134cd47
fix(native): the AE#440 start is not forced on an item that cannot pl…
Oct 1, 2026
3abefe0
diag(live): each native live item says what it started on (#684)
Oct 1, 2026
b01fcd6
test(aetherctl): an HLS origin with a scripted delivery rhythm, and t…
Oct 1, 2026
622d6f6
fix(live): the first-serve gate holds the first playlist request only…
Oct 1, 2026
fe3b924
fix(native): a not-ready refusal asks again once the item is ready (#…
Oct 1, 2026
85ac3ce
fix(live): a segment finalized without a recorded start drops its sou…
Oct 1, 2026
36ebbe2
fix(live): the upstream-segment seal is taken as far as the join can …
Oct 1, 2026
0637521
docs(live): what the ingest seal does on shallow windows, .standard a…
Oct 1, 2026
9a1d9e6
fix(live): the first-serve latch is the ingest's alone (#684)
Oct 1, 2026
c7cc166
fix(native): a thin reading on a not-ready item asks again too (#684)
Oct 1, 2026
611067a
fix(live): the join keeps its 7.24.0 depth, and a spent join is the r…
Oct 1, 2026
0a7849e
docs(live): the ingest seal under the join-bound rule, measured (#684)
Oct 1, 2026
f22e1d9
fix(live): the spent join is the pump's fact, read before the snapsho…
Oct 1, 2026
5424e29
docs(live): the spent join with a demuxed audio rendition, and a join…
Oct 1, 2026
d4891e3
fix(live): a mixed-length upstream joins the same depth in either pha…
Oct 2, 2026
c243fa2
fix(live): the merged read asserts that one thread reads both readers…
Oct 2, 2026
731771c
docs(live): mixed-length upstreams, the single-connection start, and …
Oct 2, 2026
67c12a3
fix(live): the join is equalised over the phases of one upstream, and…
Oct 2, 2026
48eb77c
docs(live): the join rule is phase equalisation, with what it leaves …
Oct 2, 2026
9490996
Merge pull request #685 from superuser404notfound/fix/684-ingest-seal…
superuser404notfound Oct 2, 2026
f5f9a73
chore(release): prep 7.25.2 - a live ingest seals its patience over t…
Oct 2, 2026
4e12c8e
fix(retention): a session is sized from the free space the other sess…
Oct 2, 2026
cd1629f
Merge pull request #688 from superuser404notfound/fix/687-shared-rete…
superuser404notfound Oct 2, 2026
de9fd83
chore(release): prep 7.25.3 - engines running side by side no longer …
Oct 2, 2026
cc31e04
test(load): the parked reader outlasts a loaded runner before the can…
Oct 2, 2026
c4b1c66
feat(hls): decide when a session can serve an I-frame rendition (#682)
Oct 2, 2026
a7797a5
feat(hls): the loopback server can list and route an I-frame renditio…
Oct 2, 2026
2ef9222
feat(hls): build a one-keyframe fragment on the plan's timeline (#682)
Oct 2, 2026
ae88ed6
feat(hls): a byte-capped disk cache for I-frame payloads (#682)
Oct 2, 2026
c72646f
feat(hls): a side reader fetches the keyframe that opens a plan segme…
Oct 2, 2026
0638cfa
feat(hls): the I-frame rendition serves, substitutes and shuts down (…
Oct 2, 2026
3ff4af5
feat(hls): a native VOD session serves the I-frame rendition when ask…
Oct 2, 2026
db5f236
feat(api): LoadOptions.serveIFramePlaylist turns on scrub thumbnails …
Oct 2, 2026
0657135
feat(aetherctl): serve --iframes lists the I-frame rendition (#682)
Oct 2, 2026
af2b5cb
fix(hls): the I-frame side reader closes its clone, aborts a slow ope…
Oct 2, 2026
746ab0d
Merge pull request #689 from superuser404notfound/feat/682-iframe-pla…
superuser404notfound Oct 2, 2026
968ec09
chore(release): prep 7.26.0 - a stock AVPlayerViewController shows sc…
Oct 2, 2026
9365288
fix(native): a VOD mount past the head holds its clock until the moun…
Oct 3, 2026
ba67ce7
Merge pull request #690 from superuser404notfound/fix/629-host-mount-…
superuser404notfound Oct 3, 2026
9ea595b
chore(release): prep 7.26.1 - a VOD mount past the head holds its clo…
Oct 3, 2026
5cf1f64
fix(live): one frame more no longer buys a whole second of fastZap TA…
Oct 3, 2026
2880a95
Merge pull request #691 from superuser404notfound/fix/670-gop-headroo…
superuser404notfound Oct 3, 2026
f660fc1
chore(release): prep 7.26.2 - one frame more no longer buys a whole s…
Oct 3, 2026
66b1da5
feat(live): an env-gated arm for the first-serve latch on engine-cut …
Oct 3, 2026
b404d6d
Merge pull request #692 from superuser404notfound/feat/686-first-serv…
superuser404notfound Oct 3, 2026
7ac28fa
chore(release): prep 7.26.3 - an env-gated arm for the first-serve la…
Oct 3, 2026
e8d8c2f
docs(used-by): add WUW IPTV Player
superuser404notfound Oct 4, 2026
2bf50c5
Merge pull request #696 from superuser404notfound/used-by/issue-695
superuser404notfound Oct 4, 2026
7fad6bf
fix(demux): one refusal at byte 0 no longer settles a range-capable V…
Oct 4, 2026
98c0e6b
Merge pull request #697 from superuser404notfound/fix/693-transient-r…
superuser404notfound Oct 4, 2026
6f427d2
chore(release): prep 7.27.0 - one refusal at byte 0 no longer settles…
Oct 4, 2026
37b6901
test(network): a dropped exchange on a loaded runner no longer fails …
Oct 4, 2026
04343a6
fix(audio): the audio-only host parks its clock at end of media (#694)
Oct 4, 2026
44cf223
Merge pull request #698 from superuser404notfound/fix/694-audio-host-…
superuser404notfound Oct 4, 2026
d9a0ce8
chore(release): prep 7.27.1 - the audio-only clock parks at end of media
Oct 4, 2026
38b9eb7
test(load): the cancelled-load ceiling is derived from the timeout it…
Oct 4, 2026
fb3b632
fix(audio): an end-of-media park that runs late still stops on the la…
Oct 4, 2026
663e4ef
diag(audio): the software path names its route, its audio lead on liv…
Oct 4, 2026
172d4e6
Merge branch 'diag/395-sw-route-lead'
Oct 5, 2026
ffbd54a
chore(release): prep 7.27.2 - the software path names its audio route…
Oct 5, 2026
adb80da
fix(demux): repair HEVC MP4s without composition offsets (#699)
Oct 5, 2026
a6b422c
Merge pull request #700 from superuser404notfound/fix/699-hevc-compos…
superuser404notfound Oct 5, 2026
b27f297
chore(release): prep 7.27.3 - HEVC MP4s without composition offsets p…
Oct 5, 2026
bbdb254
feat(probe): detect HDR Vivid (CUVA) carriage (#699)
Oct 5, 2026
7fb0e77
Merge pull request #701 from superuser404notfound/feat/699-hdr-vivid-…
superuser404notfound Oct 6, 2026
7de2d5a
chore(release): prep 7.28.0 - HDR Vivid (CUVA) detection in the opt-i…
Oct 6, 2026
e29182d
fix(native): stop trusting a keyframe index that ends minutes before EOF
Oct 6, 2026
68e898e
fix(native): keep in-band HEVC parameter sets on Annex-B sources
Oct 6, 2026
0cdec0e
Merge pull request #705 from superuser404notfound/fix/hevc-inband-ps-…
superuser404notfound Oct 6, 2026
3cc2cf2
diag(audio): the software path's aLead covers live DVR sessions too (…
Oct 6, 2026
116f5e9
Merge branch 'diag/ae395-dvr-alead'
Oct 6, 2026
92994ef
chore(release): prep 7.28.1 - aLead on live DVR sessions, HEVC in-ban…
Oct 6, 2026
efdd6e8
fix(live): the first-serve latch covers engine-cut sources by default…
Oct 6, 2026
637466f
chore(release): prep 7.28.2 - first-serve latch covers engine-cut liv…
Oct 6, 2026
8f2d2bf
test(core): read the stacked rebuild's transport without polling for …
Oct 6, 2026
4a86b52
fix(demux): repair missing composition offsets across a seek onto an …
Oct 6, 2026
84f4462
Merge pull request #707 from superuser404notfound/fix/699-repair-befo…
superuser404notfound Oct 7, 2026
3cc256a
chore(release): prep 7.28.3 - #409 repair survives a resume or seek o…
Oct 7, 2026
3eb2001
perf(routing): defer AV1 capability probing until needed
yucelokan Oct 7, 2026
43cbb17
feat(subtitles): apply timing offsets to software PiP captions
yucelokan Oct 7, 2026
1939594
feat(lifecycle): expose pending foreground video restoration
yucelokan Oct 7, 2026
3731493
fix(audio): serialize track rebuilds and preserve transport intent
yucelokan Oct 7, 2026
6c2ec70
Merge pull request #708 from yucelokan/codex/av1-probe-on-demand
superuser404notfound Oct 7, 2026
02ddd76
Merge pull request #709 from yucelokan/codex/software-pip-subtitle-ti…
Oct 7, 2026
7c85a3f
refactor(subtitles): require the PiP subtitle delay at every composit…
Oct 7, 2026
2ef8aae
fix(test): the #243 fetch-tally test tolerates a parallel session start
Oct 7, 2026
0950ea3
Merge pull request #710 from yucelokan/codex/foreground-video-restore…
Oct 7, 2026
f231820
Merge pull request #711 from yucelokan/codex/serialized-audio-selection
Oct 7, 2026
b64ff7e
docs(api): selectAudioTrack describes the serialized, item-retaining …
Oct 7, 2026
dd1d5f8
fix(transport): a play/pause during any session rebuild decides how i…
Oct 7, 2026
ebe8378
Merge upstream AetherEngine 7.28.3 (dd1d5f88) into the Silo fork
Quick104 Oct 7, 2026
dc4d543
test(audio): decode the APAC click test off the cooperative pool
Quick104 Oct 7, 2026
e773c66
fix(subtitles): select a hidden ASS rendition only once it is extracted
Quick104 Oct 7, 2026
2d221aa
fix(subtitles): select the hidden ASS rendition once playback runs
Quick104 Oct 7, 2026
afff51c
test(subtitles): hold the sidecar until the test releases it
Quick104 Oct 7, 2026
1fda333
fix(subtitles): a stale origin-rendition pick leaves a newer selectio…
Quick104 Oct 7, 2026
9c50e0d
fix(network): refuse a non-positive Content-Range total before subtra…
Quick104 Oct 8, 2026
d261d74
fix(logging): redact Xtream passwords holding , ' or ) and values beh…
Quick104 Oct 8, 2026
4ec5ac9
fix(audio): park the audio-only clock when it reaches the last sample…
Quick104 Oct 8, 2026
8fc0a12
fix(live): check a delayed revive again when its restart is admitted
Quick104 Oct 8, 2026
3e2e4a1
fix(cache): keep the I-frame cache under its cap and release the ring…
Quick104 Oct 8, 2026
e63a2d9
perf(subtitles): strip cue markup in one pass
Quick104 Oct 8, 2026
9a92e8c
docs(demuxer): say why a first seek's head sample runs outside its bu…
Quick104 Oct 8, 2026
94fab68
fix(aetherctl): redact origin URLs, resolve served-VTT URIs, linear s…
Quick104 Oct 8, 2026
d45af9e
test: release parked readers on timeout, drop the Task.yield ordering…
Quick104 Oct 8, 2026
5803770
docs(changelog): fixes from the review of the upstream code
Quick104 Oct 8, 2026
4ebc8eb
fix(reload): refuse a shared-output role change in a session correction
Quick104 Oct 8, 2026
bf23457
docs(changelog): shared-output role refusal
Quick104 Oct 8, 2026
71234f5
fix(aetherctl): print only the engine's own loopback URLs in full
Quick104 Oct 8, 2026
7f5af61
test(audio): land the pause inside the end-of-media tail on a loaded …
Quick104 Oct 8, 2026
a01a6a7
test(ring): release a parked writer when a wait is cancelled
Quick104 Oct 8, 2026
0cc3bd8
docs(changelog): aetherctl redacts a localhost origin too
Quick104 Oct 8, 2026
31047b0
fix(aetherctl): print in full only URLs on the mounted item's engine …
Quick104 Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .github/RELEASE_SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ Once all six secrets are set:

1. Make sure a release exists (use the existing `2.0.0` or create a draft tag).
2. Trigger the workflow manually: [Actions](https://github.com/superuser404notfound/AetherEngine/actions) → `Release .dmg` → `Run workflow` → enter the tag → Run.
The job checks out that tag, whatever branch the "Use workflow from" dropdown says, so a tag that predates `Examples/DemoPlayerMac/Scripts/build-dmg.sh` fails loudly instead of building `main`. The log's "Building commit" line names the built SHA.
3. Watch the job. It should reach "Upload .dmg to release" and finish green in 3-6 minutes.
4. Confirm the `.dmg` appears under the release's Assets (or got `--clobber`'d over the existing one if you pointed at `2.0.0`).

Expand Down
9 changes: 9 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
version: 2
updates:
# Third-party actions are pinned by commit SHA (audit OPS-2); this keeps the pins moving.
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
commit-message:
prefix: "chore(ci)"
155 changes: 41 additions & 114 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,24 @@ concurrency:
cancel-in-progress: true

jobs:
# One toolchain: GitHub's `xcode-27` image (macOS 27.0, default Xcode 27.0 27A266a), the same
# Xcode the engine is consumed and released from. The earlier macos-15 lanes resolved
# `latest-stable` to Xcode 26.3, whose Swift 6.2 disagreed with 6.4 in both directions (6.4
# rejects isolation shapes 6.3 accepted, 2026-09-16; 6.2 timed out type-checking a literal sum
# inside #expect, 2026-09-30), and nothing downstream builds with 26.x any more, so the README's
# requirement is Xcode 27 and CI tests exactly that. `xcode-27` is still a GitHub preview image.
# Its flaky `swift test` runs of mid-September were on a beta macOS 27 base with Xcode 27
# beta 6; the image moved to macOS 27 on 2026-09-16. If it turns unstable again, that shows as
# a lane red for its image, which is the signal to wait for the GA label, not to lower the bar.
# All three macOS jobs use it, which stays within the account's concurrent macOS runners.
test-macos:
name: swift test (macOS)
runs-on: macos-15
runs-on: xcode-27
timeout-minutes: 30
env:
AUTHORIZATION_TEST_SUITES: 'RefreshableHLSAuthorizationTests|RefreshableSubtitleAuthorizationTests|LiveTrustEvaluatorTests'
steps:
- uses: actions/checkout@v4

- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Show toolchain
run: |
Expand Down Expand Up @@ -72,23 +78,11 @@ jobs:
run: swift build --build-tests --package-path Probes/TransportProbe

build-tvos:
name: xcodebuild (tvOS Simulator)
runs-on: macos-15
name: xcodebuild (tvOS + visionOS Simulator)
runs-on: xcode-27
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable

- name: Build for tvOS Simulator
run: |
xcodebuild build \
-scheme AetherEngine \
-destination 'generic/platform=tvOS Simulator' \
-derivedDataPath .build/xcode-tvos \
CODE_SIGNING_ALLOWED=NO
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

# The test target is the only place a platform gate in TEST code is ever checked. `swift test`
# on macOS compiles the macOS side of every `#if`, so a gate put around a helper instead of
Expand All @@ -98,12 +92,16 @@ jobs:
#
# EXCLUDED_ARCHS because a generic simulator destination builds both slices and `libdovi.a`
# ships arm64 only, so the x86_64 link fails and says nothing about this repo.
#
# This step also compiles the library, so no separate `xcodebuild build` of the AetherEngine
# scheme runs first: that doubled every simulator job's compile, and the x86_64 slice it added
# is one no app can link anyway.
- name: Build the tests for tvOS Simulator
run: |
xcodebuild build-for-testing \
-scheme AetherEngineTests \
-destination 'generic/platform=tvOS Simulator' \
-derivedDataPath .build/xcode-tvos-tests \
-derivedDataPath .build/xcode-tvos \
EXCLUDED_ARCHS=x86_64 \
CODE_SIGNING_ALLOWED=NO

Expand All @@ -120,52 +118,12 @@ jobs:
-derivedDataPath .build/xcode-probe \
CODE_SIGNING_ALLOWED=NO

build-ios:
name: xcodebuild (iOS Simulator)
runs-on: macos-15
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable

- name: Build for iOS Simulator
run: |
xcodebuild build \
-scheme AetherEngine \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath .build/xcode-ios \
CODE_SIGNING_ALLOWED=NO

# The other half of the gate check above; see the tvOS job for why the test target needs its
# own build and why x86_64 is excluded.
- name: Build the tests for iOS Simulator
run: |
xcodebuild build-for-testing \
-scheme AetherEngineTests \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath .build/xcode-ios-tests \
EXCLUDED_ARCHS=x86_64 \
CODE_SIGNING_ALLOWED=NO

# #344: the package has declared visionOS since 6.0.0 and nothing here compiled for it, so an
# availability list that named tvOS/iOS/macOS and then fell through to `*` broke the visionOS
# build silently. `*` resolves to the declared visionOS floor (1.0), so any API newer than that
# is a compile error on visionOS and on no other platform. Nobody here owns a Vision Pro, which
# makes this job the only place the platform is exercised at all.
build-visionos:
name: xcodebuild (visionOS Simulator)
runs-on: macos-15
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable

# #344: the package has declared visionOS since 6.0.0 and nothing here compiled for it, so an
# availability list that named tvOS/iOS/macOS and then fell through to `*` broke the visionOS
# build silently. `*` resolves to the declared visionOS floor (1.0), so any API newer than that
# is a compile error on visionOS and on no other platform. Nobody here owns a Vision Pro, which
# makes this step the only place the platform is exercised at all. It rides in this job so CI
# stays within the account's concurrent macOS runners instead of queueing a sixth job.
- name: Build for visionOS Simulator
run: |
xcodebuild build \
Expand All @@ -174,61 +132,30 @@ jobs:
-derivedDataPath .build/xcode-visionos \
CODE_SIGNING_ALLOWED=NO

# The Xcode 27 lane. Every job above resolves `latest-stable` on macos-15, which is Xcode 26.3,
# while the engine is consumed and released from Xcode 27, and Swift 6.4 rejects isolation shapes
# 6.3 accepted (the Sodalite test target stopped compiling on exactly that, 2026-09-16). These two
# jobs compile the package and both test targets against the 27 toolchain, for macOS and for the
# tvOS 27 SDK.
#
# They build and do not run the tests, on purpose. `xcode-27` is GitHub's preview image and runs a
# BETA macOS 27 (26A5406e) under Xcode 27 beta 6: measured on two attempts of the first run, Vision
# text recognition returns nil there and the loopback-origin tests starve (a global-queue block not
# scheduled within 30 s, a TLS relay request timing out), a different set of network tests each
# time, while all 2983 pass on macOS 27 GA on a Mac. A lane that is red for its image teaches
# everyone to ignore red. Run `swift test` here once a GA macOS 27 image ships, and that is also
# the point to move to its label; the preview label disappearing fails these jobs loudly first.
# This lane replaces the weekly beta SDK watcher, whose one subject (#351) the 7.0 platform floor
# closed.
build-macos-xcode27:
name: swift build --build-tests (macOS, Xcode 27)
runs-on: xcode-27
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- name: Show toolchain
run: |
swift --version
xcodebuild -version

- name: swift build --build-tests
run: swift build --build-tests

build-tvos-xcode27:
name: xcodebuild (tvOS Simulator, Xcode 27)
build-ios:
name: xcodebuild (iOS Simulator) + release aetherctl
runs-on: xcode-27
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- name: Build for tvOS Simulator
run: |
xcodebuild build \
-scheme AetherEngine \
-destination 'generic/platform=tvOS Simulator' \
-derivedDataPath .build/xcode-tvos \
CODE_SIGNING_ALLOWED=NO
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

# See the tvOS job above for why the test target needs its own build and why x86_64 is excluded.
- name: Build the tests for tvOS Simulator
# The other half of the gate check above; see the tvOS job for why the test target needs its
# own build and why x86_64 is excluded.
- name: Build the tests for iOS Simulator
run: |
xcodebuild build-for-testing \
-scheme AetherEngineTests \
-destination 'generic/platform=tvOS Simulator' \
-derivedDataPath .build/xcode-tvos-tests \
-destination 'generic/platform=iOS Simulator' \
-derivedDataPath .build/xcode-ios \
EXCLUDED_ARCHS=x86_64 \
CODE_SIGNING_ALLOWED=NO

# Every other Swift step in CI is Debug, and aetherctl is not a product, so no consumer compiles
# it either: a DEBUG-only engine hook called without a guard kept Release broken from 7.6.0 to
# 7.14.0 without anything noticing (AE#610). Off the `swift test` job's critical path.
- name: swift build -c release (aetherctl)
run: swift build -c release --product aetherctl

# The docs site (aetherengine-website) validates every heading anchor at build time, but it
# lives in another repo and only builds AFTER a push to main, so a broken anchor ships first
# and is found second: `docs/api.md` linked `formats.md#dolby-vision` against a heading that
Expand All @@ -240,7 +167,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Validate relative links and heading anchors in the published docs
run: python3 Scripts/check-doc-links.py
10 changes: 8 additions & 2 deletions .github/workflows/release-dmg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,14 @@ jobs:
runs-on: macos-15
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
# workflow_dispatch checks out the ref picked in "Use workflow from"
# (normally main), so the tag is pinned explicitly: the DMG is named,
# versioned and uploaded for the tag and must be built from it (audit OPS-101).
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: refs/tags/${{ github.event.release.tag_name || inputs.tag }}

- uses: maxim-lobanov/setup-xcode@v1
- uses: maxim-lobanov/setup-xcode@ed7a3b1fda3918c0306d1b724322adc0b8cc0a90 # v1.7.0
with:
xcode-version: latest-stable

Expand All @@ -65,6 +70,7 @@ jobs:
fi
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "Building for tag: $TAG"
echo "Building commit: $(git rev-parse HEAD)"

- name: Import Developer ID certificate into temporary keychain
env:
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/used-by-add.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Normalise the issue body
id: normalise
Expand Down Expand Up @@ -62,7 +62,7 @@ jobs:

- name: Parse issue form
id: parse
uses: stefanbuck/github-issue-parser@v3
uses: stefanbuck/github-issue-parser@cb6e97157cbf851e3a393ff8d57c93a484cc323f # v3.2.5
with:
template-path: .github/ISSUE_TEMPLATE/used-by-submission.yml
issue-body: ${{ steps.normalise.outputs.body }}
Expand Down Expand Up @@ -151,7 +151,7 @@ jobs:
- name: Open pull request
if: steps.build.outputs.skip == 'false'
id: pr
uses: peter-evans/create-pull-request@v6
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
# Only the README, so no stray runner file can ride along.
add-paths: README.md
Expand Down
Loading
Loading