1885 Commits
Author SHA1 Message Date
Brandon ThomasandClaude Opus 5.5 bfc23840b6 relink tests: no unused index_folder import on Windows (#3113)
The only use is in a #[cfg(unix)] symlink test, so clippy -D warnings
flagged the import on Windows. Name the function at its use instead.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:25:26 -04:00
.CooCoo 42aefd3a1a Timeline: the work area bar, with Set Work Area Bar In and Out Point (#3087)
Sequences already store a work area, and Export > Range lists Work
Area, but no command set one, so the Work Area range was grayed out.
The Timeline panel menu's Work Area Bar now shows the bar over the
whole sequence or hides it. Alt+[ and Alt+] in the Timeline move its
start and end to the playhead. On the ruler the bar's ends and middle
can be dragged, a double-click fits it to the part of the sequence the
ruler shows, and its tooltip shows the start, end and duration.

The new commands are sequence.workAreaBar, sequence.setWorkAreaIn,
sequence.setWorkAreaOut and sequence.setWorkArea. The two keys move
from the skipped table in docs/keyboard.md to the keyboard-only
commands.
2026-10-24 10:24:34 -04:00
cb6dee282d media: import animated WebP as a clip (#3038)
* media: import animated WebP as a clip

* animated WebP test: use is_multiple_of (clippy)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Brandon Thomas <echelon@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:24:30 -04:00
.CooCooandBrandon Thomas b206b1332d History: the panel menu deletes redoable actions and clears the history (#3075)
The History panel's menu had no entries of its own. It now has Delete
Redoable Actions, which asks for OK and then removes the dimmed steps
after the current state, and Clear History, which removes every step.
Neither one changes the project or its unsaved state. Backspace in the
History panel opens the same confirmation.

The engine commands are history.deleteRedoable and history.clear; both
return {"deleted": n}.

Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-24 10:24:27 -04:00
561322b46d Text panel: the Captions list follows the playhead (#3042)
* Text panel: the Captions list follows the playhead

As the playhead reaches a caption, the Captions list scrolls it to the middle, so the list stays
lined up with the Timeline during playback and scrubbing. Each caption is brought into view once
(scrolling the list by hand still works), and never while a field in the panel has focus.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Move the Captions list follow test into the shared ui-egui test binary

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-24 10:24:03 -04:00
bd4139e430 Edit: Copy, Cut and Paste work on captions selected in the Timeline (#3041)
* Edit: Copy, Cut and Paste work on captions selected in the Timeline

With only captions selected, Edit ▸ Copy / Cut (⌘C / ⌘X) copy them to a caption clipboard,
and Paste / Paste Insert (⌘V / ⇧⌘V) place them at the playhead on the caption tracks they came
from (the last track when that one is gone), overwriting what is there; Paste Insert first pushes
later captions on by the copied span. The pasted captions are selected, the playhead moves past
them, and it is one undo step. Copying clips empties the caption clipboard and the other way
round, so Paste places whichever was copied last. Before, Copy did nothing with only captions
selected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Move the caption copy/paste UI test into the shared ui-egui test binary

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-24 10:23:35 -04:00
964424ea8d Timeline: Option-drag duplicates captions (#3040)
* Timeline: Option-drag duplicates captions

Option-dragging a caption block leaves the original in place and drops a copy where it is
released; the cursor turns into a copy cursor and the original stays drawn under the copy while
dragging. A drag now carries the whole caption selection, not only the grabbed block.

New command `captions.duplicate` {captions, delta|deltaFrames}: copies on their own tracks,
never before 0, selected afterwards, one undo step. Captions never overlap, so
`edit::captions::overwrite_captions` places copies over what is there: captions under a copy are
trimmed, split around it or removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* captions.duplicate: refuse an empty caption list and copy each caption once; move its UI test into the shared ui-egui test binary

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-24 10:17:02 -04:00
a5c2a73cbd Timeline: the Razor tool cuts captions (#3039)
* Timeline: the Razor tool cuts captions

With the Razor tool (C), a click on a caption block in the Timeline splits it there, snapped like
a clip cut, with the same white preview line; Shift cuts every caption on an unlocked caption
track at that time. Before, the caption blocks took every click for select/move whatever the
tool, so the Razor did nothing on them. Locked caption tracks ignore it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Move the caption Razor UI test into the shared ui-egui test binary

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-24 10:16:33 -04:00
Tex JerniganandBrandon Thomas c5da984f6b meters: drop to silence right after Stop (#3011)
After Stop the meters kept the playback ballistics (20 dB/s bars, 6 dB/s
peak holds), so a -23 dB peak took ~11 s to clear and the meters looked
like audio was still playing. Once nothing is live, bars and peak holds
now fall at 360 dB/s and reach the floor within ~0.25 s. Playback,
recording and scrubbing ballistics are unchanged; the no-input repaint
from #1133 (#1062) still drives the release.

Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-24 10:16:29 -04:00
Michael ButlerandCodex e7f7775943 control: preserve MCP pointer input defaults (#2784) (#3004)
* control: preserve MCP pointer input defaults (#2784)

The MCP bridge emits null for omitted click counts and drag steps. Treat null like an absent value in bounded_repetitions, preserving the bounds introduced by #2868 and all other invalid-input errors. Add six regression tests and document the current limits and defaults.

Validation: both null-default tests failed against upstream before the fix; 205 UI unit tests and seven UI integration tests now pass. Formatting, layers, assets and browser WASM pass. Full CI stops at an unrelated upstream Clippy diagnostic in crates/prores/src/decode.rs:133. Prepared as a non-draft PR at the contributor’s explicit request.

Co-authored-by: Codex <noreply@openai.com>

* docs: explain pointer input defaults and regression coverage (#2784)

Document the bounded repetition helper, MCP pointer handlers and regression tests in response to CodeRabbit docstring coverage feedback. No executable behavior changes.

Validation: formatting and Rustdoc generation pass. Full CI still stops at the unchanged upstream ProRes nonminimal_bool Clippy diagnostic in crates/prores/src/decode.rs:133.

Co-authored-by: Codex <noreply@openai.com>

---------

Co-authored-by: Codex <noreply@openai.com>
2026-10-24 10:16:14 -04:00
skylar taylor-barrick d5ead4ba1e EffectCraft #293: finish ProRes alpha runs (#2991)
Write the required run after the final alpha difference, including a singleton. Add exact-codeword and strict slice conformance regressions; document native macOS and EffectCraft export validation.
2026-10-24 10:16:09 -04:00
jahvariandCodex fd7ac2fe4f REC2792: retain recovery candidates when discard fails (#2993)
Stop deleting after the first filesystem error and restore failed, unprocessed
and unselected candidates before returning it. Keep completed deletions removed.

Three real filesystem regressions reproduced list loss. Fourteen autosave
tests, formatting and strict engine lint pass; full CI runs on GitHub.

Refs #2792.

Co-authored-by: Codex <noreply@openai.com>
2026-10-24 10:16:05 -04:00
jahvariandCodex bb66ec17c4 HEVC2797: share immutable gray rows across unavailable references (#2992)
Keep unique frame identities while lazily caching one gray backing for
the active geometry and plane depths. Invalidate it on format changes
and release it on flush without invalidating readers.

Fixes #2797.

Co-authored-by: Codex <noreply@openai.com>
2026-10-24 10:16:01 -04:00
NetterSilverandClaude Opus 5.5 8bf939182e Only materialise kept frames when filling an H.264 frame_num gap (#2995)
Fixes #2779

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:15:54 -04:00
Adam BruncajandClaude Opus 5.5 4c91c89fd8 Say why H.265 and AV1 are unavailable without a hardware encoder (#3062)
The Format list greyed H.265 and AV1 out as "not supported yet". It now gives the reason: they
have no software encoder, and a hardware one (NVENC on NVIDIA, VideoToolbox on macOS) was not
found. A preset that names such a format shows the same note under the Format row
(export.format.unavailable) before the export would fail. Where the encoder exists, an NVENC
H.265 export still works (ffprobe reads hvc1 Main 4:2:0 BT.709). Spanish, Japanese and Chinese
for the two notes.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:15:50 -04:00
NetterSilverandClaude Haiku 5.5 b8821192e6 Keep WebVTT cues whose identifier is STYLE or REGION (#3088)
Found while testing crates/captions/src/vtt.rs:86

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-24 10:15:46 -04:00
NetterSilverandClaude Haiku 5.5 ba4bf46b28 Don't treat pieces with different settings as through edits (#3072)
Found while testing crates/edit/src/through.rs:21 (is_through_edit) and :61-102 (join_through_edits_where)

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-24 10:15:42 -04:00
.CooCoo 1f6567021d Import: numbered embedded-audio names keep the path's separators on Windows (#2988)
When an AAF or OMF import finds its embedded-audio path taken, it writes
the audio under a numbered name. The numbered path was built with
`Path::with_file_name`, which on Windows joins the folder and the new name
with `\` whatever separator the path was written with:
`/files/cut Audio.wav` became `/files\cut Audio (2).wav`. A document
imported by a forward-slash path stored media paths with mixed separators,
and `virtual_extraction_keeps_existing_media` failed on Windows, because
its in-memory files are keyed by string and the `(2)` name looked free.

A numbered name now replaces only the file name and keeps the folder as
written. New test `numbered_names_keep_the_path_separators` covers a `/`
and a `\` path.
2026-10-24 10:15:37 -04:00
Dylan M. Taylor 552f008d27 security(audio): bound sequence sample rates and AAF/OMF export channel buffers (#3082)
* security(audio): bound sequence sample rates and AAF/OMF export channel buffers

* fix(engine): bound export audio channels and samples independently
2026-10-24 05:28:22 -04:00
Dylan M. Taylor 48c7a27226 security(engine): require local trust for ingest destinations (#3083) 2026-10-24 05:26:28 -04:00
Dylan M. Taylor b4901c5bce security(codecs): validate VP9 empty tiles and AV1 film grain scaling points (#3081) 2026-10-24 05:25:27 -04:00
Dylan M. Taylor 057f460085 security: harden developer tools, scripts, and testkit against hostile input (#3078) 2026-10-24 05:15:45 -04:00
Dylan M. Taylor 15ca07300b security(interchange): harden FCPXML cycle detection, XML DTD entities, and imported formats (#3079) 2026-10-24 05:14:30 -04:00
Earl Co da691ce78a fix(speech): bound Whisper model metadata allocations (#2866) 2026-10-24 04:51:22 -04:00
Earl Co e69122c0b3 fix(speech): contain and verify downloaded model artifacts (#2867) 2026-10-24 04:51:16 -04:00
Earl Co ee08cd3b5e security(frame): bound decimation sampling work (#2878) 2026-10-24 04:51:10 -04:00
Earl Co 2d0382320a security(captions): bound malformed text processing (#2879) 2026-10-24 04:51:04 -04:00
Earl Co 52794db321 security(format): preserve permissions on atomic replacement (#2881) 2026-10-24 04:50:59 -04:00
Earl Co 5f2a77e3c8 security(hevc): bound specification equation parsing (#2884) 2026-10-24 04:50:53 -04:00
Earl Co f30c6be228 security(project): scan malformed caption markup once (#2885) 2026-10-24 04:50:47 -04:00
Earl Co 036086fa5b security(speech): bound diarization clustering work (#2891) 2026-10-24 04:50:41 -04:00
Earl Co d858c4682d security(engine): validate imported sequence settings (#2892) 2026-10-24 04:50:36 -04:00
Earl Co ee871ca06c security(h264): enforce long-term DPB limits (#2894) 2026-10-24 04:50:30 -04:00
Earl Co 087c7d5721 security(captions): bound TTML inline span output (#2896) 2026-10-24 04:50:25 -04:00
Earl Co 7095a7f8b9 security(captions): bound TTML speaker labels (#2897) 2026-10-24 04:50:20 -04:00
Earl Co b9689dd3a3 security(mpegts): avoid repeated audio buffer drains (#2898) 2026-10-24 04:50:14 -04:00
Earl Co 894a9b56b6 security(codecs): cap GOP cache frame retention (#2899) 2026-10-24 04:50:09 -04:00
Earl Co a70cac4c23 security(render): bound embedded LUT resolution (#2901) 2026-10-24 04:50:04 -04:00
Earl Co 4328e49a49 security(h264): bound hostile picture allocation (#2915)
* security(h264): bound reconstructed picture area

* security(h264): bound inferred gap pictures
2026-10-24 04:49:59 -04:00
Earl Co d4595df9c4 security(tts): verify Kokoro checkpoint before parsing (#2918)
* security(av1): require unique complete tile coverage

* security(tts): verify Kokoro checkpoint before parsing
2026-10-24 04:49:53 -04:00
Earl Co 8c928442ab security(remix): bound analysis resources (#2926)
* security(remix): bound analysis resources

* fix(audio-dsp): bound public analysis inputs
2026-10-24 04:49:48 -04:00
Earl Co ea8380a24f security(avi): bound framed audio scans (#2932) 2026-10-24 04:49:42 -04:00
Earl Co 355a2b5538 security(aaf): bound materialized streams (#2934) 2026-10-24 04:49:36 -04:00
Earl Co f9a2d66db1 security(mpeg2v): bound access-unit output (#2935) 2026-10-24 04:49:31 -04:00
Earl Co ca3ee00845 security(captions): bound burn-in overlays (#2941) 2026-10-24 04:49:25 -04:00
Earl Co b4792ecc06 security(render): bound burn-in text rasters (#2943) 2026-10-24 04:49:19 -04:00
Earl Co 90327492a6 security(export): bound image overlay decoding (#2944) 2026-10-24 04:49:13 -04:00
Earl Co a8d074247a security(omf): bound metadata expansion and traversal (#2946) 2026-10-24 04:49:07 -04:00
Earl Co 21df45601c security(mxf): bound recovery and PCM edit units (#2948) 2026-10-24 04:49:02 -04:00
Earl Co 85db84cf93 security(ogg): bound recovery scanning (#2950) 2026-10-24 04:48:57 -04:00