What's Changed
- Updates: shared check-result dialog from craft-update by @aiongg in #3756
- docs: tidy agent, contributor and asset docs by @aiongg in #3755
- Integration: backlog round r1 (244 PRs) by @aiongg in #3746
- Keep a clip's transitions when copying and pasting it by @Silvertree2010 in #3473
- fix(export): a failed encoder factory does not stop the next one (#936) by @ComfyChloe in #3475
- fix(#issue3): loop button highlights when looping is active by @dknalp in #3486
- docs(#2645): document numpad key limitation and workarounds in keyboard.md by @dknalp in #3516
- Tests: split the NVENC error test so clippy's complexity limit passes on Windows by @dotCooCoo in #3566
- Platform: the macOS and Windows encode tests build again by @marshiyar in #3580
- Trim: a graphic, still or adjustment layer extends from its left edge by @marshiyar in #3582
- Timeline: the box selection stays on the clips while the view scrolls by @marshiyar in #3583
- Timeline: double-clicking a marker opens an Edit Marker dialog by @marshiyar in #3585
- media-browser: list AAF and OMF documents, which File ▸ Import already reads by @noesis-bot in #3615
- Preserve multiline WebVTT cue identifiers by @TheGalitube in #3664
- Reject out-of-range EBU STL timecodes by @TheGalitube in #3665
- ogg: charge bad-CRC page reads to the recovery budget by @marshiyar in #3681
- platform: macOS test fixes (boxed MediaClip, HEVC probe test in its own binary) by @kler in #3683
- Render Effects In to Out renders only red segments, like Premiere (#1220) by @kler in #3684
- ProRes encoder: rate control starts from the previous frame's quantiser, 2x faster 4K encode (#1220) by @kler in #3685
- Graphics: document what Responsive Design – Time remaps by @marshiyar in #3690
- Panels: a floating panel's menu opens in its own window by @marshiyar in #3693
- Color: add a Three-Way Color Corrector by @marshiyar in #3695
- Effects panel: Set as Default Transition by @marshiyar in #3696
- Graphics: gradient stops can carry opacity by @marshiyar in #3701
- UI: Thai fallback font for file and clip names by @marshiyar in #3702
- Select the whole value when a single-line text field gains focus (#3655) by @MarekSpodBiedry in #3707
- docs: transcripts: word bounds are only moved across pauses by @tdog37 in #3718
- Export: background jobs read their own copy of each file, so playback keeps its decoder by @kler in #3723
- Media: the per-frame growing-files check no longer lists every media file by @kler in #3729
- ime: read the viewport id outside the context lock by @marshiyar in #3731
- tests: a_single_frame_source_range waits for the wall clock instead of racing it by @marshiyar in #3733
- fix(av1): turn a frame worker panic into a decoding error instead of a hang by @vangel76 in #3109
- perf(av1): drop redundant whole-frame copies in Plane::clone and the output path by @vangel76 in #3117
- refactor(av1): narrow the public header API to what crates/codecs uses by @vangel76 in #3122
- audio-dsp: step the resampler's source position instead of dividing per sample by @vangel76 in #3138
- audio-dsp: wrap LFO phases and delay-line indices without modulo by @vangel76 in #3139
- audio-dsp: vectorisable true-peak interpolator by @vangel76 in #3140
- audio-dsp: defer convolution reverb impulse rebuild to process by @vangel76 in #3141
- audio-dsp: faster FFT kernel (contiguous twiddles, cheaper first stage) by @vangel76 in #3142
- audio-dsp: cheaper gain math in the dynamics effects by @vangel76 in #3143
- audio-dsp: recover filter state after a NaN or infinite input sample by @vangel76 in #3144
- audio-dsp: one sin_cos per peak region in the pitch shifter by @vangel76 in #3146
- h264: implicit 32/32 bi-prediction weights as the rounded average by @vangel76 in #3167
- h264: cheaper deblocking boundary-strength derivation by @vangel76 in #3168
- hevc: table-driven intra availability by @vangel76 in #3182
- h264: const-generic MC kernels, i16 first pass, inline window row copy by @vangel76 in #3183
- hevc: SAO border lines through the vectorised edge run by @vangel76 in #3185
- hevc: motion compensation without 71-entry slice arrays per call by @vangel76 in #3186
- hevc: even/odd butterfly for the 8..32-point inverse DCT by @vangel76 in #3187
- hevc: intra planar/angular with const size and hoisted branches by @vangel76 in #3189
- h264enc: SATD on the half-pel plane, const sad8, fixed-size MC by @vangel76 in #3204
- h264enc: byte-wise CABAC renormalisation by @vangel76 in #3206
- h264enc: branch-free u32 quantisation by @vangel76 in #3208
- matroska: preserve PTS semantics in the lacing oracle by @KeroZelvin in #3225
- Preserve Unicode names in graphics template export identities by @jnohclee-rgb in #3245
- Preserve Reverse Speed when reopening the clip dialog by @jnohclee-rgb in #3247
- Settings: Selection Follows Playhead persists across restarts by @amoisttowe1 in #3251
- platform: VideoToolbox export takes the RGBA pictures and converts them itself (#3030) by @ZJHeepfixer in #3255
- aac: memoise the encoder's per-band work across rate-loop iterations (2.4x faster, output identical) by @vangel76 in #3264
- aac: faster decoder (Huffman lookup table, FFT twiddles and stage fusion, scratch buffers; PCM identical) by @vangel76 in #3271
- Opus decoder: radix-2/3/4 FFT kernels in the CELT IMDCT by @vangel76 in #3272
- Opus decoder: build the PVQ V(n,k) table once by @vangel76 in #3273
- mxf writer: write pictures directly, sound read cursor instead of front drain by @vangel76 in #3274
- Opus decoder: de-emphasis for both channels in one loop by @vangel76 in #3275
- mxf: faster decode_pcm, AES3 read_pcm no longer decodes the whole element per call by @vangel76 in #3276
- Opus decoder: faster SILK output resampler by @vangel76 in #3277
- mxf: adaptive read window while walking KLVs at open (reads 8x less for intra files) by @vangel76 in #3279
- Opus decoder: cap concealment and FEC length at 120 ms by @vangel76 in #3280
- vp9: inter prediction across a band boundary without the window copy by @vangel76 in #3295
- vp9: token loop monomorphised on counting, cheaper sign read by @vangel76 in #3296
- #2633: a press on the ruler closes no audio stream, and the default r… by @XIILO in #3308
- Select All in a text field selects its text, not the timeline clips by @punkhop in #3328
- test: wait for the condition in two timing-sensitive tests by @sarayunova in #3352
- codecs: the rayon deadlock test fails 120 s after the last answered request by @dotCooCoo in #3376
- #3357: caption track font style by @evillollive in #3389
- timeline: Track Select Forward/Backward selects and moves the captions with the clips (#3388) by @x-labb in #3407
- Use default interpolation for keyframes added before the first by @Silvertree2010 in #3434
- lumetri: a plain click places a point on the curve (#3431) by @rahul05ranjan in #3435
- i18n(fr): translate the 8 interface strings still in English by @SevenxDev in #3446
- captions: reject unparseable MCC timecode fields by @SevenxDev in #3461
- interchange: reject overflowing EDL fields without leaking event metadata by @SevenxDev in #3462
- Properties: the arrow keys move the caret in a number field (#3372) by @Kathir-D in #3481
- fix(sequence): clamp a new transition's duration to what its cut supports by @rahul05ranjan in #3483
- Select names when renaming project items and bins by @TheGalitube in #3667
- h264enc: pay back single-pass VBR/CBR overshoot within a short clip by @marshiyar in #3691
- fix(engine): timeline.slip by i64::MIN clamps instead of overflowing by @inspiretelapps in #2365
- Read currency amounts with a scale word as scale then unit by @Silvertree2010 in #2381
- #1422: Matroska audio without a decoder is labelled unsupported by @Felix-Helleckes in #2391
- #1123: Effect Controls' LUT rows pick a LUT by @Felix-Helleckes in #2393
- #579: a middle-button drag pans the Freeform canvas by @Felix-Helleckes in #2396
- #2195: relative media URLs in imported timelines are percent-decoded by @Felix-Helleckes in #2403
- #1758: every Audio Track Mixer insert can be edited by @Felix-Helleckes in #2404
- #1658: Lumetri curves grow with the panel and every inner point can be removed by @Felix-Helleckes in #2408
- #1265: the demo project's sound has no hiss by @Felix-Helleckes in #2409
- fix(tts-text): a currency amount past the digit cap is read digit by digit by @GabrielMatozo in #2410
- #1822: a Vertical workspace for 9:16 editing by @Felix-Helleckes in #2412
- #2402: Transcribe is shown disabled when the build has no speech-to-text by @Felix-Helleckes in #2413
- fix(export): a bitrateKbps in settings is the bitrate over an adaptive preset by @derektrimm in #2432
- #2211: Quit ▸ Save on a new project saves and quits when the dialog answers later by @Felix-Helleckes in #2437
- #1142: no 60 Hz polling for queued frames, no media file list every frame by @Felix-Helleckes in #2438
- #2211: Export Frame shows why an export failed, and saves new projects' stills home by @Felix-Helleckes in #2446
- #2416: Edit Marker dialog (name, comment, duration, colour, type) by @Felix-Helleckes in #2470
- GPU: bound export read-back waits by @jahvari in #2490
- Tests: render video in export fixtures and cover nested transforms by @jackcanon in #2505
- Fix tooltips showing stale default shortcuts after keybinding changes by @usermrpj in #2513
- fix(timeline): a press hits only the track rows of its own pane when tracks are scrolled by @4waymedia in #2533
- ui: zoom scroll bar handles show the horizontal resize cursor by @danielbanariba in #2546
- #2295: the status bar's text can be selected and copied by @ksaxena149 in #2559
- FilmcraftApp::toast is gone; engine toasts reach the status bar (#2443) by @rahul05ranjan in #2568
- test: handle concurrent fixture publication on Windows by @jahvari in #2587
- Export: the Frame Rate list offers 119.88 and 120 by @keigoly in #2611
- Clip Mismatch Warning: a first clip that doesn't match an empty sequence asks by @keigoly in #2612
- #2623: Sequence and Markers menu toggles show their checkmark by @storybored379 in #2640
- Settings and Edit ▸ Language: list the languages alphabetically by their own name by @nikolainyegaard in #2658
- #2419: Bokeh Blur runs on the GPU by @ded-achtung in #2660
- #1673: the Program monitor keeps playing while a value is dragged by @ded-achtung in #2666
- Project panel, Media Browser: a dragged column width or thumbnail size is written to preferences.json by @marcoarnulfo in #2673
- Lumetri: Luma vs Sat and Sat vs Sat stop wrapping; hue curves meet exactly at red by @alexanderalber in #2699
- #2489: an imported shortcut set is always listed; .kys files explain why they can't be read by @Felix-Helleckes in #2705
- #2682: Lumetri curves get automation elements; regression test for curve undo/redo by @Felix-Helleckes in #2710
- Link Media: Offline All is saved, so reopening the project doesn't ask again by @texjer in #2738
- #2749: Export starts on Source In/Out when the sequence has In/Out marks by @Felix-Helleckes in #2768
- Span workspace dropdown highlights full width by @justacalico in #2829
- codecs: prevent 32-bit length overflows (#2801) by @thecyberbutler in #2842
- fix(interchange): bound subclip parent resolution to prevent cycle stack overflow by @justdxvid in #2847
- edit: ripple sync-locked captions with deleted items (#2873) by @jnohclee-rgb in #2921
- fix(captions): VTT parse decodes the writer's cue-text arrow escape (#2066) by @rollroyces in #2974
- Recovery: retain durable journals and contain autosave worker failures by @jahvari in #2984
- Fix FCPXML slideshow imports and missing-media relinking (#2837) by @thecyberbutler in #3052
- gpu: export on the high-performance GPU, and read staging memory in bulk by @Exalted5373 in #3053
- frame: convert full-size 8-bit Y'CbCr row by row, 28 % faster and bit-identical by @Exalted5373 in #3066
- docs(platform): update FFI architecture decision to match implementation (#2814) by @Zaxaerith in #3093
- Font pickers scan the system fonts before taking the family list by @marcoarnulfo in #3119
- perf(av1): inverse DCT with compile-time size and a DC-only path by @vangel76 in #3120
- perf(av1): cheaper dequantisation per transform block by @vangel76 in #3121
- audio-dsp: filter channel pairs together in the settled EQ cascade by @vangel76 in #3136
- audio-dsp: remix analysis with sparse mel weights and precomputed norms by @vangel76 in #3137
- perf(h264): DC-only inverse transform for blocks without AC coefficients by @vangel76 in #3179
- h264: Decoder::reset keeps the thread pool and cancels in-flight pictures by @vangel76 in #3181
- fix(codecs): read the frame rate phone clips average to (#1700) by @earlvanze in #1829
- #1831: proxy and transcode jobs run one at a time, in the order they were asked for by @Guilhermeb-Ferrarezi in #1864
- perf: Warp Stabilizer works out the corrections of a clip once per set of settings by @Guilhermeb-Ferrarezi in #1866
- effects.apply adds the effect at the end of the clip's stack, so existing effect indices stay valid by @marcoarnulfo in #1883
- voice-over: the Mixer's input meter follows the microphone while recording by @jack-pardal in #1891
- #1877: graphics.set can put keyframes on the properties it sets by @Guilhermeb-Ferrarezi in #1899
- #1885: Proxy ▸ Create Proxies… from the item menu takes the whole selection by @Guilhermeb-Ferrarezi in #1902
- Effect Controls: the keyframe menu's interpolation applies to every selected keyframe by @marcoarnulfo in #1924
- i18n: Swedish (sv) interface translation by @kler in #1930
- render: Transform with its own shutter angle stays on the CPU (the GPU path dropped its motion blur) by @schnierk in #1957
- #1910: Interpret Footage from the item menu takes the whole selection by @vangel76 in #1960
- enhancement: Program monitor shows the motion path of a clip's animated Position by @aw4e in #1970
- i18n: clarify 11 Korean editing terms by @kangyou04 in #1992
- fix: satisfy clippy::nonminimal_bool on Rust 1.96 by @ssandweiss in #2007
- fix(macos): Edit menu copy and paste go to the graphic text being edited (#1953) by @ssandweiss in #2010
- Properties: with text selected, the character controls show the selection's style (#1996) by @wstock in #2015
- Project panel: cut long bin/clip names with "…" and show them on hover by @LloydNicholson in #2034
- Project panel: make the Up one level button legible by @LloydNicholson in #2035
- Import: EDL / FCP7 XML / FCPXML / OTIO / AAF / OMF land in the Project panel's current bin (#2036) by @switch87 in #2038
- codecs: an ipcm/fpcm entry declaring zero bits decodes to silence by @midasmatterhorn in #2047
- project: a moved auto point counts as modified by @midasmatterhorn in #2050
- fix(ui): Clip > Rename… opens a rename dialog by @ssandweiss in #2088
- fix(ui): Close All Projects asks to save unsaved changes by @ssandweiss in #2089
- #776: Corner Pin gets corner handles on the Program monitor by @ruck-syu in #2100
- fix(engine): enable Reveal Nested and Join Through Edits only when they can act (#2103) by @ssandweiss in #2104
- fix(ui): disable the Project panel's Clear and Automate buttons with nothing selected (#2106) by @ssandweiss in #2108
- feat(media): import PSD files as their flattened composite (Merge All Layers) by @marcoarnulfo in #2116
- Ignore unusable M2 speeds in EDL import by @Silvertree2010 in #2127
- #1903: timeline.move refuses a clip listed twice (it left one clip id on two tracks) by @00xJS in #2132
- #2024: dialog commands the engine defaults can be bound to a key by @txiki739 in #2136
- fix(gpu): FXC compiles the effect stage, so DX12 keeps GPU effects (#1616, #1425, #1458) by @derektrimm in #2138
- fix(gpu): Intel Gen 9 to Gen 11 integrated graphics draw through DirectX 12 (#512, #1425) by @derektrimm in #2139
- fix(timeline): preview every track a Project drop fills (#1887) by @ssandweiss in #2151
- #2094: the Lumetri shadow lift no longer amplifies near-black chroma into blue specks by @00xJS in #2153
- fix(timeline): snap moved and trimmed captions like clips by @marcoarnulfo in #2197
- fix: make clip duration editable in Speed/Duration dialog by @aqibmohd271 in #2202
- fix(timeline): Track Select tools skip locked tracks (#2223) by @MarekSpodBiedry in #2232
- Clarify the first-launch demo project name by @TheGalitube in #2240
- Read every digit of numbers longer than 20 digits individually by @Silvertree2010 in #2247
- Ignore out-of-range AUD channels in EDL import by @Silvertree2010 in #2248
- fix(interchange): FCPXML zero frameDuration no longer divides by zero on export by @Wbunker in #2252
- fix(interchange): absurd frame rates and start timecodes are bounded on import by @Wbunker in #2282
- fix(interchange): a huge duration times a speed saturates instead of overflowing by @Wbunker in #2284
- i18n: Russian covers the whole interface by @ivandrozdov1505-coder in #2288
- AVI: recover the video when its idx1 entries are damaged by @tylerjenningsw in #2302
- Stop voice-over when input device fails (#2215) by @TheGalitube in #2314
- fix(ui): open Speed/Duration from the Properties speed footer by @gyroninja in #2315
- i18n: Turkish (tr) interface catalog (#1377) by @MOzcelik14 in #2344
- fix(hevc tests): skip Main10 fixtures an 8-bit-only libx265 cannot encode by @adventurelands in #2372
- #2375: the NVENC SDR sample entry test expects the BT.709 colr since #2142 by @Felix-Helleckes in #2386
- #1878: list fonts activated through Adobe Fonts by @Felix-Helleckes in #2389
- fix: シーケンス配置時の自動文字起こしを実行 #903 by @haranishi in #1118
- fix(media-browser): don't freeze the UI while probing files by @ossini in #1406
- #1411: docs/gaps.md: remove entries for features that already shipped by @vangel76 in #1412
- #1418: parity docs: correct entries outdated by merged work by @vangel76 in #1419
- #1421: roadmap.md and gaps.md G14: mark shipped codecs and languages as done by @vangel76 in #1423
- #1436: mpegts: H.264/HEVC units are access units; H.264 recovery points are key by @vangel76 in #1440
- fix(control): sequence.settings without params reports the settings instead of opening a dialog by @marcoarnulfo in #1555
- timeline, panels: only the primary button starts a gesture; a right-button drag no longer draws a box by @ReReddo in #1597
- timeline: zooming out stops where the whole Timeline is in view by @ReReddo in #1598
- tools: the Tools panel lays its buttons out along its longer side and wraps by @ReReddo in #1600
- widgets: the text of a search field is centred vertically in it by @ReReddo in #1610
- timeline: snap transition drops to Start/Center/End at Cut by @gyroninja in #1613
- #1583: still images honour EXIF Orientation by @AndreaGhidara in #1617
- timeline: preview carried transitions on the track they land on by @gyroninja in #1619
- timeline: drop transitions when an edit moves their clips apart by @gyroninja in #1623
- timeline: right-clicking the ruler opens the ruler's menu, not a stale clip menu by @ReReddo in #1628
- timeline: a track header's context menu adds and deletes tracks by @ReReddo in #1630
- timeline: a transition on a compact track fills the track's height by @ReReddo in #1636
- timeline: Show Video Names and Show Audio Names hide the clip names of video or audio tracks by @ReReddo in #1637
- timeline: the waveform fills the clip on a compact audio track by @ReReddo in #1638
- ui: highlight selected items in the project bin (#1445) by @bfenty in #1647
- scrub bars: dragging the playhead keeps the audio stream open instead of stopping it every move by @ReReddo in #1649
- menus: the Timeline and monitor settings menus stay open while options are toggled by @ReReddo in #1650
- ui: keep the waveform anchored while a remix drag previews (#1424) by @bfenty in #1654
- #1644: save dialogs add the file's extension and ask before replacing what that names by @txiki739 in #1679
- fix(linux): add an "All files" filter to the Open Project dialog (#1644) by @saadkhantareen in #1693
- mpegts/avi: drop redundant PES header check and doubled frame_info call by @vangel76 in #1707
- cfb: reject NUL in entry names, checked sector arithmetic, allocation-free name compare by @vangel76 in #1718
- Effect Controls: the keyframe right-click menu follows Premiere's rows and order by @marcoarnulfo in #1760
- Project panel: Select All / Deselect All from the macOS menu act on the focused panel with a sequence open by @marcoarnulfo in #1765
- Help menu: hints open at the cursor and show just the address by @liangforstudy in #1772
- shortcuts: key names break between words and use the dialog's width by @clickonlab in #1787
- #1780: the trim cursor stays while an edge is dragged by @marcoarnulfo in #1788
- Media Browser: list view columns resize by dragging their header's right edge by @marcoarnulfo in #1802
- Program monitor: Go to Previous / Next Edit Point in the Button Editor, beside the frame steps by @marcoarnulfo in #1806
- Project panel: Sequence Settings… in a sequence's right-click menu by @marcoarnulfo in #1828
- fix(codecs): read AC-3/E-AC-3 MP4 layout from dac3/dec3 (#1701) by @earlvanze in #1835
- #1675: keyframes on a Frame Hold clip go where the playhead is (they all landed on the held frame) by @marcoarnulfo in #1860
- #1381: the Warp Stabilizer analyses a clip a block of frames at a time by @Guilhermeb-Ferrarezi in #1865
- packaging(flatpak): add OCI image build and GHCR publishing helper by @dylanmtaylor in #3814
- ci(xtask): print the i18n report without recompiling the workspace by @FredApps in #3821
- Add shared custom colors and complete marker editing by @whatever-industries in #1435
New Contributors
- @ComfyChloe made their first contribution in #3475
- @dknalp made their first contribution in #3486
- @noesis-bot made their first contribution in #3615
- @kler made their first contribution in #3683
- @KeroZelvin made their first contribution in #3225
- @amoisttowe1 made their first contribution in #3251
- @ZJHeepfixer made their first contribution in #3255
- @XIILO made their first contribution in #3308
- @sarayunova made their first contribution in #3352
- @evillollive made their first contribution in #3389
- @rahul05ranjan made their first contribution in #3435
- @SevenxDev made their first contribution in #3446
- @Kathir-D made their first contribution in #3481
- @inspiretelapps made their first contribution in #2365
- @GabrielMatozo made their first contribution in #2410
- @derektrimm made their first contribution in #2432
- @usermrpj made their first contribution in #2513
- @4waymedia made their first contribution in #2533
- @danielbanariba made their first contribution in #2546
- @ksaxena149 made their first contribution in #2559
- @keigoly made their first contribution in #2611
- @nikolainyegaard made their first contribution in #2658
- @ded-achtung made their first contribution in #2660
- @justdxvid made their first contribution in #2847
- @rollroyces made their first contribution in #2974
- @Exalted5373 made their first contribution in #3053
- @Zaxaerith made their first contribution in #3093
- @jack-pardal made their first contribution in #1891
- @schnierk made their first contribution in #1957
- @kangyou04 made their first contribution in #1992
- @midasmatterhorn made their first contribution in #2047
- @ruck-syu made their first contribution in #2100
- @aqibmohd271 made their first contribution in #2202
- @tylerjenningsw made their first contribution in #2302
- @MOzcelik14 made their first contribution in #2344
- @adventurelands made their first contribution in #2372
- @AndreaGhidara made their first contribution in #1617
- @saadkhantareen made their first contribution in #1693
- @clickonlab made their first contribution in #1787
Full Changelog: v0.15.0...v0.16.0