SourceForge Logo

Click here to access the edl2aaf sourceforge accout

Usage Instuctions

EDLAAF converts CMX 3600 files to AAF files.

It takes two parameters. The first is the frames per second of the edl. The second is the name of the edl (without the .edl extension). It will create a file with the same name as the edl but with a .aaf extension.

EDLAAF outputs lots of debug informatrion as it runs. To ignore this redirect the output to nul (or a file if you like). EDLAAF outputs warnings to the error stream.

Example

PAL edl filename: fred.edl

The command: edlaaf 25 fred > nul

generates a file called: fred.aaf

edl2aaf supported constructs

Usage

edl2aaf <frames per second> <basename>

 

Program Command Line Parameters

frames per second positive integer

eg 24,25,30 ... Determines <Frames Per Day>

 

basename String. <basename> is the filename without the ".edl" of the input edit decision list. Output file will be <basename>.aaf

 

Build Parameters

NUM_AUDIO_TRACKS defines the number of supported audio tracks. Minimum is two, Maximum not defined. Currently set to four.

 

All text is read and stored as Unicode.

 

EDL Contents

Edl files have the following structure:

Preamble

[Statement]*

 

Preamble

Title <title>

<title> String. <title> becomes CompositionMob name. The CompositionMob will have TimelineMobSlots with edit rate … and source rate …

 

FCM One of {Drop Frame, Non-Drop Frame}

First entry controls both source and destination timecodes. Any further FCM statements will affect all following source timecodes. Required when <frames per second> is 30 (and 24 ???). Drop Frame illegal when <frames per second> is 25.

 

Statement

One of {Edit Decision, Aud command, M2 command, Comment, Reel}

Edit Decisions

<EditNum> <Tapename> <Channels> <Operation> [Operation Duration] <SourceInTime> <SourceOutTime> <DestInTime> <DestOutTime>

 

EditNum Integer. Added as KLV data to all the Components (SourceClips, Fillers, Transitions, OperationGroups) added to the TimeLineMobSlots due to this decision.

Key for KLV edit Number = { 0xfedcba98, 0x2267, 0x11d3, { 0x8a, 0x4c, 0x0, 0x50, 0x4, 0xe, 0xf7, 0xd2 } }. Length = 4 bytes, stored as integer.

 

Tapename String. Each unique name will create Source and Master Mob having 1 video, <NUM_AUDIO_TRACKS> audio and 1 timecode TimelineMobSlot. Each TimelineMobSlot will be <Frames Per Day> (modified by Source ??? FCM) long, starting at midnight. The edit rate is a rational: numerator = <frames per second> * 1000; denominator = 1000 or 1001 depending upon <FCM>. The source rate … A single 'B' at end of name will be stripped (this indicates a B roll and is not relevant to non-linear suites). The Source Mob has a TapeEssenceDescriptor. There is a special case when the <Tapename> equals BL or BLK. This indicates black so Filler is used as the Segment in the CompositionMob for the edit decision instead of SourceClip.

 

Channels String. One of {NONE, A, B, V, A2, A2\V, AA, AA\V} Determines which channels of the source essence the edit decision applies to. <NONE> is useful if the edit decision is followed by an <Aud> command.

 

Operation One of {C, D, W}

C: Cut - inserts a SouceClip (length = <DestOutTime> - <DestInTime>) into the <channels> TimeLineMobSlot of the CompositionMob. SourceRef.MobId = MasterMob of <Tapename>. SourceRef.SlotId = SlotId of MasterMob for <channel>. SourceRef.StartTime = <DestInTime> as frames from midnight (calculated using <frames per second> and <FCM> for destintion timecodes).

 

D: Disolve - syntax demands that the preceding line is a cut with the same <EditNum> and that <channels> match. The <SourceInTime> of the cut determines the first frame that the edit will dissolve from. The dissolve will require <SourceInTime> + <Operation Duration> of source to be available. Inserts A SourceClip (length = <Operation Duration>), Transition (length = <Operation Duration>), SourceClip (length = <SourceOutTime> - <SourceInTime>) into the <channels> MobSlots of the Composition Mob. Video channels use an OperationDefinition of <VideoDisolve>. Audio channels use an OperationDefinition of <MonoAudioDissolve>.

 

W<SMPTE wipe num>: Wipe - syntax demands that the preceding line is a cut with the same <EditNum> and that <channels> match. The <SourceInTime> of the cut determines the first frame that the edit will wipe from. The wipe will require <SourceInTime> + <Operation Duration> of source to be available. Inserts A SourceClip (length = <Operation Duration>), Transition (length = <Operation Duration>), SourceClip (length = <SourceOutTime> - <SourceInTime>) into the <channels> MobSlots of the Composition Mob. <SMPTE wipe num> is the type of wipe as defined by SMPTE 258M-1993. The number may also be negative indicating that the wipe should be inverted. The Minus sign follows the W and precedes the <SMPTE wipe num> with no spaces. Video channels use an OperationDefinition of <SMPTEVideoWipe> with a Parameter of <SMPTEWipeNumber>. As audio does not support wipes Audio channels use an OperationDefinition of <MonoAudioDissolve>.

 

Operation Duration <number>

Determines the number of frames for the dissolve or wipe.

 

SourceInTime Timecode. Converted to frames from midnight using both the <frames per second> and current <FCM> settings. Determines the start time of the source essence.

 

SourceOutTime Timecode. Converted to frames from midnight using both the <frames per second> and current <FCM> settings. Data seems to be of no use and is totally redundant (and often wrong or misleading). Edl2aaf never uses this field in its calculations.

 

DestInTime Timecode. Converted to frames from midnight using both the <frames per second> and current <FCM> settings. Determines the start time the SourceClips that are inserted into the TimeLineMobSlots referred to by <channels>.

 

DestOutTime Timecode. Converted to frames from midnight using both the <frames per second> and current <FCM> settings. Determines the duration of the edit decision. Length = <DestOutTime> - <DestInTime>. Caveat: The next edit decision can have a DestInTime prior to DestOutTime of this edit decision, therefore neighbourhood checks need to be made before any Segments are constructed.

Note that InTimes are inclusive and OutTimes are exclusive.
Thus: Duration = [DestOutTime> <DestInTime>). This has the same semantics as the STL iterators in C++.

 

Aud <Channels> Series of positive integers.

Modifies the previous Edit Decision to include extra Audio channels. Each number represent the audio channel to enable.

 

M2 <Tapename> <Speed> <SourceInTime>

Motion Memory command. Modifies the previous Edit Decision by causing the Source material to be stretched. <Speed> determines the play rate. It is declared in frames per second. <Speed> may be negative indicating reverse. Zero indicates still frame. One decimal place is allowed. The <Tapename> and <SourceInTime> must match one of the Edit Decisions that occur within the current <EditNum>. Therefore they may be two M2 commands following a Dissolve or Wipe modifying both the source essences separately. Causes the SourceClip to be inserted as an InputSegment of an OperationGroup. The OperationGroup has one parameter SpeedRatio set with a rational calculated as follows: Numerator = <Speed>*10. Denominator = <frames per second>*10. Multiplication by 10 allows the <Speed> to have one decimal place of accuracy.

 

Comments are indicated by * or COMMENT: at the start of a line. They are deemed to have the <DestInTime> of the current EditNum. If more than one comment occurs between edit decisions, the strings are concatenated, being separated with a newline. They are put into an EventMobSlot in the CompositionMob. Each comment string is stored in a CommentMarker with duration of one. StartTime = <DestInTime> as frames from midnight of current (most recently parsed) EditNum.

 

Split commands are ignored, as the data they contain is redundant. There are other commands that a 3600 EDL may include. These are not supported yet. These include: multiple M2 commands affecting one source essence in one edit decision (allowing for variable speed stretches) and GPI Triggers.

 

Edls have a semantic subtlety called Insert Mode, where an edit decision can have <DestInTime> and <DestOutTime> that falls prior to the previous <DestOutTime>. This then causes the new edit decision to be ‘inserted’ in the previous edit. This functionality is not yet modelled.

 

New (invented) EDL command to allow for mixed file and tape based conforms.

Reel <Tapename> <channel> <InTime> <OutTime> <Pathname>

Inserts a Source and Master Mob with a FileEssenceDescriptor containing the Pathname. All source essence that falls between the timecodes on <channels> slots have SouceClips created referring to the Source Mob. The <Aud> command may follow as normal to allow for extra Audio tracks.

 

Issues to document: DataDefs (Video, Audio and Unknown), Edit Rates, Source Rates, Timecode TimelineMobSlots.

 

Editor: Grep for … and ??? and !!!