Skip to content

v0.20.0 — the preview stops flattening your cut

Choose a tag to compare

@DareDev256 DareDev256 released this 02 Sep 15:56
· 10 commits to feat/cutting-room-v0.17 since this release

Crossfades are compiled, not flattened

A transition on a spine cut now becomes an ffmpeg xfade. Dissolve, dip/fade to colour, wipe and slide map onto their nearest xfade equivalents; anything unrecognised renders as a dissolve and says so.

A transition is only compiled onto a boundary it can actually run on — within its own duration of a real cut, both neighbours present, the cut not already taken, and its length trimmed to fit the shorter neighbour. Everything else is reported with the render, naming the reason, instead of being silently dropped. FilterGraph.total subtracts the overlaps, so the artifact duration read-back still means something.

Video lanes composite

Connected clips are overlaid over the spine for their own window, in lane order, each shifted by any crossfade that shortened the timeline before them. They are drawn full-frame — this module does not read transforms — and the render prints that, along with the fact that audio lanes are never mixed. preview_render and preview_timeline now also report the crossfades that were compiled: reporting only the substitutions leaves an honoured dissolve looking exactly like a dropped one.

Checked against the real binary

Both chains are verified by running ffmpeg, not just by asserting argument lists: an xfade render must come back shorter by the overlap, and a lane is rendered twice — with and without — with the frame inside the lane's window asserted to differ. A graph ffmpeg rejects, or one that composites nothing, fails there and nowhere else.

Verification

1692 tests across 60 suites. mcp floor 1685 pass / 7 skip · mcp 2.x 1686 / 6 · FCP_MCP_INDEX=off 1661 / 31 · no ffmpeg on PATH 1665 / 27.

Still deferred

Splitting server.py's flat handlers into tools/; an operation Protocol shared by XML and Live; Timecode → TimeValue unification.