chore: sync upstream (18 Commits) #20

Merged
alf merged 18 commits from chore/sync-upstream-20261106 into main 2026-11-05 23:14:54 +00:00
Owner

Upstream-Sync von upstream/main (18 Commits). Fast-Forward.

  • 8b63d430 Merge pull request #2916 from vangel76/fix/exr-scene-linear-output
  • 39af86e9 Merge pull request #2929 from vangel76/perf/aux-footage-hint-474
  • 35ce9b26 Merge pull request #2920 from vangel76/perf/exr-decode-cache-474
  • ab6e7697 ProEXR test: a non-sRGB output curve (Rec. 709) decodes with its own curve
  • 65315753 Merge upstream/main into fix/exr-scene-linear-output
  • e3ab397a Merge remote-tracking branch 'origin/perf/exr-decode-cache-474' into m2929-merge
  • 2b3d76c5 Merge upstream/main into perf/exr-decode-cache-474
  • 0d2153e2 test(media): review follow-ups for the aux footage set (#474)
  • 5b31b96c perf(media): tell the media pool which EXR footage effects read (#474)
  • 00a15d84 Merge remote-tracking branch 'upstream/main' into perf/exr-decode-cache-474
  • eedd6490 #474: keep files in use in the channel cache, cap plane memory, fall back on a missing cache entry
  • d4816719 #474: golden OpenEXR files for tiles, mip levels, line order, uncompressed and uint RGB
  • 2939b376 #474: format the OpenEXR golden test
  • 8add8ac7 #474: decode a multi-layer EXR once per frame, and only its picture when nothing else reads it
  • 05c6f5d4 Merge remote-tracking branch 'upstream/main' into fix/exr-scene-linear-output
Upstream-Sync von `upstream/main` (18 Commits). Fast-Forward. - 8b63d430 Merge pull request #2916 from vangel76/fix/exr-scene-linear-output - 39af86e9 Merge pull request #2929 from vangel76/perf/aux-footage-hint-474 - 35ce9b26 Merge pull request #2920 from vangel76/perf/exr-decode-cache-474 - ab6e7697 ProEXR test: a non-sRGB output curve (Rec. 709) decodes with its own curve - 65315753 Merge upstream/main into fix/exr-scene-linear-output - e3ab397a Merge remote-tracking branch 'origin/perf/exr-decode-cache-474' into m2929-merge - 2b3d76c5 Merge upstream/main into perf/exr-decode-cache-474 - 0d2153e2 test(media): review follow-ups for the aux footage set (#474) - 5b31b96c perf(media): tell the media pool which EXR footage effects read (#474) - 00a15d84 Merge remote-tracking branch 'upstream/main' into perf/exr-decode-cache-474 - eedd6490 #474: keep files in use in the channel cache, cap plane memory, fall back on a missing cache entry - d4816719 #474: golden OpenEXR files for tiles, mip levels, line order, uncompressed and uint RGB - 2939b376 #474: format the OpenEXR golden test - 8add8ac7 #474: decode a multi-layer EXR once per frame, and only its picture when nothing else reads it - 05c6f5d4 Merge remote-tracking branch 'upstream/main' into fix/exr-scene-linear-output
alf added 18 commits 2026-11-05 23:14:53 +00:00
Synthetic single-layer, multi-layer, multi-part and windowed files in
half, float and uint, with RLE, ZIP, PIZ and DWAA, decoded through the
media pool picture first and channels first. The hashes are taken on
main before the decode is reworked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OpenEXR renders (Render Queue sequences and Save Frame As ProEXR) received
the frame after Project Settings > HDR, so Compand and Tone Map (the default
of every OCIO project) compressed highlights and changed values below 1.0
before the writer decoded them, always with the sRGB curve.

- RenderOpts::scene_output: the top-level comp converts to the output space
  without the HDR step (CPU and GPU walks, via Renderer::output_pipe).
- Pipe::output_linear: the writers decode with the output space's curve
  (the Working Gamma's when unmanaged) instead of a fixed sRGB curve.
- Render Queue EXR jobs and ProEXR set the flag; PSD layers, 8-bit stills,
  movies and the viewer keep the HDR step. The flag is part of the viewer
  frame and disk cache keys (opts_hash).

Golden hashes, taken before the change, pin PNG/TIFF/Targa bytes for
8/16/32 bpc x Clip/Compand/ToneMap, Clip-mode EXR samples with an sRGB
output, and the layered PSD bytes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Rename RenderOpts::scene_output to skip_hdr_step (Pipe::without_hdr_step):
  the consumer decodes with Pipe::output_linear or applies the step itself.
- Alpha-only EXRs hold the alpha as it is in every output space (it is
  coverage, not encoded colour; it used to be sRGB-decoded).
- Tests: a half-opacity layer over a coloured background (premultiplied and
  RGB-over-background paths, golden hashes taken before the change), Rec.
  2100 PQ and HLG EXR outputs, raw alpha, and a visible skip of the GPU test
  without an adapter.
- docs/architecture.md: the Working Gamma curve for unmanaged projects, and
  no HDR step for unmanaged projects or PQ / HLG outputs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The channel cache decodes a file once however many callers ask for it at
  the same time (the others wait for that decode), and is bounded by the
  bytes of its planes (1 GiB, least recently used out first, a file counting
  as used when its decode finishes, the newest file always kept) instead of
  four files of any size.
- Once an effect has read a footage item's channels, its pictures are made
  of the cached planes, also for files with an unnamed RGB layer (bit for
  bit what the image crate shows, which still decodes the files the planes
  can't stand in for); footage alone decodes only its picture's channels
  (a multi-layer file's were all decoded and cached for every frame).
- Channels are decoded straight into their display-window planes, and the
  picture is converted from the planes without two interleaved copies.

Measured on a 30-frame 2560x1440 sequence of 32 channels (DWAA), one frame
at a time: footage alone 0.185 -> 0.073 s per frame and 4.4 -> 1.8 GB peak;
with an unnamed RGB layer plus Cryptomatte 0.244 -> 0.159 s; multi-part
plus EXtractoR 0.194 -> 0.127 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Formatting only; no hash changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds tiled (ZIP16, RLE), tiled mip-mapped (ZIP16, PIZ), decreasing line
order, uncompressed, a uint R/G/B picture and a multi-part file whose first
R/G/B part is depth-named (the planes can't stand in for the image crate's
picture there). The new hashes were taken with main's crates/media/src at
a646bdcc (extracted with git archive) and the same test, before the decode
rework.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review follow-ups:
- Files in use are never dropped from the channel cache: planes an effect
  holds, the files of the last 4 pictures made of their planes until their
  effects ask for the channels, and decodes in progress, which now count
  the planes they will allocate (from the header) against the budget. With
  4 frames at once over a budget of one file, each file decodes once (test).
- A decode that panics removes its entry instead of leaving it decoding.
- One decode allocates at most 8 GiB of planes (512 MiB on 32-bit and
  wasm); a header asking for more is refused with the reason.
- A shared picture whose file has no cached channels (a failed read, a
  broken part it doesn't use) is decoded from its own channels.
- Comment why waiting on a decode may block a rayon worker; drop the
  subsampling check and test (the exr crate refuses subsampled files).
- Docs: the cache is a soft bound; a single-part file still decompresses
  every channel; the first frame and the image crate's route decode twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pool learned that an effect reads a footage item's channels only at the
first aux() call, so the first frame was decoded twice (picture, then in
full), and the hint was never cleared after the effect was removed.

The session now gives the footage source the whole set of files read by
enabled 3D Channel effects (FootageSource::set_aux_footage) with every
project change (Session::bump: edits, undo, redo, history jumps, rollbacks,
project open), sending it only when it changed. The pool keeps that set and,
as a safety net, what aux() learns; a new set drops what was learned.

Refs #474

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A watch-folder render gives the host session's set back after its own
  project replaced it on the shared footage source.
- Guard gpu fx_depth::IDS against reads_aux drifting apart.
- Count picture and channel decodes per thread instead of reading the
  shared channel cache, so parallel tests can't make the checks flaky.
- The engine test fails when no set was ever sent.
- Docs: Media Replacement items are learned at their first frame.

Refs #474

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Conflict: crates/gpu/src/tests.rs (both sides added a test; kept both).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Multi-layer EXR: one decode per frame shared by the picture and EXtractoR / Cryptomatte, picture-only decode for footage alone (#474)
perf(media): tell the media pool which EXR footage effects read (#474)
Merge pull request #2916 from vangel76/fix/exr-scene-linear-output
Some checks failed
ci.yml / Merge pull request #2916 from vangel76/fix/exr-scene-linear-output (pull_request) Failing after 0s
sonarcloud.yml / Merge pull request #2916 from vangel76/fix/exr-scene-linear-output (pull_request) Failing after 0s
ci.yml / Merge pull request #2916 from vangel76/fix/exr-scene-linear-output (push) Failing after 0s
sonarcloud.yml / Merge pull request #2916 from vangel76/fix/exr-scene-linear-output (push) Failing after 0s
8b63d4308c
EXR export: no compand / tone mapping, and the output space's own curve (#2913)
alf merged commit 8b63d4308c into main 2026-11-05 23:14:54 +00:00
alf deleted branch chore/sync-upstream-20261106 2026-11-05 23:14:54 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/effectcraft!20
No description provided.