diff options
| author | cashmere <cashmere@autistici.org> | 2026-07-28 19:41:16 +0200 |
|---|---|---|
| committer | cashmere <cashmere@autistici.org> | 2026-07-28 19:41:16 +0200 |
| commit | f5a82152394fde4d8f740f664ab7737b82861618 (patch) | |
| tree | 5a51b181abead1ce03d2dbfc12b77918d3be0e1b /notes/roadmap.md | |
| parent | e837e7504379e100ff3b56282577ec67bb88bec9 (diff) | |
| download | opencut-f5a82152394fde4d8f740f664ab7737b82861618.tar.gz | |
feat: GPUI desktop port foundation
- scene crate: full project/scene/element model, serde round-trip
proven against the web SerializedProject shape
- transfer crate: .ocp zip container, cross-compat with web fflate
archives proven in both directions
- storage crate: filesystem project store replacing IndexedDB,
.ocp import/export
- media crate: ffmpeg-next 8 decoder (frames, audio, thumbnails,
waveform summaries)
- playback crate: wall-clock anchored, frame-rounded playback clock
- gpu crate: native texture readback; compositor renders headless
offscreen on Vulkan (spike test)
- flake devshell: rust toolchain, GPUI native deps, ffmpeg dev,
bindgen clang args; GPUI hello-world builds
- port plan in notes/gpui-port.md
Diffstat (limited to 'notes/roadmap.md')
| -rw-r--r-- | notes/roadmap.md | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/notes/roadmap.md b/notes/roadmap.md index c886edeb..fc89bb46 100644 --- a/notes/roadmap.md +++ b/notes/roadmap.md @@ -1,10 +1,21 @@ # Roadmap & session notes Working notes for the fork's development direction. Captured 2026-07-26, -updated 2026-07-27 (roadmap feature slices implemented, last commit -`9c3b788b`). +updated 2026-07-28 (GPUI desktop port greenlit — see notes/gpui-port.md). -## Done +## Done (2026-07-28 session) + +- Freeze-duration prompt removed; freeze frame uses a fixed 3s (store, dialog, and test deleted). +- Ripple-extend: dragging the right edge of a static element (image/freeze still/text, i.e. no `sourceDuration`) past its neighbor pushes the whole right-hand chain on that track. Same undo step as the resize; live during drag. Video/audio keep clamping. Core: `timeline/group-resize/compute-resize.ts` + `rightPushChain` from `resize-controller.ts`. +- Timeline filmstrip: video elements render real per-position thumbnails, density adapts to zoom (power-of-two interval snapping). New `services/thumbnail-cache/` (LRU, batched mediabunny decode) + `timeline/components/video-filmstrip.tsx`. Images unchanged. Verified in browser by agent (distinct tiles, zoom density, viewport clipping, cache clear on media delete). +- Export hardening (`services/renderer/scene-exporter.ts`, `export-encoding.ts`): bitrate is fps-aware (`w*h*fps*bpp`, high = 0.2 bpp → ~12.4 Mbps at 1080p30, was ~6 fps-blind); keyframe every 2s; export canvas rounded to even dims. A capture-timing change (wait past WebGPU present before snapshot) was tried and REVERTED the same day — the canvas is blank after present, export came out black. Synchronous same-task snapshot is the correct behavior for WebGPU canvases; the temporal-ghosting hypothesis is dead. Colorspace tagging: no API exists (verified mediabunny + lib.dom) — BT.709 vs 601 is Chrome's encoder's call. +- MP4 export: ffmpeg.wasm + libx264 was implemented (chunked rawvideo → x264 CRF ladder) and then REVERTED at the owner's request after two wasm-side bugs (x264 auto-threading spawns 28 pthreads and hangs the worker — `-threads 4` fixes it; `@ffmpeg/ffmpeg` `writeFile` transfers/detaches the input ArrayBuffer, so chunk buffers must be single-use). The investigation notes stay here in case the idea is revisited; WebM/VP9 export is the owner's daily path and works well. MP4 stays on the mediabunny/WebCodecs avc path (which undershoots bitrate on this machine — OpenH264 ignores bitrateMode, has no quantizer mode, no hardware encoder exists; probe-verified 2026-07-28). +- Encoder investigation (2026-07-28, probe-verified in the user's Helium): NO hardware H.264 encode exists on the machine; Chrome's OpenH264 ignores `bitrateMode` (byte-identical VBR/CBR output), has no AVC quantizer mode (`isConfigSupported` false), and undershoots to ~0.6 Mbps on real content regardless of configured bitrate (6-50 Mbps). WebCodecs H.264 is a dead end for quality export; x264 via wasm is the only in-browser path. The fps-aware `computeVideoBitrate` still serves the WebM path. +- Next dev overlay disabled (`devIndicators: false` in `apps/web/next.config.ts`). +- Gates green: bun test 316 pass / 1 skip, tsc, eslint on touched files, `bun build:web`. +- Human verification still owed: freeze + ripple-extend click-through by owner. + +## Done (2026-07-26/27 session) - Freeze frame at playhead (snowflake button), composite canvas capture. - Freeze frame is a single undo step (`BatchCommand` + `ShiftSplitRemainderCommand`). @@ -69,13 +80,12 @@ work. The GPUI desktop app sidesteps it entirely (native GPU). 5. ~~Voice-over recording~~ done. 6. ~~Git-like project versioning~~ done (v1). v2 candidates: diff view, branches, content-addressed media dedup, shipping history inside `.ocp`. -7. **Self-contained binary, first-class Linux + BSD.** `apps/desktop` (GPUI) - is the vehicle but is a hello-world scaffold today; porting the editor is - a large effort. Caveat: GPUI's Linux support is young; BSD support is - unproven — spike before committing. Browser version stays regardless - (editing in a browser is a feature, not a compromise). Distribution: - AppImage/GitHub releases first; Flathub is effectively closed to us (June - 2026 policy bans AI-assisted code in new submissions). +7. ~~Self-contained binary, first-class Linux + BSD.~~ **GREENLIT + 2026-07-28: full 1:1 GPUI port, Linux-first.** Decisions: in-process + ffmpeg (`ffmpeg-next`) for decode+encode, x264 for H.264 (licensing + waived, quality first), no server backend (project store moves to + filesystem), web version stays. BSD parked (GPUI unproven there). + Full plan: notes/gpui-port.md. ## Deprioritized / parked |
