Commit Graph
1810 Commits
Author SHA1 Message Date
Earl Co 70d0260b6e security(dnx): validate fields before frame allocation (#2914) 2026-10-23 10:53:38 -04:00
7f8c9921a1 security(engine): confine stored media filesystem access (#2869)
* security(engine): confine stored media filesystem access

* relink: index symlinked files; skip only symlinked folders

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:53:29 -04:00
875eec90e9 security(render): bound expanded frame plans (#2942)
* security(render): bound expanded frame plans

* render: count plan layers as they are pushed instead of re-summing every step

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:53:24 -04:00
1c40c48289 security(mxf): share resolved descriptor metadata (#2949)
* security(mxf): share resolved descriptor metadata

* mxf: keep every source-package track in the no-material-package fallback

Two packages may reuse a track id and number; comparing only those dropped a real track.

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:53:19 -04:00
Marco Arnulfo 0b99bafcc4 Project panel: a clip dropped on New Item makes a sequence from it (fixes #2855) (#2940) 2026-10-23 10:53:14 -04:00
Earl Co 66da0e5270 security(avi): bound OpenDML index work (#2925) 2026-10-23 10:53:09 -04:00
Earl Co a6ed3ecd14 security(text): bound transformed glyph masks (#2900) 2026-10-23 10:53:05 -04:00
Earl Co 71d5f52b4d security(opus): validate direct multistream headers (#2905) 2026-10-23 10:53:00 -04:00
980c388325 codecs: walk open-GOP leading pictures back in a loop, not by recursion (#2920)
* codecs: walk open-GOP leading pictures back in a loop, not by recursion

MxfVideo::sync_before and MpegVideo::sync_before recursed one GOP back
per leading picture, so a crafted index whose every GOP leads its key
frame recursed once per GOP: tens of thousands of frames for a small
file, a plausible stack overflow in dev builds.

Both now use gop::open_gop_sync, a loop over the same steps. It stops
when the index's sync sample lies past the picture instead of looping,
and reads pts and keys with get().

Fixes #2803

* gop: keep decode_start's doc comment on decode_start

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:52:55 -04:00
68cfb0b52d security(text): keep font scans within configured folders (#2876)
* security(text): keep font scans within configured folders

* fonts: still find symlinked font files; skip only symlinked folders

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

* fonts: rustfmt

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:52:49 -04:00
d3ec344691 security(ui): bound export folder elision work (#2902)
* security(ui): bound export folder elision work

* export mode: keep location_link's doc comment on the function

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:52:45 -04:00
441e80b7a6 security(tts): make malformed-token scanning linear (#2871)
* security(tts): make malformed-token scanning linear

* tts-text: find a pause marker's ] by byte, so a multi-byte character at byte 64 doesn't hide it

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:52:40 -04:00
599516dc1c fix(control): bound synthetic pointer events (#2868)
* fix(control): bound synthetic pointer events

* control: check ui.click's count before queuing any input events

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:52:35 -04:00
9722d77aa5 security(engine): bound graphic template thumbnails (#2887)
* security(engine): bound graphic template thumbnails

* graphic templates: scale a capped thumbnail to fit both sides of the canvas

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:52:30 -04:00
Earl Co ebe15de141 security(bench): isolate temporary export outputs (#2928)
* security(bench): isolate temporary export outputs

* chore(bench): record tempfile dependency
2026-10-23 10:52:26 -04:00
Earl Co 73265622b2 security(h264enc): cache second-pass plan sums (#2906) 2026-10-23 10:52:21 -04:00
Earl Co cbeb748ecc security(matroska): compose stripped private data once (#2911) 2026-10-23 10:52:17 -04:00
Earl Co 370019bdfc security(isobmff): bound metadata expansion (#2933) 2026-10-23 10:52:13 -04:00
Earl Co ccb80b2e9d security(platform): bound hybrid replay output (#2938) 2026-10-23 10:52:08 -04:00
Earl Co 8fa72cf18d security(codecs): avoid quadratic MPEG timestamp lookup (#2883) 2026-10-23 10:52:03 -04:00
Earl Co 19ff23cba3 security(hevc): validate slice payload before allocation (#2939) 2026-10-23 10:51:59 -04:00
04a4a7bc72 security(proxies): reserve outputs atomically (#2922)
* security(proxies): reserve outputs atomically

* proxies: ReservedOutput::file returns an Option instead of expect()

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

---------

Co-authored-by: Brandon Thomas <brandon@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 10:51:54 -04:00
Marco Arnulfo 9f16d97750 Raise a loaded project's next_id past the ids already in it (#2864)
* Raise a loaded project's next_id past the ids already in it (fixes #2809)

* Demo project: start new ids past its fixed transition and marker ids (#2809)

* Count transcript, source graphic and narration keys as ids in use on load (#2809)

* Format tests: a transcript's key raises next_id on load (#2809)

* Count ids that are only referenced (clip items, subclip parents, transition ends, sends, outputs, cameras, merged clips) on load (#2809)
2026-10-23 10:51:49 -04:00
Earl Co f6e053b352 security(text): bound text and phonemizer work (#2870)
* security(text): bound layout and font-name work

* security(tts): bound phonemizer input expansion
2026-10-23 10:51:44 -04:00
Earl Co 199b70c1d1 security(interchange): bound imported track indices (#2910) 2026-10-23 10:51:39 -04:00
HEOJUNFOandClaude Opus 5.5 700bdd9190 Scroll the timeline clip menu when it is taller than the screen (#2852) (#2862)
* Scroll the timeline clip menu when it is taller than the screen (#2852)

The clip menu has about 35 items and ran off the bottom of short
screens with no way to reach the rest. It now scrolls inside the window,
as the panel menu already does.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Let the clip menu move up before it scrolls

The scroll area only took the height left below the pointer, so the menu
stayed where it was opened and scrolled even when the whole menu fit on
the screen, and the clip menu tests in clip_dialogs_ui could no longer
click the items past that height. Asking for the full height lets the
popup move up as before; it only scrolls when the screen is too short.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-23 10:51:34 -04:00
skylar taylor-barrickandBrandon Thomas b366ff3205 Regression tests for #130, #703, #1084 and #1309 (#2861)
* #703: test that timeline track lines are visible and the playhead head is short

The lines between timeline tracks were drawn in the timeline background colour, so they could not be seen, nothing marked the top of the highest video track, and the playhead head covered the whole ruler. The tests check that separator-coloured lines run under every track and above the top video track, and that the head stays within the bottom 14 points of the ruler. Without the fix no such lines are drawn and the head is 38 points tall.

* #130: test that timecodes and menus use the Premiere-style type

The big timecodes were 15 pt semibold and the menu bar's menus used egui's default text size. The tests check that the timeline, program and reference timecodes are painted in 16 pt regular in the timecode colour, and that File menu items are drawn at 13 pt. Without the fix the timecodes are 15 pt semibold and the menu items are 12 pt.

* #1084: test that the Import captions file button label is legible in light mode

The label was always white, so it disappeared against the light grey button in light mode. The test shows the empty Captions tab in the dark and light themes and requires at least 3:1 contrast between the label and the button fill. Without the fix the light theme fails at 1.04:1.

* #1309: test that the sort arrow does not cover a sorted column's name

In a narrow List-view column the sort arrow was painted over the end of the clipped column name. The test narrows the sorted Name column and requires the name's visible clip rect to end left of the arrow. Without the fix the name stays visible up to x=67 while the arrow starts at x=60.

* #1084: hold the Import captions label to 4.5:1 contrast

The label is normal-size text (12 pt semibold), so WCAG AA asks for 4.5:1, not the 3:1 the test allowed. Both themes clear 4.5:1 today; with the fix reverted the label is at 1.04:1.

* #130: menu bar titles use the 13 pt menu text, like their menus

#130 styled the menus' items with theme::menu_style through MenuConfig, which egui applies to submenus only. The bar's own titles kept egui's default 12 pt, dimmer button text. MenuBar::style takes the same style, so the titles and their menus now share one size and colour, as in a native menu bar. The #130 test now checks the File title too; without this change it fails at 12 pt.

---------

Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-23 10:51:23 -04:00
Dylan M. Taylor 689e37782a fix: harden CLI file I/O and AV1 tooling (SonarCloud)
- Read and write CLI inputs/outputs on a blocking pool instead of stalling
  the async runtime (rust:S7493).
- Document the FLAC STREAMINFO MD5 as the RFC 9639 integrity signature it
  is, and validate the AV1 generator's spec path before reading it.
- Normalize the DCT basis literals that read as numeric suffixes.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-23 09:53:17 -04:00
skylar taylor-barrick abf44fda90 Reject non-hex characters in colour hex parsing (#2600)
Accept only ASCII hexadecimal digits after a single optional hash in color strings.
2026-10-22 22:56:01 -06:00
skylar taylor-barrick 229b3a0fec #2679: effects.setParam refuses values outside the parameter's range (#2709)
Reject float effect parameter values outside the declared inclusive range without changing project state.
2026-10-22 22:52:46 -06:00
skylar taylor-barrick 85c431d6f6 Reject signed fields in SCC timecode parser (#2630)
Reject signed SCC timecode fields while preserving valid and drop-frame parsing.
2026-10-22 22:52:36 -06:00
skylar taylor-barrick edb501a3fe Fix false overlaps for empty time ranges (#2601)
Treat zero- and negative-duration time ranges as empty in overlap checks.
2026-10-22 22:51:02 -06:00
skylar taylor-barrick f1ba4e9596 Escape tab/newline/CR in XML attribute values (#2586)
Encode attribute whitespace using numeric character references so it survives XML parsing.
2026-10-22 22:49:04 -06:00
skylar taylor-barrick b31a5d94da Keep WebVTT cues whose identifier starts with NOTE (#2629)
Keep valid WebVTT cues with NOTE-prefixed identifiers instead of dropping them as comments.
2026-10-22 22:48:54 -06:00
skylar taylor-barrick e29bc50fe0 Merge branch 'main' into fix/2679-setparam-range 2026-10-22 22:30:53 -06:00
skylar taylor-barrick 8e294e7d2a Merge branch 'main' into fix/h846-xml-writer-does-not-escape-tab-n 2026-10-22 22:30:50 -06:00
skylar taylor-barrick 87f7594407 Merge branch 'main' into fix/h938-color-parse-hex-accepts-signed-d 2026-10-22 22:30:48 -06:00
skylar taylor-barrick 0667ce3907 Merge branch 'main' into fix/empty-time-range-overlaps 2026-10-22 22:30:44 -06:00
skylar taylor-barrick 1b1ed5cc70 Merge branch 'main' into fix/h1115-webvtt-cue-whose-identifier-star 2026-10-22 22:30:41 -06:00
skylar taylor-barrick c3142b63c6 Merge branch 'main' into fix/h1135-scc-timecode-parser-accepts-sign 2026-10-22 22:30:39 -06:00
skylar taylor-barrick ce1b1cd718 Merge branch 'main' into fix/h1166-parse-timecode-accepts-signed-fi 2026-10-22 22:30:35 -06:00
coderabbitai[bot]andcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> d3801e2df8 control: Require session-token authentication before dispatching requests (#2764)
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-10-22 22:17:48 -04:00
skylar taylor-barrick 3131b1462c Merge branch 'main' into feat/fujifilm-flog 2026-10-22 19:24:50 -06:00
skylar taylor-barrick 07f2d3a213 i18n test: leave installed right-to-left faces out of the Japanese check (#2576)
i18n test: leave installed right-to-left faces out of the Japanese check
2026-10-22 18:14:46 -06:00
skylar taylor-barrick 2860e4bdf8 Read the a of a.m. and attached am as the letter name A (#2832)
Read the a of a.m. and attached am as the letter name A
2026-10-22 17:44:05 -06:00
skylar taylor-barrick defb9ca947 Keep file URL hosts that only start with "localhost" (#2757)
Keep file URL hosts that only start with "localhost"
2026-10-22 17:43:57 -06:00
skylar taylor-barrick a9c6803489 Speak the minus sign of negative currency amounts in TTS normalizer (#2756)
Speak the minus sign of negative currency amounts in TTS normalizer
2026-10-22 17:43:48 -06:00
NetterSilverandClaude Haiku 5.5 cda58a2b1d Read the a of a.m. and attached am as the letter name A
Found while testing crates/tts-text/src/normalize.rs:416 (parse_time am/pm suffix) and :947 (parse_wordish a.m. branch); consumed by crates/tts-text/src/phonemize.rs:398 (is_single_letter)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 18:39:43 +02:00
melchiaaronzedekandClaude Opus 5.5 6cfd42c511 M8: Fujifilm F-Log, F-Log2 and F-Log2 C colour spaces (F-Gamut / F-Gamut C)
Interpret Footage ▸ Color Management now offers "Fujifilm F-Log / F-Gamut", "Fujifilm F-Log2 /
F-Gamut" and "Fujifilm F-Log2 C / F-Gamut C" (X-S20, X-H2S, X-T5, GFX…), implemented from
Fujifilm's GFX ETERNA Technical Guide white paper v1.01 (the F-Log / F-Log2 data sheet
formulas): 10-bit code-value domain, F-Gamut = BT.2020 primaries, F-Gamut C primaries
(0.7347, 0.2653) (0.0263, 0.9737) (0.1173, -0.0224). Round trip and monotonicity tests cover
the new curves with the others; reference values from the white paper's table: 0 % → 95,
18 % → 470 / 400, 90 % → 705 / 570 (F-Log / F-Log2).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:32:05 +05:30
NetterSilverandClaude Opus 5.5 47e5f63ded Keep file URL hosts that only start with "localhost"
Found while testing crates/interchange/src/common.rs:68

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 08:14:56 +00:00