Reference ingest shot record: cut types, palette, luma, motion
Each reference-ingest shot carries cut_out type (hard, gradual, end), palette, luma, contrast and a motion class. Turn them into shot length and pacing numbers.

A shot in a Sume reference-ingest manifest is more than a pair of timestamps. Each entry in shots[] has start, end, duration, a cut_in, a cut_out with type (hard, gradual or end), confidence and method, one source-resolution keyframe, a palette of hex colours with shares, luma_mean, contrast, a motion class with magnitude, and the ids of text tracks that appear in it. The list tiles [0, duration] with no gap, so shot lengths always sum to the clip.
That makes pacing a calculation instead of an impression. Auto-assembly tools now cut for people: TechCrunch reports Instagram's First Draft trims clips and removes pauses into a first cut (TechCrunch, read 2026-10-04). Measuring the cut rate of a reference tells you what pace to match.
The fields that carry pacing
Per the reference ingest docs, cuts are frame-exact, found by ffmpeg scdet and PySceneDetect voting together. A separate boundaries[] list holds mechanical change candidates at 12 samples a second and is not the editorial shot list; see boundary candidates.
| Field | Gives you | Pacing use |
|---|---|---|
| duration | Seconds in the shot | Average and longest shot |
| cut_out.type | hard, gradual or end | Count hard cuts versus dissolves |
| motion.class | A motion label | Match how busy each shot is |
| luma_mean | Mean brightness | Spot a dark shot that needs a lift |
| palette | Hex colours and shares | Pull a brand-adjacent colour for a still |
From manifest to three numbers
Shot count, average shot length and the share of hard cuts are enough to brief a remake: "about one cut every two seconds, mostly hard". The sample below uses four shots; replace it with the shots array from your manifest.
shots = [
{"start": 0.0, "end": 1.8, "duration": 1.8, "cut_out": {"type": "hard"}},
{"start": 1.8, "end": 4.6, "duration": 2.8, "cut_out": {"type": "hard"}},
{"start": 4.6, "end": 6.0, "duration": 1.4, "cut_out": {"type": "gradual"}},
{"start": 6.0, "end": 9.2, "duration": 3.2, "cut_out": {"type": "end"}},
]
total = shots[-1]["end"]
hard = sum(1 for s in shots if s["cut_out"]["type"] == "hard")
cuts = len(shots) - 1
print("shots:", len(shots))
print("average shot length:", round(total / len(shots), 2), "s")
print("longest shot:", max(s["duration"] for s in shots), "s")
print("hard cuts:", hard, "of", cuts)
Shots come with their keyframes, so each one can be reviewed without a second call. The strip in overview shows up to six tiles with gutter labels like S0 0.00-4.28s (t=2.14). Reference ingest is dest first and production opt-in; check tools_list for reference_ingest.
Sources
Related posts
More in Media tools
- Reference ingest source block: rotation, vfr and aspect
Before you remake a reference, read the manifest source block: display_aspect, rotation, fps, vfr, codec and has_audio_track. What each field should change.
- Reference ingest uncertain[]: five kinds and what to do
The reference-ingest manifest lists five uncertain kinds, each with a suggested next step. Read the list, look again once per entry, and skip the rest.
- Remove a video background: Firefly vs Sume options
Adobe Firefly can now remove a video background across a whole clip. The Sume docs list a cutout tool for stills, not video, so plan a clean backdrop instead.
- Replace the music on a recast clip: Timeline spine, $0.10 render
Recast keeps the source soundtrack. To swap it, render the clip through Sume Timeline 1.0 with your own audio spine; the render bills $0.10 per output minute.
Written by Sume