Skip to content

Commit fc1c531

Browse files
Vincent Herbstclaude
andcommitted
chore(release): prep 7.19.0 - a software-decoded picture and a still carry the colours playback shows
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mf4MXgM9bqugHoe5TW4BYf
1 parent 1bdcef3 commit fc1c531

4 files changed

Lines changed: 31 additions & 5 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,32 @@ the public-API contract.
1212

1313
_Nothing yet._
1414

15+
## [7.19.0] - 2026-09-26
16+
17+
### Fixed
18+
19+
- **A software-decoded picture carries the colour tags VideoToolbox would give it (AE#654).** The
20+
software decoder attached a tag only where the frame declared one and CoreVideo had a mapping, so
21+
an untagged source reached the display layer with no primaries, transfer or matrix, while the same
22+
file through VideoToolbox arrives tagged BT.709. It now fills the gaps the way VideoToolbox does,
23+
measured on its output: nothing declared means BT.709 in all three at any size and codec, and a
24+
lone BT.601 matrix gets SMPTE-C primaries. Affects the software route (MPEG-4 ASP, MPEG-2, VC-1,
25+
VP9, AV1 without hardware decode). `ColorDescription` keeps its gaps, so the HDR gate and the
26+
tone mapper still see an untagged stream as untagged.
27+
- **Tagged SD sources keep their tags on the software path.** `ColorAttachments` had no mapping for
28+
BT.601 matrices, SMPTE-C or EBU 3213 primaries, so a correctly tagged PAL or NTSC source lost all
29+
three. Added with DCI-P3, SMPTE 240M, sRGB and linear transfer.
30+
- **A `FrameExtractor` still is converted with the picture's own matrix and range.** The SDR still
31+
path never called `sws_setColorspaceDetails`, so every still went through swscale's BT.601
32+
default and a range read from the pixel format alone: HD colour bars were up to 33 levels off, and
33+
a 10-bit full-range picture (no `yuvj` variant exists) was read as limited. The matrix now follows
34+
the rule the displayed buffer is tagged by, so an untagged still resolves exactly as playback.
35+
36+
### Added
37+
38+
- **`SoftwareDecodeProbeResult.firstFrameColor`**: the colour tags the first picture reaches the
39+
display layer with, as `primaries / transfer / matrix`. Printed by `aetherctl swdecode`.
40+
1541
## [7.18.2] - 2026-09-26
1642

1743
### Fixed

‎Examples/README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Three samples covering different audiences:
1818
```
1919
https://github.com/superuser404notfound/AetherEngine
2020
```
21-
Dependency Rule: Up to Next Major Version, starting from `7.18.2`. Add the `AetherEngine` library product to your app target.
21+
Dependency Rule: Up to Next Major Version, starting from `7.19.0`. Add the `AetherEngine` library product to your app target.
2222

2323
3. **Drop the file in.** Replace the Xcode template's default `App.swift` (or whatever the generated `@main` file is called) with the contents of [`MinimalPlayerApp.swift`](MinimalPlayer/MinimalPlayerApp.swift). The file is self-contained: it defines both the `@main App` struct and the `ContentView`.
2424

‎README.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ Subtitle cues land in raw source PTS; render the overlay against `player.sourceT
384384
Install via Swift Package Manager:
385385

386386
```swift
387-
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "7.18.2")
387+
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "7.19.0")
388388
```
389389

390390
Three samples ship in `Examples/`:
@@ -631,10 +631,10 @@ Browse all of this as a searchable site at **[aetherengine.superuser404.de](http
631631
AetherEngine uses [Semantic Versioning](https://semver.org). The public API surface, every `public` declaration in `Sources/AetherEngine/`, is the stability contract. **Major** removes / renames public symbols or breaks adopters; **Minor** adds public API or codec / format support; **Patch** fixes bugs with no public API change. `internal` types are not part of the contract.
632632

633633
```swift
634-
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "7.18.2")
634+
.package(url: "https://github.com/superuser404notfound/AetherEngine", from: "7.19.0")
635635
```
636636

637-
Pin to `.upToNextMinor(from: "7.18.2")` for stricter teams that prefer to opt into minor bumps explicitly.
637+
Pin to `.upToNextMinor(from: "7.19.0")` for stricter teams that prefer to opt into minor bumps explicitly.
638638

639639
## Requirements
640640

‎Sources/AetherEngine/AetherEngine+Version.swift‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ extension AetherEngine {
1111
///
1212
/// Between releases, and in a consumer that pins an unreleased commit for a device test, this
1313
/// names the last PUBLISHED version the checkout descends from, not every patch in it.
14-
public nonisolated static let version = "7.18.2"
14+
public nonisolated static let version = "7.19.0"
1515
}

0 commit comments

Comments
 (0)