Each layer of a composition is one list inside the composition’s
LIST:Item:
LIST:Layr for the layers a user sees, and LIST:SLay,
LIST:CLay, LIST:DLay and LIST:SecL for the view
layers After Effects keeps for every composition (the 3D view cameras and the composition
markers). All of them have the same shape. Everything a layer animates hangs off its root
property group, described on Properties and
keyframes. This page follows the
py_aep specification;
Adobe publishes no description of the format.
Children of a layer list
In the order After Effects writes them, in every sample from AE CC 2018 to AE 2026:
| Child | Occurs | Meaning |
|---|---|---|
ldta | 1, required | Layer record: ID, timing, switches, type and parent. |
Utf8 | 1, required | Layer name in UTF-8, any length. Empty means the layer shows its source item’s name. |
LIST:tdgp | 1, required | The root property group. |
LIST:Gide | 1 | Layer guides, usually empty. |
cmta | 0–1 | Layer comment. |
LIST:OvdG | 0–1 | Essential Graphics overrides. |
mdla, mdlv | 0–1 each | 3D model layers only, after LIST:Gide. |
ldta: layer record (160 or 164 bytes)
The record is 160 bytes in files whose version is below 94 and 164 bytes from file version 94 (AE 2023) on. A 164-byte record in an older file makes every version of After Effects refuse the composition. Times are a dividend and a divisor (seconds = dividend ÷ divisor). The in and out points are in layer time: they are measured from the layer’s start and are not stretched, so the in point in the composition is start time + in point × stretch ÷ 100, and the same for the out point.
| Offset | Size | Type | Name | Meaning |
|---|---|---|---|---|
| 0x00 | 4 | u4 | Layer ID | Unique and persistent; parent and matte fields and tdpi refer to it. Drawn from the same counter as item IDs. |
| 0x04 | 2 | u2 | Quality | 0 Wireframe, 1 Draft, 2 Best. Cameras, lights and view cameras store 0. |
| 0x06 | 2 | bytes | 0 in the samples. | |
| 0x08 | 4 | s4 | Stretch | Dividend; the divisor is at 0x6C. Stretch in per cent = 100 × dividend ÷ divisor. Negative means the layer plays backwards. |
| 0x0C | 4 | s4 | Start time | Dividend, in composition time. |
| 0x10 | 4 | u4 | Start time | Divisor, usually 600 or the composition timebase. |
| 0x14 | 4 | s4 | In point | Dividend, in layer time. |
| 0x18 | 4 | u4 | In point | Divisor, usually the composition timebase. |
| 0x1C | 4 | s4 | Out point | Dividend, in layer time. |
| 0x20 | 4 | u4 | Out point | Divisor. |
| 0x24 | 1 | u1 | 0 in the samples. | |
| 0x25 | 1 | u1 | Flags A | See below. |
| 0x26 | 1 | u1 | Flags B | See below. |
| 0x27 | 1 | u1 | Flags C | See below. Usually 0x07 on AV layers and nulls, 0x87 on text and shape layers, 0x01 on cameras and lights. |
| 0x28 | 4 | u4 | Source | The idta ID of the footage, solid or composition. 0 for text, shape and camera layers. Lights store 0 up to AE 2022 and 0xFFFFFFFF from AE 2023, except an environment light that uses a footage item, which stores its ID. |
| 0x2C | 15 | bytes | 0 in the samples. | |
| 0x3B | 1 | u1 | Unknown. 1 on every AV layer (footage, solid, null, text, shape, 3D model, mesh), 0 on cameras, lights and view cameras. | |
| 0x3C | 1 | u1 | Unknown. Usually 0; 1 on a few layers, 3D nulls among them. | |
| 0x3D | 1 | u1 | Label | Label colour, 0 (none) to 16. |
| 0x3E | 2 | bytes | 0 in the samples. | |
| 0x40 | 32 | char[32] | Short name | The first 31 bytes of the layer name, NUL-terminated. The Utf8 that follows is authoritative; older files may hold this copy in an 8-bit legacy encoding. |
| 0x60 | 3 | bytes | 0 in the samples. | |
| 0x63 | 1 | u1 | Blending mode | See below. |
| 0x64 | 3 | bytes | 0 in the samples. | |
| 0x67 | 1 | u1 | Transfer flags | Bit 0 preserve underlying transparency; bit 1 Dancing Dissolve (with blending mode 3). |
| 0x68 | 3 | bytes | 0 in the samples. | |
| 0x6B | 1 | u1 | Track matte | 0 none, 1 Alpha, 2 Alpha Inverted, 3 Luma, 4 Luma Inverted. |
| 0x6C | 4 | u4 | Stretch | Divisor. |
| 0x70 | 8 | f8 | 0.0 in the samples. | |
| 0x78 | 8 | f8 | 0.0 in the samples. | |
| 0x80 | 3 | bytes | 0 in the samples. | |
| 0x83 | 1 | u1 | Layer type | See below. |
| 0x84 | 4 | u4 | Parent | Parent layer ID; 0 for none. |
| 0x88 | 3 | bytes | 0 in the samples. | |
| 0x8B | 1 | u1 | Subtype | Light type on a light, mesh type on a parametric mesh, otherwise 0. |
| 0x8C | 4 | u4 | 1 on the six secondary view cameras (LIST:SLay), otherwise 0. | |
| 0x90 | 1 | u1 | View layer | 1 on every view layer (SLay, CLay, DLay, SecL), 0 on composition layers. |
| 0x91 | 3 | bytes | 0 in the samples. | |
| 0x94 | 4 | u4 | 1 when 0x98 is not zero, otherwise 0. | |
| 0x98 | 8 | f8 | 0.0, 36.0 or 102.047… on cameras and view cameras, 0.0 elsewhere. Inferred to be a 36 mm film size (102.047 = 36 × 72 ÷ 25.4). | |
| 0xA0 | 4 | u4 | Matte layer | Track matte layer ID, 0 for none. Only in the 164-byte record; before AE 2023 the matte was always the layer above. |
A stretch set from a script is stored as the exact ratio of the 32-bit float of the percentage ÷ 100 (133.33 % is 11184531 ÷ 8388608), and anything under 1 % becomes 655 ÷ 65536. A time-reversed layer’s time 0 sits |stretch| ÷ 100 ÷ 3000 seconds before its start time.
Layer flags
Flags A (0x25)
| Bit | Mask | Meaning |
|---|---|---|
| 0 | 0x01 | The name was set on a layer that has a source item. Always 0 on layers without a source (camera, light, text, shape), except a renamed parametric mesh. |
| 1 | 0x02 | Guide layer. |
| 2 | 0x04 | Frame blending type: 1 Pixel Motion, 0 Frame Mix. Only meaningful with flags C bit 4. |
| 3 | 0x08 | Per-character 3D. |
| 4 | 0x10 | Auto-orient characters towards the camera (needs bit 3). |
| 5 | 0x20 | Environment layer. |
| 6 | 0x40 | Sampling quality: 1 Bicubic, 0 Bilinear. |
| 7 | 0x80 | 0 in the samples. |
Flags B (0x26)
| Bit | Mask | Meaning |
|---|---|---|
| 0 | 0x01 | Auto-orient along path. |
| 1 | 0x02 | Adjustment layer. |
| 2 | 0x04 | 3D layer. |
| 3 | 0x08 | Solo. |
| 4 | 0x10 | Layer markers locked (inferred). |
| 5 | 0x20 | Auto-orient towards the camera, on an AV layer (needs bit 2). |
| 6 | 0x40 | Auto-orient towards the point of interest, on a camera or light (two-node). AE 2026 writes 0x44 for a default two-node camera. |
| 7 | 0x80 | Null layer. |
Flags C (0x27)
| Bit | Mask | Meaning |
|---|---|---|
| 0 | 0x01 | Video enabled. |
| 1 | 0x02 | Audio enabled. |
| 2 | 0x04 | Effects active. |
| 3 | 0x08 | Motion blur. |
| 4 | 0x10 | Frame blending on (type in flags A bit 2). |
| 5 | 0x20 | Locked. |
| 6 | 0x40 | Shy. |
| 7 | 0x80 | Collapse transformations, or continuously rasterise. |
Auto-orient is spread over three bits: along path is flags B bit 0; towards the camera is flags B bit 5 on AV layers or bit 6 on cameras and lights; characters towards the camera is flags A bit 4 with bit 3.
Blending modes (0x63)
The values are the After Effects SDK’s PF_Xfer transfer modes. Normal is
2; cameras, lights and view cameras store 0. Dancing Dissolve has no value of its own: it
is Dissolve (3) with transfer flag bit 1.
| Value | Mode | Value | Mode |
|---|---|---|---|
| 0 | Normal (cameras and lights) | 20 | Silhouette Luma |
| 2 | Normal | 21 | Luminescent Premultiply |
| 3 | Dissolve | 22 | Alpha Add |
| 4 | Add | 23 | Classic Color Dodge |
| 5 | Multiply | 24 | Classic Color Burn |
| 6 | Screen | 25 | Exclusion |
| 7 | Overlay | 26 | Difference |
| 8 | Soft Light | 27 | Color Dodge |
| 9 | Hard Light | 28 | Color Burn |
| 10 | Darken | 29 | Linear Dodge |
| 11 | Lighten | 30 | Linear Burn |
| 12 | Classic Difference | 31 | Linear Light |
| 13 | Hue | 32 | Vivid Light |
| 14 | Saturation | 33 | Pin Light |
| 15 | Color | 34 | Hard Mix |
| 16 | Luminosity | 35 | Lighter Color |
| 17 | Stencil Alpha | 36 | Darker Color |
| 18 | Stencil Luma | 37 | Subtract |
| 19 | Silhouette Alpha | 38 | Divide |
Value 1 has not been seen.
Layer types (0x83) and subtypes (0x8B)
| Type | Layer | Subtype at 0x8B |
|---|---|---|
| 0 | AV layer: footage, solid, composition, null or adjustment layer | 0 |
| 1 | Light | 0 Parallel, 1 Spot, 2 Point, 3 Ambient, 4 Environment (the SDK’s AEGP_LightType order) |
| 2 | Camera | 0 |
| 3 | Text | 0 |
| 4 | Shape | 0 |
| 5 | 3D model | 0 |
| 7 | Parametric mesh | 0 Cube, 1 Sphere, 2 Plane, 3 Torus, 4 Cone, 5 Cylinder |
Type 6 has not been seen.
mdla and mdlv: 3D model layers
Layers of type 5 carry two more chunks after LIST:Gide. Neither is
understood.
| Chunk | Size | Contents |
|---|---|---|
mdla | 256 | Unknown; all zero in the three samples that have it. |
mdlv | 8 | A little-endian 64-bit value, 1 in the three samples. |
Example
Reading a layer in a 24 frames a second composition (timebase 24576): a start time of
1200 ÷ 600 is 2 seconds; an in point of 24576 ÷ 24576 is 1 second of layer time; a
stretch of 200 ÷ 100 is 200 %. The layer therefore appears in the composition at 2 + 1 ×
200 ÷ 100 = 4 seconds. Flags bytes 04 00 07 at 0x25 to 0x27 mean
Pixel Motion frame blending selected (but frame blending off), no flags B, and video,
audio and effects on.