Skip to content

render_timeline: lower stills, image sequences, and cornball.* effects - #19

Merged
TroyHernandez merged 3 commits into
mainfrom
feat/render-stills
Jul 20, 2026
Merged

render_timeline: lower stills, image sequences, and cornball.* effects#19
TroyHernandez merged 3 commits into
mainfrom
feat/render-stills

Conversation

@TroyHernandez

Copy link
Copy Markdown
Contributor

Teaches render_timeline() to handle non-video sources by pre-rendering them into temp clips before the existing concat/crossfade/framing/caption/audio machinery (which is untouched):

  • Still-image clips (.png/.jpg/... ExternalReferences) lower via still_clip(): duration = source_range end (so a preceding dissolve keeps its head handle), fps = source_range rate, raster = source aspect fitted inside the framing box, motion from the clip's cornball.* effects. A still clip without a source_range is an error — a still has no intrinsic duration.
  • ImageSequenceReference clips lower via frames_clip() at the reference's own rate (pattern from name_prefix/zero_padding/suffix). Previously these were silently dropped by the track walk.
  • cornball.* effect namespace (public contract: inst/schema/cornball-effects.md): cornball.kenburns schema 1 is lowered; foreign effects are ignored silently; unrecognized/disabled/schema-too-new cornball.* effects degrade to a static clip with one warning. First usable motion wins.

at_home tests render a real two-slide bundle (Ken Burns on slide 1, 6-frame dissolve riding the head handle, mp3 narration bed as ground truth for output length, framed 240×240) and a 10-frame ImageSequenceReference scene. Full suite 185/185 with at_home on.

Second of the two compost PRs for the slide-explainer pipeline; cornductor's bundle writer lands next and degrades gracefully against older compost.

…effects

Still-image clips (png/jpg/... ExternalReferences) pre-render into temp
video via still_clip() before the concat/crossfade chain: duration from
the source_range end (so a preceding dissolve keeps its head handle),
fps from the source_range rate, raster from the source aspect fitted in
the framing box, motion from the clip's cornball.* effects.
ImageSequenceReference clips pre-render via frames_clip() at the
reference's rate. Everything downstream is unchanged.

.motion_from_effects() reads the open cornball.* effect namespace
(inst/schema/cornball-effects.md): foreign effects are ignored silently;
unrecognized, disabled, or schema-too-new cornball.* effects degrade to
a static clip with one warning; the first usable motion wins.

A still-image clip without a source_range is an error: a still has no
intrinsic duration.
@TroyHernandez
TroyHernandez merged commit 0df7eb0 into main Jul 20, 2026
2 checks passed
@TroyHernandez
TroyHernandez deleted the feat/render-stills branch July 20, 2026 20:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant