Skip to content

A contact sheet, transition sampling, and audio measurement #334

Description

@LeadcodeDev

Part of #326. The contact sheet is batch 1 and depends on nothing. Transition sampling is batch 3 and depends on #336.

Asked how he verified the SVG reel, its author is direct: he cannot watch it move or hear it. He captured stills at chosen instants, assembled them into contact sheets by hand, and found the misplaced hexagons and the clipped subtitle that way. The audio he checked only through peak and RMS numbers from ffmpeg, which is how he found the mix clipping at 0 dB. One blind spot he names outright: "the transitions, I never saw them play."

That is the real ground Rustmotion holds. A generator cannot watch its own output, and what can be given to it is not a better eye but numbers in place of one. The geometry validator already catches the clipped subtitle without a contact sheet. But geometry.rs iterates view.scenes and calls anim_sample_times(scene_duration), so transition frames are separate FrameTasks that nothing ever checks. The composite of two frame buffers is unverified, which is the same blind spot, in this engine, on main.

Owned files

  • crates/rustmotion/src/cli/commands/sheet.rs (new)
  • crates/rustmotion/src/cli/commands/geometry.rs (the sampling loop)
  • crates/rustmotion/src/cli/mod.rs (the subcommand)

Do NOT write: encode/video/tasks.rs (#336), any audio file (#331 owns the measurement this reads).

Deliverables

  1. rustmotion sheet — -f x.json --at 3.2,4.8,19.9 or --every 0.5, producing one PNG grid with each cell stamped with its timestamp. The SVG reel's author assembled these by hand; here it is a subcommand over the existing single-frame render path.

  2. Sample transition frames. Iterate build_frame_tasks rather than view.scenes, so --strict-anim covers SlideTransition and ViewTransition frames. This closes the blind spot both this engine and the reference reel share.

  3. Audio measurement in --report — peak, RMS and true-peak, per beat. Clipping becomes a named violation found at validation time rather than a late discovery. Nearly free once Synthesise a soundtrack on the same clock as the cuts #331 lands, and it is the audio half of the same idea.

Acceptance

  • rustmotion sheet -f examples/mega-showcase.json --every 1.0 writes one readable PNG
  • A scenario whose text leaves the viewport only mid-transition is caught by --strict-anim, and is not caught today
  • A clipping soundtrack produces a violation in --report

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions