Commit Graph
460 Commits
Author SHA1 Message Date
Brandon Thomas 2a9f39db63 Merge pull request #825 from vangel76/gap-aac-audio
#814: AAC Audio export (audio-only .m4a, or ADTS .aac)
2026-10-10 19:22:45 -04:00
vangel76 f8f16b6eca Merge remote-tracking branch 'upstream/main' into gap-aac-audio
# Conflicts:
#	crates/engine/src/commands.rs
#	docs/gaps.md
2026-10-11 01:09:25 +02:00
vangel76 2ca656684e Merge remote-tracking branch 'upstream/main' into gap-mask-rounded-corners
# Conflicts:
#	docs/gaps.md
2026-10-11 01:00:22 +02:00
vangel76andClaude Opus 5.5 b9f60842bb #814: AAC Audio export (audio-only .m4a, or ADTS .aac)
Problem: Premiere's "AAC Audio" format has no FilmCraft equivalent. AAC
was only written inside H.264 / H.265 / AV1 movies; the only audio-only
exports were Waveform Audio and AIFF.

Fix: a new `aac` export format ("AAC Audio") that encodes the sequence
mix with the existing AAC-LC encoder into an MPEG-4 audio file (.m4a,
encoder delay in an edit list), or a raw ADTS stream when the path ends
in .aac. Bitrate, sample rate, channels and loudness normalisation follow
the audio settings. Adds an "AAC Audio 48 kHz 320 kbps" Audio Only
preset, CLI extension guessing (.m4a / .aac), es/fr/ja/zh-cn strings, and
updates G13 (also noting ProRes 4444 / XQ is already in the export UI).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 00:56:35 +02:00
vangel76andClaude Opus 5.5 16493a7f70 #813: masks round their corners (rounded rectangle masks)
Problem: Premiere 26's redesigned mask tools give rectangle masks
rounded corners; FilmCraft masks only had sharp corners.

Fix: MaskPath::with_rounded_corners replaces each sharp corner between
straight edges by a circular fillet (two vertices joined by a cubic arc,
handles 4/3·tan(φ/4)·r, shrunk to fit half of each edge; hostile radii
and indices are clamped or ignored). masks.add takes `cornerRadius` for
a rounded rectangle, and the new masks.roundCorners command rounds an
existing mask's corners (or the listed vertices) in one undo step, on
every Mask Path keyframe so animated paths keep interpolating.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 00:47:09 +02:00
Brandon Thomas 9efe8f3112 Merge pull request #812 from vangel76/gap-exr-sequences
#806: export OpenEXR image sequences
2026-10-10 18:44:25 -04:00
Brandon Thomas 4a81aa1742 Merge pull request #804 from vangel76/gap-french-localization
#498: French (fr) interface translation
2026-10-10 18:35:20 -04:00
vangel76andClaude Opus 5.5 fb5863bc8a #806: export OpenEXR image sequences
Problem: Premiere offers OpenEXR as an image-sequence export format;
FilmCraft could not write EXR at all (docs/gaps.md G13).

Fix: a new export format (id exr, "OpenEXR") writing numbered .exr stills,
with a preset, the Include Alpha Channel option, the file.exportMedia format
list and es/ja/zh-cn strings. The writer in crates/export/src/raster.rs
follows the public OpenEXR file layout: version 2 single-part scan-line
file, half-float B/G/R(/A) channels, no compression, one scan line per
chunk, Rec.709 chromaticities; values are scene-linear (the pipeline's
transfer undone) with premultiplied alpha, as EXR defines. No new
dependency. ZIP / PIZ / DWA compression stays open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 00:34:28 +02:00
vangel76andClaude Opus 5.5 73f9982c0c #498: French (fr) interface translation
Problem: French, one of Premiere's interface languages and one of the
12 key languages in docs/gaps.md G14, had no catalog; #498 asked for it.

Fix: a new fr.tsv catalog with every entry Spanish has (menus, panels,
dialogs, Settings pages, the Effects / Effect Controls registry, the
Keyboard Shortcuts dialog, status messages) plus the native macOS
Settings item, written from the plain meaning of the English text with
ordinary French editing vocabulary (infinitive commands, "vous", French
sentence case and spacing). Language::Fr is persisted as `fr`;
app.language.french joins Edit > Language (checkmark, native macOS menu),
Settings > General offers Français, and System Language picks French for
any fr-* locale. Like Japanese, tests require only the core menus, so
later strings show in English until translated; a French entry without
a Spanish one fails. A new test checks the bundled fonts cover every
French letter (the glyph check is shared with Ukrainian). Docs: G14,
localization-parity, ROADMAP language row, ui-egui README.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 00:22:08 +02:00
Brandon Thomas bf7ef0e894 Merge pull request #794 from impostazioni/fix/alt-drag-duplicate
Timeline: Option-drag copies clips instead of moving them
2026-10-10 18:15:25 -04:00
Brandon Thomas de6dcc8ebf Merge pull request #789 from vangel76/gap-optical-flow
#780: Optical Flow time interpolation synthesises motion-compensated frames
2026-10-10 18:09:14 -04:00
Brandon Thomas 257d7af4ab Merge pull request #791 from vangel76/gap-image-sequences
#779: export JPEG, Targa and DPX image sequences
2026-10-10 18:09:10 -04:00
vangel76andClaude Opus 5.5 c673ee85b9 #779: export JPEG, Targa and DPX image sequences
Problem: Premiere offers JPEG, Targa and DPX as image-sequence export
formats; FilmCraft only wrote PNG, TIFF and BMP sequences (docs/gaps.md G13).

Fix: three new export formats (ids jpg, tga, dpx), numbered like the other
sequences, with presets, the export UI (JPEG quality slider, Targa alpha)
and es/ja/zh-cn strings. JPEG uses the image crate at the export quality;
Targa (TGA 2.0, uncompressed 24/32-bit) and DPX (SMPTE ST 268, 10-bit RGB
method A, BT.709) are written by a small hostile-input-safe writer in
crates/export/src/raster.rs. Format::is_image_sequence replaces the
hand-kept format lists. OpenEXR stays open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 23:51:41 +02:00
vangel76andClaude Opus 5.5 e56ddd0e36 #780: Optical Flow time interpolation synthesises motion-compensated frames
Problem: a speed-changed clip set to Time Interpolation > Optical Flow
rendered exactly like Frame Blending, a cross-fade of the two neighbouring
source frames, so moving objects showed double images.

Fix: new filmcraft_render::flow. It computes dense coarse-to-fine
Lucas-Kanade flow both ways on a luma pyramid at most 640 px wide, drops
motion wherever standing still explains the window as well (flicker on
static content), forward-splats both flows to the in-between time
(Baker et al. 2011), and warps both frames there. Each fetch is weighted
by how well its own flow agrees, so uncovered background comes from the
frame that shows it. Pixels that look the same in both frames, or where
neither fetch agrees, fade to the plain cross-fade. media_image uses it
for OpticalFlow clips. docs/gaps.md G18 and target-app-parity updated
(also drops the #415 / #458 items, already fixed on main).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 23:50:15 +02:00
vangel76andClaude Opus 5.5 d676fdc720 #424: Render In to Out renders only the frames between In and Out
Problem: Render Effects In to Out and Render In to Out rendered every
render-bar segment that In/Out touched, in full. Segments run between
edit points, so In/Out inside one long clip rendered the whole clip
(often the whole timeline).

Fix: render only the marked frames of each segment as a partial preview,
`<hash>-<off>-<len>.mov`, frames counted from the segment start (so a
ripple keeps it, like whole `<hash>.mov` previews). The store indexes
parts per hash; the render bar is green over rendered frames only,
playback reads the part holding a frame, later renders fill only the
gaps, and Delete Render Files In to Out removes only files holding
marked frames.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 23:41:36 +02:00
Brandon ThomasandClaude Opus 5.5 fe47da6fdf Merge origin/main into #625 (keep both ja.tsv additions)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 17:09:36 -04:00
Brandon Thomas 77eeb5be29 Merge pull request #767 from vangel76/fix-313-timeline-double-click
#313: double-clicking a Timeline clip opens it in the Source monitor
2026-10-10 17:01:36 -04:00
Brandon Thomas 726ba5cf5c Merge pull request #763 from vangel76/fix-313-source-clip-history
#313: the Source monitor remembers its clips; Close and Close All
2026-10-10 17:01:25 -04:00
Brandon Thomas 47fc0677c7 Merge pull request #762 from vangel76/fix-626-unsupported-video-slate
#626: undecodable video shows the MEDIA UNREADABLE slate, not black
2026-10-10 17:01:19 -04:00
Brandon Thomas 35527a38ba Merge pull request #757 from vangel76/fix-228-export-frame-pending
#228: Export Frame reports a frame still loading instead of saving it blank
2026-10-10 17:00:50 -04:00
impostazioniandClaude Opus 5.5 a8b3d7f703 Timeline: Option-drag copies clips instead of moving them
Holding Option (Alt) while dragging timeline clips now leaves the
originals in place and drops copies where the pointer lets go, as in
Premiere. The copies are selected; copies of linked clips are linked to
each other, and transitions that would travel with a move are copied.

- edit: copy_items (overwrite / insert, new ids, links and transitions)
- engine: timeline.move takes `copy: true`, returns `copied`
- ui: the drag remembers Option, shows the copy under the pointer while
  the originals stay, copy cursor
- tests: engine copy/link/locked-track test, headless Option-drag UI test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:52:28 +01:00
Brandon ThomasandClaude Opus 5.5 5a94f761ff Merge origin/main into #610: Russian alongside Simplified Chinese and German; ROADMAP from main; rows for Next Appearance Mode and Project Notes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 16:42:04 -04:00
Brandon ThomasandClaude Opus 5.5 398befbeec Merge origin/main into #630: ROADMAP from main (restructured), contributors, German row for the new Project Notes menu
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 16:34:01 -04:00
Brandon ThomasandClaude Opus 5.5 e4f3cab5a0 Merge origin/main into #704 (gap and marker context menus side by side; contributors)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 16:27:48 -04:00
Brandon Thomas 73723151ce Merge pull request #682 from vangel76/fix-342-prores-4444-export
#342: ProRes 4444 and 4444 XQ export, with alpha
2026-10-10 16:14:22 -04:00
Brandon ThomasandClaude Opus 5.5 c16e712e5a Merge origin/main into #677 (keep both import tests)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 16:07:04 -04:00
vangel76andClaude Opus 5.5 ad80801596 #313: double-clicking a Timeline clip opens it in the Source monitor
Problem: the Timeline only reacted to double-clicks on transitions and
nested sequences, so double-clicking an ordinary clip did nothing instead
of Premiere's opening it in the Source monitor.

Fix: `source.open` takes an optional `clip` (a clip of the active
sequence): its media opens in the Source monitor, parked on the frame
under the playhead when the playhead is over the clip, otherwise on the
clip's first frame. The Timeline's Selection-tool double-click on a clip
body (not its edge, not a nested sequence or graphic) dispatches it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 22:01:54 +02:00
vangel76andClaude Opus 5.5 3190eab4ef #313: the Source monitor remembers its clips; Close and Close All
Problem: the Source monitor only knew the one clip it showed. Opening
another clip forgot the previous one, there was no list to switch back
from, and no way to close a Source clip (Premiere keeps a list of the
recently opened clips with Close / Close All).

Fix: EditorState keeps `source_history` (most recent first, at most 20),
updated after every command; items removed from the project drop out.
New commands `source.close` (the next most recent clip opens in its
place) and `source.closeAll`. The Source panel menu lists the recent
clips (the shown one ticked) to switch between, then Close / Close All.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:55:11 +02:00
Brandon Thomas e43392a86c Merge pull request #754 from vangel76/fix-483-drop-new-track
#483: media dropped past the last track goes on a new track
2026-10-10 15:53:19 -04:00
Brandon Thomas 6239d3d65e Merge pull request #751 from vangel76/fix-456-nest-bins
#456: a bin can be dragged into another bin and back out
2026-10-10 15:53:08 -04:00
Brandon Thomas 9fb10ded25 Merge pull request #750 from vangel76/fix-620-project-notes
#620: Project Notes panel, saved in the project
2026-10-10 15:53:02 -04:00
Brandon Thomas e59fb46f77 Merge pull request #740 from vangel76/fix-712-keyboard-slide-linked
#712: keyboard Slide keeps linked picture and sound aligned at a neighbour limit
2026-10-10 15:52:26 -04:00
Brandon Thomas 1039e4830c Merge pull request #671 from vangel76/fix-284-reset-keeps-keyframes
#284: reset buttons keep keyframes; a reset button on every property
2026-10-10 15:52:08 -04:00
Brandon Thomas 8747305aa0 Merge pull request #663 from vangel76/fix-653-clamp-trim-drag
#653: a dragged trim edge stops at the end of the media
2026-10-10 15:52:03 -04:00
Brandon Thomas cee18f1006 Merge pull request #651 from vangel76/fix-591-explicit-clip-errors
#591: named clips that cannot stand in for a selection say why
2026-10-10 15:51:49 -04:00
Brandon Thomas e66fa7faf4 Merge pull request #727 from Ni-zav/fix/prefs-timeline-focus-schema-713-s20261010T1747Z-c64d9
fix(settings): mark inactive Timeline focus preference as unwired
2026-10-10 15:51:37 -04:00
Oskar 24d555eb7c Merge upstream/main into fix/ripple-delete
Conflicts:
- contributors/people.toml: keep both new entries (maxm11, ossini)
- timeline.rs: take upstream's Alt-click through timeline.select (it
  clears the gap selection), and its empty-space arm (#683); only an
  empty stretch of a track selects a gap
2026-10-10 21:48:36 +02:00
vangel76andClaude Opus 5.5 ba5727029a #626: undecodable video shows the MEDIA UNREADABLE slate, not black
Problem: a file that opens but whose picture FilmCraft cannot decode
(H.264 High 10 / 4:2:2 / 4:4:4, interlaced, a codec without a decoder)
rendered black with no sign of why. The H.264 and HEVC decoders'
"unsupported" errors reached the media source as generic decode errors,
and the renderer drops frames that fail.

Fix: the H.264 / HEVC wrappers report unsupported features as
CodecError::Unsupported. The media pool wraps every file source it opens
so a frame failing as unsupported renders the existing MEDIA UNREADABLE
slate and the item is marked Unreadable with the decoder's reason (as
for files that fail to open). Decodable frames, damaged frames and the
sound are untouched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:46:06 +02:00
vangel76andClaude Opus 5.5 7f59211912 #228: Export Frame reports a frame still loading instead of saving it blank
Problem: file.exportFrame rendered and wrote the still without looking at
filmcraft_media::pending. On the web, a frame WebCodecs is still decoding
(or whose Blob bytes are still loading) is left out of the render, so the
command succeeded with a transparent/blank picture passed off as the
requested frame.

Fix: clear the pending flag before rendering and check it afterwards; when
a read was deferred, fail with "the frame is still loading; export it
again in a moment" and write nothing. A later call exports the real frame.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:31:27 +02:00
vangel76 95a9a7770a Merge upstream/main into fix-342-prores-4444-export
# Conflicts:
#	crates/engine/src/commands.rs
2026-10-10 21:27:52 +02:00
Brandon Thomas b43e3828a9 Revert "Merge pull request #685 from vbasky/fix/linked-clip-delete"
This reverts commit 6145dcc568, reversing
changes made to f34a00c020.
2026-10-10 15:24:43 -04:00
vangel76 c583157088 Merge upstream/main into fix-284-reset-keeps-keyframes
# Conflicts:
#	crates/engine/src/clip_ops_tests.rs
2026-10-10 21:24:34 +02:00
vangel76andClaude Opus 5.5 cca7d5ef0e #483: media dropped past the last track goes on a new track
Problem: dropping a project item in the empty space above the top video
track or below the last audio track did nothing: the Timeline only
accepted drops on an existing track row, and timeline.place could only
target existing tracks.

Fix: timeline.place accepts "new" as `track` / `audioTrack`. It adds a
track after the last one of its kind for each stream the item carries,
then places the clip there, as one undo step (the new tracks are removed
again if the placement fails). The Timeline shows the drop ghost in the
empty space and places on a new video track (above) or audio track
(below); the other stream goes on the track of the same number, or on a
new one when that track does not exist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:23:42 +02:00
vangel76 ae488523a9 Merge remote-tracking branch 'upstream/main' into fix-620-project-notes
# Conflicts:
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/zh-cn.tsv
2026-10-10 21:15:04 +02:00
vangel76andClaude Opus 5.5 6f650a363a #456: a bin can be dragged into another bin and back out
Problem: a bin stayed wherever it was created. `project.moveToBin` only
moved project items, and bin rows and cards in the Project panel could not
be dragged, so the only way to nest bins was to create them inside each
other.

Fix: `project.moveToBin` also takes bin ids in `items` (as `project.delete`
does) and moves the bin with everything in it, skipping the root and any
move that would put a bin inside itself. In the Project panel, bin rows
(List view) and bin cards (Icon view) can be dragged: dropping one on
another bin nests it there, and dropping it on empty space moves it into
the bin the view shows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:13:42 +02:00
vangel76 6067462b88 Merge upstream/main into fix-591-explicit-clip-errors 2026-10-10 21:13:24 +02:00
vangel76andClaude Opus 5.5 110c1783c3 #620: Project Notes panel, saved in the project
Problem: a project had nowhere to keep free text (to-dos, instructions
for whoever opens it next, frame numbers).

Fix: plain-text `Project::notes` (schema v15, no-op migration so older
builds refuse instead of dropping it), `project.notes` /
`project.setNotes {text, merge?}` engine commands (undoable, capped at
1 MiB; calls with one `merge` key share an undo step), and a
Window > Project Notes panel whose editor (`notes.text`) commits every
change, one typing session per undo step. Translations for es, ja,
zh-cn (and the panel title for pt-br, uk).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:09:13 +02:00
Brandon ThomasandClaude Opus 5.5 2140d9c9ab Restore green after the community batch: rustfmt, clippy as_chunks_mut in webm_alpha, zh-cn caption-track and es shutter-angle rows
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:07:59 -04:00
vangel76 2a1c92e15a Merge remote-tracking branch 'upstream/main' into fix-653-clamp-trim-drag
# Conflicts:
#	crates/ui-egui/tests/timeline_trim_ui.rs
2026-10-10 21:02:44 +02:00
Brandon Thomas 794a25fc9e Merge pull request #658 from vbasky/fix/current-bugs
Fix silent WAV sample-rate substitution
2026-10-10 14:57:13 -04:00