Commit Graph

76 Commits

Author SHA1 Message Date
JordyUSA 8ea94a8541 Merge main into feat/flac-export
No conflicts. main's new Chinese catalog requires every tl! string:
added zh-CN for the FLAC labels (format, preset, Audio Format entry,
Compression Level and its hint).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:53:52 +07:00
JordyUSA 360183e273 Merge main into feat/export-crf
Conflict in crates/engine/src/export_tools.rs: both sides added an
import (BitrateMode for CRF, GpuRendering from main); both kept.
main's new Chinese catalog requires every tl! string: added zh-CN for
"Quality (CRF)" and "CRF (constant quality)".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:45:31 +07:00
MrCloudy2 7d6c53d03d Merge origin/main into #260; Chinese and Japanese for "A file dialog is already open"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:23:08 +02:00
Mario Podolan 7123e1fc46 ui: detect software rasterizers and say GPU acceleration is unavailable
When wgpu falls back to a software rasterizer (llvmpipe / SwiftShader /
softpipe - containers and VMs without GPU device access, missing drivers),
set_wgpu accepted it as the GPU compositor (llvmpipe satisfies the Rgba16Float
checks), so the preview quietly composited through WGSL on a CPU rasterizer:
GPU usage 0 %, CPU saturated, laggy playback, no visible explanation.

software_rasterizer() now detects CPU rasterizers (device_type == Cpu, or
llvmpipe / SwiftShader / softpipe in the name) and gpu_compositor_unsupported
rejects them first, so the monitors use the native CPU compositor, which
renders the same frames faster than wgpu-on-llvmpipe. The status bar shows the
reason ("GPU acceleration is unavailable; preview renders on the CPU
(software rasterizer (...))") in addition to the log line. New tl! string with
Spanish, Japanese and Simplified Chinese translations.

Test: gpu_fallback_tests::software_rasterizers_are_detected.

Co-Authored-By: Xiaomi MiMo <noreply@xiaomi.com>
2026-10-10 14:43:28 +02:00
Brandon Thomas 58f768c472 Merge origin/main into gpu-rendering
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:27:57 -04:00
Brandon Thomas c030f78762 Merge origin/main into tts-narration
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:13:05 -04:00
Katt de6ab8d239 Media: translate Refresh Changed Media (es, ja, zh-CN)
Portuguese and Ukrainian catalogs only hold menu labels, so they keep the
English name like the other menu-less commands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 17:41:45 +05:30
Brandon Thomas 5a5684484f
Merge pull request #517 from mitchmckinstry/feat/drop-import-to-timeline
[feat] files dropped onto the Timeline are placed there, not just imported. Supports preview too
2026-10-10 07:28:19 -04:00
JordyUSA 055e95ab17 Export: FLAC (clean-room encoder; .flac files and FLAC audio in MP4/MOV)
New L0 crate filmcraft-flac, a FLAC encoder written from RFC 9639:
constant / verbatim / fixed / LPC subframes (Levinson-Durbin on Tukey-
windowed autocorrelation, up to order 12), partitioned Rice residuals,
left/side, side/right and mid/side stereo, CRC-8/CRC-16, STREAMINFO with
MD5 (RFC 1321, own implementation), levels 0-8, all lossless.

Export:
- Format::Flac, an audio-only .flac (16/24-bit), streamed one second at
  a time like WAV/AIFF; STREAMINFO is rewritten at the end with frame
  sizes, total samples and MD5. Preset "FLAC 48 kHz 24-bit".
- AudioCodec::Flac in MP4 and QuickTime (fLaC + dfLa), one frame per
  sample with the short last frame timed exactly; the dfLa STREAMINFO
  is replaced before the moov is written (Mp4Writer::set_sample_entry).
  MXF stays PCM.
- AudioSettings::flac_level (default 5); Export panel: FLAC (lossless)
  audio format and Compression Level; file.exportMedia `format: "flac"`,
  `audioCodec`, `flacLevel`. Spanish and Japanese strings.

ffmpeg oracle: every stream decodes bit-exactly with the STREAMINFO MD5
equal to ffmpeg's hash; .flac and FLAC-in-MP4/MOV exports decode to the
same samples as a WAV export of the range.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 18:26:28 +07:00
Brandon Thomas c9e803ff3b Merge origin/main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:24:39 -04:00
Brandon Thomas ac103be552 Merge origin/main into fix-503; Chinese and Japanese rows for the transition strings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:21:51 -04:00
Brandon Thomas 762344769b Merge origin/main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:21:39 -04:00
Brandon Thomas 4304cd9382 Merge origin/main into #421; GPU export opt-in, wgpu error handler, drop panicked renderers
- GpuRendering defaults to Off (opt-in per export) until measured on Windows and macOS;
  docs and ROADMAP say so.
- The shared export device installs an uncaptured-error handler and a device-lost callback
  that log once and retire GPU export for the session (frames go to the CPU) instead of
  wgpu's default panic.
- RendererPool drops a renderer that panicked and retires the pool, so the rest of the
  export renders on the CPU (regression test in gpu_hook_scenarios); the duplicate
  hostile-size test that raced on the global registry is folded into it.
- Rebased onto main's render_plan/transitions: render_export_prepared reads the linear
  accumulator after render_plan; transition (Composite) plans fall back to the CPU.
- es/ja rows for the new Export strings; web_time::Instant in the export pipeline.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:21:38 -04:00
Brandon Thomas ab227a1853 Timeline file drops: Chinese and Japanese strings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:19:37 -04:00
Brandon Thomas 1ace90d191 Merge remote-tracking branch 'origin/main' into fix-505 2026-10-10 07:05:06 -04:00
Brandon Thomas 1ffe0cf4e7 #505: merge origin/main; ja/uk rows, colorTheme kept in line, docs
- ja.tsv rows for the new appearance strings (no duplicate Dark/Light);
  uk.tsv gets Next Appearance Mode, which the pt-br menu catalog now has.
- appearance.colorTheme is legacy input but no longer goes stale: it follows the
  mode and theme choices (the theme a fixed mode shows, the dark theme in Auto).
- docs/project-files.md documents appearanceMode / darkTheme / lightTheme.
- #489's menu/settings label test compares with the theme cards' choices.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:01:41 -04:00
Brandon Thomas 664c13efeb Merge origin/main into #278; schema v14, neural-voices off by default, review fixes
- Narrations take schema v14 (main's v13 is audio streams): v13_to_v14, docs updated.
- neural-voices is off by default in the desktop app, like whisper; the model download stays
  an explicit, confirmed job.
- Removed the debug probe2 test module from tts-text.
- project_subset prunes narrations of items it drops.
- unique_wav_path is bounded (99 999 names) and returns an error instead of looping.
- narration.rs uses web_time::Instant (wasm clock test); tts.* commands get the
  "Text to Speech" shortcut category, with es/ja rows for it and Edit Narration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:55:59 -04:00
Brandon Thomas 5c4a07b148 Merge remote-tracking branch 'origin/main' into fix-505 2026-10-10 06:48:09 -04:00
Brandon Thomas 8e9b805952 #550: merge origin/main; Simplified Chinese as zh-cn with #389's plumbing
- One code everywhere: Language::ZhCn, persisted as `zh-cn`, catalog zh-cn.tsv.
- general.interfaceLanguage accepts and lists zh-cn (Settings > General).
- macOS native menu follows app.language.chinese.
- System Language picks Simplified Chinese only for zh, zh-CN, zh-SG and zh-Hans
  (not zh-TW / zh-HK / zh-MO / zh-Hant).
- Drop the second CJK font loader: cjk.rs already installs the Chinese fallback,
  so switching needs only cjk::available(); without a face the switch is refused
  and a saved zh-cn preference falls back to English at startup, like Japanese.
- Remove the fork's build-zh.yml workflow.
- Tests: Chinese covers every menu label and tl! literal; switching persists or is
  refused without a font; locale mapping. New strings get es/ja/zh rows.

Plumbing from #389 by @demon820308.

Co-authored-by: demon820308 <zwbigi@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:45:45 -04:00
JordyUSA 3a46156861 Export: CRF (constant quality) bitrate encoding for H.264
Adds BitrateMode::Crf with ExportSettings::crf (0-51, default 23) and
maps it to the built-in encoder's RateControl::Crf, which export never
used. The Export panel offers "CRF (constant quality)" with a Quality
(CRF) slider in place of the bitrate fields; file.exportMedia takes
`crf` and `bitrateMode: "crf"`. H.265 (hardware only) rejects it, and
VideoToolbox / NVENC decline it so the built-in encoder runs. Settings
saved before this read as CRF 23.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 17:09:05 +07:00
Brandon Thomas 55d10195fb main: green again after the batch merges
- marker_export test: build the Session with struct-update syntax (clippy field_reassign_with_default, #454)
- es/ja catalogs: Export Markers as CSV… (#454) and the gradient fill labels (#514); drop the duplicate
  "Gradient" row #514 added to es.tsv

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 05:39:39 -04:00
Luniiya 9e3c9c9b65 Merge remote-tracking branch 'upstream/main' into feat/system-appearance
# Conflicts:
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/icons.rs
2026-10-10 11:32:04 +02:00
Luniiya 77fa159f49 ui: standardise system appearance modes and theme previews 2026-10-10 02:14:55 +02:00
Ikki Nishihara cf614c1fa3 i18n: Japanese for the whole interface
ja.tsv now has the same 3,466 entries as es.tsv (menus, panels, dialogs,
the Settings pages, the Effects registry, Keyboard Shortcuts, tooltips and
status messages) instead of 89 menu-only entries.

The 46 old rows that came from PhotoCraft/PDFCraft and match no FilmCraft
string are dropped. Five rows that were wrong for a video editor are
fixed: Horizontal/Vertical are 水平/垂直 (every use is geometry, not
writing direction), Orientation is 向き, Type is 種類 and Effect is
エフェクト. The other 38 rows that were already in use are unchanged.

ROADMAP.md and crates/ui-egui/README.md now list Japanese next to Spanish
as covering the whole interface.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-10 02:14:19 +09:00
txiki739 4af4765278 Merge storytold/main into i18n-spanish-panels
Brazilian Portuguese (#176) moves to the catalog system as i18n/pt-br.tsv (the
menu entries unchanged) and joins the general.interfaceLanguage preference. The
new UI text from main is wrapped and translated into Spanish: the credits
window, Text Properties, H.265 export rows, Clip Speed / Duration, Color Matte
dialogs, the voice-over discard button, the time-left suffix and the audio
output status messages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 08:59:32 +02:00
txiki739 b6cdc9dd7a i18n: Spanish for the whole interface, catalogs and a remembered language
Translations move from Rust tables to one catalog per language
(crates/ui-egui/src/i18n/<code>.tsv), looked up through HashMaps. UI code
wraps its strings in tl!("…") and tlf!("…{name}", name); names from
registries (effects and parameters, settings, commands, panels, workspaces,
export and effect presets) are translated where they are drawn, so command
ids, automation ids and preference values stay English.

Spanish now covers menus, panels, dialogs, the Settings pages, the Effects and
Effect Controls registry, the Keyboard Shortcuts dialog and status messages
(about 3,350 entries). Tests fail when a tl!/tlf! literal, a menu label or a
registry name has no Spanish entry, and check catalog syntax, duplicates,
placeholders and ellipses. Searches match the Spanish label as well as the
English source. Window titles keep their English egui ids.

The language is stored in the general.interfaceLanguage preference (also in
Settings > General) and restored on startup; a failed preferences write still
switches the interface and says it could not be saved. Template values are
inserted literally, so a file name containing braces is not re-substituted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 01:41:48 +02:00