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.
- Roku ad frame rates: only three allowed, probe first
Roku ads reportedly accept 23.98, 25 or 29.97 fps. Probe your clip before upload with Sume's video inspect, and cut it to length if it is outside 6 to 92 s.
Written by Sume