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.

5 min readSume
All posts

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.

Shot fields worth reading first (contract fields, read 2026-10-04)
FieldGives youPacing use
durationSeconds in the shotAverage and longest shot
cut_out.typehard, gradual or endCount hard cuts versus dissolves
motion.classA motion labelMatch how busy each shot is
luma_meanMean brightnessSpot a dark shot that needs a lift
paletteHex colours and sharesPull 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

All Media tools posts

Written by Sume