Everything a layer animates (transform, masks, effects, text, shape contents, markers)
is a tree under the layer’s root property group. Groups are LIST:tdgp lists
of match-name and body pairs; the leaves are property streams, LIST:tdbs
lists that hold either one static value (cdat) or a keyframe list
(LIST:list with lhd3 and ldat). This page follows
the py_aep specification,
measured on files from AE CC 2018 to AE 2026. All values are big-endian unless marked
little-endian.
LIST:tdgp: property group
The layer’s root group and every named group below it: Transform, Masks, Effects, one mask, one effect’s parameters, a shape group, a layer style.
| Child | Occurs | Meaning |
|---|---|---|
tdsb | 1, first | Group flags. |
tdsn | 1, second | Display name, a wrapper around one Utf8 (see below). |
tdmn and body | 0 or more | One child property: its match name, then the chunks that make up the child. |
tdmn ADBE Group End | 1, last | Terminator, with no body. A group without it makes After Effects refuse the file. |
A child’s body is every chunk between its tdmn and the next one:
| Body | Child |
|---|---|
LIST:tdbs | A property stream (number, point, colour and so on). |
LIST:tdgp | A sub-group. |
LIST:otst | ADBE Orientation (below). |
LIST:om-s | A mask or shape path (ADBE Mask Shape, ADBE Vector Shape). |
mkif and LIST:tdgp | A mask (ADBE Mask Atom): its settings, then its properties. |
LIST:mrst | Layer markers (ADBE Marker). |
LIST:btds | A text document (ADBE Text Document). |
LIST:GCst | Gradient colours of a shape or layer style. |
LIST:sspc | One effect inside ADBE Effect Parade. |
LIST:OvG2 and LIST:tdgp | ADBE Layer Overrides. |
blsv, blsi and LIST:tdbs | ADBE Layer Source Alternate. |
LIST:tdbs and vfdn | A variable-font axis of a text animator (AE 2026). |
mtov, Utf8 and LIST:tdgp | A 3D model material. |
The group’s tdsn holds the six characters -_0_/- when the
group has no name of its own (After Effects then shows the match name’s localised
default), the visible name for groups that carry one (Mask 1,
Group 1, Fill 1, a renamed effect), and an empty string on a
layer’s root group.
Order and omitted children
After Effects reads a group’s children by match name in a fixed order, scanning forwards; a child that appears too early is skipped as if absent. The order AE 2025 and 2026 write:
- Root group:
ADBE Marker; thenADBE Time Remapping(AV layers),ADBE Text Properties(text) orADBE Root Vectors Group(shape);ADBE Mask Parade,ADBE Effect Parade,ADBE Transform Group,ADBE Light Options GrouporADBE Camera Options Group,ADBE Layer Styles,ADBE Plane Options Group,ADBE Extrsn Options Group,ADBE Material Options Group,ADBE Audio Group,ADBE Data Group,ADBE Layer Overrides,ADBE Layer Sets,ADBE Source Options Group,ADBE Group End. AE 15 has no Layer Sets or Source Options Group. - Transform group:
ADBE Anchor Point,ADBE Position,ADBE Position_0,_1,_2,ADBE Scale,ADBE Orientation,ADBE Rotate X,Y,Z,ADBE Opacity,ADBE Envir Appear in Reflect,ADBE Group End.
Not every property is written. Empty Masks, Effects, Motion Trackers and Text Animators groups are left out, and so are many streams that hold their default: most AV layers in the samples have no Anchor Point, Position or Scale stream at all. A reader supplies the default for a missing property.
tdmn: match name (40 bytes)
The match name of the child that follows, ASCII, padded with zeros to 40 bytes
(ADBE Position, ADBE Effect Parade). Effect parameters are named
after the effect with a four-digit index, as in ADBE Gaussian Blur 2-0001;
-0000 is a hidden first parameter that every effect carries.
tdmn also appears in LIST:parT and LIST:EfDf.
tdsb: group and stream flags (4 bytes)
| Bit | Mask | Meaning |
|---|---|---|
| 0 | 0x00000001 | Enabled. Clear disables the group or stream (a switched-off layer style stores 0x2). |
| 1 | 0x00000002 | Hidden in the Timeline because it does not apply (a 3D-only property on a 2D layer, the unused half of a separable Position, a parameter the effect hides). Recomputed on open. |
| 4 | 0x00000010 | Unknown; on a few groups and streams such as ADBE Plane Options Group. |
| 9 | 0x00000200 | Unknown; on some transform streams in production projects only. |
| 10 | 0x00000400 | On ADBE Root Vectors Group, ADBE Vectors Group and ADBE Data Group (inferred: listed even when empty). |
| 11 | 0x00000800 | Dimensions separated, on ADBE Position. |
| 13 | 0x00002000 | Constrain proportions off on ADBE Scale or ADBE Mask Feather (polarity inferred). |
| 24 | 0x01000000 | RotoBezier, on a mask or shape path stream. |
All other bits are 0 in about 1.1 million samples. A visible stream stores 0x1 and a
hidden one 0x3. An unseparated Position stores 0x1 on ADBE Position and 0x3
on _0, _1 and _2; once separated, 0x803 on the
leader and 0x1 on the three followers, which then hold the values and keyframes.
LIST:tdbs: property stream
| Child | Occurs | Meaning |
|---|---|---|
tdsb | 1 | Stream flags. |
tdsn | 1 | Display name: -_0_/- for the default, empty on an effect’s -0000 parameter, or a parameter name. |
tdb4 | 1 | Stream metadata. |
cdat or LIST:list | 1 | The static value, or the keyframes. |
Utf8 | 0–1 | The expression (an expr chunk, NUL-terminated, in files older than version 92.0). |
tdli | 0–1 | Mask reference of an effect path parameter. |
tdum and tduM | 0–1 pair | Minimum and maximum. |
tdpi and tdps | 0–1 pair | Layer reference. |
The order is always tdsb tdsn tdb4 (cdat | LIST:list) [Utf8] [tdum tduM | tdpi
tdps | tdli].
Stream kinds
The value layout depends on tdb4: its dimension count, bit 1 of its stream
flags (the single-ease layout) and its valueless flag.
| Kind | Examples | Dims | Flags static / animated | Valueless | cdat | Keyframe item | Value held in |
|---|---|---|---|---|---|---|---|
| 1-D number | Opacity, Rotation, sliders, menus | 1 | 0x01 / 0x00 | no | 40 | 48 | – |
| 2-D number | shape Size, Mask Feather | 2 | 0x01 / 0x00 | no | 80 | 88 | – |
| 3-D number | Scale | 3 | 0x01 / 0x00 | no | 120 | 128 | – |
| 2-D spatial | effect points, shape Position | 2 | 0x0F / 0x0E | no | 48 | 104 | – |
| 3-D spatial | Position, Anchor Point | 3 | 0x0F / 0x0E | no | 72 | 128 | – |
| Colour | Shadow Color, Color Control | 4 | 0x07 / 0x06 | no | 96 | 152 | – |
| Orientation | ADBE Orientation | 1 | 0x07 / 0x06 | yes | 24 | 80 | LIST:otky |
| Path, gradient | mask and shape paths, gradient colours | 1 | 0x07 / 0x06 | yes | 4 | 64 | LIST:omks, LIST:GCky |
| Text, markers | ADBE Text Document, ADBE Marker | 1 | 0x01 / 0x00 | yes | 4 | 16 | LIST:btdk, LIST:mrky |
| Layer source alternate | after blsv and blsi | 1 | 0x01 | yes | 4 | – | – |
Sizes are in bytes. Valueless streams keep their real value in the container named in the
last column; their cdat and the value part of their keyframes are
placeholders.
Expressions
An expression is a Utf8 right after the value. tdb4 records
it twice: 0x78 holds 0x01000000 exactly when the expression is present, and
bit 0 of 0x77 is set when it is disabled.
Static and animated
When the first keyframe is added, After Effects replaces the cdat with a
keyframe list and changes only these bytes of tdb4: it clears bit 0 of the
stream flags, sets 0x44 to 1, clears bit 0 of 0x4F, and zeroes the stored keyframe
record at 0x48 to 0x73. Removing the last keyframe does the reverse, and the record keeps
the removed key’s interpolation and spatial flags. A stream that was never set also has
zeros for the time base and category, which become real values once it is animated.
tdb4: stream metadata (124 bytes)
| Offset | Size | Type | Name | Meaning |
|---|---|---|---|---|
| 0x00 | 2 | u2 | Magic | 0xDB99. |
| 0x02 | 2 | u2 | Dimensions | 1 to 3, 4 for a colour. Orientation stores 1. |
| 0x04 | 2 | u2 | Stream flags | See below. |
| 0x06 | 2 | u2 | Spatial setting | Inferred. 3 on spatial streams, 1 on paths and layer-style colours, 0 elsewhere. |
| 0x08 | 2 | u2 | Spatial mask | Inferred. 0xFFFF on spatial streams and many others, 1 on most numbers, 2 on colours, paths and some angles, 6 on Orientation. |
| 0x0A | 2 | u2 | Interpolation mask | Which interpolations the stream allows (inferred: bit 0 Linear, bit 1 Bezier, bit 2 Hold). 0xFFFF on most streams, 7 on Orientation and paths, 4 on hold-only streams (menus, checkboxes, text, markers), 0 on streams that cannot be animated. |
| 0x0C | 4 | u4 | Time base | Keyframe time units per second of layer time. The composition timebase up to 100 % stretch; above it, floor(timebase × s) with s the stretch ÷ 100 in 16.16 fixed point, capped at 115200. Never 0. |
| 0x10 | 8 | f8 | Arc accuracy | Tolerance for measuring a spatial segment: 0.0001 for pixel values, 6.25e-12 for points stored as a fraction of the layer. |
| 0x18 | 8 | f8 | X multiplier | Applied before measuring a motion path: the pixel aspect ratio on Position and Anchor Point, width ÷ height on a point stored as a fraction of the layer; 1.0 elsewhere. |
| 0x20 | 8 | f8 | Y multiplier | 1.0 in the samples. |
| 0x28 | 8 | f8 | Z multiplier | 1.0 in the samples. |
| 0x30 | 8 | f8 | Fourth multiplier | 1.0 in the samples. |
| 0x38 | 2 | u2 | Value flags | Bit 0: valueless stream (text, paths, markers, gradients, Orientation, layer source alternate, an effect’s arbitrary-data parameter). |
| 0x3A | 2 | u2 | Type flags | See below. |
| 0x3C | 4 | u4 LE | Category | See below. The only little-endian field. |
| 0x40 | 4 | bytes | 0 in the samples. | |
| 0x44 | 1 | u1 | Animated | 1 when the stream holds a keyframe list. |
| 0x45 | 3 | bytes | 0 in the samples. | |
| 0x48 | 4 | s4 | Record time | 0 on layer properties; on static effect parameters 0x80000000 (no time), 0 or a time. |
| 0x4C | 1 | u1 | Record in interpolation | 1 Linear, 2 Bezier, 3 Hold, or 0. |
| 0x4D | 1 | u1 | Record out interpolation | The same. |
| 0x4E | 2 | u2 | Record key flags | Bit 0 is set exactly on static streams whose stream flags have bit 1; 0 on animated streams. |
| 0x50 | 4 | u4 | Record spatial flags | 0 to 3 or 7 (inferred: as in a keyframe item). |
| 0x54 | 8 | f8 | Record in speed | |
| 0x5C | 8 | f8 | Record in influence | |
| 0x64 | 8 | f8 | Record out speed | |
| 0x6C | 8 | f8 | Record out influence | |
| 0x74 | 4 | u4 | Expression flags | Bit 0: expression disabled. Also set on many Position and Anchor Point streams without one. |
| 0x78 | 4 | u4 | Has expression | 0x01000000 when an expression follows the value, else 0. |
Stream flags (0x04)
| Bit | Mask | Meaning |
|---|---|---|
| 0 | 0x0001 | Static: no keyframes. |
| 1 | 0x0002 | Single-ease layout: one temporal ease for the whole value, and 3 doubles a dimension in cdat instead of 5. On spatial streams, colours, Orientation, paths and gradients. |
| 2 | 0x0004 | Always set with bit 1; meaning unknown. |
| 3 | 0x0008 | Spatial: the values form a motion path and keys can rove. |
Type flags (0x3B) and category (0x3C)
| 0x3B | 0x3C | Streams |
|---|---|---|
| 0x08 | 9 | Most numbers: Position, Anchor Point, Scale, Rotation, Opacity, Time Remapping, many sliders. |
| 0x04 | 4 | Menus and checkboxes, and an effect’s -0000 parameter. |
| 0x04 | 6 | Layer-style angles, Mask Feather, Mask Opacity, some effect parameters. |
| 0x04 | 8 | Camera iris options, stroke width and miter limit, star radii and roundness. |
| 0x01 | 1 | Colours. |
| 0x08 | 0 | Valueless streams. |
| 0x18 | 0 | ADBE Orientation. |
Bit 0 of 0x3B marks a colour and bit 4 appears only on Orientation. Bits 2 and 3 and the category values are not decoded beyond this table.
cdat: static value
- Without stream-flag bit 1 (numbers, menus): dimensions × 5 doubles. The first dims are the value; the rest, in the places of the eases, are 0. 40, 80 or 120 bytes.
- With stream-flag bit 1 (spatial, colour): dimensions × 3 doubles: the value, then in and out tangents, which are 0. 48 or 72 bytes for points, 96 for a colour.
- Orientation: three little-endian doubles, the X, Y and Z angles in degrees (24 bytes).
- Other valueless streams: 4 zero bytes.
| Stream | Stored as |
|---|---|
ADBE Opacity, ADBE Scale | A fraction: 1.0 is 100 %. |
| Colours | Four doubles A, R, G, B from 0 to 255. |
| Effect points | A fraction of the layer’s width and height (0.5 is the centre). |
| Position, Anchor Point, rotations and most others | The units the user sees: pixels, degrees, per cent, seconds. |
tdum, tduM, tdli, tdpi and tdps
| Chunk | Size | Type | Meaning |
|---|---|---|---|
tdum | 8 | f8 | Minimum of the stream. |
tduM | 8 | f8 | Maximum of the stream. |
tdli | 4 | s4 | Mask reference of an effect path parameter: inferred 0 for none, n for the layer’s nth mask. |
tdpi | 4 | s4 | A layer ID. On an effect’s -0000 parameter, the layer the effect is on; on a layer parameter, the referenced layer, 0 for none. |
tdps | 4 | s4 | Unknown; 0, or −1 in a few samples. |
The bounds pair appears on numeric layer streams that are not angles, menus, checkboxes,
colours or spatial streams, for example Opacity 0.0 / 100.0 (in the user’s units, though
the value itself is stored as a fraction), Index of Refraction 1.0 / 2.0, Plane
Subdivision 2.0 / 256.0, and 0.0 / 0.0 as a placeholder on Scale, separated Position and
Time Remapping. Effect parameters keep their real bounds in pard.
LIST:list and lhd3: typed lists
A header and, unless the list is empty, the items. Under a stream it is the keyframe list; it also holds guides, mask and shape vertices and render queue records.
| Offset | Size | Type | Name | Meaning |
|---|---|---|---|---|
| 0x00 | 4 | u4 | Magic | 0x00D00BEE. |
| 0x04 | 4 | u4 | 0 in the samples. | |
| 0x08 | 4 | u4 | Count | Number of items. ldat is exactly count × item size bytes. |
| 0x0C | 4 | u4 | Blocks | ceil(count ÷ block size), at least 1. |
| 0x10 | 4 | u4 | Item size | Bytes per item: keyframes 16 to 152, guides 16, vertices 8, render queue records 2246 and 128. |
| 0x14 | 4 | u4 | Item type | 4 keyframes and path vertices, 2 guides, 1 render queue and output module records. |
| 0x18 | 4 | u4 | The number of blocks when the block size is 1, else 1. | |
| 0x1C | 4 | u4 | Capacity | Blocks × block size. |
| 0x20 | 20 | bytes | 0 in the samples. |
The block size is 4 for keyframes and vertices, 2 for guides and 1 for render queue
records. An empty guide list stores count 0 with 1, 1, 2 in the counters, and has no
ldat. After Effects checks the counters against the count and refuses a file
where they disagree.
ldat: keyframe items
Keyframes are sorted by time. Every item starts with the same 8 bytes:
| Offset | Size | Type | Name | Meaning |
|---|---|---|---|---|
| 0x00 | 4 | s4 | Time | In tdb4 time-base units of layer time, from the layer’s start. Can be negative; 0x80000000 means no time. |
| 0x04 | 1 | u1 | In interpolation | 1 Linear, 2 Bezier, 3 Hold (the SDK’s AEGP_KeyInterp). |
| 0x05 | 1 | u1 | Out interpolation | The same. |
| 0x06 | 2 | u2 | Key flags | See below. |
| Bits | Mask | Meaning |
|---|---|---|
| 0–2 | 0x0007 | 7 on every spatial key, 1 on colour, Orientation, path and gradient keys, 0 on others; meaning unknown. |
| 3 | 0x0008 | Temporal continuous. |
| 4 | 0x0010 | Temporal auto-Bezier. |
| 5 | 0x0020 | Roving (spatial streams only). |
| 6–10 | 0x07C0 | Label colour, 0 to 16: (flags >> 6) & 0x1F. |
| 11–15 | 0xF800 | 0 in the samples. |
Numbers, text and markers (stream-flag bit 1 clear)
From 0x08: the value, then the in speed, in influence, out speed and out influence, each as dims doubles. A 1-D item is 48 bytes, 2-D 88 and 3-D 128. Influences are fractions (0.33 is 33 %); After Effects’ default influence is the decimal 0.16666666667. Text and marker items are 16 bytes: 8 bytes at 0x08 that carry nothing, and interpolation 3 / 3 (hold).
Spatial, colour, Orientation, paths and gradients (bit 1 set)
| Offset | Size | Type | Name | Meaning |
|---|---|---|---|---|
| 0x08 | 4 | u4 | Spatial flags | Bit 0 spatial continuous, bit 1 spatial auto-Bezier. |
| 0x0C | 4 | u4 | 0 in the samples. | |
| 0x10 | 8 | f8 | Segment length | To the next key, 0 on the last: arc length for spatial streams, colour distance in 0–255 units for colours, duration in seconds for Orientation, paths and gradients. May be 0. |
| 0x18 | 8 | f8 | In speed | One value; along the path for spatial streams. |
| 0x20 | 8 | f8 | In influence | Fraction. |
| 0x28 | 8 | f8 | Out speed | |
| 0x30 | 8 | f8 | Out influence | Fraction. |
| 0x38 | varies | Value | See below. |
- Spatial: dims doubles of value, then in tangent and out tangent as offsets from the value. 104 bytes for 2-D, 128 for 3-D.
- Colour: A, R, G, B (0–255), then 8 doubles that are 0. 152 bytes.
- Orientation: X, Y and Z angles as three little-endian doubles. 80 bytes.
- Paths and gradients: 8 bytes that carry nothing; the value is in
LIST:omksorLIST:GCky. 64 bytes.
Interpreting keyframes
- Time. A key’s composition time is start time + (time ÷ time base) × stretch ÷ 100. Times need not fall on frames.
- Segment type. The segment from key A to key B uses A’s out type and B’s in type. Hold on A’s out side keeps A’s value until B.
- Temporal Bezier. For each dimension, with dt = tB − tA, A’s out speed so and influence io, and B’s in speed si and influence ii, the curve’s control points are (tA, vA), (tA + dt·io, vA + dt·io·so), (tB − dt·ii, vB − dt·ii·si) and (tB, vB).
- Spatial streams. The path from A to B is the cubic through vA,
vA + A’s out tangent, vB + B’s in tangent and vB. The ease maps time to distance along
it, with the same handle rule in (seconds, distance) from (0, 0) to (dt, arc length).
The length is measured with each dimension scaled by the
tdb4multipliers. - Auto-Bezier. With key flag bit 4, the stored ease is ignored: each side uses the slope between the neighbouring keys with influence 0.16666666667. With spatial flag bit 1, the tangents are out = (next − previous) ÷ 6 and in = −out.
- Continuous. With key flag bit 3 the out speed equals the in speed.
- Roving. A roving key’s stored time is derived from its share of the arc length between the surrounding fixed keys.
- Switching a key between Linear, Hold and Bezier does not rewrite its stored speeds and influences.
Orientation: LIST:otst, LIST:otky and otda
ADBE Orientation’s body is LIST:otst: first its
LIST:tdbs stream (one dimension, valueless, type flags 0x18), then
LIST:otky with one otda per keyframe, or one when static.
otda is 24 bytes: the X, Y and Z angles in degrees as big-endian doubles. The
stream’s cdat or keyframe values hold the same angles little-endian. A
camera’s untouched Orientation can also be a bare 3-dimension LIST:tdbs
without LIST:otst.
Example
A static Opacity of 50 % on an unstretched layer at 24 frames a second has a
tdb4 with dimensions 1, stream flags 0x0001, time base 24576 (bytes
00 00 60 00 at 0x0C), type flags 0x08 and category 9; its cdat
is 40 bytes beginning 3F E0 00 00 00 00 00 00 (0.5) followed by four zero
doubles; then tdum 0.0 and tduM 100.0. A keyframe at 1 second
on the same stream has time 24576 (00 00 60 00).