{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/tools/software-encoders/avm",
  "collection": "docs",
  "title": "AVM reference software",
  "description": "AVM is AOMedia's reference encoder and decoder for AV2; this page covers its status and how to build it and run a test encode.",
  "canonicalUrl": "https://encode.wiki/tools/software-encoders/avm/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/tools/software-encoders/avm.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/tools/software-encoders/avm.md",
  "status": "current",
  "tags": [
    "migrated",
    "av2",
    "reference-software"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "AOMedia AVM repository",
      "url": "https://github.com/AOMediaCodec/avm",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "AVM v1.0.0 source",
      "url": "https://github.com/AOMediaCodec/avm/tree/v1.0.0",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "AVM v1.0.0 avmenc option registration",
      "url": "https://github.com/AOMediaCodec/avm/blob/v1.0.0/apps/avmenc.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "AVM v1.0.0 encoder defaults",
      "url": "https://github.com/AOMediaCodec/avm/blob/v1.0.0/av2/av2_cx_iface.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "AV2 Bitstream & Decoding Process Specification v1.0.0",
      "url": "https://av2.aomedia.org/v1.0.0/20260528_38f28e7_AV2_Spec_v1.0.0.pdf",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "AOMedia — Alliance for Open Media Releases AV2 Codec",
      "url": "https://aomedia.org/press%20releases/Alliance-for-Open-Media-Releases-AV2-Codec/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "provenance": {
    "originUrl": "https://github.com/av1-community-contributors/codec-wiki/blob/37c3317fd058b23c71a87679bed5619a98f77752/docs/encoders/AVM.mdx",
    "originCommit": "37c3317fd058b23c71a87679bed5619a98f77752",
    "migratedAt": "2026-08-21T00:00:00.000Z",
    "modified": true,
    "originPath": "docs/encoders/AVM.mdx"
  },
  "headings": [
    {
      "depth": 2,
      "text": "Status",
      "anchor": "status"
    },
    {
      "depth": 2,
      "text": "Build",
      "anchor": "build"
    },
    {
      "depth": 2,
      "text": "Encode and decode",
      "anchor": "encode-and-decode"
    },
    {
      "depth": 2,
      "text": "Complete native parameter reference",
      "anchor": "complete-native-parameter-reference"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/avm/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/_preamble.md",
      "checksum": "fb9eae1f0d75fc4cfaebe6052e85a9f5a9f987472ad817a870ce6746a853ab85",
      "bytes": 761
    },
    {
      "id": "status",
      "title": "Status",
      "depth": 2,
      "anchor": "status",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/avm/#status",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/status.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/status.md",
      "checksum": "2f43212ec86427f24aa1f3649f65551e42d2a7e2aaebd04122bdfe208698a465",
      "bytes": 589
    },
    {
      "id": "build",
      "title": "Build",
      "depth": 2,
      "anchor": "build",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/avm/#build",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/build.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/build.md",
      "checksum": "af376b73424f784f38a4d819e11288b88afb2f5714f2396e913f02808fbed4d4",
      "bytes": 417
    },
    {
      "id": "encode-and-decode",
      "title": "Encode and decode",
      "depth": 2,
      "anchor": "encode-and-decode",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/avm/#encode-and-decode",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/encode-and-decode.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/encode-and-decode.md",
      "checksum": "e3670baefa6eea66a057d04f4bdc0458dfeb40d31753af713e932ccaed5404f4",
      "bytes": 1684
    },
    {
      "id": "complete-native-parameter-reference",
      "title": "Complete native parameter reference",
      "depth": 2,
      "anchor": "complete-native-parameter-reference",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/avm/#complete-native-parameter-reference",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/complete-native-parameter-reference.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/avm/complete-native-parameter-reference.md",
      "checksum": "52699da162fe455b553b27c3bdbfeaee1e32acd4186d936e6a46507fc9443bd6",
      "bytes": 31397
    }
  ],
  "outboundReferences": [
    "/codecs/video/av2/",
    "https://code.videolan.org/videolan/dav2d",
    "https://github.com/AOMediaCodec/avm",
    "https://github.com/AOMediaCodec/avm/tree/v1.0.0"
  ],
  "checksum": "3ebdb74503c0035ece02792156933d34ac49c375bd2f46d67363c04c8caa3ff5",
  "contentFormat": "markdown",
  "markdown": "> **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.\n\nAVM (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.\n\n## Status\n\nAOMedia 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.\n\nBefore 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.\n\n## Build\n\nYou need CMake 3.16+, a C/C++ compiler, Perl, Git, and Yasm or NASM on x86:\n\n```sh\ngit clone --branch v1.0.0 https://github.com/AOMediaCodec/avm.git\ncmake -S avm -B avm-build -DCMAKE_BUILD_TYPE=Release -DENABLE_TESTS=0\ncmake --build avm-build -j\"$(nproc)\"\n```\n\nThis produces `avm-build/avmenc` and `avm-build/avmdec`. The build also compiles Abseil and other dependencies, so the first build takes a while.\n\n## Encode and decode\n\n`avmenc` reads Y4M (or raw YUV with explicit dimensions). This encodes a short constant-QP test clip:\n\n```sh\navmenc --end-usage=q --qp=160 --cpu-used=6 --limit=60 -o output.ivf input.y4m\navmdec -o decoded.y4m output.ivf\n```\n\nFrom another source, pipe 10-bit Y4M through FFmpeg:\n\n```sh\nffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -1 -f yuv4mpegpipe - | \\\n  avmenc --end-usage=q --qp=160 --cpu-used=6 --limit=60 -o output.ivf -\n```\n\nWhat matters:\n\n- **Set `--end-usage=q`.** The default rate control is VBR, so `--qp` on its own does not give a constant-QP encode.\n- **`--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.\n- **`--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.\n- **Only one pass** is supported (`--passes` must be 1).\n- **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.\n\nTo 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.\n\nFor codec research, the AV2 common test conditions (CTC) document and test sequences are linked from the repository README.\n\n## Complete native parameter reference\n\nAll 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.\n\n<details>\n<summary>Application and output (24 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--help` | off | Print the full option list and exit. |\n| `--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. |\n| `--debug`, `-D` | off | Deterministic WebM output: omits the encoder version and settings and uses a fixed track UID, so repeated encodes are byte-identical. |\n| `--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. |\n| `--recon` | unset | Also write the encoder's reconstructed frames to this file as headerless planar YUV. |\n| `--codec` | av2 | Encoder to use. AVM contains only `av2`. |\n| `--passes`, `-p` | 1 | Number of passes. Only 1 is accepted. |\n| `--pass` | 0 (all passes) | Run a single pass. With one pass, `0` and `1` both run it; other values are rejected. |\n| `--fpf` | not parsed | Listed in `--help`, but avmenc never parses it: any use stops with “Unrecognized option”. |\n| `--limit` | 0 (all frames) | Stop after this many input frames. `--limit=1` produces a still picture with the reduced still-picture header. |\n| `--skip` | 0 | Discard this many frames from the start of the input. |\n| `--step` | 1 | Encode only every Nth input frame after `--skip`. Must be at least 1. |\n| `--good` | on (usage 0) | Good-quality usage, the only usage AVM has. Same as `--usage=0`. |\n| `--quiet`, `-q` | off | Don't print per-frame progress. |\n| `--verbose`, `-v` | off | Print the input format and the complete coding-tool configuration before encoding. |\n| `--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. |\n| `--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. |\n| `--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. |\n| `--obu` | off | Write a raw OBU stream with no container, like an `.obu` output name. Same ordering rule as `--ivf`. |\n| `--q-hist` | 0 (off) | At the end, print a histogram of frame quantizers with this many buckets. |\n| `--rate-hist` | 0 (off) | At the end, print a bitrate histogram with this many buckets. |\n| `--disable-warnings` | off | Skip avmenc's checks for suspicious settings. |\n| `--disable-warning-prompt`, `-y` | off | Print those warnings but don't stop to ask whether to continue. |\n| `--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). |\n\n</details>\n\n<details>\n<summary>Input, profile and bit depth (20 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--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. |\n| `--yv12` | off | Raw input is 4:2:0 with the V plane before U. |\n| `--i422` | off | Raw input is 4:2:2; the profile is raised to 3. |\n| `--i444` | off | Raw input is 4:4:4; the profile is raised to 4. |\n| `--width`, `-w` | from Y4M header | Frame width in pixels. Required for raw input. |\n| `--height`, `-h` | from Y4M header | Frame height in pixels. Required for raw input. |\n| `--fps` | from Y4M; 30/1 for raw | Frame rate as `num/den`, overriding the Y4M header. It also sets the stream timebase. |\n| `--timebase` | 1/frame rate | No effect: avmenc always replaces the timebase with the inverse of the frame rate. |\n| `--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. |\n| `--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. |\n| `--input-chroma-subsampling-x` | 0 | Horizontal chroma subsampling (0–1) for the test-only 12-bit profile. Normal builds take subsampling from the profile. |\n| `--input-chroma-subsampling-y` | 0 | Vertical chroma subsampling (0–1) for the test-only 12-bit profile. |\n| `--monochrome` | off | Code luma only (4:0:0). |\n| `--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. |\n| `--usage`, `-u` | 0 (good quality) | Usage preset. Only `0` exists; other values fail with “Failed to get config”. |\n| `--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. |\n| `--forced_max_frame_height` | 0 (frame height) | Same for the maximum frame height. |\n| `--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. |\n| `--force-video-mode` | 0 | With `--limit=1`, code a normal one-frame video stream instead of a still picture. |\n| `--full-still-picture-hdr` | off | For still pictures, write the full sequence header instead of the reduced one. |\n\n</details>\n\n<details>\n<summary>Threads and tiles (8 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--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. |\n| `--row-mt` | 1 | Row-based multithreading inside tiles, `0` or `1`. |\n| `--tile-columns` | 0 | Tile columns as log2, 0–6 (1–64 columns), evenly spaced and limited by the frame width. |\n| `--tile-rows` | 0 | Tile rows as log2, 0–6. |\n| `--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`. |\n| `--tile-height` | unset (uniform tiles) | Explicit tile-row heights in superblocks, as for `--tile-width`. Not shown in `--help`. |\n| `--num-tile-groups` | 1 | Split each frame's tiles into up to this many tile-group OBUs. |\n| `--mtu-size` | 0 (off) | Target maximum tile-group size in bytes for packetised transport. Overrides `--num-tile-groups`. |\n\n</details>\n\n<details>\n<summary>Rate control and quantizer (28 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--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. |\n| `--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. |\n| `--target-bitrate` | 256 | Target bitrate in kbit/s for `vbr`, `cbr` and `cq`. |\n| `--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. |\n| `--max-qp` | 255 | Worst (highest) quantizer allowed, same scale as `--min-qp`. |\n| `--cq-level` | unset | Deprecated 0–63 form of `--qp`, mapped to the 0–255 scale with a warning. Not shown in `--help`. |\n| `--min-q` | unset | Deprecated 0–63 form of `--min-qp`, mapped with a warning. |\n| `--max-q` | unset | Deprecated 0–63 form of `--max-qp`, mapped with a warning. |\n| `--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`. |\n| `--undershoot-pct` | 25 | How far below the target bitrate, in percent (0–100), rate control lets the encode run before correcting. |\n| `--overshoot-pct` | 25 | How far above the target, in percent (0–100). |\n| `--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. |\n| `--buf-initial-sz` | 4000 | Initial buffer fullness in ms (non-VBR). |\n| `--buf-optimal-sz` | 5000 | Target buffer fullness in ms (non-VBR). |\n| `--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. |\n| `--maxsection-pct` | 2000 | Maximum bitrate of a frame group as a percentage of the target (VBR). |\n| `--drop-frame` | 0 (off) | Drop frames when the rate-control buffer falls below this fullness, in percent (0–100). |\n| `--max-intra-rate` | 0 (no cap) | Cap a keyframe's size at this percentage of the average per-frame budget. |\n| `--max-inter-rate` | 0 (no cap) | Cap an inter frame's size at this percentage of the average per-frame budget. |\n| `--gf-cbr-boost` | 0 | Extra bits for golden/alt-ref frames in CBR, in percent. |\n| `--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. |\n| `--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`. |\n| `--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`. |\n| `--min-cr` | 0 (off) | Minimum compression ratio ×100: the encoder tries to keep each frame's compression ratio above value/100. |\n| `--frame-boost` | 0 | Accepted (0–1) but not used by the v1.0.0 encoder. |\n| `--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. |\n| `--resize-denominator` | 8 (no scaling) | Scale for `--resize-mode=1` as 8/denominator, 8–16. |\n| `--resize-kf-denominator` | 8 (no scaling) | Keyframe scale for `--resize-mode=1`, 8–16. |\n\n</details>\n\n<details>\n<summary>Speed, tuning and adaptive quantization (11 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--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. |\n| `--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. |\n| `--vmaf-model-path` | /usr/local/share/model/vmaf_v0.6.1.json | VMAF model file for the VMAF tunings. Requires a build with VMAF. |\n| `--tune-content` | default | Content type: `default` or `screen` (desktop capture, slides, games). |\n| `--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. |\n| `--deltaq-mode` | 1 (objective) | Per-superblock QP modulation: 0 off, 1 objective (TPL-based), 2 perceptual. Needs `--enable-tpl-model=1`. |\n| `--aq-mode` | 0 (off) | Segment-based adaptive quantization: 0 off, 1 variance, 2 complexity, 3 cyclic refresh. |\n| `--enable-chroma-deltaq` | 0 | Allow separate delta QP for the chroma planes. |\n| `--enable-ext-seg` | 0 | Allow 16 segments instead of 8. |\n| `--noise-sensitivity` | 0 | Accepted (0–6) but not used by the v1.0.0 encoder. |\n| `--static-thresh` | 0 | Accepted but not used by the v1.0.0 encoder. |\n\n</details>\n\n<details>\n<summary>Keyframes, frame groups and references (30 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--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. |\n| `--kf-min-dist` | 0 | Minimum keyframe interval in frames. Equal to `--kf-max-dist` gives keyframes at a fixed interval. |\n| `--disable-kf` | off | No automatic keyframes; only the first frame is a keyframe. |\n| `--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). |\n| `--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. |\n| `--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. |\n| `--arnr-maxframes` | 7 | Maximum number of frames in the alt-ref temporal filter, 0–15. |\n| `--arnr-strength` | 5 | Alt-ref temporal filter strength, 0–6. |\n| `--enable-keyframe-filtering` | 2 | Temporally filter keyframes: 0 off, 1 filter without an overlay, 2 filter and code an overlay frame. |\n| `--enable-overlay` | 0 | Code overlay frames after filtered alt-refs. |\n| `--min-gf-interval` | 0 (auto) | Minimum distance between alt-ref/golden frames, 0–34. |\n| `--max-gf-interval` | 0 (auto) | Maximum distance between alt-ref/golden frames, 2–34 when set. |\n| `--gf-min-pyr-height` | 0 | Minimum depth of the frame-group pyramid, 0–5. |\n| `--gf-max-pyr-height` | 5 | Maximum depth of the frame-group pyramid, 0–5; must be at least the minimum. |\n| `--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). |\n| `--subgop-config-path` | unset (built-in structure) | Read the sub-GOP structures from a file. |\n| `--max-reference-frames` | 7 | References a frame may use, 1–7; capped at `--dpb-size`. |\n| `--reduced-reference-set` | 0 | Search a smaller set of single and compound reference combinations. |\n| `--dpb-size` | 8 | Decoded picture buffer slots, 1–16. |\n| `--explicit-ref-frame-map` | 0 | Signal the reference-slot mapping explicitly instead of letting the decoder derive it. |\n| `--add-sef-for-output` | 0 | Show hidden frames with show-existing-frame (SEF) OBUs that carry no order hint. |\n| `--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`. |\n| `--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. |\n| `--enable-short-refresh-frame-flags` | 1 | Signal reference refresh flags with 3 bits instead of 8. |\n| `--enable-sframe` | 0 | Allow S-frames (switch frames), inter frames that serve as stream-switching points. Place them with `--sframe-dist` and `--sframe-mode`. |\n| `--sframe-dist` | 0 (off) | S-frame interval in frames. |\n| `--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. |\n| `--sframe-type` | 0 (regular S-frame) | `0` regular S-frame, `1` RAS frame. |\n| `--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. |\n| `--frame-parallel` | 0 | Frame-parallel decoding mode: frames don't inherit entropy-coder state from earlier frames. |\n\n</details>\n\n<details>\n<summary>Partitioning (12 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--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. |\n| `--min-partition-size` | 4 | Smallest block size: 4, 8, 16, 32, 64 or 128. 4K frames and faster presets use at least 8. |\n| `--max-partition-size` | 256 | Largest block size, 4–256 (at least 8 with SDP). |\n| `--enable-rect-partitions` | 1 | Allow rectangular (horizontal and vertical) splits. |\n| `--enable-ext-partitions` | 1 | Allow AV2's extended (H-shaped) partition types. |\n| `--enable-uneven-4way-partitions` | 1 | Allow uneven four-way splits in 1:2:4:1 and 1:4:2:1 proportions. |\n| `--max-pb-aspect-ratio` | 8 | Maximum block aspect ratio: 2, 4 or 8. |\n| `--enable-sdp` | 1 | Semi-decoupled partitioning: separate luma and chroma partition trees in intra frames. Off for monochrome. |\n| `--enable-extended-sdp` | 1 | Semi-decoupled partitioning in inter frames as well. Needs `--enable-sdp=1`. |\n| `--erp-pruning-level` | 5 | Pruning of the ERP partition search: 0 off, 1 reuse decisions from the co-located block, 2–6 increasingly aggressive. |\n| `--use-ml-erp-pruning` | 2 | ML model for ERP pruning: 0 off, 1 prune rectangular splits, 2 prune splits, 3 both. |\n| `--disable-ml-partition-speed-features` | 1 | Turn off the ML-based partition speed-ups. Set `0` to allow them. |\n\n</details>\n\n<details>\n<summary>Intra prediction and intra block copy (14 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--enable-mrls` | 1 | Multiple reference line selection: predict from one of several rows/columns of neighbouring pixels. |\n| `--enable-ibp` | 1 | Intra bi-prediction. |\n| `--enable-intra-dip` | 1 | Data-driven intra prediction (DIP) mode. |\n| `--enable-smooth-intra` | 1 | Smooth intra prediction modes. |\n| `--enable-paeth-intra` | 1 | Paeth intra prediction mode. |\n| `--enable-angle-delta` | 1 | Fine angle offsets for directional intra modes. |\n| `--enable-intra-edge-filter` | 1 | Smooth the neighbouring edge pixels before directional prediction. |\n| `--enable-cfl-intra` | 1 | Chroma-from-luma prediction. |\n| `--select-adaptive-ds` | 3 (adaptive) | Luma downsampling filter used by chroma-from-luma: 0, 1 or 2 for a fixed filter, 3 adaptive. |\n| `--enable-mhccp` | 1 | Multi-hypothesis cross-component prediction for chroma. |\n| `--enable-palette` | 1 | Palette mode, mostly useful for screen content. |\n| `--enable-intrabc` | 1 | Intra block copy: predict from already-coded areas of the same frame, mostly useful for screen content. |\n| `--enable-intrabc-ext` | 1 | Intra block copy search range: 0 default range, 1 add the local area, 2 local area only. |\n| `--max-drl-refbvs` | 0 (auto) | Number of reference block vectors in the intra-block-copy candidate list: 0 auto, or 2–4. |\n\n</details>\n\n<details>\n<summary>Inter prediction and motion vectors (32 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--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`. |\n| `--enable-tip-refinemv` | 1 | Motion-vector refinement and optical flow for TIP. |\n| `--enable-mv-traj` | 1 | Motion-vector trajectory tracking for temporal MV projection. |\n| `--enable-ref-frame-mvs` | 1 | Temporal motion-vector prediction from reference frames. Turning it off also disables TIP and MV trajectories. |\n| `--reduced-ref-frame-mvs-mode` | 0 | `1` projects temporal MVs from only one reference-frame combination. |\n| `--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. |\n| `--enable-refinemv` | 1 | Decoder-side motion-vector refinement (RefineMV) mode. |\n| `--enable-high-motion` | 0 | Use a large motion search window for fast motion. |\n| `--enable-global-motion` | 0 | Global motion models per reference frame (camera pans, zooms). |\n| `--enable-warped-motion` | 1 | Local warped motion. Turning it off also disables the four warp options below. |\n| `--enable-warp-causal` | 1 | Warp models derived from neighbouring blocks. |\n| `--enable-warp-delta` | 1 | Warp models signalled explicitly as deltas. |\n| `--enable-six-param-warp-delta` | 1 | Allow six-parameter (affine) explicit warp models. |\n| `--enable-warp-extend` | 1 | Extend a neighbouring block's warp model into the current block. |\n| `--enable-skip-mode` | 1 | Skip mode: compound prediction from the two nearest references with no residual or MVs signalled. |\n| `--enable-bawp` | 1 | Block adaptive weighted prediction (BAWP): per-block weight and offset on the prediction, which helps with fades and lighting changes. |\n| `--enable-cwp` | 1 | Compound weighted prediction (CWP): unequal weights for the two predictions. |\n| `--enable-masked-comp` | 1 | Masked compound (wedge and difference-weighted). Turning it off also disables the two options below. |\n| `--enable-diff-wtd-comp` | 1 | Difference-weighted compound. |\n| `--enable-interinter-wedge` | 1 | Wedge-masked compound of two inter predictions. |\n| `--enable-imp-msk-bld` | 1 | Implicit masked blending of compound predictions. |\n| `--enable-onesided-comp` | 1 | Compound prediction from two references on the same side in time. |\n| `--enable-interintra-comp` | 1 | Inter-intra compound. Turning it off also disables the two options below. |\n| `--enable-smooth-interintra` | 1 | Smooth blending for inter-intra. |\n| `--enable-interintra-wedge` | 1 | Wedge masks for inter-intra. |\n| `--enable-adaptive-mvd` | 1 | Adaptive motion-vector-difference resolution. |\n| `--enable-flex-mvres` | 1 | Flexible motion-vector precision per block. |\n| `--enable-joint-mvd` | 1 | Joint coding of the two MV differences in compound blocks. |\n| `--enable-mvd-sign-derive` | 1 | Derive MV-difference signs instead of coding them. |\n| `--max-drl-refmvs` | 0 (auto) | Number of reference MVs in the dynamic reference list per reference: 0 auto, or 2–8. |\n| `--enable-refmvbank` | 1 | Reference-MV bank: keep recent MVs as extra candidates. |\n| `--enable-drl-reorder` | 1 | Reorder the dynamic reference list: 0 never, 1 with constraints, 2 always. |\n\n</details>\n\n<details>\n<summary>Transforms and quantization (22 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--enable-tx-partition` | 1 | Transform partitioning inside a block. |\n| `--reduced-tx-part-set` | 0 | Search a reduced set of transform partitions. |\n| `--enable-flip-idtx` | 1 | Flipped-ADST, identity and one-dimensional transform types. |\n| `--reduced-tx-type-set` | 0 | Search a reduced set of transform types, 0–3. |\n| `--use-intra-dct-only` | 0 | Use only DCT in intra blocks. |\n| `--use-inter-dct-only` | 0 | Use only DCT in inter blocks. |\n| `--use-intra-default-tx-only` | 0 | Use only the default transform type in intra blocks. |\n| `--enable-ist` | 1 | Intra secondary transform. |\n| `--enable-inter-ist` | 1 | Secondary transform for inter blocks. |\n| `--enable-inter-ddt` | 1 | Data-driven transforms for inter blocks. |\n| `--enable-chroma-dctonly` | 0 | Use only DCT for chroma. |\n| `--enable-cctx` | 1 | Cross-chroma component transform: jointly transform the Cb and Cr residuals. Off for monochrome. |\n| `--enable-fsc` | 1 | Forward skip coding: intra residuals coded with the identity transform and their own coefficient coding. |\n| `--enable-idtx-intra` | 1 | Allow the identity transform in intra blocks when `--enable-fsc=0`. |\n| `--disable-ml-transform-speed-features` | 0 | Turn off the ML-based transform-search speed-ups. |\n| `--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. |\n| `--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. |\n| `--enable-parity-hiding` | 1 | Hide one coefficient's parity in the sum of the others. Not used together with TCQ mode 1. |\n| `--enable-qm` | 0 | Quantization matrices: quantize high frequencies more coarsely than low ones. |\n| `--qm-min` | 5 | Lowest quantization-matrix level the encoder may pick, 0–15. Lower levels quantize high frequencies more coarsely; 15 is flat. |\n| `--qm-max` | 9 | Highest quantization-matrix level the encoder may pick, 0–15. |\n| `--quant-b-adapt` | 0 | Use the adaptive variant of the quantizer. |\n\n</details>\n\n<details>\n<summary>Loop filters and restoration (13 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--enable-deblocking` | 1 | Deblocking filter. |\n| `--sharpness` | 0 | Deblocking sharpness, 0–7; higher values filter edges less. |\n| `--enable-lf-sub-pu` | 1 | Also deblock sub-block edges inside a prediction block. Off for all-intra. |\n| `--enable-cdef` | 1 | Constrained directional enhancement filter (CDEF). |\n| `--enable-cdef-on-skip-txfm` | 1 | CDEF on blocks without residual: 0 never, 1 always, 2 decided per frame. |\n| `--enable-gdf` | 1 | Guided detail filter (GDF). |\n| `--gdf-unit-matches-sb` | 0 | Make GDF units the size of a superblock. |\n| `--enable-ccso` | 1 | Cross-component sample offset (CCSO) filter. |\n| `--ccso-unit-matches-sb` | 0 | Make CCSO units the size of a superblock. |\n| `--enable-restoration` | 1 | Loop restoration. Turns off when both filter types below are disabled. |\n| `--enable-pc-wiener` | 1 | Pixel-classified Wiener restoration filter. |\n| `--enable-wiener-nonsep` | 1 | Non-separable Wiener restoration filter. |\n| `--disable-loopfilters-across-tiles` | 0 | Don't filter across tile boundaries, so tiles can be decoded independently. |\n\n</details>\n\n<details>\n<summary>Film grain and denoising (5 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--film-grain-test` | 0 (off) | Apply built-in film-grain test vector 1–16. |\n| `--film-grain-table` | unset | Read film-grain parameters from a table file and signal them for decoder-side grain synthesis. |\n| `--film-grain-block-size` | 0 (16×16) | Grain synthesis block size: 0 is 16×16, 1 is 32×32. |\n| `--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). |\n| `--denoise-block-size` | 32 | Block size for noise estimation in `--denoise-noise-level`. |\n\n</details>\n\n<details>\n<summary>Entropy coding and cost updates (7 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--cdf-update-mode` | 1 | Adapt the entropy-coder probabilities (CDFs): 0 never, 1 on every frame, 2 on selected frames. |\n| `--cross-frame-cdf-init-mode` | 1 | `1` initialises each frame's CDFs from a previous frame, `0` from defaults. |\n| `--enable-avg-cdf` | 1 | Initialise CDFs from an average over frames or tiles. |\n| `--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. |\n| `--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. |\n| `--mode-cost-upd-freq` | 0 (superblock) | How often it refreshes mode rate estimates: 0 per superblock, 1 per superblock row, 2 per tile. |\n| `--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. |\n\n</details>\n\n<details>\n<summary>Color, metadata and stream structure (24 options)</summary>\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--color-primaries` | unspecified | CICP primaries to signal: `bt709`, `unspecified`, `bt601`, `bt470m`, `bt470bg`, `smpte240`, `film`, `bt2020`, `xyz`, `smpte431`, `smpte432`, `ebu3213`. Signalling only; nothing is converted. |\n| `--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`. |\n| `--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`. |\n| `--chroma-sample-position` | unspecified | Chroma siting for 4:2:0 and 4:2:2: `unspecified`, `left`, `center`, `topleft`, `top`, `bottomleft`, `bottom`. |\n| `--timing-info` | unspecified | Timing information in the bitstream: `unspecified` (none), `constant` (fixed frame rate) or `model` (decoder model; only without hidden frames). |\n| `--icc` | unset | Attach an ICC profile from this file as keyframe metadata. Only the first 128 bytes of the file are read. |\n| `--scan-type-info` | 0 | Signal scan type (progressive or interlaced) in the content-interpretation OBU and a metadata OBU. |\n| `--enable-banding-metadata` | 0 | Detect banding and write banding-hint metadata for decoder-side debanding. |\n| `--frame-hash` | off | Write decoded-frame hash metadata: `off`, `raw` (before grain synthesis), `filmgrain` (after), or `both`. Not shown in `--help`. |\n| `--use-per-plane-frame-hash` | 0 | Hash each plane separately instead of the whole frame. Not shown in `--help`. |\n| `--use-short-metadata` | 0 (group format) | Write metadata OBUs in the short format instead of the group format. |\n| `--enable-cropping-window` | 0 | Signal a cropping window given by the four `--crop-win-*` offsets. |\n| `--crop-win-left-offset` | 0 | Cropping-window left offset in pixels, 0–65535. |\n| `--crop-win-right-offset` | 0 | Cropping-window right offset in pixels, 0–65535. |\n| `--crop-win-top-offset` | 0 | Cropping-window top offset in pixels, 0–65535. |\n| `--crop-win-bottom-offset` | 0 | Cropping-window bottom offset in pixels, 0–65535. |\n| `--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. |\n| `--set-tier-mask` | 0 (all Main tier) | Bit mask over the 32 possible operating points; a set bit marks that point as High tier. |\n| `--operating-points-count` | 1 | Number of operating points, 1–31. |\n| `--enable-lcr` | 0 | Write a layer configuration record (LCR) OBU. |\n| `--enable-operating-point-sets` | 0 | Write operating point set (OPS) OBUs. |\n| `--num-operating-point-sets` | 1 | Number of operating point sets to write, 1–16. |\n| `--enable-atlas` | 0 | Write an atlas segment OBU. |\n| `--enable-mfh-obu-signaling` | 0 | Signal a multi-frame header (MFH) OBU. |\n\n</details>\n"
}
