Commit Graph
235 Commits
Author SHA1 Message Date
Brandon ThomasandClaude Opus 5.5 3b6ef97010 Release fixes: CLI --version, ALSA on Linux, web build via xtask
- filmcraft-cli: support --version/-V/version (the packaging smoke tests call it).
- Linux release job installs libasound2-dev for alsa-sys; deb/rpm depend on
  libasound2/alsa-lib; Flatpak gets --socket=pulseaudio for audio.
- packaging/web/package.sh builds with `cargo xtask web` (wasm-bindgen) and
  zips <target>/web/dist instead of assuming trunk; the release job installs
  wasm-bindgen-cli 0.2.129 to match the crate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.1.0
2026-10-02 12:33:59 -04:00
Brandon ThomasandClaude Opus 5.5 6e4e46a10a README: tagline names the Adobe app it reimplements; standard Adobe trademark and non-affiliation notice
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:24:14 -04:00
Brandon ThomasandClaude Opus 5.5 ae1b0ad9b3 README: Crafting Apps table in five columns (icon, app, purpose, GitHub, Website)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:19:02 -04:00
Brandon ThomasandClaude Opus 5.5 2516751a25 README: drop the old DrawCraft name; VectorCraft links to /apps/vectorcraft
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:18:14 -04:00
Brandon ThomasandClaude Opus 5.5 0f64294fc8 README: app icons in the Crafting Apps table
Drop the app icon from the top of the README, matching PhotoCraft, and
show each app's icon next to its name in the Crafting Apps table in place
of the coloured name badges. The table is now identical across all seven
apps apart from the "you are here" row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:17:15 -04:00
Brandon ThomasandClaude Opus 5.5 e9983b398c ROADMAP: ~72% parity after effects/transitions/settings/menus; 1258 tests; updated estimate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:12:59 -04:00
Brandon ThomasandClaude Opus 5.5 7058004ecf xtask: wire cargo xtask version (root() helper, run via $CARGO) so xtask builds again
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:12:29 -04:00
Brandon ThomasandClaude Opus 5.5 b809240d2f xtask/version.rs: rustfmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:11:45 -04:00
Brandon Thomas ba7a465e56 Merge branch 'main' into integrate 2026-10-02 12:11:28 -04:00
Brandon ThomasandClaude Opus 4.8 f02eefba26 Signed release pipeline (macOS/Windows/Linux/Web); README community note
Ports photocraft's release workflow + packaging (signing, notarization,
MSI/DMG/deb/rpm/AppImage/web), adds `cargo xtask version`. File-type
associations omitted (route B); app keeps its own .desktop. Fresh WiX
UpgradeCode. README 'about' note updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-02 12:06:09 -04:00
Brandon Thomas 96da81a239 Merge branch 'm3.11-menu-long-tail' into integrate 2026-10-02 12:01:51 -04:00
Brandon ThomasandClaude Opus 5.5 ae2cda9247 M3.11: fix menu-order / shortcut tests (Save as Template position, bindable Edit Original), UI search-bin assertion
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:00:30 -04:00
Brandon ThomasandClaude Opus 5.5 feae349814 Merge remaining Premiere menu items (M3.11, schema v11) into integration
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:47:51 -04:00
Brandon ThomasandClaude Opus 5.5 cd4b61b9ee Integration: Mosaic keeps the original tile boundaries (fixes mask_inverted golden)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:37:32 -04:00
Brandon ThomasandClaude Opus 5.5 616615ff9a Integration: effects.list test checks folder (leaf) and path
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:34:00 -04:00
Brandon ThomasandClaude Opus 5.5 d67f101064 Merge video transitions (M5.10) into integration; effects.list keeps folder (leaf) and adds path
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:17:22 -04:00
Brandon Thomas 4a8c3d8076 Merge branch 'worktree-agent-afeed4478aa7a6497' into integrate
# Conflicts:
#	crates/project/src/effect.rs
2026-10-02 11:15:38 -04:00
Brandon ThomasandClaude Opus 5.5 bff5b723ee M5.10: Premiere 26 video transitions (84 in 10 folders + 21 Legacy)
- project: vtransition.rs registry. Animation, Dissolve, Grunge & Distort,
  Immersive Video, Lights & Blurs, Slide, Smart Tools, Text, Transformers
  and Wipe folders, plus Legacy > Video Transitions. Old ids are kept:
  modern versions reuse push/slide/split/whip/clock_wipe/radial_wipe/
  cross_zoom/page_peel, the old behaviour lives under *_legacy ids, and
  removed transitions move to a hidden Obsolete folder. Parameters are
  not animatable; find_transition looks up by kind (Mosaic/Mirror/
  Directional Blur names are shared with video effects).
- render: transitions/ module with procedural CPU implementations, a
  field-wipe engine (feather, border width/colour, anti-aliasing, centre),
  a 3D card renderer (flips, cube, folds, spins), page curl, blur/light/
  grunge families and flat VR approximations. Endpoints are exact,
  pixel params scale with the render resolution, and Reverse now plays
  B->A backwards. There is no GPU transition path, so the plan keeps
  only the symmetric dissolves on the GPU.
- engine: applyVideoTransition takes params/reverse; new
  sequence.setTransition; effects.list adds folder/kind filters,
  badges and detail paramInfo; sequence.inspect shows transition params.
- ui: the Effects panel shows the Legacy top folder and all badges;
  ui.set effectsSearch.
- tests: per-transition endpoint, continuity, midpoint, determinism,
  NaN, parameter-wiring and direction properties; golden fingerprints;
  tree counts; apply-every-transition via command; UI panel test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:14:59 -04:00
Brandon Thomas 0f8b03820a Merge branch 'worktree-agent-af22f22f99adc619b' into integrate 2026-10-02 11:11:15 -04:00
Brandon ThomasandClaude Opus 5.5 a69148d5e7 M12.5: Settings dialog with every Premiere category, wired to real behaviour
One Preferences window (app menu ▸ Settings ▸ <category>, Edit ▸ Preferences in-window, General =
Cmd+,): category list, schema-driven pages, Help / Reset… / Cancel / OK. Settings live in the
per-user preferences.json (version 2, v1 migrated, bad values repaired), reachable via
prefs.get/set/reset{category} and the new prefs.schema; app.settings.<category> opens a page;
every control has a settings.<key> automation id.

Wired: still/transition default durations, auto-scroll, snap playhead, return to beginning, play
after rendering, step many, selection-tool roll/ripple, theme/highlight/contrast, tooltips, at
startup + recent projects, label names/colours/defaults, indeterminate timebase, default media
scaling, media cache location/policy/clean, frame cache budget, cpal device/buffer/rate/output
mapping, transcription defaults + auto-transcribe on import, text smart quotes/ligatures/font.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:10:46 -04:00
Brandon ThomasandClaude Opus 5.5 a34bc7f038 M3.11: remaining Premiere menu items — Scene Edit Detection, Normalize Mix Track, Simplify Sequence, Find / search bins, Automate to Sequence, Project Settings, ALE export…
- Scene Edit Detection: pure-Rust cut detection (render::scene: luma grid + RGB
  histogram difference, adaptive threshold with sensitivity, min shot length),
  background job with progress/cancel; applies cuts (linked audio too), clip
  markers and subclips in one undo step.
- Sequence: Normalize Mix Track…, Simplify Sequence…, Transcribe Sequence…,
  Captions ▸ Show Active Caption Tracks Only, Apply Default Transitions to
  Selection works on selected clips; Sequence menu in Premiere's order.
- Markers: Add Flash Cue Marker… (MarkerKind::FlashCue).
- File: New ▸ Search Bin (live saved queries), Close, Close All (Other)
  Projects, Save as Template… (+ new project from template), Import from Media
  Browser, Get Media File Properties for ▸ File…/Selection…, Project Settings ▸
  General…/Scratch Disks… (scratch disks drive previews, proxies, auto-save),
  Export ▸ Selection as FilmCraft Project…, Export ▸ Avid Log Exchange…
- Edit: Find… / Find Next (project columns/operators/all-any, timeline clips
  and markers), Edit Original (OS opener host hook).
- Clip: Edit Offline…, Source Settings…, Update Metadata… (XMP sidecars),
  Generate Audio Waveform, Restore Captions from Source Clip (disabled: no
  embedded caption reader), Automate to Sequence…
- View ▸ Dynamic Audio Waveforms; Help ▸ Reveal Log Files…, System
  Compatibility Report… (with the wgpu adapter).
- Dialogs for all of the above (panels::menu_dialogs, ui.set menuDialog).
- Project schema v11 (no-op v10_to_v11, fixture, docs row).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:08:58 -04:00
Brandon Thomas dbce890644 Merge branch 'worktree-agent-a791459ad666c0727' into integrate 2026-10-02 11:05:24 -04:00
Brandon ThomasandClaude Opus 5.5 8961f2eab9 M7.7: ui: Clip/Track Fx Editor windows (Parametric EQ, Graphic EQ 10/20/30, Multiband Compressor, Dynamics), folder submenus
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:04:47 -04:00
Brandon ThomasandClaude Opus 5.5 4c0f01166f M7.7: project/render/engine: 53 Premiere audio effects in folders, DSP mappings, clip and track application
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:04:47 -04:00
Brandon ThomasandClaude Opus 5.5 9ef525441a M7.7: audio-dsp: Premiere audio effect set (EQs, scientific/FFT filters, dynamics, multiband, modulation, delays, convolution/surround reverb, click remover, special/stereo)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:04:47 -04:00
Brandon ThomasandClaude Opus 5.5 3139e63870 M5.11: Effects panel Legacy bin and alphabetical folders, Text param editing, vfx goldens and docs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:04:45 -04:00
Brandon ThomasandClaude Opus 5.5 2e278c8ff0 M5.11: Premiere 26 video effects catalogue (93 in 16 folders, Legacy, obsolete) with CPU implementations and FxEnv for temporal/track effects
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:04:45 -04:00
Brandon ThomasandClaude Opus 5.5 4a931a3400 app icon: owl with ear tufts (owner's ArtCraft drawing), Dock/taskbar/launcher wiring, palette docs
- assets/app-icon/: canonical SVG + light SVG, 1024 PNG, macOS runtime PNG, .icns, .ico,
  hicolor theme, LICENSE.txt and README (palette, geometry, provenance, regeneration).
- packaging/icons.sh regenerates everything with resvg, iconutil and the new `cargo xtask ico`.
- Native app sets the window icon (with_icon) and the Wayland app id; build.rs embeds the .ico
  and VERSIONINFO into filmcraft.exe on Windows (winresource, Windows-host build-dep only).
- packaging/linux/ai.storyteller.filmcraft.desktop with Icon=ai.storyteller.filmcraft.
- Web app: favicon.svg replaced by favicon.png from the same artwork; sidecars and
  ATTRIBUTION.md updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 09:52:46 -04:00
Brandon ThomasandClaude Opus 5.5 1f54f4a608 ROADMAP: measured parity scorecard (~62%) and Opus 5.5 hours estimate to parity
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 07:44:09 -04:00
Brandon ThomasandClaude Opus 5.5 7db132d98c ROADMAP: menu long tail, transcripts, AV1 threading, CLI; 1095 tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 00:05:24 -04:00
Brandon ThomasandClaude Opus 5.5 e222d025cf Merge transcripts (M10.5) and clip/project commands (M3.10); clip schema renumbered to v10
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:34:12 -04:00
Brandon Thomas f5ac5989f0 Merge branch 'worktree-agent-a7d751de0d72abab7' into worktree-agent-a6d2cbb6d6b3e5d7a
# Conflicts:
#	crates/edit/src/lib.rs
2026-10-01 23:31:39 -04:00
Brandon Thomas dc6e271442 Merge branch 'main' into worktree-agent-a6d2cbb6d6b3e5d7a
# Conflicts:
#	crates/ui-egui/src/panels/dialogs.rs
2026-10-01 23:31:26 -04:00
Brandon ThomasandClaude Opus 5.5 c3d2f740d0 M3.10: Edit/Clip/File menu commands — labels, Paste/Remove Attributes, subclips, frame holds, time interpolation, audio options, Replace With Clip
Edit: Label ▸ 16 colours + Select Label Group, Paste Attributes… (⌥⌘V, with
Scale Attribute Times), Remove Attributes…, Select All Matching, Remove
Unused, Consolidate Duplicates. File: New ▸ Sequence From Clip, Bin From
Selection (⇧B), Offline File…; Close Project (⇧⌘W, asks to save), Save All.
Clip: Make Subclip… (⌘U, Restrict Trims), Edit Subclip…, Modify ▸ Audio
Channels… (⇧G) / Timecode…, Video Options ▸ Frame Hold Options…, Add Frame
Hold (now splits at the playhead), Insert Frame Hold Segment, Field
Options…, Time Interpolation (Frame Sampling / Frame Blending / Optical
Flow, blending rendered on CPU; optical flow falls back to blending),
Fit to frame / Fill frame; Audio Options ▸ Breakout to Mono, Extract Audio
(WAV next to the project, imported); Replace With Clip ▸ From Source
Monitor / Match Frame / From Bin. Hold Filters: effects animate through a
hold unless set. Menus support nested submenus (egui and native) and follow
Premiere's order. Dialogs in panels::clip_dialogs with automation ids and
ui.set {clipDialog}.

Project schema v9 (no-op migration v8→v9, v8-subclip fixture): clip
time_interpolation / hold_filters / field_options / source_channels,
Interpretation.audio_channels, Subclip.restrict_trims.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:28:37 -04:00
Brandon ThomasandClaude Opus 5.5 fc18a6962e M10.5: Text-based editing / transcripts
- crates/speech (L2): Transcriber trait, FixedTranscriber, Whisper model catalogue (pinned,
  SHA-256 verified) with optional downloader (feature `download`: ureq + rustls + RustCrypto),
  pure-Rust Whisper inference on candle with word timestamps (feature `whisper`), log-mel, VAD
  word tightening, MFCC speaker clustering. Both features off by default and for wasm.
- project: per-media-item transcripts (Project::transcripts); schema v9 with a no-op v8->v9
  migration and a v8 fixture.
- edit::transcript: sequence transcript derived from clip transcripts, search, paragraphs,
  word ranges, pause/filler detection, ripple delete of many ranges, caption layout.
- engine: transcript.* commands (generate, set, delete, inspect, search, select, extract, lift,
  renameSpeaker, removeFillers, removePauses, createCaptions, models, downloadModel);
  Session::transcriber for hosts/tests; features `whisper` / `speech-download` (also on the
  desktop and CLI apps). Without whisper, transcript.generate fails with a clear error.
- ui: Text panel Transcript tab (Transcribe button, speaker paragraphs of clickable words,
  Shift+click selection -> In/Out, extract/lift/remove fillers/create captions, search) with
  text.transcript.* automation ids; headless UI test.
- docs/transcripts.md, crates/speech/README.md, architecture and project-files updates.
  whisper-tiny measures 12.2% WER over 797 words on local samples.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:25:49 -04:00
Brandon ThomasandClaude Opus 5.5 858403ebf3 M3.9: Sequence and Markers menu long tail
Sequence: Reverse Match Frame (Shift+R), Go to Gap > Next/Previous in
Sequence (Shift+; / Cmd+Shift+;) and in Track, Selection Follows Playhead,
Show Through Edits (bow-tie marks on the timeline, wrench toggle), Join
Through Edits (clip context menu), Make Subsequence (Shift+U), Delete
Tracks... (dialog: all empty tracks or one track per kind).

Markers: Mark Split and Go to Split (Video/Audio In/Out) on the sequence
and the Source monitor; source split points make J/L-cuts on Insert and
Overwrite. Add Range Marker (Ctrl+Shift+M), Add Range Marker to In and Out
(Ctrl+M), Add Chapter Marker..., Clear Markers label, Show All Marker
Colors with a Markers panel colour filter, Ripple Sequence Markers
(insert, paste insert, extract, ripple delete, close gap, ripple trim) and
Copy Paste Includes Sequence Markers.

Edit crate: through-edit detection/join, track and sequence gaps, range
clipping. Shifted punctuation keys (Shift+; arrives as ':') now match
their bindings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:25:38 -04:00
Brandon Thomas 0ebc328fc4 Merge branch 'worktree-agent-aa900e64f5299bf69' 2026-10-01 23:23:59 -04:00
Brandon ThomasandClaude Opus 5.5 9947fee359 M4.7: View menu and monitor view options: Paused Resolution, 1/16, High Quality Playback, Display Mode (alpha/RGB channels, comparison, multi-camera, source audio waveform, video+waveform split), Magnification with panning, rulers, guides (drag from rulers, lock, clear, Add Guide, templates in preferences), Snap in Program Monitor
MonitorView state is serde and settable with ui.set {program|source}; view.* UI commands with
menu checkmarks; wrench and zoom menus with automation ids; headless kittest tests (view_ui.rs).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:23:27 -04:00
Brandon ThomasandClaude Opus 5.5 012bcf7aa5 M10.6: Graphics and Titles menu: New Layer (Vertical Text, Rectangle, Ellipse, Polygon, From file), Align to Video Frame / as Group / to Selection, Distribute (centres and gaps), Arrange, Select Next/Previous Graphic and Layer, Reset All Parameters, Reset Duration
Vertical text layout in the text engine (one line per character, columns right to left).
All edits are undoable engine commands; engine tests cover each menu group.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:23:27 -04:00
Brandon Thomas 83357490d4 Merge branch 'worktree-agent-a047c9696e3105eec' 2026-10-01 22:46:23 -04:00
Brandon ThomasandClaude Opus 5.5 0e35e82e47 M9.7: AV1 tile, frame and post-filter threading
Tiles decode in parallel into private region buffers (Plane / MiInfo with a
frame-coordinate origin) that are merged afterwards; intra block copy frames
keep whole-frame buffers. Post-filter row bands run on a rayon pool (par.rs,
behind the `threads` feature, sequential on wasm32). Frames become jobs that
wait on the reference slots they read and run on frame worker threads, so
independent GOP layers decode concurrently; output stays in order and each
Picture carries the pts of its temporal unit (Decoder::decode_pts, flush,
flush_result). codecs::Av1Decoder passes pts through and drains on flush.

Oracle tests now compare 1 thread, many threads and libdav1d (bit-exact),
with new multi-tile fixtures and an ignored 1080p set. README records fps
before/after.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:45:40 -04:00
Brandon ThomasandClaude Opus 5.5 2d5267a7df M12.4: agent-friendly CLI: exec/describe/inspect/import/export, run from stdin with JSON lines and --keep-going, --save/--save-as, --bridge to the live app, exit codes; tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 21:26:44 -04:00
Brandon Thomas bf67521c4d Merge branch 'main' into worktree-agent-a047c9696e3105eec 2026-10-01 20:43:25 -04:00
Brandon ThomasandClaude Opus 5.5 ff07ed1dc8 Merge main into M13 (web app): community links and ArtCraft wordmark
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:54:09 -04:00
Brandon ThomasandClaude Opus 5.5 3e834442ea ArtCraft brand marks: docs/brand logos with sidecars (ArtCraft trademark, all rights reserved, used with permission), AGENTS.md §1.8 first-party exception, wordmark in the About dialog and on the Home screen; README licence notes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:52:40 -04:00
Brandon ThomasandClaude Opus 5.5 5f613aff25 M13.2: FilmCraft web app (apps/filmcraft-web) with Blob media, OPFS recovery, WebAudio, WebCodecs
- eframe web runner on WebGPU (WebGL2 fallback; GPU compositor on WebGPU, CPU on WebGL2).
- fs: virtual file table of File/Blob handles, 1 MiB chunked async range reads with an
  LRU cache and read-ahead (pending + retry instead of blocking), downloads for written
  files, /opfs/ paths written to OPFS.
- import: File System Access picker / <input type=file>, drag-and-drop anywhere,
  container index prefetch (moov wherever it is), retried imports; project open/save.
- recovery: OPFS auto-save snapshot while dirty, media copies, reopened on next visit.
- audio: AudioWorklet output fed ahead from the UI thread; played-frame audio clock.
- webcodecs: H.264/HEVC/VP9/AV1 MP4/MOV decoded by the browser VideoDecoder via a
  reader opener (fallback to our decoders on any error), probed with isConfigSupported.
- api: window.filmcraft (execute/request/commands/screenshot/importFiles/importUrl/
  openProject/files/readFile/info).
- cargo xtask web [--dev] [--serve PORT] (wasm-bindgen CLI); xtask wasm also checks
  filmcraft-ui-egui and filmcraft-web; layer L6 for the web app.
- Original web icon (favicon.svg) with attribution sidecar; docs/web.md; headless-Chrome
  smoke test (tests/smoke.mjs).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:52:35 -04:00
Brandon ThomasandClaude Opus 5.5 243e95ab24 M13.1: wasm groundwork: range readers, pending reads, cooperative frames, stepped export
- filmcraft-media: ByteReader/ReaderOpener (open containers without reading the whole
  file) and the pending flag for asynchronous (web Blob) reads.
- filmcraft-codecs: MP4/MOV and Matroska open from a ByteReader; registry of reader
  openers (platform sources first).
- filmcraft-engine: Services::reader / export_in_memory; streamed imports; media pool
  never caches a still-loading file as offline; Session::pump_jobs advances stepped
  exports on hosts without threads.
- filmcraft-export: Exporter (one batch per step, re-renders on pending reads) used by
  export(); OutputSink for in-memory output.
- filmcraft-ui-egui: FrameServer::pump (time-budgeted cooperative frame jobs on wasm,
  retries jobs whose media is loading); screenshots as base64 on wasm; web-time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:50:06 -04:00
Brandon ThomasandClaude Opus 5.5 31f8b3dadf M9.7: AV1 hot loops: vectorisable MC, CDEF, transforms; faster deblocking and entropy decoding
Bit-exact restructuring of the per-sample spec processes (all oracle and conformance
vectors still match libdav1d):
- Inter prediction: unscaled references use one filter phase per block, so the 8-tap
  filters run tap-outer over whole rows (no per-tap clamps inside the frame, identity
  phases copy, zero-tap rows skipped); scratch buffers are reused, not allocated.
- CDEF: padded 12x12 block with availability; blocks whose taps are all available run
  branch-free in i16 lanes; zero-strength blocks are skipped.
- Inverse transforms: generic over lanes, 4 or 8 rows/columns at a time in 32-bit
  arithmetic (exact up to 10-bit per the spec's intermediate range); all-zero rows skipped;
  only the used dequant area is cleared.
- Deblocking: early exits before strength lookup; per-length sample filters; the wide
  filters as sliding-window sums.
- Symbol decoder: a 64-bit window of inverted bits instead of bit-at-a-time refills.
- Coefficient contexts from a zero-padded level buffer (no bounds checks); mode info
  stored with row fills; reconstruction on row slices.

Single-threaded 1080p (thread CPU): GOP 20.7 -> ~52 fps, high-quality GOP 9.6 -> ~20 fps,
4x2-tile GOP 22 -> ~48 fps, 10-bit GOP 17 -> ~44 fps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:48:22 -04:00
Brandon ThomasandClaude Opus 5.5 9f687f7b44 Community links: header Discord button, Help menu (Discord, ArtCraft website, FilmCraft app page, GitHub, Report an Issue), Discord in the macOS app menu, About dialog with link buttons (centred, Escape closes), Community row on the Home screen, README links; help.* commands for agents; headless UI test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:25:46 -04:00
Brandon ThomasandClaude Opus 5.5 fef248a527 M9.7: AV1 decode statistics (per-stage busy time) and perf test with stage breakdown
Decoder::stats() reports frames, tiles and the busy time of setup, tile decoding,
deblocking, CDEF, superres, loop restoration and output. The ignored perf test
measures single-threaded throughput with the thread CPU clock (robust to machine
load), prints ms/frame per stage, and the all-cores wall-clock rate next to the
load average. Adds high-quality and 4x2-tile 1080p fixtures. Decoder::with_threads
and flush() are added as the API the threaded decoder will use.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:07:55 -04:00