What's Changed
- OCIO config: a mismatched closing bracket ends a flow collection; multiline flows parse in linear time by @dylanmtaylor in #2939
- Roto Brush: keep frozen mattes in a session without their model (#2833) by @JonRC in #2834
- Import: EDL source timecodes land on each file's own time (#2832) by @JonRC in #2835
- Lottie: read the closed flag older Bodymovin files keep outside the path by @JonRC in #2842
- Text animators: a later animator's Opacity can show characters an earlier one hid by @JonRC in #2843
- Lottie: warn when embedded glyphs (
chars) are not imported by @JonRC in #2847 - Import: BT.2020 PQ and HLG video gets the Rec. 2100 profile (#2849) by @JonRC in #2852
- G2: --save runs on one project take turns, so no edit is lost by @JonRC in #2872
- Export: H.264, HEVC and AV1 tag the frames' own colour (#2879) by @JonRC in #2881
- Viewer: the Rotation tool turns a child around its own anchor by @barchukmov in #2887
- Puppet: a click where the deformed layer is empty creates nothing by @barchukmov in #2891
- UI: Composition Settings widens to fit a longer translation (#2841) by @ljkx in #2892
- SAM 2: read the wgpu env variables and refuse adapters without compute shaders (#2900) by @JonRC in #2905
- Layer and item names: a second layer or a copy of v-b1.mp4 is v-b1.mp4 2 (#2904) by @JonRC in #2908
- Text animators: say that animator indexes count from 1 (#2907) by @JonRC in #2909
- Match Grain: take no sample box beside transparent pixels (#2919) by @JonRC in #2922
- material.set: name the Material Options a layer doesn't have (#2917) by @JonRC in #2924
- Panels: the panel menu stays as wide as its contents (#2864) by @barchukmov in #2933
- Panels: the gutter keeps rows clear of the scroll bar (#2867) by @barchukmov in #2934
- Viewer, Timeline: a middle-drag pans and moves no layer (#2854) by @barchukmov in #2935
- Cryptomatte eyedropper: pick IDs in the viewer from the Selection (#473) by @MatejKozlovsky in #2957
- 3D Camera Tracker: Effect Controls say how many frames a partial solve solved (#2959) by @JonRC in #2960
- Effect Controls: Shift-click selects a range of effects by @barchukmov in #2962
- i18n(ja): the work area is ワークエリア in the panel too by @zitann2020 in #2978
- Pre-compose: layers left behind drop links to moved layers; default names are numbered by @nanox333 in #2979
- Render Queue EXR sequences are scan-line, not tiled (#2805) by @HEOJUNFO in #2812
- test(cli): a child that exits before draining stdin breaks the write, not the test by @rahul05ranjan in #2819
- 3D Camera Tracker: a partial solve is not reported as solved (#2822) by @JonRC in #2824
- Motion Tile: mirror folds sample the edge texel, not the transparent outside (#2820) by @rahul05ranjan in #2825
- Fix #2803: Timewarp plays an animated Speed as a rate by @arnav-hiwarkar in #2878
- Viewer: dragged layers snap to other layers' midpoints and center lines by @barchukmov in #2885
- Timeline: box selection selects a keyframe as soon as it touches it by @barchukmov in #2888
- CLI: props prints an enum's label next to its number (#2928) by @JonRC in #2931
- i18n: complete the Traditional Chinese effect names (#2037) by @tommy1616 in #2981
- Path booleans: sparse winding numbers and bounded merge runs by @dylanmtaylor in #2946
- Mask feather: bound the variable feather's distance pass by @dylanmtaylor in #2947
- Settings: when recovering from a bad value, try only the settings' own pages one by one by @dylanmtaylor in #3010
- GPU: free effect working textures after each call instead of at frame end by @MatejKozlovsky in #1523
- gpu: memory back-pressure for frames in flight (fixes OOM at 3–4 frames in flight) by @MatejKozlovsky in #1550
- gpu: run Content-Aware Fill's PatchMatch and flow on the GPU by @gmrmad1 in #1856
- Preview: debounce GPU OOM bursts and recover the frame budget by @howdeploy in #3025
- Fix GPU/CPU parity in numerical effects by @skylartaylor in #1490
- GPU: Posterize and CC Grid Wipe match the CPU on AMD and Intel (#1605) by @00xJS in #1836
- GPU: build effect kernels on first use, each family from a module of its own (fixes #1590) by @00xJS in #1705
- #1487: size the GPU memory cap from the card's video memory where Linux reports it (depends on #1550) by @00xJS in #1706
- OCIO: refuse a .csp LUT whose header claims an oversized table before reserving it by @dylanmtaylor in #2938
- After Effects project import (.aep / .aepx); export follows by @vangel76 in #2558
- Content-Aware Fill: drop redundant full-range copies (#2570 phase 1) by @gmrmad1 in #2806
- Pass the Linux signing key to the release workflow by @dylanmtaylor in #3074
- About: credits column widths come from a tested fit_widths by @FredApps in #3039
- G8: Plug-in Library: install, preview and update community WebAssembly effects by @iseemhlyfta in #2524
- Frames cache: edits keep the frames they can't reach by @nazar-gavrylyk in #2795
- Plug-ins: external effect helpers (safe, out-of-process native effects) + plug-in API 2 by @glumbis in #889
- Effect ▸ Install Effect Plug-in… and plug-in bundles (wasm + ScriptUI panel in one go) by @justanshh in #2749
- Timeline: a double-click on the composition marker bin adds a marker at the current time (#1826) by @ZIDAN44 in #3091
- expr: an expression cannot rebind a prelude name for the next one (#2133) by @Anubhav-Rai in #2176
- Grow the buffer to the pinned quad so Corner Pin draws outside the layer rectangle (#1938) by @MarekSpodBiedry in #1967
- Export: use conformant ProRes alpha run termination by @skylartaylor in #2225
- Content-Aware Fill: spill the range and stream the output (#2570 phases 2-4) by @gmrmad1 in #3079
- Multi-layer EXR: one decode per frame shared by the picture and EXtractoR / Cryptomatte, picture-only decode for footage alone (#474) by @vangel76 in #2920
- perf(media): tell the media pool which EXR footage effects read (#474) by @vangel76 in #2929
- EXR export: no compand / tone mapping, and the output space's own curve (#2913) by @vangel76 in #2916
- HDR Highlight Compression: match After Effects' compression curve by @vangel76 in #3133
- .aep import: read effect values stored as default-state records by @vangel76 in #3134
- Cryptomatte: Matte Only puts the matte in RGB with alpha 1, as After Effects does by @vangel76 in #3130
- Render Queue OpenEXR: choose compression and half or 32-bit float by @vangel76 in #2915
- Reveal newly created mask controls in the Timeline by @arnav-hiwarkar in #3149
- After Effects project export, every chunk built in code (stacked on #2558) by @vangel76 in #2594
- Report offline footage and recover automatically when media returns by @arnav-hiwarkar in #3161
- Copy the shared house rules into AGENTS.md by @FredApps in #3162
- contributors: set names for vangel76 by @vangel76 in #3041
- Skip the startup update check when started for an agent by @vangel76 in #3097
- Effects: Write-on and Stroke Brush Size go up to 200 px (#2980) by @vangel76 in #3021
- EXR export: write the output space's chromaticities attribute by @vangel76 in #3038
- Import: EDL clips without a SOURCE FILE link the file beside the list (#2836) by @vangel76 in #3019
- Home screen: leave it when a menu command opens a composition by @vangel76 in #3092
- Disk cache: stamp footage files for the salt off the UI thread by @vangel76 in #3106
- Scripting: After Effects match names for 14 effects and Casts Shadows by @vangel76 in #3122
- .aep import: map HDR Highlight Compression, Echo, Linear Wipe, Offset and Color Stabilizer by @vangel76 in #3119
- .aep import: name the After Effects version in the report; 25.x and 24.x copies import like 2026 by @vangel76 in #3136
- Color Stabilizer and Linear Wipe: match After Effects (sample positions, feather) by @vangel76 in #3135
- Timeline: one selection box spans the layer list and the time graph by @vangel76 in #3075
- Project panel: the Name column fits long names and resizes by @vangel76 in #3094
- Viewer: Alt-drag duplicates the dragged layers by @vangel76 in #3076
- Layer: Quick Set Anchor, nine anchor points with Position compensation by @vangel76 in #3080
- Masks: set the corner roundness of a Rounded Rectangle mask by @vangel76 in #3077
- Viewer exposure on the full float range of 32 bpc frames by @vangel76 in #2937
- Cryptomatte: the Layer popup lists the footage's Cryptomatte layers (#473) by @vangel76 in #3020
- Project panel: fix main's clippy failure in show() by @FredApps in #3173
- Timeline: hover texts for the icon-only column headers and layer switches by @vangel76 in #3096
- Accessibility (gap 25), slice 2: Info, Flowchart, Script Console and the 3D Camera Tracker block named, described and keyboard-operable (builds on #1339) by @vangel76 in #1341
- .aep import: map the Cryptomatte plug-in to EffectCraft's Cryptomatte by @vangel76 in #3109
- Posterize on the GPU: divide by the levels exactly by @FredApps in #3179
- EXR golden test: compare samples near, not bit for bit by @FredApps in #3181
- Display pass tests: a virtual GPU gets the software tolerance by @FredApps in #3182
New Contributors
- @barchukmov made their first contribution in #2887
- @ljkx made their first contribution in #2892
- @rahul05ranjan made their first contribution in #2819
- @tommy1616 made their first contribution in #2981
- @howdeploy made their first contribution in #3025
- @00xJS made their first contribution in #1836
- @iseemhlyfta made their first contribution in #2524
- @nazar-gavrylyk made their first contribution in #2795
- @glumbis made their first contribution in #889
- @justanshh made their first contribution in #2749
- @ZIDAN44 made their first contribution in #3091
Full Changelog: v0.21.1...v0.22.0