# AVM reference software

Canonical URL: https://encode.wiki/tools/software-encoders/avm/
Content version: ca42e61ede0a24f789d7287a0001244ad22f4abf
Status: current
License: CC BY-SA 4.0
Checksum (SHA-256): 3ebdb74503c0035ece02792156933d34ac49c375bd2f46d67363c04c8caa3ff5

> **Repository:** [AOMediaCodec/avm](https://github.com/AOMediaCodec/avm). AVM (AOM Video Model) is the reference software for AV2 codec from Alliance for Open Media (https://aomedia.org/). Latest tag: [v1.0.0](https://github.com/AOMediaCodec/avm/tree/v1.0.0), May 26, 2026. Last commit: Oct 8, 2026. License: BSD-3-Clause-Clear. Stars: 232.

AVM (AOM Video Model) is the Alliance for Open Media's reference software for [AV2](/codecs/video/av2/), the successor to AV1. It contains the reference encoder `avmenc` and decoder `avmdec`. Use it to experiment with AV2 coding tools, to produce and check conformance streams, or to see roughly what AV2 can do. It is not a production encoder. It is very slow, and almost nothing outside AVM can play its output yet.

## Status

AOMedia finalised the AV2 v1.0.0 specification on 28 May 2026 and announced it in June 2026. AVM **v1.0.0**, tagged the day before the specification ("First released version of AV2"), is the matching reference release. Development continues on the `main` branch of the [GitHub repository](https://github.com/AOMediaCodec/avm); the old GitLab repository is marked deprecated.

Before v1.0.0, AVM went through `research-v*` tags whose bitstreams changed between versions. Older guides that describe AVM producing AV1 (`av01`) streams, or binaries named `aomenc`, are out of date.

## Build

You need CMake 3.16+, a C/C++ compiler, Perl, Git, and Yasm or NASM on x86:

```sh
git clone --branch v1.0.0 https://github.com/AOMediaCodec/avm.git
cmake -S avm -B avm-build -DCMAKE_BUILD_TYPE=Release -DENABLE_TESTS=0
cmake --build avm-build -j"$(nproc)"
```

This produces `avm-build/avmenc` and `avm-build/avmdec`. The build also compiles Abseil and other dependencies, so the first build takes a while.

## Encode and decode

`avmenc` reads Y4M (or raw YUV with explicit dimensions). This encodes a short constant-QP test clip:

```sh
avmenc --end-usage=q --qp=160 --cpu-used=6 --limit=60 -o output.ivf input.y4m
avmdec -o decoded.y4m output.ivf
```

From another source, pipe 10-bit Y4M through FFmpeg:

```sh
ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -1 -f yuv4mpegpipe - | \
  avmenc --end-usage=q --qp=160 --cpu-used=6 --limit=60 -o output.ivf -
```

What matters:

- **Set `--end-usage=q`.** The default rate control is VBR, so `--qp` on its own does not give a constant-QP encode.
- **`--qp` is on a 0–255 scale** at every bit depth; only `--min-qp`/`--max-qp` reach down to −48 at 10-bit. Lower means higher quality. AV1 CRF/cq-level values do not carry over.
- **`--cpu-used` runs from 0 to 9 and defaults to 0**, the slowest setting. Even `--cpu-used=6` encodes well under 1 fps at 320×180 on a modern desktop CPU, so test with short clips (`--limit`) and small resolutions.
- **Only one pass** is supported (`--passes` must be 1).
- **Output format follows the file extension.** `.ivf` writes IVF, `.obu` writes a raw OBU stream, and anything else writes WebM. No standard container mapping for AV2 exists yet (AOMedia has announced a planned ISO BMFF binding), so stick to IVF or OBU.

To play the result, decode it with `avmdec` to Y4M and watch that. As of October 2026, no mainstream player, browser or hardware decoder supports AV2. VideoLAN's [dav2d](https://code.videolan.org/videolan/dav2d) software decoder is in early development.

For codec research, the AV2 common test conditions (CTC) document and test sequences are linked from the repository README.

## Complete native parameter reference

All 250 option spellings that `avmenc` accepts at AVM v1.0.0 (commit `966a7d7cd6fc`), grouped by purpose. Defaults are those of a plain command line without `--cfg`. On/off tools take `0` or `1`. Options marked “not shown in `--help`” are parsed but missing from the help text. `--qp` uses the 0–255 scale at every bit depth; `--min-qp` and `--max-qp` extend down to −48 at 10-bit.

<details>
<summary>Application and output (24 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--help` | off | Print the full option list and exit. |
| `--cfg`, `-c` | unset | Read coding-tool settings from a `key = value` file (format: `Sample.cfg` in the source tree). Only the first `--cfg` counts, and command-line options override it. Tools the file leaves out take the config-file defaults, which differ from the command-line ones in two places: global motion on and 256×256 superblocks. |
| `--debug`, `-D` | off | Deterministic WebM output: omits the encoder version and settings and uses a fixed track UID, so repeated encodes are byte-identical. |
| `--output`, `-o` | required | Output file, or `-` for stdout. The file name can also pick the container; see `--webm`. WebM needs a seekable output, so pipe IVF or OBU. |
| `--recon` | unset | Also write the encoder's reconstructed frames to this file as headerless planar YUV. |
| `--codec` | av2 | Encoder to use. AVM contains only `av2`. |
| `--passes`, `-p` | 1 | Number of passes. Only 1 is accepted. |
| `--pass` | 0 (all passes) | Run a single pass. With one pass, `0` and `1` both run it; other values are rejected. |
| `--fpf` | not parsed | Listed in `--help`, but avmenc never parses it: any use stops with “Unrecognized option”. |
| `--limit` | 0 (all frames) | Stop after this many input frames. `--limit=1` produces a still picture with the reduced still-picture header. |
| `--skip` | 0 | Discard this many frames from the start of the input. |
| `--step` | 1 | Encode only every Nth input frame after `--skip`. Must be at least 1. |
| `--good` | on (usage 0) | Good-quality usage, the only usage AVM has. Same as `--usage=0`. |
| `--quiet`, `-q` | off | Don't print per-frame progress. |
| `--verbose`, `-v` | off | Print the input format and the complete coding-tool configuration before encoding. |
| `--psnr` | 0 (off) | Report PSNR: `1` at the input bit depth, `2` at the coded bit depth. The bare flag means `2`, which falls back to `1` when the two depths are equal. |
| `--webm` | WebM, unless -o ends in .ivf or .obu | Write WebM. WebM is the default container, but an `-o` name ending in lowercase `.ivf` or `.obu` switches to IVF or a raw OBU stream. After `--webm`, later `-o` extensions are ignored. Requires a build with WebM I/O (on by default); without it avmenc writes OBU. |
| `--ivf` | off | Write IVF. The container flags and `-o` are applied left to right, so `--obu -o out.ivf` writes IVF and `-o out.ivf --obu` writes OBU. |
| `--obu` | off | Write a raw OBU stream with no container, like an `.obu` output name. Same ordering rule as `--ivf`. |
| `--q-hist` | 0 (off) | At the end, print a histogram of frame quantizers with this many buckets. |
| `--rate-hist` | 0 (off) | At the end, print a bitrate histogram with this many buckets. |
| `--disable-warnings` | off | Skip avmenc's checks for suspicious settings. |
| `--disable-warning-prompt`, `-y` | off | Print those warnings but don't stop to ask whether to continue. |
| `--test-decode` | off | Decode every frame inside avmenc and compare it with the encoder's reconstruction: `off`, `warn` (report mismatches) or `fatal` (stop at the first). |

</details>

<details>
<summary>Input, profile and bit depth (20 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--i420` | on for raw input | Raw input is 4:2:0 I420. Y4M input carries its own format, so the four layout flags only matter for raw YUV. |
| `--yv12` | off | Raw input is 4:2:0 with the V plane before U. |
| `--i422` | off | Raw input is 4:2:2; the profile is raised to 3. |
| `--i444` | off | Raw input is 4:4:4; the profile is raised to 4. |
| `--width`, `-w` | from Y4M header | Frame width in pixels. Required for raw input. |
| `--height`, `-h` | from Y4M header | Frame height in pixels. Required for raw input. |
| `--fps` | from Y4M; 30/1 for raw | Frame rate as `num/den`, overriding the Y4M header. It also sets the stream timebase. |
| `--timebase` | 1/frame rate | No effect: avmenc always replaces the timebase with the inverse of the frame rate. |
| `--bit-depth`, `-b` | 8 (raised to the input depth) | Coded bit depth, `8` or `10`. `12` is listed but rejected unless the build has test-only 12-bit support. |
| `--input-bit-depth` | from Y4M, else --bit-depth | Bit depth of raw input samples. If it is lower than `--bit-depth`, samples are shifted up before encoding. |
| `--input-chroma-subsampling-x` | 0 | Horizontal chroma subsampling (0–1) for the test-only 12-bit profile. Normal builds take subsampling from the profile. |
| `--input-chroma-subsampling-y` | 0 | Vertical chroma subsampling (0–1) for the test-only 12-bit profile. |
| `--monochrome` | off | Code luma only (4:0:0). |
| `--profile` | 0 | Bitstream profile: 0–2 are the Main 4:2:0 10-bit profiles (`MAIN_420_10_IP0`–`IP2`), 3 is 4:2:2 and 4 is 4:4:4. avmenc raises a 4:2:0 profile automatically for 4:2:2 or 4:4:4 input. |
| `--usage`, `-u` | 0 (good quality) | Usage preset. Only `0` exists; other values fail with “Failed to get config”. |
| `--forced_max_frame_width` | 0 (frame width) | Signal a larger maximum frame width in the sequence header than the first frame needs. Note the underscores. |
| `--forced_max_frame_height` | 0 (frame height) | Same for the maximum frame height. |
| `--stereo-mode` | mono | Stereo 3D layout written to the WebM header: `mono`, `left-right`, `bottom-top`, `top-bottom` or `right-left`. Requires a build with WebM I/O. |
| `--force-video-mode` | 0 | With `--limit=1`, code a normal one-frame video stream instead of a still picture. |
| `--full-still-picture-hdr` | off | For still pictures, write the full sequence header instead of the reduced one. |

</details>

<details>
<summary>Threads and tiles (8 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--threads`, `-t` | 0 (one thread) | Maximum worker threads, up to 64. `0` and `1` both run single-threaded. Extra threads need `--row-mt` or several tiles. |
| `--row-mt` | 1 | Row-based multithreading inside tiles, `0` or `1`. |
| `--tile-columns` | 0 | Tile columns as log2, 0–6 (1–64 columns), evenly spaced and limited by the frame width. |
| `--tile-rows` | 0 | Tile rows as log2, 0–6. |
| `--tile-width` | unset (uniform tiles) | Explicit tile-column widths in superblocks, comma-separated; the list repeats until the frame is covered. Overrides `--tile-columns`. Not shown in `--help`. |
| `--tile-height` | unset (uniform tiles) | Explicit tile-row heights in superblocks, as for `--tile-width`. Not shown in `--help`. |
| `--num-tile-groups` | 1 | Split each frame's tiles into up to this many tile-group OBUs. |
| `--mtu-size` | 0 (off) | Target maximum tile-group size in bytes for packetised transport. Overrides `--num-tile-groups`. |

</details>

<details>
<summary>Rate control and quantizer (28 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--end-usage` | vbr | Rate control: `vbr`, `cbr`, `cq` (constrained quality: `--qp` level under a bitrate cap) or `q` (constant quality from `--qp`). Use `q` for quality-targeted tests. |
| `--qp` | 40 | Quality level for `q` and `cq`, 0–255 at every bit depth; lower is better. At 10-bit the encoder offsets it internally, but unlike `--min-qp`/`--max-qp` it rejects negative values. |
| `--target-bitrate` | 256 | Target bitrate in kbit/s for `vbr`, `cbr` and `cq`. |
| `--min-qp` | 0 | Best (lowest) quantizer allowed: −48 to 255 at 10-bit, 0 to 255 at 8-bit. Setting `--min-qp` and `--max-qp` both to the bottom of the range turns on lossless coding. |
| `--max-qp` | 255 | Worst (highest) quantizer allowed, same scale as `--min-qp`. |
| `--cq-level` | unset | Deprecated 0–63 form of `--qp`, mapped to the 0–255 scale with a warning. Not shown in `--help`. |
| `--min-q` | unset | Deprecated 0–63 form of `--min-qp`, mapped with a warning. |
| `--max-q` | unset | Deprecated 0–63 form of `--max-qp`, mapped with a warning. |
| `--lossless` | 0 | `1` codes losslessly; TCQ, parity hiding, secondary and data-driven transforms are turned off. Requires `--aq-mode=0` and `--enable-chroma-deltaq=0`. |
| `--undershoot-pct` | 25 | How far below the target bitrate, in percent (0–100), rate control lets the encode run before correcting. |
| `--overshoot-pct` | 25 | How far above the target, in percent (0–100). |
| `--buf-sz` | 6000 | Decoder buffer size in ms for `cbr`, `cq` and `q`. VBR uses a fixed 240000 ms model and ignores the three buffer options. |
| `--buf-initial-sz` | 4000 | Initial buffer fullness in ms (non-VBR). |
| `--buf-optimal-sz` | 5000 | Target buffer fullness in ms (non-VBR). |
| `--minsection-pct` | 0 | Minimum bitrate of a frame group as a percentage of the target (VBR). avmenc prints a one-pass warning when it is set. |
| `--maxsection-pct` | 2000 | Maximum bitrate of a frame group as a percentage of the target (VBR). |
| `--drop-frame` | 0 (off) | Drop frames when the rate-control buffer falls below this fullness, in percent (0–100). |
| `--max-intra-rate` | 0 (no cap) | Cap a keyframe's size at this percentage of the average per-frame budget. |
| `--max-inter-rate` | 0 (no cap) | Cap an inter frame's size at this percentage of the average per-frame budget. |
| `--gf-cbr-boost` | 0 | Extra bits for golden/alt-ref frames in CBR, in percent. |
| `--vbr-corpus-complexity-lap` | 0 (off) | VBR only: average corpus complexity per macroblock (0–10000) used by lookahead rate allocation. Other modes reject a non-zero value. |
| `--use-fixed-qp-offsets` | 0 (adaptive) | `q` mode only: use fixed QP offsets per pyramid level instead of adaptive ones. `1` uses modelled offsets, `2` q-dependent modelled offsets. Not shown in `--help`. |
| `--fixed-qp-offsets` | unset | `q` mode only: comma-separated QP offsets for the keyframe, alt-ref and four deeper pyramid levels. At least two values; missing levels are halved from the previous one. Implies `--use-fixed-qp-offsets=1`. Not shown in `--help`. |
| `--min-cr` | 0 (off) | Minimum compression ratio ×100: the encoder tries to keep each frame's compression ratio above value/100. |
| `--frame-boost` | 0 | Accepted (0–1) but not used by the v1.0.0 encoder. |
| `--resize-mode` | 0 (off) | Frame resizing: 0 none, 1 fixed scale, 2 random, 3 dynamic (rate-control driven), 4 the fixed CTC pattern, 5 a bridge-frame test pattern. Resizing turns off TPL and BRU. |
| `--resize-denominator` | 8 (no scaling) | Scale for `--resize-mode=1` as 8/denominator, 8–16. |
| `--resize-kf-denominator` | 8 (no scaling) | Keyframe scale for `--resize-mode=1`, 8–16. |

</details>

<details>
<summary>Speed, tuning and adaptive quantization (11 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--cpu-used` | 0 | Speed preset, 0–9; higher is faster, 0 is slowest. From 2 up, TCQ is switched off and many searches are pruned. |
| `--tune` | psnr | Distortion metric for rate–distortion decisions: `psnr` or `ssim`. `vmaf`, `vmaf_neg`, `vmaf_with_preprocessing` and `vmaf_without_preprocessing` require a build with VMAF. |
| `--vmaf-model-path` | /usr/local/share/model/vmaf_v0.6.1.json | VMAF model file for the VMAF tunings. Requires a build with VMAF. |
| `--tune-content` | default | Content type: `default` or `screen` (desktop capture, slides, games). |
| `--enable-tpl-model` | 1 | Temporal dependency model (TPL), which spends more bits on blocks that later frames reference. Required by `--deltaq-mode`; turned off when resizing. |
| `--deltaq-mode` | 1 (objective) | Per-superblock QP modulation: 0 off, 1 objective (TPL-based), 2 perceptual. Needs `--enable-tpl-model=1`. |
| `--aq-mode` | 0 (off) | Segment-based adaptive quantization: 0 off, 1 variance, 2 complexity, 3 cyclic refresh. |
| `--enable-chroma-deltaq` | 0 | Allow separate delta QP for the chroma planes. |
| `--enable-ext-seg` | 0 | Allow 16 segments instead of 8. |
| `--noise-sensitivity` | 0 | Accepted (0–6) but not used by the v1.0.0 encoder. |
| `--static-thresh` | 0 | Accepted but not used by the v1.0.0 encoder. |

</details>

<details>
<summary>Keyframes, frame groups and references (30 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--kf-max-dist` | 9999 | Maximum keyframe interval in frames. `0` makes every frame a keyframe (all-intra), which also disables TIP, optical-flow refinement, BRU and sub-block deblocking. |
| `--kf-min-dist` | 0 | Minimum keyframe interval in frames. Equal to `--kf-max-dist` gives keyframes at a fixed interval. |
| `--disable-kf` | off | No automatic keyframes; only the first frame is a keyframe. |
| `--enable-fwd-kf` | 0 | Forward keyframes: the keyframe is coded early as a hidden alt-ref and shown later, so the frames before it can reference it (open GOP). |
| `--lag-in-frames` | 19 | Lookahead in frames; values up to 70 are accepted but capped at 35. `0` gives low-delay coding without alt-refs and also disables optical-flow refinement. |
| `--auto-alt-ref` | 1 | Use alt-reference frames: hidden, temporally filtered future frames that later frames predict from. Values above 1 are reset to 1. |
| `--arnr-maxframes` | 7 | Maximum number of frames in the alt-ref temporal filter, 0–15. |
| `--arnr-strength` | 5 | Alt-ref temporal filter strength, 0–6. |
| `--enable-keyframe-filtering` | 2 | Temporally filter keyframes: 0 off, 1 filter without an overlay, 2 filter and code an overlay frame. |
| `--enable-overlay` | 0 | Code overlay frames after filtered alt-refs. |
| `--min-gf-interval` | 0 (auto) | Minimum distance between alt-ref/golden frames, 0–34. |
| `--max-gf-interval` | 0 (auto) | Maximum distance between alt-ref/golden frames, 2–34 when set. |
| `--gf-min-pyr-height` | 0 | Minimum depth of the frame-group pyramid, 0–5. |
| `--gf-max-pyr-height` | 5 | Maximum depth of the frame-group pyramid, 0–5; must be at least the minimum. |
| `--subgop-config-str` | unset (built-in structure) | Explicit sub-GOP structures as a string, or a preset name: `def`, `enh`, `asym`, `ts` (temporally scalable) or `ld` (low delay). |
| `--subgop-config-path` | unset (built-in structure) | Read the sub-GOP structures from a file. |
| `--max-reference-frames` | 7 | References a frame may use, 1–7; capped at `--dpb-size`. |
| `--reduced-reference-set` | 0 | Search a smaller set of single and compound reference combinations. |
| `--dpb-size` | 8 | Decoded picture buffer slots, 1–16. |
| `--explicit-ref-frame-map` | 0 | Signal the reference-slot mapping explicitly instead of letting the decoder derive it. |
| `--add-sef-for-output` | 0 | Show hidden frames with show-existing-frame (SEF) OBUs that carry no order hint. |
| `--monotonic-output-order` | 0 | Set the monotonic-output-order flag, so hidden frames are shown with SEF OBUs as in AV1. Implies `--add-sef-for-output=1` and requires `--enable-keyframe-filtering=0`. |
| `--enable-bru` | 0 | Backward reference update: 1 for the regular decoder, 2 for an optimised decoder. Takes effect only with `--lag-in-frames=0`, no resizing and not all-intra. |
| `--enable-short-refresh-frame-flags` | 1 | Signal reference refresh flags with 3 bits instead of 8. |
| `--enable-sframe` | 0 | Allow S-frames (switch frames), inter frames that serve as stream-switching points. Place them with `--sframe-dist` and `--sframe-mode`. |
| `--sframe-dist` | 0 (off) | S-frame interval in frames. |
| `--sframe-mode` | 1 | S-frame placement, 0–2: 0 turns every alt-ref into an S-frame; 1 and 2 insert them at the `--sframe-dist` interval, aligned to alt-ref frames. |
| `--sframe-type` | 0 (regular S-frame) | `0` regular S-frame, `1` RAS frame. |
| `--global-error-resilient` | 0 | Error-resilient mode: non-key frames are coded as S-frames, so decoding can recover after loss at a cost in efficiency. |
| `--frame-parallel` | 0 | Frame-parallel decoding mode: frames don't inherit entropy-coder state from earlier frames. |

</details>

<details>
<summary>Partitioning (12 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--sb-size` | dynamic | Superblock size: `64`, `128`, `256` or `dynamic`. Dynamic picks 256 when the shorter side is at least 720 pixels, otherwise 128; at `--cpu-used` 2 and up it picks 128 above 480 pixels, otherwise 64. |
| `--min-partition-size` | 4 | Smallest block size: 4, 8, 16, 32, 64 or 128. 4K frames and faster presets use at least 8. |
| `--max-partition-size` | 256 | Largest block size, 4–256 (at least 8 with SDP). |
| `--enable-rect-partitions` | 1 | Allow rectangular (horizontal and vertical) splits. |
| `--enable-ext-partitions` | 1 | Allow AV2's extended (H-shaped) partition types. |
| `--enable-uneven-4way-partitions` | 1 | Allow uneven four-way splits in 1:2:4:1 and 1:4:2:1 proportions. |
| `--max-pb-aspect-ratio` | 8 | Maximum block aspect ratio: 2, 4 or 8. |
| `--enable-sdp` | 1 | Semi-decoupled partitioning: separate luma and chroma partition trees in intra frames. Off for monochrome. |
| `--enable-extended-sdp` | 1 | Semi-decoupled partitioning in inter frames as well. Needs `--enable-sdp=1`. |
| `--erp-pruning-level` | 5 | Pruning of the ERP partition search: 0 off, 1 reuse decisions from the co-located block, 2–6 increasingly aggressive. |
| `--use-ml-erp-pruning` | 2 | ML model for ERP pruning: 0 off, 1 prune rectangular splits, 2 prune splits, 3 both. |
| `--disable-ml-partition-speed-features` | 1 | Turn off the ML-based partition speed-ups. Set `0` to allow them. |

</details>

<details>
<summary>Intra prediction and intra block copy (14 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--enable-mrls` | 1 | Multiple reference line selection: predict from one of several rows/columns of neighbouring pixels. |
| `--enable-ibp` | 1 | Intra bi-prediction. |
| `--enable-intra-dip` | 1 | Data-driven intra prediction (DIP) mode. |
| `--enable-smooth-intra` | 1 | Smooth intra prediction modes. |
| `--enable-paeth-intra` | 1 | Paeth intra prediction mode. |
| `--enable-angle-delta` | 1 | Fine angle offsets for directional intra modes. |
| `--enable-intra-edge-filter` | 1 | Smooth the neighbouring edge pixels before directional prediction. |
| `--enable-cfl-intra` | 1 | Chroma-from-luma prediction. |
| `--select-adaptive-ds` | 3 (adaptive) | Luma downsampling filter used by chroma-from-luma: 0, 1 or 2 for a fixed filter, 3 adaptive. |
| `--enable-mhccp` | 1 | Multi-hypothesis cross-component prediction for chroma. |
| `--enable-palette` | 1 | Palette mode, mostly useful for screen content. |
| `--enable-intrabc` | 1 | Intra block copy: predict from already-coded areas of the same frame, mostly useful for screen content. |
| `--enable-intrabc-ext` | 1 | Intra block copy search range: 0 default range, 1 add the local area, 2 local area only. |
| `--max-drl-refbvs` | 0 (auto) | Number of reference block vectors in the intra-block-copy candidate list: 0 auto, or 2–4. |

</details>

<details>
<summary>Inter prediction and motion vectors (32 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--enable-tip` | 1 | Temporal interpolated prediction (TIP): 1 the interpolated frame can be a reference or be output directly, 2 reference only, 0 off. Needs `--enable-ref-frame-mvs=1`. |
| `--enable-tip-refinemv` | 1 | Motion-vector refinement and optical flow for TIP. |
| `--enable-mv-traj` | 1 | Motion-vector trajectory tracking for temporal MV projection. |
| `--enable-ref-frame-mvs` | 1 | Temporal motion-vector prediction from reference frames. Turning it off also disables TIP and MV trajectories. |
| `--reduced-ref-frame-mvs-mode` | 0 | `1` projects temporal MVs from only one reference-frame combination. |
| `--enable-opfl-refine` | 1 | Optical-flow MV refinement: 0 off, 1 switchable per block, 2 all simple-average compound blocks, 3 the encoder chooses per frame. Off with `--lag-in-frames=0` or all-intra. |
| `--enable-refinemv` | 1 | Decoder-side motion-vector refinement (RefineMV) mode. |
| `--enable-high-motion` | 0 | Use a large motion search window for fast motion. |
| `--enable-global-motion` | 0 | Global motion models per reference frame (camera pans, zooms). |
| `--enable-warped-motion` | 1 | Local warped motion. Turning it off also disables the four warp options below. |
| `--enable-warp-causal` | 1 | Warp models derived from neighbouring blocks. |
| `--enable-warp-delta` | 1 | Warp models signalled explicitly as deltas. |
| `--enable-six-param-warp-delta` | 1 | Allow six-parameter (affine) explicit warp models. |
| `--enable-warp-extend` | 1 | Extend a neighbouring block's warp model into the current block. |
| `--enable-skip-mode` | 1 | Skip mode: compound prediction from the two nearest references with no residual or MVs signalled. |
| `--enable-bawp` | 1 | Block adaptive weighted prediction (BAWP): per-block weight and offset on the prediction, which helps with fades and lighting changes. |
| `--enable-cwp` | 1 | Compound weighted prediction (CWP): unequal weights for the two predictions. |
| `--enable-masked-comp` | 1 | Masked compound (wedge and difference-weighted). Turning it off also disables the two options below. |
| `--enable-diff-wtd-comp` | 1 | Difference-weighted compound. |
| `--enable-interinter-wedge` | 1 | Wedge-masked compound of two inter predictions. |
| `--enable-imp-msk-bld` | 1 | Implicit masked blending of compound predictions. |
| `--enable-onesided-comp` | 1 | Compound prediction from two references on the same side in time. |
| `--enable-interintra-comp` | 1 | Inter-intra compound. Turning it off also disables the two options below. |
| `--enable-smooth-interintra` | 1 | Smooth blending for inter-intra. |
| `--enable-interintra-wedge` | 1 | Wedge masks for inter-intra. |
| `--enable-adaptive-mvd` | 1 | Adaptive motion-vector-difference resolution. |
| `--enable-flex-mvres` | 1 | Flexible motion-vector precision per block. |
| `--enable-joint-mvd` | 1 | Joint coding of the two MV differences in compound blocks. |
| `--enable-mvd-sign-derive` | 1 | Derive MV-difference signs instead of coding them. |
| `--max-drl-refmvs` | 0 (auto) | Number of reference MVs in the dynamic reference list per reference: 0 auto, or 2–8. |
| `--enable-refmvbank` | 1 | Reference-MV bank: keep recent MVs as extra candidates. |
| `--enable-drl-reorder` | 1 | Reorder the dynamic reference list: 0 never, 1 with constraints, 2 always. |

</details>

<details>
<summary>Transforms and quantization (22 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--enable-tx-partition` | 1 | Transform partitioning inside a block. |
| `--reduced-tx-part-set` | 0 | Search a reduced set of transform partitions. |
| `--enable-flip-idtx` | 1 | Flipped-ADST, identity and one-dimensional transform types. |
| `--reduced-tx-type-set` | 0 | Search a reduced set of transform types, 0–3. |
| `--use-intra-dct-only` | 0 | Use only DCT in intra blocks. |
| `--use-inter-dct-only` | 0 | Use only DCT in inter blocks. |
| `--use-intra-default-tx-only` | 0 | Use only the default transform type in intra blocks. |
| `--enable-ist` | 1 | Intra secondary transform. |
| `--enable-inter-ist` | 1 | Secondary transform for inter blocks. |
| `--enable-inter-ddt` | 1 | Data-driven transforms for inter blocks. |
| `--enable-chroma-dctonly` | 0 | Use only DCT for chroma. |
| `--enable-cctx` | 1 | Cross-chroma component transform: jointly transform the Cb and Cr residuals. Off for monochrome. |
| `--enable-fsc` | 1 | Forward skip coding: intra residuals coded with the identity transform and their own coefficient coding. |
| `--enable-idtx-intra` | 1 | Allow the identity transform in intra blocks when `--enable-fsc=0`. |
| `--disable-ml-transform-speed-features` | 0 | Turn off the ML-based transform-search speed-ups. |
| `--enable-tcq` | 1 (every frame) | Trellis-coded quantization: 0 off, 1 every frame, 2 keyframes and alt-refs only. `--cpu-used` 2 and up turn it off. |
| `--enable-trellis-quant` | 3 | Trellis optimisation of quantized coefficients: 0 off, 1 all stages, 2 final pass only, 3 all except the superblock RD estimate. |
| `--enable-parity-hiding` | 1 | Hide one coefficient's parity in the sum of the others. Not used together with TCQ mode 1. |
| `--enable-qm` | 0 | Quantization matrices: quantize high frequencies more coarsely than low ones. |
| `--qm-min` | 5 | Lowest quantization-matrix level the encoder may pick, 0–15. Lower levels quantize high frequencies more coarsely; 15 is flat. |
| `--qm-max` | 9 | Highest quantization-matrix level the encoder may pick, 0–15. |
| `--quant-b-adapt` | 0 | Use the adaptive variant of the quantizer. |

</details>

<details>
<summary>Loop filters and restoration (13 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--enable-deblocking` | 1 | Deblocking filter. |
| `--sharpness` | 0 | Deblocking sharpness, 0–7; higher values filter edges less. |
| `--enable-lf-sub-pu` | 1 | Also deblock sub-block edges inside a prediction block. Off for all-intra. |
| `--enable-cdef` | 1 | Constrained directional enhancement filter (CDEF). |
| `--enable-cdef-on-skip-txfm` | 1 | CDEF on blocks without residual: 0 never, 1 always, 2 decided per frame. |
| `--enable-gdf` | 1 | Guided detail filter (GDF). |
| `--gdf-unit-matches-sb` | 0 | Make GDF units the size of a superblock. |
| `--enable-ccso` | 1 | Cross-component sample offset (CCSO) filter. |
| `--ccso-unit-matches-sb` | 0 | Make CCSO units the size of a superblock. |
| `--enable-restoration` | 1 | Loop restoration. Turns off when both filter types below are disabled. |
| `--enable-pc-wiener` | 1 | Pixel-classified Wiener restoration filter. |
| `--enable-wiener-nonsep` | 1 | Non-separable Wiener restoration filter. |
| `--disable-loopfilters-across-tiles` | 0 | Don't filter across tile boundaries, so tiles can be decoded independently. |

</details>

<details>
<summary>Film grain and denoising (5 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--film-grain-test` | 0 (off) | Apply built-in film-grain test vector 1–16. |
| `--film-grain-table` | unset | Read film-grain parameters from a table file and signal them for decoder-side grain synthesis. |
| `--film-grain-block-size` | 0 (16×16) | Grain synthesis block size: 0 is 16×16, 1 is 32×32. |
| `--denoise-noise-level` | 0 (off) | Denoise the input and signal matching film-grain parameters; strength 0–50. Requires a build with denoising (on by default). |
| `--denoise-block-size` | 32 | Block size for noise estimation in `--denoise-noise-level`. |

</details>

<details>
<summary>Entropy coding and cost updates (7 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--cdf-update-mode` | 1 | Adapt the entropy-coder probabilities (CDFs): 0 never, 1 on every frame, 2 on selected frames. |
| `--cross-frame-cdf-init-mode` | 1 | `1` initialises each frame's CDFs from a previous frame, `0` from defaults. |
| `--enable-avg-cdf` | 1 | Initialise CDFs from an average over frames or tiles. |
| `--avg-cdf-type` | 1 | What `--enable-avg-cdf` averages: 0 frames, 1 tiles. Frame averaging is always used when `--tile-columns` and `--tile-rows` are both 0. |
| `--coeff-cost-upd-freq` | 0 (superblock) | How often the encoder refreshes its coefficient rate estimates: 0 per superblock, 1 per superblock row, 2 per tile. |
| `--mode-cost-upd-freq` | 0 (superblock) | How often it refreshes mode rate estimates: 0 per superblock, 1 per superblock row, 2 per tile. |
| `--mv-cost-upd-freq` | 0 (superblock) | How often it refreshes MV rate estimates: 0 per superblock, 1 per superblock row, 2 per tile, 3 never. |

</details>

<details>
<summary>Color, metadata and stream structure (24 options)</summary>

| Option | Default | What it does |
| --- | --- | --- |
| `--color-primaries` | unspecified | CICP primaries to signal: `bt709`, `unspecified`, `bt601`, `bt470m`, `bt470bg`, `smpte240`, `film`, `bt2020`, `xyz`, `smpte431`, `smpte432`, `ebu3213`. Signalling only; nothing is converted. |
| `--transfer-characteristics` | unspecified | CICP transfer function: `unspecified`, `bt709`, `bt470m`, `bt470bg`, `bt601`, `smpte240`, `lin`, `log100`, `log100sq10`, `iec61966`, `bt1361`, `srgb`, `bt2020-10bit`, `bt2020-12bit`, `smpte2084` (PQ), `hlg`, `smpte428`. |
| `--matrix-coefficients` | unspecified | CICP matrix: `identity`, `bt709`, `unspecified`, `fcc73`, `bt470bg`, `bt601`, `smpte240`, `ycgco`, `bt2020ncl`, `bt2020cl`, `smpte2085`, `chromncl`, `chromcl`, `ictcp`, `ipt-c2`, `ycgco-re`, `ycgco-ro`. |
| `--chroma-sample-position` | unspecified | Chroma siting for 4:2:0 and 4:2:2: `unspecified`, `left`, `center`, `topleft`, `top`, `bottomleft`, `bottom`. |
| `--timing-info` | unspecified | Timing information in the bitstream: `unspecified` (none), `constant` (fixed frame rate) or `model` (decoder model; only without hidden frames). |
| `--icc` | unset | Attach an ICC profile from this file as keyframe metadata. Only the first 128 bytes of the file are read. |
| `--scan-type-info` | 0 | Signal scan type (progressive or interlaced) in the content-interpretation OBU and a metadata OBU. |
| `--enable-banding-metadata` | 0 | Detect banding and write banding-hint metadata for decoder-side debanding. |
| `--frame-hash` | off | Write decoded-frame hash metadata: `off`, `raw` (before grain synthesis), `filmgrain` (after), or `both`. Not shown in `--help`. |
| `--use-per-plane-frame-hash` | 0 | Hash each plane separately instead of the whole frame. Not shown in `--help`. |
| `--use-short-metadata` | 0 (group format) | Write metadata OBUs in the short format instead of the group format. |
| `--enable-cropping-window` | 0 | Signal a cropping window given by the four `--crop-win-*` offsets. |
| `--crop-win-left-offset` | 0 | Cropping-window left offset in pixels, 0–65535. |
| `--crop-win-right-offset` | 0 | Cropping-window right offset in pixels, 0–65535. |
| `--crop-win-top-offset` | 0 | Cropping-window top offset in pixels, 0–65535. |
| `--crop-win-bottom-offset` | 0 | Cropping-window bottom offset in pixels, 0–65535. |
| `--target-seq-level-idx` | 31 (no level target) | Target level for an operating point, written `ABxy`: AB is the operating point, xy the level index (`1021` = level index 21 for point 10). Repeat for several points. |
| `--set-tier-mask` | 0 (all Main tier) | Bit mask over the 32 possible operating points; a set bit marks that point as High tier. |
| `--operating-points-count` | 1 | Number of operating points, 1–31. |
| `--enable-lcr` | 0 | Write a layer configuration record (LCR) OBU. |
| `--enable-operating-point-sets` | 0 | Write operating point set (OPS) OBUs. |
| `--num-operating-point-sets` | 1 | Number of operating point sets to write, 1–16. |
| `--enable-atlas` | 0 | Write an atlas segment OBU. |
| `--enable-mfh-obu-signaling` | 0 | Signal a multi-frame header (MFH) OBU. |

</details>
