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.

5 min readSume
All posts

The first block of a Sume reference-ingest manifest, source, answers what the file is before you ask what happens in it: duration_seconds, width, height, rotation, display_aspect, fps, frame_count, vfr, video_codec, has_audio_track, size_bytes, plus url, artifact_id and sha256. Read it first; three of those fields change how you plan the remake.

Phone footage is the common reference, and phone editors keep adding clip-assembly features: Instagram's First Draft, which TechCrunch reported on August 25, trims clips and removes pauses to build a first cut in under 10 seconds, on iPhone first (TechCrunch, read 2026-10-04). Files like that arrive with whatever the phone recorded, so check before you assume.

Fields and what they change

The field list comes from the manifest contract in packages/api-contract/src/reference-ingest.ts and the OpenAPI schema; the column on the right is guidance, not a documented Sume rule.

Manifest source fields and what to do with them (contract fields, read 2026-10-04)
FieldTypeWhat to change
display_aspectstringPick the remake's output aspect from this, not from width and height
rotationnumberRemember that text boxes are normalised to the rotated frame
fpsnumberChoose a conform rate for the remake
vfrbooleanTrue means variable frame rate; do not assume a fixed frame time
has_audio_trackbooleanFalse means plan new sound; see audio.silent for a track that exists but is quiet
sha256string or nullUse as a stable key for the source in your own log

Tie it to the next call

Two Sume surfaces take an output spec. Video trim accepts output with width and height 256 to 2160 and fps of 24, 25, 30 or 60, on exact precision only. Timeline compose takes output.width, output.height and output.fps, and warns output_fps_resamples_sources when the rate differs from the clip. Read source.fps and source.vfr first and you know whether a conform will repeat or drop frames.

source = {
    "width": 1080, "height": 1920, "rotation": 0,
    "display_aspect": "9:16", "fps": 29.97, "vfr": True,
    "has_audio_track": True,
}

allowed_fps = (24, 25, 30, 60)
nearest = min(allowed_fps, key=lambda f: abs(f - source["fps"]))
notes = [f"output aspect {source['display_aspect']}",
         f"trim output.fps candidate {nearest}"]
if source["vfr"]:
    notes.append("variable frame rate: conform on purpose")
if not source["has_audio_track"]:
    notes.append("no track: plan new sound")
print("; ".join(notes))

The reference-ingest read itself covers a clip of up to 300 seconds that already lives on media.sume.com; import outside files first through POST /v1/media-imports, as the media inputs page describes. It is dest first with a production opt-in.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume