Edit decision list (EDL): what it is, with an example

An edit decision list (EDL) is the ordered list of edits that rebuilds a cut: source, track, transition, and timecodes. An example and its JSON form.

5 min readSume
All posts

An edit decision list (EDL) is the ordered list of edits that rebuilds a finished cut: for each event, which source it comes from, which track, which transition, the source in and out points, and where it lands on the program timeline. Classic EDLs are plain-text CMX 3600 files; AI video pipelines write the same list as JSON and hand it to a render API.

The format facts come from the Wikipedia article and the OpenTimelineIO CMX 3600 adapter, which reads and writes these files. The render facts come from Sume's Timeline 1.0 docs. All were read on 2026-09-28.

What does an edit decision list look like?

Wikipedia describes the list as "reel and timecode data representing where each video clip can be obtained in order to conform the final cut". This is a short CMX 3600 EDL from the adapter's test files: a cut, then a 10-frame dissolve from clip_A to clip_B. Lines starting with * are comments.

TITLE: dissolve test
FCM: NON-DROP FRAME
001 TST V C 01:00:04:05 01:00:04:14 01:00:00:00 01:00:00:09
* FROM CLIP NAME: clip_A
002 TST V C 01:00:04:14 01:00:04:14 01:00:00:09 01:00:00:09
002 TST V D 010 01:00:08:08 01:00:08:18 01:00:00:09 01:00:00:19
* BLEND, DISSOLVE
* FROM CLIP NAME: clip_A
* TO CLIP NAME: clip_B

What does each column in an EDL mean?

The adapter's parser splits each event line on spaces. A cut has eight fields; a dissolve or wipe has nine, because it adds a duration in frames.

Field names from the OpenTimelineIO cmx_3600.py parser, read 2026-09-28.
ColumnParser fieldIn the example
Event numberclip_num / transition_id001
Reel (source tape or file)reelTST
Channel (video or audio track)channel_codeV
Transition: C cut, D dissolve, W### wipetransition_typeC, D
Transition length in framestransition_data010
Source in, source outsource_tc_in, source_tc_out01:00:04:05, 01:00:04:14
Record in, record outrecord_tc_in, record_tc_out01:00:00:00, 01:00:00:09

What can a CMX 3600 EDL not hold?

It records simple decisions well and leaves out a lot around them:

  • Complex edits. Wikipedia: "Some formats, such as CMX3600, can represent simple editing decisions only." It names Final Cut Pro XML and AAF as formats that can hold more.
  • More than one video track, in this adapter: its feature matrix marks "Multiple Video Tracks" as unsupported.
  • The frame rate. The adapter's README says EDLs "don't contain metadata specifying the rate", so a reader has to be told it.
  • The media itself. An EDL only points at sources, so the editor rebuilding the cut needs the same files.

How do AI pipelines use an edit decision list?

An agent plans the cut, writes it as JSON, and a render API turns it into one file. Sume's Timeline 1.0 takes "a declarative document (one audio spine + ordered video[] slots)" and returns one MP4; callers never send filtergraphs or codecs. Its slots map onto EDL columns, measured in seconds rather than timecode. There is no EDL import in the docs, so a CMX file has to be converted first.

  • Record in → start. The first slot must start at 0, and later starts must increase.
  • Record out → start plus duration, which is at least 0.2 s.
  • Source in → source_in. Reel → source_url, which must be this workspace's media.sume.com file, such as an earlier Sume job's output.
  • D or W### → transition on a slot after the first: fade, wipeleft, wiperight, slideup, slidedown, or dissolve, up to 1 s. A slot without one is a hard cut.
  • Audio → the audio spine. In current code the render takes sound only from the spine and an optional soundtrack, so each clip's own audio is dropped.
{
  "audio": {
    "url": "https://media.sume.com/artifacts/artf_demo/voice.wav",
    "duration_seconds": 24
  },
  "video": [
    { "source_url": "https://media.sume.com/artifacts/artf_demo/intro.mp4",
      "start": 0, "duration": 8 },
    { "source_url": "https://media.sume.com/artifacts/artf_demo/talk.mp4",
      "start": 8, "duration": 16,
      "transition": { "type": "dissolve", "duration": 0.25 } }
  ]
}

How do I check an EDL before rendering?

Send the document to POST /v1/timeline-1.0/plan. It runs the schema and compiler checks and returns the duration, segment count, and estimated cost without creating a job or reserving credits. A bad list is refused with a stable code, such as timeline_must_start_at_zero, segment_overlap, or transition_too_long. Validate a timeline before rendering walks through the response, and How to assemble a long-form video covers the render call.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume