{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/tools/software-encoders/aomenc",
  "collection": "docs",
  "title": "aomenc",
  "description": "aomenc is the command-line encoder of libaom, AOMedia's reference AV1 library, used for quality-focused video encodes (usually through Av1an) and AVIF images.",
  "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/tools/software-encoders/aomenc.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/tools/software-encoders/aomenc.md",
  "status": "current",
  "tags": [
    "migrated"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "libaom v3.15.1 aomenc application source",
      "url": "https://aomedia.googlesource.com/aom/+/refs/tags/v3.15.1/apps/aomenc.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "libaom v3.15.1 option definitions and help text",
      "url": "https://aomedia.googlesource.com/aom/+/refs/tags/v3.15.1/av1/arg_defs.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "libaom v3.15.1 encoder defaults and tune handling",
      "url": "https://aomedia.googlesource.com/aom/+/refs/tags/v3.15.1/av1/av1_cx_iface.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "libaom v3.15.1 lookahead limit (MAX_LAG_BUFFERS)",
      "url": "https://aomedia.googlesource.com/aom/+/refs/tags/v3.15.1/av1/encoder/lookahead.h",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "libaom CHANGELOG at v3.15.1",
      "url": "https://aomedia.googlesource.com/aom/+/refs/tags/v3.15.1/CHANGELOG",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "libaom v3.15.1 README",
      "url": "https://aomedia.googlesource.com/aom/+/refs/tags/v3.15.1/README.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "FFmpeg n9.0.2 libaom-av1 wrapper",
      "url": "https://github.com/FFmpeg/FFmpeg/blob/n9.0.2/libavcodec/libaomenc.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Av1an 0.5.2 encoding options",
      "url": "https://github.com/rust-av/Av1an/blob/v0.5.2/site/src/Cli/encoding.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Av1an 0.5.2 scene detection options",
      "url": "https://github.com/rust-av/Av1an/blob/v0.5.2/site/src/Cli/scene_detection.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Av1an 0.5.2 default aomenc arguments",
      "url": "https://github.com/rust-av/Av1an/blob/v0.5.2/av1an-core/src/encoder/mod.rs",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "provenance": {
    "originUrl": "https://github.com/av1-community-contributors/codec-wiki/blob/37c3317fd058b23c71a87679bed5619a98f77752/docs/encoders/aomenc.mdx",
    "originCommit": "37c3317fd058b23c71a87679bed5619a98f77752",
    "migratedAt": "2026-08-21T00:00:00.000Z",
    "modified": true,
    "originPath": "docs/encoders/aomenc.mdx"
  },
  "headings": [
    {
      "depth": 2,
      "text": "Getting aomenc",
      "anchor": "getting-aomenc"
    },
    {
      "depth": 2,
      "text": "Constant-quality encoding",
      "anchor": "constant-quality-encoding"
    },
    {
      "depth": 2,
      "text": "Encoding with Av1an",
      "anchor": "encoding-with-av1an"
    },
    {
      "depth": 2,
      "text": "Options that matter for quality",
      "anchor": "options-that-matter-for-quality"
    },
    {
      "depth": 3,
      "text": "Film grain synthesis",
      "anchor": "film-grain-synthesis"
    },
    {
      "depth": 2,
      "text": "FFmpeg (libaom-av1)",
      "anchor": "ffmpeg-libaom-av1"
    },
    {
      "depth": 2,
      "text": "AVIF images",
      "anchor": "avif-images"
    },
    {
      "depth": 2,
      "text": "Community forks",
      "anchor": "community-forks"
    },
    {
      "depth": 2,
      "text": "Related pages",
      "anchor": "related-pages"
    },
    {
      "depth": 2,
      "text": "FFmpeg libaom-av1 private options (n9.0.2)",
      "anchor": "ffmpeg-libaom-av1-private-options-n902"
    },
    {
      "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/aomenc/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/_preamble.md",
      "checksum": "93101ad54cb86f642600093144caffeb6c9e0b14623b8c85ec54a9ab8e09cb6f",
      "bytes": 889
    },
    {
      "id": "getting-aomenc",
      "title": "Getting aomenc",
      "depth": 2,
      "anchor": "getting-aomenc",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#getting-aomenc",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/getting-aomenc.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/getting-aomenc.md",
      "checksum": "16b0a13d0f349b52d981428f9cd92217382879d9522c3d5e184cb88007247fc0",
      "bytes": 761
    },
    {
      "id": "constant-quality-encoding",
      "title": "Constant-quality encoding",
      "depth": 2,
      "anchor": "constant-quality-encoding",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#constant-quality-encoding",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/constant-quality-encoding.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/constant-quality-encoding.md",
      "checksum": "5f11ece6584fc7b7e78731277cfc57961ed6caabaa259db57a45e8f5cd3fd021",
      "bytes": 1699
    },
    {
      "id": "encoding-with-av1an",
      "title": "Encoding with Av1an",
      "depth": 2,
      "anchor": "encoding-with-av1an",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#encoding-with-av1an",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/encoding-with-av1an.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/encoding-with-av1an.md",
      "checksum": "2bb16fa0e35b578ba34fb32815ba5f465ae77dfaf799bb6297b836a2368ea1e9",
      "bytes": 754
    },
    {
      "id": "options-that-matter-for-quality",
      "title": "Options that matter for quality",
      "depth": 2,
      "anchor": "options-that-matter-for-quality",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#options-that-matter-for-quality",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/options-that-matter-for-quality.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/options-that-matter-for-quality.md",
      "checksum": "2ed81d17670b89b2b892269814c67c0bb6fb1b99c2f69da4619a44f562e2e85b",
      "bytes": 8157
    },
    {
      "id": "film-grain-synthesis",
      "title": "Film grain synthesis",
      "depth": 3,
      "anchor": "film-grain-synthesis",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#film-grain-synthesis",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/film-grain-synthesis.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/film-grain-synthesis.md",
      "checksum": "c2cfda2b6fb27f3e669c6885763610210c38b49ad2593a04dee904c908d705cd",
      "bytes": 875
    },
    {
      "id": "ffmpeg-libaom-av1",
      "title": "FFmpeg (libaom-av1)",
      "depth": 2,
      "anchor": "ffmpeg-libaom-av1",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#ffmpeg-libaom-av1",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/ffmpeg-libaom-av1.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/ffmpeg-libaom-av1.md",
      "checksum": "6f22756c25efcb04c26ec4d1e315d241a012e041856ac057af894c3d2152da61",
      "bytes": 856
    },
    {
      "id": "avif-images",
      "title": "AVIF images",
      "depth": 2,
      "anchor": "avif-images",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#avif-images",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/avif-images.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/avif-images.md",
      "checksum": "05810f5e270005b2d4f587acb799f816aca2164a93d5d375c14c1aac0e59a9e3",
      "bytes": 480
    },
    {
      "id": "community-forks",
      "title": "Community forks",
      "depth": 2,
      "anchor": "community-forks",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#community-forks",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/community-forks.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/community-forks.md",
      "checksum": "f76bde0945afc5bf162b59b177894906d3fb6df675814aabaa352ef96e80d4c8",
      "bytes": 885
    },
    {
      "id": "related-pages",
      "title": "Related pages",
      "depth": 2,
      "anchor": "related-pages",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#related-pages",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/related-pages.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/related-pages.md",
      "checksum": "3fa8ab0e97ee0208f400316017dcd27c596d5f1b258e7d0bb9145f788575f430",
      "bytes": 294
    },
    {
      "id": "ffmpeg-libaom-av1-private-options-n902",
      "title": "FFmpeg libaom-av1 private options (n9.0.2)",
      "depth": 2,
      "anchor": "ffmpeg-libaom-av1-private-options-n902",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#ffmpeg-libaom-av1-private-options-n902",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/ffmpeg-libaom-av1-private-options-n902.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/ffmpeg-libaom-av1-private-options-n902.md",
      "checksum": "ec0a5a79430b656bdec015d03b9ee802d80d3c2a78ad29622a6138f9eee9c206",
      "bytes": 8461
    },
    {
      "id": "complete-native-parameter-reference",
      "title": "Complete native parameter reference",
      "depth": 2,
      "anchor": "complete-native-parameter-reference",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/aomenc/#complete-native-parameter-reference",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/complete-native-parameter-reference.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/aomenc/complete-native-parameter-reference.md",
      "checksum": "7785df9f16254265df9085a1df99d9b83c1c7f2b68c5af97bff3d1bbf8c54193",
      "bytes": 31524
    }
  ],
  "outboundReferences": [
    "#community-forks",
    "#film-grain-synthesis",
    "/codecs/images/avif/",
    "/reference/metrics/ssimulacra2/",
    "/tools/software-encoders/aom-av1-lavish/",
    "/tools/software-encoders/aom-psy101/",
    "/tools/software-encoders/rav1e/",
    "/tools/software-encoders/svt-av1/",
    "/tools/utilities/av1an/",
    "/tools/utilities/mkvtoolnix/",
    "https://github.com/BlueSwordM/aom-av1-psy",
    "https://github.com/porcino/aom-av1ador"
  ],
  "checksum": "d0f245f9b000fcb8809adb562ab6bdca98c41dda1d516ef99b346b58e5dd07a6",
  "contentFormat": "markdown",
  "markdown": "`aomenc` is the command-line encoder of **libaom**, the Alliance for Open Media's reference AV1 library. The same library is FFmpeg's `libaom-av1` encoder and libavif's `aom` codec.\n\nPeople use it today for:\n\n- **Quality-first video encodes.** A single aomenc process threads poorly, so it is usually run through [Av1an](/tools/utilities/av1an/), which splits the source at scene changes and encodes many chunks in parallel.\n- **AVIF and other still images**, where libaom's all-intra mode and image tunes are strong.\n- **A base for community forks** with perceptual tuning (see [community forks](#community-forks)).\n\nFor most video, [SVT-AV1](/tools/software-encoders/svt-av1/) is the more practical encoder: it is much faster at comparable presets and parallelises well on its own. Mainline libaom also defaults to `--tune=psnr`, so good perceptual results depend on the settings below.\n\n## Getting aomenc\n\nLinux distributions, Homebrew and MSYS2 package libaom with `aomenc`, and most FFmpeg builds include `libaom-av1`. Packaged builds normally lack the optional VMAF and Butteraugli tunes, which need `-DCONFIG_TUNE_VMAF=1` or `-DCONFIG_TUNE_BUTTERAUGLI=1` (plus libvmaf or libjxl) at build time.\n\nTo build the current release:\n\n```sh\ngit clone --depth 1 --branch v3.15.1 https://aomedia.googlesource.com/aom\ncmake -S aom -B aom_build -DCMAKE_BUILD_TYPE=Release -DENABLE_TESTS=0 -DENABLE_DOCS=0\ncmake --build aom_build -j\"$(nproc)\"\n```\n\nThe encoder is `aom_build/aomenc`. If you add `-march=native` to `CMAKE_C_FLAGS` and `CMAKE_CXX_FLAGS`, do not share the binary with machines that have a different CPU: it can crash on instructions they lack.\n\n## Constant-quality encoding\n\n```sh\naomenc --end-usage=q --cq-level=24 --cpu-used=4 --bit-depth=10 -o output.webm input.y4m\n```\n\n- `--end-usage=q --cq-level=N` selects constant quality. `cq-level` runs from 0 to 63; lower is higher quality. Without `--end-usage`, aomenc does 256 kbit/s VBR. Values in the 20s are typical for high-quality encodes; the scale does not match x264, x265 or SVT-AV1 CRF numbers.\n- `--cpu-used` is the speed preset (0–6 in the default good-quality mode; lower is slower and more efficient). The default, 0, is extremely slow. 4 is the usual balance, 3 if you have time, 6 when speed matters.\n- `--bit-depth=10` encodes 8-bit sources at 10 bits, which improves efficiency and reduces banding. A 10-bit Y4M input is encoded at 10 bits automatically.\n- Good-quality mode runs **two passes by default**. Keep them: libaom uses first-pass statistics even in constant-quality mode.\n- Output is WebM by default; `--ivf` and `--obu` select other formats. Mux the result into MKV or MP4 with [mkvmerge](/tools/utilities/mkvtoolnix/) or FFmpeg.\n\nTo feed aomenc from FFmpeg, pipe Y4M. aomenc cannot read a pipe twice, so the default two-pass mode fails with a WebM finalisation error and leaves an empty file. Use `--passes=1`:\n\n```sh\nffmpeg -i input.mkv -f yuv4mpegpipe - | aomenc - --passes=1 --end-usage=q --cq-level=24 --cpu-used=4 --bit-depth=10 -o output.webm\n```\n\nFor two passes, run the pipe twice, once with `--passes=2 --pass=1 --fpf=stats.log` and once with `--pass=2` and the same `--fpf`. To pipe a source that is already 10-bit, add `-pix_fmt yuv420p10le -strict -1` before `-f yuv4mpegpipe`, because FFmpeg refuses to write high-bit-depth Y4M without `-strict -1`.\n\n## Encoding with Av1an\n\nAv1an runs aomenc in two passes and pipes 10-bit `yuv420p10le` by default. Give each worker a couple of threads and let Av1an's scene detection place keyframes:\n\n```sh\nav1an -i input.mkv -e aom -v \"--end-usage=q --cq-level=24 --cpu-used=4 --threads=2 --lag-in-frames=48 --tune=ssim --enable-qm=1 --enable-chroma-deltaq=1 --deltaq-mode=0\" -o output.mkv\n```\n\nAv1an adds `--disable-kf --kf-max-dist=9999` itself, so aomenc does not place keyframes inside a chunk. Each chunk starts with a keyframe, and Av1an splits scenes longer than 10 seconds by default (`--extra-split-sec`). The perceptual options are explained in the next section. Av1an's `--photon-noise=N` adds synthetic film grain; see [film grain](#film-grain-synthesis).\n\n## Options that matter for quality\n\nDefaults below are for good-quality mode in libaom 3.15.1.\n\n| Option                                                                  | Default                         | What it does and how people set it                                                                                                                                                                                                                                                                                                                                                           |\n| ----------------------------------------------------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `--tune`                                                                | `psnr`                          | `ssim` is the usual choice for video. `iq` and `ssimulacra2` are image tunes: they turn on quantisation matrices, `--sharpness=7`, Variance Boost (`--deltaq-mode=6`), chroma delta-q and adaptive CDEF. Since 3.14 they also work outside all-intra mode, for layered images. `vmaf*` and `butteraugli` require a build with those tunes enabled; VMAF tunes also need `--vmaf-model-path`. |\n| `--tune-content`                                                        | `default`                       | `screen` for screen recordings and slides. `film` turns on film-grain synthesis with a fixed grain pattern.                                                                                                                                                                                                                                                                                  |\n| `--deltaq-mode`                                                         | `1`                             | Per-superblock quantiser modulation. Mode 1 uses the temporal (TPL) model to optimise objective quality, and community settings commonly turn it off with `0`. Mode 6 is Variance Boost, from SVT-AV1-PSY, which gives flat, low-variance areas more bits to fight banding and blocking. Mode 6 works in good-quality mode since 3.14, and `--deltaq-strength` scales it.                    |\n| `--enable-qm`, `--qm-min`, `--qm-max`                                   | `0`, `5`, `9`                   | Quantisation matrices quantise high frequencies more coarsely than low ones. They are off by default and commonly enabled for perceptual encodes. The levels run from 0 to 15, and a lower level means a less flat matrix.                                                                                                                                                                   |\n| `--enable-chroma-deltaq`                                                | `0`                             | Automatic chroma quantiser offsets. With `--tune=iq` or `ssimulacra2` they depend on subsampling; with other tunes (including `ssim`) chroma qindex is only raised by 2.                                                                                                                                                                                                                                                                                                                           |\n| `--sharpness`                                                           | `0`                             | 0–7. Biases rate–distortion decisions towards keeping detail; in all-intra mode it also reduces loop filtering. Higher values retain texture at the cost of more ringing.                                                                                                                                                                                                                    |\n| `--arnr-strength`, `--arnr-maxframes`                                   | `5`, `7`                        | Strength and length of the temporal denoising filter applied to alt-ref frames. It smooths fine detail. Community guides lower the strength to 1–2 for animation and clean CGI and keep the default or higher for noisy live action and low bitrates.                                                                                                                                        |\n| `--lag-in-frames`                                                       | `35`                            | Lookahead for frame-type and rate-control decisions. The maximum in mainline is 48, so older guides' `--lag-in-frames=64` is rejected with “g_lag_in_frames out of range”. Some forks allow more.                                                                                                                                                                                            |\n| `--enable-keyframe-filtering`                                           | `1`                             | Temporal filtering on keyframes. `2` adds an overlay frame and is marked experimental because it can break seeking. Leave it at 1.                                                                                                                                                                                                                                                           |\n| `--kf-max-dist`, `--enable-fwd-kf`                                      | `9999`, `0`                     | For standalone encodes, set `--kf-max-dist` to the seek granularity you want (e.g. 10 seconds' worth of frames). Av1an disables aomenc's keyframe placement itself.                                                                                                                                                                                                                          |\n| `--denoise-noise-level`, `--enable-dnl-denoising`, `--film-grain-table` | `0`, `1`, unset                 | Film-grain synthesis. See below.                                                                                                                                                                                                                                                                                                                                                             |\n| `--threads`, `--row-mt`, `--tile-columns`, `--tile-rows`                | `0` (one thread), `1`, `0`, `0` | aomenc does not thread unless you set `--threads`. Tile values are log2: `--tile-columns=2` means four columns. Tiles speed up encoding and decoding but cost some efficiency. With Av1an, use no tiles and `--threads=2`. For standalone encodes, a common rule is no tiles up to 1080p, `--tile-columns=1` at 1440p, and `--tile-columns=2 --tile-rows=1` at 2160p.                        |\n\nOptions are applied in command-line order, and `--tune=iq`/`--tune=ssimulacra2` set several of the options above. Put the tune first if you want to override any of them.\n\n### Film grain synthesis\n\n`--denoise-noise-level=N` (0–50) makes libaom estimate the source's grain, denoise the frame, encode the cleaner picture and signal grain parameters that the decoder re-synthesises. Grain is expensive to encode, so this saves a lot of bitrate on grainy sources.\n\nThe built-in denoiser smears detail. Many encoders therefore add `--enable-dnl-denoising=0`: the grain is still estimated and synthesised, but the encoded frame is not denoised first. Keep the level low (single digits to about 10), because high values produce visible, patterned grain. As an alternative, pass a photon-noise table with `--film-grain-table`. Av1an's `--photon-noise=N` generates one for you.\n\nGrain synthesis lowers full-reference metric scores even when the result looks better, so turn it off when comparing encoders with [metrics](/reference/metrics/ssimulacra2/).\n\n## FFmpeg (libaom-av1)\n\n```sh\nffmpeg -i input.mkv -c:v libaom-av1 -crf 24 -cpu-used 4 -pix_fmt yuv420p10le -aom-params tune=ssim:enable-qm=1:enable-chroma-deltaq=1 -c:a copy output.mkv\n```\n\n- `-crf` on its own selects constant-quality (`q`) mode. Adding `-b:v` turns it into constrained quality. FFmpeg's `-b:v` is in bit/s, whereas aomenc's `--target-bitrate` is in kbit/s.\n- The wrapper's default `-cpu-used` is 1, which is very slow. Always set it.\n- FFmpeg runs a single pass unless you use `-pass 1` and `-pass 2`.\n- `-aom-params key=value:key=value` passes libaom options that have no FFmpeg equivalent, using aomenc's long option names. Options stored in libaom's main encoder configuration (end usage, bitrate, min/max quantiser, lag, keyframe distances, bit depth, threads, frame limit) cannot be set this way; use FFmpeg's own options for those.\n\n## AVIF images\n\nFor still images, use [libavif's `avifenc`](/codecs/images/avif/), which uses libaom by default:\n\n```sh\navifenc -q 65 -s 4 input.png output.avif\n```\n\nWith libavif 1.4 and libaom 3.13 or newer, still images are encoded with libaom's `tune=iq` image tune by default, so there is no need to pass it with `-a`. Speeds of 4 and below give the best compression. The [AVIF page](/codecs/images/avif/) covers bit depth, chroma subsampling and the other `avifenc` options.\n\n## Community forks\n\nMainline libaom defaults to PSNR-oriented decisions. Community forks change defaults and add perceptual tunes and controls:\n\n- [aom-psy101](/tools/software-encoders/aom-psy101/) by Damian Höster follows current libaom. Its fork-specific work last changed in February 2025, and upstream libaom was last merged in June 2026.\n- [aom-av1-lavish](/tools/software-encoders/aom-av1-lavish/) by Clybius is unmaintained. It is based on libaom 3.6.0 and was last committed to in November 2023.\n- [aom-av1-psy](https://github.com/BlueSwordM/aom-av1-psy) by BlueSwordM is archived. Its last commit was on 13 January 2023.\n- [aom-av1ador](https://github.com/porcino/aom-av1ador) by porcino was last committed to on 31 May 2024.\n\nSome psy-community work has since reached mainline. `--tune=iq` and Variance Boost (`--deltaq-mode=6`) were ported from SVT-AV1-PSY in libaom 3.12.\n\n## Related pages\n\n- [SVT-AV1](/tools/software-encoders/svt-av1/) and [rav1e](/tools/software-encoders/rav1e/) are the other main open-source AV1 encoders.\n- [Av1an](/tools/utilities/av1an/) handles chunked, parallel encoding with aomenc.\n- [AVIF](/codecs/images/avif/) covers the image format.\n\n## FFmpeg libaom-av1 private options (n9.0.2)\n\nPrivate options of the `libaom-av1` encoder in FFmpeg n9.0.2. A value of -1 or `auto` keeps the libaom default, shown in brackets or listed in the native table below; the boolean coding-tool options take `auto`, 0 or 1. FFmpeg's generic options set the rest: `-b:v` (bit/s, where aomenc uses kbit/s), `-qmin`/`-qmax`, `-g`, `-keyint_min`, `-pass`, `-profile` and `-threads`, which defaults to all CPU cores (up to 64) rather than aomenc's single thread.\n\n<details>\n<summary>Speed, usage and tuning (4 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `-cpu-used` | 1 | Speed preset, as aomenc `--cpu-used`. FFmpeg limits it to 0–8; realtime speeds 9–12 need `-aom-params cpu-used=N`. The default 1 is very slow, so always set it. |\n| `-usage` | good (0) | `good` (0), `realtime` (1) or `allintra` (2), as aomenc `--usage`. |\n| `-tune` | -1 (libaom: psnr) | `psnr` or `ssim`. Other tunes, such as `iq` or `ssimulacra2`, go through `-aom-params tune=…`. |\n| `-still-picture` | 0 (off) | Single-frame mode for AVIF: one frame, no lookahead, keyframes only, and libaom writes the reduced still-picture header. |\n\n</details>\n\n<details>\n<summary>Rate control (8 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `-crf` | -1 (32 without -b:v) | Quality level 0–63 (aomenc `--cq-level`). On its own it selects `q` mode; with `-b:v` it selects constrained quality (`cq`). `-crf 0` without `-qmax` is lossless. |\n| `-aq-mode` | -1 (libaom: 0) | Segment-based adaptive quantisation: `none` (0), `variance` (1), `complexity` (2) or `cyclic` (3). |\n| `-undershoot-pct` | -1 (libaom: 25) | Allowed bitrate undershoot in percent, 0–100 (aomenc `--undershoot-pct`). |\n| `-overshoot-pct` | -1 (libaom: 25) | Allowed bitrate overshoot in percent (aomenc `--overshoot-pct`). FFmpeg accepts up to 1000, libaom only 100. |\n| `-minsection-pct` | -1 (libaom: 0) | Two-pass minimum GOP bitrate in percent of the target. When unset it is derived from `-minrate`. |\n| `-maxsection-pct` | -1 (libaom: 2000) | Two-pass maximum GOP bitrate in percent of the target. When unset and `-maxrate` is given, it is derived from `-maxrate`. |\n| `-drop-threshold` | 0 (off) | Drop frames when the rate buffer falls below this fill level in percent (aomenc `--drop-frame`). Used with CBR. |\n| `-static-thresh` | 0 | Passed to libaom, which does not use it for AV1. |\n\n</details>\n\n<details>\n<summary>Lookahead, alt-refs and denoising (6 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `-lag-in-frames` | -1 (libaom: 35) | Lookahead in frames, 0–48 (aomenc `--lag-in-frames`). FFmpeg forces 0 in the first pass of a two-pass encode. |\n| `-auto-alt-ref` | -1 (libaom: 1) | Alternate reference frames, 0 or 1 (aomenc `--auto-alt-ref`). |\n| `-arnr-max-frames` | -1 (libaom: 7) | Frames averaged by the alt-ref temporal filter, 0–15 (aomenc `--arnr-maxframes`). |\n| `-arnr-strength` | -1 (libaom: 5) | Alt-ref temporal filter strength, 0–6. Lower values keep more fine detail. |\n| `-denoise-noise-level` | -1 (libaom: 0) | Film-grain synthesis level, 0–50 (aomenc `--denoise-noise-level`). Add `-aom-params enable-dnl-denoising=0` to encode the original frame rather than the denoised one. |\n| `-denoise-block-size` | -1 (libaom: 32) | Block size in pixels for the grain estimator. |\n\n</details>\n\n<details>\n<summary>Tiles, threads and error resilience (6 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `-tiles` | unset | Tile grid as actual columns × rows, e.g. `4x2`. FFmpeg uses uniform tiling when it can and explicit tile sizes otherwise. |\n| `-tile-columns` | -1 (libaom: 0) | Number of tile columns as log2, 0–6. |\n| `-tile-rows` | -1 (libaom: 0) | Number of tile rows as log2, 0–6. |\n| `-row-mt` | auto | Row-based multithreading inside tiles; needs `-threads` above 1. |\n| `-frame-parallel` | auto | Disable backward probability adaptation so that a decoder can decode frames in parallel. |\n| `-error-resilience` | 0 (off) | `default` turns on error-resilient frames (aomenc `--global-error-resilient`). |\n\n</details>\n\n<details>\n<summary>Coding tools (32 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `-enable-cdef` | auto | CDEF deringing filter, on or off. Modes 2 and 3 of aomenc `--enable-cdef` need `-aom-params enable-cdef=N`. |\n| `-enable-restoration` | auto | Loop restoration (Wiener and self-guided filters). Slow to search; always off in realtime mode. |\n| `-enable-global-motion` | auto | Frame-level global motion models for camera pans, zooms and rotation. |\n| `-enable-intrabc` | auto | Intra block copy from an already coded area of the same frame. Used only in intra frames with screen-content tools. |\n| `-enable-rect-partitions` | auto | Rectangular partitions (horizontal and vertical halves). |\n| `-enable-1to4-partitions` | auto | 1:4 and 4:1 partitions (four horizontal or vertical strips). |\n| `-enable-ab-partitions` | auto | AB partitions: a split into one half and two quarters. |\n| `-enable-angle-delta` | auto | Fine angle offsets (up to ±3 steps of 3°) on directional modes. |\n| `-enable-cfl-intra` | auto | Chroma from luma: chroma predicted from the reconstructed luma. |\n| `-enable-filter-intra` | auto | Filter-intra modes: recursive filtered prediction in 4×2 cells, for smooth texture. |\n| `-enable-intra-edge-filter` | auto | Smoothing and upsampling of the reference edge used for directional prediction. |\n| `-enable-smooth-intra` | auto | Smooth, smooth-horizontal and smooth-vertical intra modes, which interpolate between edges. |\n| `-enable-paeth-intra` | auto | Paeth intra predictor, which picks the left, top or top-left neighbour per pixel. |\n| `-enable-palette` | auto | Palette mode, which codes a block as up to eight colours. Used only when screen-content tools are active. |\n| `-enable-flip-idtx` | auto | Extended transform types: flipped ADST, identity and one-dimensional (horizontal or vertical) transforms. |\n| `-enable-tx64` | auto | 64-point transforms for blocks of 64 pixels and larger. |\n| `-reduced-tx-type-set` | auto | Search a reduced set of transform types, which is faster. |\n| `-use-intra-dct-only` | auto | Use only the DCT for intra blocks. |\n| `-use-inter-dct-only` | auto | Use only the DCT for inter blocks. |\n| `-use-intra-default-tx-only` | auto | Use only the default transform type of each intra mode. |\n| `-enable-ref-frame-mvs` | auto | Temporal motion-vector prediction from the motion fields of reference frames. |\n| `-enable-reduced-reference-set` | auto | Search a reduced set of single and compound references, which is faster. |\n| `-enable-obmc` | auto | Overlapped block motion compensation: blends in predictions made with neighbouring blocks' motion to soften block edges. |\n| `-enable-dual-filter` | auto | Separate interpolation filters for horizontal and vertical sub-pixel motion. |\n| `-enable-diff-wtd-comp` | auto | Difference-weighted compound, with a mask derived from the difference between the two predictions. |\n| `-enable-dist-wtd-comp` | auto | Distance-weighted compound prediction, weighting two references by their temporal distance. Off when order hints are off. |\n| `-enable-onesided-comp` | auto | Compound prediction from two references on the same side (both past or both future). |\n| `-enable-interinter-wedge` | auto | Wedge-shaped masks for compound prediction from two references. |\n| `-enable-interintra-wedge` | auto | Wedge-shaped masks for inter-intra prediction. |\n| `-enable-masked-comp` | auto | Masked compound prediction (wedge and difference-weighted); 0 turns both off. |\n| `-enable-interintra-comp` | auto | Inter-intra prediction: an inter prediction blended with an intra prediction. |\n| `-enable-smooth-interintra` | auto | Smooth (gradual) blending for inter-intra prediction. |\n\n</details>\n\n<details>\n<summary>Metadata and pass-through (2 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `-dolbyvision` | auto | Write Dolby Vision RPUs from frame side data; `auto` does so when the input carries a Dolby Vision configuration. |\n| `-aom-params` | unset | Any libaom encoder control by its aomenc long name, as `key=value:key=value` (e.g. `tune=iq:enable-qm=1`). Rate-control mode, bitrate, quantiser limits, keyframe interval, bit depth and threads cannot be set this way; use FFmpeg's own options for those. |\n\n</details>\n\n## Complete native parameter reference\n\nEvery option aomenc 3.15.1 accepts, including those that need optional build features and a few that `--help` does not list (`--tile-width`, `--tile-height`, `--use-fixed-qp-offsets`, `--fixed-qp-offsets`, `--two-pass-input`, `--two-pass-width` and `--two-pass-height`). Defaults are for good-quality mode; realtime and all-intra defaults are given where they differ.\n\n<details>\n<summary>Application and output (19 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--help` | — | Print the full option list and exit. |\n| `--cfg`, `-c` | unset | Read low-level tool settings from a key–value file in the format of libaom's `Sample.cfg`. Only the first `--cfg` is used. |\n| `--debug`, `-D` | off | Leave the application version out of the WebM tags so that repeated encodes are byte-identical. |\n| `--output`, `-o` | required | Output file. A `.ivf` or `.obu` extension selects that format unless `--webm` is given; any other name gets WebM. |\n| `--codec` | `av1` | Encoder to use. libaom builds contain only `av1`. |\n| `--limit` | 0 (all frames) | Stop after this many input frames. |\n| `--skip` | 0 | Skip this many input frames before encoding. |\n| `--quiet`, `-q` | off | Do not print progress. |\n| `--verbose`, `-v` | off | Print the encoder configuration before encoding. |\n| `--psnr` | 0 (off) | Report PSNR: 1 at the input bit depth, 2 at the stream bit depth. `--psnr` without a value means 1. |\n| `--test-decode` | off | Decode every frame while encoding and compare it with the encoder's reconstruction: `warn` reports a mismatch, `fatal` stops the encode. |\n| `--webm` | on | WebM output. Requires a build with WebM I/O (`CONFIG_WEBM_IO`, on by default); without it the default output is raw OBU. |\n| `--ivf` | off | IVF output, the minimal frame container used by libaom's own tools and test vectors. |\n| `--obu` | off | Raw low-overhead OBU stream (AV1 Section 5) with no container. |\n| `--annexb` | 0 (off) | Write the length-delimited Annex B bitstream format instead of Section 5 OBUs. Range 0–1. |\n| `--q-hist` | 0 (off) | After encoding, print a histogram of frame quantisers with this many buckets. |\n| `--rate-hist` | 0 (off) | After encoding, print a histogram of frame bitrates with this many buckets. |\n| `--disable-warnings` | off | Suppress the warnings about questionable settings. |\n| `--disable-warning-prompt`, `-y` | off | Print those warnings but do not stop to ask whether to continue. |\n\n</details>\n\n<details>\n<summary>Usage modes and passes (12 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--good` | selected | Good-quality mode (`--usage=0`), the normal mode for offline video. |\n| `--rt` | off | Realtime mode (`--usage=1`): one pass, no lookahead, speeds 5–12, for low-latency streaming and conferencing. |\n| `--allintra` | off | All-intra mode (`--usage=2`): every frame is a keyframe, no lookahead, speeds 0–9. Meant for still images and image sequences; it also turns CDEF off and changes the QM range and screen-content detection defaults. |\n| `--usage`, `-u` | 0 (good) | Usage mode by number: 0 good quality, 1 realtime, 2 all-intra. Same as `--good`, `--rt` and `--allintra`. |\n| `--passes`, `-p` | 2 (1 in realtime and all-intra) | Number of passes, 1–3. Two-pass good-quality encodes use the first-pass statistics even in `q` mode; realtime and all-intra always run one pass. Three passes add a half-resolution second pass whose decisions guide the final pass. |\n| `--pass` | all passes | Run only pass 1, 2 or 3 of a multi-pass encode, so that the passes can run as separate processes (each needs the same `--fpf`). |\n| `--fpf` | in memory | First-pass statistics file. Needed when passes run as separate processes; otherwise the statistics stay in memory. |\n| `--two-pass-output` | `<output>_pass2_<n>.ivf` | Three-pass encoding: IVF file that receives the second (downscaled) pass. |\n| `--second-pass-log`, `-spf` | unset | Three-pass encoding: file in which the second pass stores its GOP and TPL decisions for the third pass. |\n| `--two-pass-input` | unset | Three-pass encoding: an already-downscaled source to read in the second pass instead of scaling the input to half size. |\n| `--two-pass-width` | 0 (half the input) | Three-pass encoding: frame width of the second pass (and of raw `--two-pass-input`). |\n| `--two-pass-height` | 0 (half the input) | Three-pass encoding: frame height of the second pass (and of raw `--two-pass-input`). |\n\n</details>\n\n<details>\n<summary>Input format (20 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--i420` | on for raw input | Raw input is 4:2:0 planar (I420). Y4M input takes its format from the header. |\n| `--yv12` | off | Raw input is YV12 (4:2:0 planar with V before U). |\n| `--nv12` | off | Raw input is NV12 (4:2:0 with interleaved U and V). |\n| `--i422` | off | Raw input is 4:2:2 planar. |\n| `--i444` | off | Raw input is 4:4:4 planar. |\n| `--width`, `-w` | from Y4M | Frame width in pixels. Required for raw input. |\n| `--height`, `-h` | from Y4M | Frame height in pixels. Required for raw input. |\n| `--fps` | from Y4M (raw: 30/1) | Frame rate as a fraction, e.g. `24000/1001`. |\n| `--timebase` | 1/fps | Timestamp precision in fractional seconds. aomenc overwrites it with the inverse frame rate before encoding, so setting it has no effect. |\n| `--bit-depth`, `-b` | 8 (or the input's, if higher) | Bit depth of the encoded stream: 8, 10 or 12. Encoding 8-bit sources at 10 bits reduces banding and usually improves efficiency. |\n| `--input-bit-depth` | from Y4M (raw: `--bit-depth`) | Bit depth of raw input when it differs from the stream bit depth. |\n| `--input-chroma-subsampling-x` | 0 | Horizontal chroma subsampling (0 or 1) of 12-bit raw input in profile 2. Y4M input supplies it from the header. |\n| `--input-chroma-subsampling-y` | 0 | Vertical chroma subsampling (0 or 1) of 12-bit raw input in profile 2. |\n| `--profile` | 0 (Main) | AV1 profile: 0 Main (4:2:0 and monochrome, 8–10 bit), 1 High (adds 4:4:4), 2 Professional (adds 4:2:2 and 12 bit). aomenc raises it when the input needs a higher profile. |\n| `--monochrome` | off | Encode luma only, with no chroma planes. |\n| `--use-16bit-internal` | off (on above 8 bit) | Use the high-bit-depth (16-bit) pipeline for an 8-bit encode. |\n| `--validate-hbd-input` | 1 (on) | Check that every high-bit-depth input sample lies within the range of the bit depth. Range 0–1. |\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| `--forced_max_frame_width` | 0 (first frame) | Maximum frame width written to the sequence header, so that later frames (for example after a resize) may be wider than the first. |\n| `--forced_max_frame_height` | 0 (first frame) | Maximum frame height written to the sequence header. |\n\n</details>\n\n<details>\n<summary>Rate control (24 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--end-usage` | vbr (q in all-intra, cbr in realtime) | Rate-control mode: `vbr`, `cbr`, `cq` (constrained quality: `--cq-level` capped by `--target-bitrate`) or `q` (constant quality at `--cq-level`). Quality-targeted encodes use `q`. |\n| `--target-bitrate` | 256 | Target bitrate in kbit/s for `vbr` and `cbr`, and the bitrate cap in `cq` mode. |\n| `--cq-level` | 10 | Quality level for `q` and `cq` modes, 0–63; lower is better. It maps to qindex 4×N (255 at 63). The scale does not match x264, x265 or SVT-AV1 CRF values. |\n| `--min-q` | 0 | Best (lowest) quantiser rate control may use, 0–63. In `q` mode `--cq-level` must not be below it. |\n| `--max-q` | 63 | Worst (highest) quantiser rate control may use, 0–63. |\n| `--lossless` | 0 (off) | Mathematically lossless coding (qindex 0 with the lossless transform). Range 0–1. |\n| `--undershoot-pct` | 25 (50 in realtime) | How far below the target bitrate a GOP may fall, in percent (0–100), before rate control compensates. |\n| `--overshoot-pct` | 25 (50 in realtime) | How far above the target bitrate a GOP may go, in percent (0–100), before rate control compensates. |\n| `--buf-sz` | 6000 (1000 in realtime) | Decoder buffer size in milliseconds at the target bitrate, for the rate-control buffer model. |\n| `--buf-initial-sz` | 4000 (600 in realtime) | Initial decoder buffer fill in milliseconds. |\n| `--buf-optimal-sz` | 5000 (600 in realtime) | Target decoder buffer fill in milliseconds. |\n| `--bias-pct` | 50 | Two-pass VBR bit distribution, 0–100: 0 spreads bits evenly like CBR, 100 follows frame complexity fully. Ignored in one pass. |\n| `--minsection-pct` | 0 | Lowest bitrate a GOP may get in two-pass VBR, as a percentage of the target. Ignored in one pass. |\n| `--maxsection-pct` | 2000 | Highest bitrate a GOP may get in two-pass VBR, as a percentage of the target. Ignored in one pass. |\n| `--drop-frame` | 0 (off) | Drop frames when the rate buffer falls below this fill level (percent, 0–100). Used with CBR. |\n| `--max-intra-rate` | 0 (unlimited) | Cap on keyframe size as a percentage of the average frame size (450 allows 4.5 frames' worth). |\n| `--max-inter-rate` | 0 (unlimited) | Cap on inter-frame size as a percentage of the average frame size. |\n| `--gf-cbr-boost` | 0 (off) | Extra bits for golden frames in CBR mode, as a percentage of the average frame bitrate. |\n| `--frame-boost` | 0 (off) | Periodic quantiser boost (0–1). The setting is accepted but the AV1 encoder does not use it. |\n| `--vbr-corpus-complexity-lap` | 0 (off) | One-pass VBR with lookahead only: average complexity per macroblock of the content corpus (0–10000), used to distribute bits. |\n| `--min-cr` | 0 (off) | Minimum compression ratio per frame ×100 (850 means 8.5:1), used to stay within level limits. |\n| `--use-fixed-qp-offsets` | 0 (adaptive) | `q` mode only: 0 derives per-layer quantiser offsets from `--cq-level` adaptively, 1 uses fixed offsets, 2 codes every frame at `--cq-level` with no offsets. |\n| `--fixed-qp-offsets` | unset | Meant to give five offsets (keyframe, ALTREF and three internal alt-ref levels). aomenc only uses it to switch on `--use-fixed-qp-offsets=1` and ignores the values. |\n| `--sb-qp-sweep` | 0 (off) | Try several quantisers per superblock and keep the one with the lowest RD cost. Intended for libaom's unit tests; very slow. |\n\n</details>\n\n<details>\n<summary>Keyframes and GOP structure (12 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--kf-min-dist` | 0 | Minimum keyframe interval in frames. Set it equal to `--kf-max-dist` for a fixed interval. |\n| `--kf-max-dist` | 9999 (0 in all-intra) | Maximum keyframe interval in frames; scene-cut keyframes can come sooner. For standalone encodes set it to the seek granularity you want, e.g. ten seconds of frames. |\n| `--disable-kf` | off | Place no keyframes after the first frame. Av1an sets this for each chunk. |\n| `--enable-fwd-kf` | 0 (off) | Forward keyframes (open GOP): the keyframe is coded early as an alt-ref, so frames shown before it can reference it. Range 0–1. |\n| `--fwd-kf-dist` | -1 (off) | Distance in frames between repeated forward keyframes. |\n| `--sframe-dist` | 0 (off) | Insert a switch frame (S-frame, a point where a player can switch between streams) every N frames. |\n| `--sframe-mode` | 1 | S-frame placement, 1–2: 1 turns the frame into an S-frame only if it is an alt-ref, 2 uses the next alt-ref. |\n| `--min-gf-interval` | 0 (auto) | Shortest golden-frame group (distance between alt-refs) in frames, up to 47. |\n| `--max-gf-interval` | 0 (auto) | Longest golden-frame group in frames, 2–47. |\n| `--gf-min-pyr-height` | 0 | Minimum depth of the hierarchical reference pyramid in a GF group, 0–5. |\n| `--gf-max-pyr-height` | 5 | Maximum depth of the hierarchical reference pyramid in a GF group, 0–5. Lower values mean fewer reference layers and less temporal quality variation. |\n| `--kf-max-pyr-height` | -1 (off) | Maximum pyramid depth for the GF group that starts at a keyframe, −1–5; the smaller of this and `--gf-max-pyr-height` applies. |\n\n</details>\n\n<details>\n<summary>Lookahead, alt-refs and temporal filtering (7 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--lag-in-frames` | 35 (0 in realtime and all-intra) | Lookahead in frames for frame-type, alt-ref and rate-control decisions, 0–48. Larger values use more memory. Older guides' `--lag-in-frames=64` is rejected as out of range. |\n| `--auto-alt-ref` | 1 (on) | Use alternate reference frames: hidden, temporally filtered frames that the frames around them predict from. Values above 1 are treated as 1. |\n| `--enable-overlay` | 1 (on) | Code an overlay frame where a filtered alt-ref is displayed. With 0 the filtered alt-ref is shown as it is. |\n| `--enable-tpl-model` | 1 (on) | Temporal dependency model (TPL): estimates how much later frames reference each block and spends bits accordingly. Required by `--deltaq-mode=1`. |\n| `--enable-keyframe-filtering` | 1 | Temporal filtering of keyframes: 0 off, 1 on, 2 on with an overlay frame (experimental; can break seeking in players). |\n| `--arnr-maxframes` | 7 | Number of frames, 0–15, that the alt-ref temporal filter averages; 0 or 1 disables filtering. |\n| `--arnr-strength` | 5 | Alt-ref temporal filter strength, 0–6. Lower values keep more fine detail; community guides use 1–2 for animation and clean CGI. |\n\n</details>\n\n<details>\n<summary>Speed and tuning (11 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--cpu-used` | 0 | Speed preset; lower is slower and more efficient. Good-quality mode uses 0–6 (the library accepts up to 9, but nothing changes beyond 6), realtime 5–12, all-intra 0–9. 4 is a common balance. |\n| `--tune` | `psnr` | Metric that RD decisions optimise: `psnr`, `ssim` (the usual choice for video), `iq` and `ssimulacra2` (image tunes, accepted in every usage mode since 3.14), `butteraugli` (requires `-DCONFIG_TUNE_BUTTERAUGLI=1`), the `vmaf*` tunes (require `-DCONFIG_TUNE_VMAF=1` and `--vmaf-model-path`) and `vmaf_saliency_map` (requires `-DCONFIG_SALIENCY_MAP=1`). `iq` and `ssimulacra2` also set QMs, `--sharpness=7`, `--deltaq-mode=6`, chroma delta-q, QM-PSNR and adaptive CDEF, so give them before any option you want to override. |\n| `--tune-content` | `default` | Content type: `screen` enables screen-content tools for desktop recordings and slides; `film` adds film-grain synthesis with a fixed built-in grain pattern. |\n| `--dist-metric` | `psnr` | Distortion measure inside block decisions: `psnr`, or `qm-psnr`, which weights errors by the quantisation matrices (set by `--tune=iq` and `ssimulacra2`). |\n| `--sharpness` | 0 | Bias, 0–7, of coefficient RD decisions towards keeping block detail. In all-intra mode it also sets the bitstream's loop-filter sharpness, which weakens deblocking on block edges. |\n| `--enable-adaptive-sharpness` | 0 (off) | Vary the effective sharpness with the frame quantiser, using `--sharpness` as the maximum; reduces blocking at low and medium quality. No effect while `--sharpness` is 0. `--tune=iq` turns it on. |\n| `--screen-detection-mode` | 1 (2 in all-intra) | Screen-content detection: 1 standard, 2 also recognises anti-aliased text and graphics. |\n| `--enable-low-complexity-decode` | 0 (off) | Restrict tools so the stream is cheaper to decode. It only applies to good-quality speeds 1–3 when the shorter frame side is 608–1080 pixels and `--sharpness` is not 3. |\n| `--static-thresh` | 0 | Motion threshold inherited from VP8/VP9. The setting is accepted but the AV1 encoder does not use it. |\n| `--noise-sensitivity` | 0 (off) | Temporal denoiser strength, 0–6, for realtime encodes. Requires a build with `-DCONFIG_AV1_TEMPORAL_DENOISING=1` and only acts on 8-bit encodes at speed 8 and above. |\n| `--vmaf-model-path` | `/usr/local/share/model/vmaf_v0.6.1.json` | VMAF model file used by the `vmaf*` tunes. Requires a build with `-DCONFIG_TUNE_VMAF=1`. |\n\n</details>\n\n<details>\n<summary>Adaptive quantisation and delta-q (8 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--deltaq-mode` | 1 (objective) | Per-superblock quantiser modulation: 0 off; 1 objective, from the TPL model (needs `--enable-tpl-model=1`); 2 perceptual (wavelet energy); 3 perceptual for all-intra; 4 user-rating-based (all-intra); 5 HDR (only for 10-bit BT.2020 input); 6 Variance Boost, which gives flat, low-variance areas more bits against banding and blocking. Community video settings often use 0 or 6. |\n| `--deltaq-strength` | 100 | Strength of `--deltaq-mode=4` and `6`, in percent (0–1000). |\n| `--delta-lf-mode` | 0 (off) | Also vary the loop-filter level per superblock. Only works with a non-zero `--deltaq-mode`. Range 0–1. |\n| `--aq-mode` | 0 (off) | Segment-based adaptive quantisation, separate from delta-q: 0 off, 1 variance, 2 complexity, 3 cyclic refresh (realtime). |\n| `--enable-chroma-deltaq` | 0 (off) | Chroma quantiser offsets. With `--tune=iq` or `ssimulacra2` they depend on subsampling (finer chroma for 4:2:0, coarser chroma AC for 4:2:2 and 4:4:4); with other tunes chroma qindex is simply raised by 2. |\n| `--enable-rate-guide-deltaq` | 0 (off) | All-intra only: rate-guided delta-q from a per-16×16-block rate file given with `--rate-distribution-info`. Needs `--deltaq-mode=3`. |\n| `--rate-distribution-info` | `./rate_map.txt` | Rate-distribution file for `--enable-rate-guide-deltaq`. |\n| `--auto-intra-tools-off` | 0 (off) | All-intra with `--deltaq-mode=3`: let the encoder switch off intra tools that rarely pay off. |\n\n</details>\n\n<details>\n<summary>Quantisation (5 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--enable-qm` | 0 (off) | Quantisation matrices: quantise high frequencies more coarsely than low ones. Commonly enabled for perceptual encodes. |\n| `--qm-min` | 5 (4 in all-intra) | Lowest QM level, 0–15 (15 is flat, lower levels weight frequencies more strongly). The level used rises with the quantiser from `--qm-min` to `--qm-max`. |\n| `--qm-max` | 9 (10 in all-intra) | Highest QM level, 0–15. |\n| `--quant-b-adapt` | 0 (off) | Adaptive quantiser: a wider dead zone for the trailing (highest-frequency) coefficients of each block, and a lone ±1 coefficient is dropped. Saves bits on fine noise. |\n| `--disable-trellis-quant` | 3 | Trellis (RD-optimised) coefficient quantisation: 0 always, 1 never, 2 not during the RD search, 3 not in the fast luma RD estimate. |\n\n</details>\n\n<details>\n<summary>Threads and tiles (11 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--threads`, `-t` | 0 (one thread) | Maximum number of worker threads. aomenc stays single-threaded unless this is set. |\n| `--row-mt` | 1 (on) | Row-based multithreading inside tiles; needs `--threads` above 1. Range 0–1. |\n| `--fp-mt` | 0 (off) | Frame-parallel multithreading: encode several frames at once for more speed with many threads, at a small efficiency cost. Range 0–1. |\n| `--tile-columns` | 0 | Number of tile columns as log2, 0–6 (2 means four columns). Tiles let encoder and decoder work in parallel but cost some efficiency; the frame width limits how many are possible. |\n| `--tile-rows` | 0 | Number of tile rows as log2, 0–6. |\n| `--auto-tiles` | 0 (off) | Choose tile columns and rows from the thread count and frame size, replacing `--tile-columns` and `--tile-rows`. Range 0–1. |\n| `--tile-width` | unset (uniform) | Non-uniform tile widths in superblocks, comma-separated; the list repeats across the frame. Needs `--tile-height` as well. |\n| `--tile-height` | unset (uniform) | Non-uniform tile heights in superblocks, comma-separated; the list repeats down the frame. |\n| `--large-scale-tile` | 0 (off) | Large-scale tile coding for random access to individual tiles (light-field and VR use). IVF output only. Range 0–1. |\n| `--num-tile-groups` | 1 | Maximum number of tile groups (OBUs) per frame. `--mtu-size` overrides it. |\n| `--mtu-size` | 0 (off) | Maximum bytes per tile group, for packetised transport. A single tile larger than this still goes in one group. |\n\n</details>\n\n<details>\n<summary>Partitioning and superblocks (7 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--sb-size` | `dynamic` | Superblock size: `dynamic` (the encoder picks 64×64 or 128×128 from resolution and speed), `64` or `128`. |\n| `--enable-rect-partitions` | 1 (on) | Rectangular partitions (horizontal and vertical halves). |\n| `--enable-ab-partitions` | 1 (on) | AB partitions: a split into one half and two quarters. |\n| `--enable-1to4-partitions` | 1 (on) | 1:4 and 4:1 partitions (four horizontal or vertical strips). |\n| `--min-partition-size` | 4 | Smallest block size searched: 4, 8, 16, 32, 64 or 128. At 4K and above, or at faster speeds, it is at least 8. |\n| `--max-partition-size` | 128 | Largest block size searched: 4, 8, 16, 32, 64 or 128. |\n| `--partition-info-path` | `.` | Directory for partition statistics read and written by libaom's partition experiments. |\n\n</details>\n\n<details>\n<summary>Intra prediction (11 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--enable-directional-intra` | 1 (on) | Directional (angular) intra modes. |\n| `--enable-diagonal-intra` | 1 (on) | The diagonal subset of directional modes (D45 to D203). No effect when directional modes are off. |\n| `--enable-angle-delta` | 1 (on) | Fine angle offsets (up to ±3 steps of 3°) on directional modes. |\n| `--enable-intra-edge-filter` | 1 (on) | Smoothing and upsampling of the reference edge used for directional prediction. |\n| `--enable-smooth-intra` | 1 (on) | Smooth, smooth-horizontal and smooth-vertical intra modes, which interpolate between edges. |\n| `--enable-paeth-intra` | 1 (on) | Paeth intra predictor, which picks the left, top or top-left neighbour per pixel. |\n| `--enable-filter-intra` | 1 (on) | Filter-intra modes: recursive filtered prediction in 4×2 cells, for smooth texture. |\n| `--enable-cfl-intra` | 1 (on) | Chroma from luma: chroma predicted from the reconstructed luma. |\n| `--enable-palette` | 1 (on) | Palette mode, which codes a block as up to eight colours. Used only when screen-content tools are active. |\n| `--enable-intrabc` | 1 (on) | Intra block copy from an already coded area of the same frame. Used only in intra frames with screen-content tools. |\n| `--force-video-mode` | 0 (off) | Use video coding settings even when only one frame is encoded, instead of still-picture settings. |\n\n</details>\n\n<details>\n<summary>Inter prediction (16 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--max-reference-frames` | 7 | Maximum number of reference frames searched per frame, 3–7. |\n| `--reduced-reference-set` | 0 (off) | Search a reduced set of single and compound references, which is faster. |\n| `--enable-order-hint` | 1 (on) | Frame order hints. Distance-weighted compound, temporal motion-vector projection and reference sign bias depend on them. |\n| `--enable-ref-frame-mvs` | 1 (on) | Temporal motion-vector prediction from the motion fields of reference frames. |\n| `--enable-dual-filter` | 1 (on) | Separate interpolation filters for horizontal and vertical sub-pixel motion. |\n| `--enable-global-motion` | 1 (on) | Frame-level global motion models for camera pans, zooms and rotation. |\n| `--enable-warped-motion` | 1 (on) | Local warped motion: a per-block affine model derived from neighbouring motion vectors. |\n| `--enable-obmc` | 1 (on) | Overlapped block motion compensation: blends in predictions made with neighbouring blocks' motion to soften block edges. |\n| `--enable-dist-wtd-comp` | 1 (on) | Distance-weighted compound prediction, weighting two references by their temporal distance. Off when order hints are off. |\n| `--enable-onesided-comp` | 1 (on) | Compound prediction from two references on the same side (both past or both future). |\n| `--enable-masked-comp` | 1 (on) | Masked compound prediction (wedge and difference-weighted); 0 turns both off. |\n| `--enable-diff-wtd-comp` | 1 (on) | Difference-weighted compound, with a mask derived from the difference between the two predictions. |\n| `--enable-interinter-wedge` | 1 (on) | Wedge-shaped masks for compound prediction from two references. |\n| `--enable-interintra-comp` | 1 (on) | Inter-intra prediction: an inter prediction blended with an intra prediction. |\n| `--enable-smooth-interintra` | 1 (on) | Smooth (gradual) blending for inter-intra prediction. |\n| `--enable-interintra-wedge` | 1 (on) | Wedge-shaped masks for inter-intra prediction. |\n\n</details>\n\n<details>\n<summary>Transforms (8 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--enable-tx64` | 1 (on) | 64-point transforms for blocks of 64 pixels and larger. |\n| `--enable-flip-idtx` | 1 (on) | Extended transform types: flipped ADST, identity and one-dimensional (horizontal or vertical) transforms. |\n| `--enable-rect-tx` | 1 (on) | Rectangular transforms. They need rectangular partitions. |\n| `--enable-tx-size-search` | 1 (on) | Search the transform size per block. With 0 each block uses its largest possible transform. |\n| `--reduced-tx-type-set` | 0 (off) | Search a reduced set of transform types, which is faster. |\n| `--use-intra-dct-only` | 0 (off) | Use only the DCT for intra blocks. |\n| `--use-inter-dct-only` | 0 (off) | Use only the DCT for inter blocks. |\n| `--use-intra-default-tx-only` | 0 (off) | Use only the default transform type of each intra mode. |\n\n</details>\n\n<details>\n<summary>Loop filters (3 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--loopfilter-control` | 1 (all frames) | Deblocking filter: 0 off, 1 all frames, 2 skip non-reference frames, 3 skip low-motion frames. |\n| `--enable-cdef` | 1 (0 in all-intra) | CDEF, the constrained directional enhancement (deringing) filter: 0 off, 1 all frames, 2 reference frames only, 3 adaptive, which weakens it at high quality. |\n| `--enable-restoration` | 1 (0 in realtime) | Loop restoration (Wiener and self-guided filters). It is slow to search and is always off in realtime mode. |\n\n</details>\n\n<details>\n<summary>Resize and super-resolution (8 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--resize-mode` | 0 (off) | Code frames at a lower resolution while the render size keeps the original: 0 off, 1 fixed (`--resize-denominator`), 2 random (testing), 3 dynamic (realtime CBR). |\n| `--resize-denominator` | 8 | Resize factor 8/N for non-key frames, N = 8–16 (16 halves both dimensions). |\n| `--resize-kf-denominator` | 8 | Resize factor 8/N for keyframes, N = 8–16. |\n| `--superres-mode` | 0 (off) | Super-resolution: code frames at reduced width and let the decoder upscale them in-loop: 0 off, 1 fixed, 2 random, 3 above a quantiser threshold, 4 automatic. |\n| `--superres-denominator` | 8 | Horizontal super-resolution factor 8/N for non-key frames, N = 8–16. |\n| `--superres-kf-denominator` | 8 | Horizontal super-resolution factor 8/N for keyframes, N = 8–16. |\n| `--superres-qthresh` | 63 | Mode 3: use super-resolution on non-key frames whose quantiser (1–63) exceeds this. |\n| `--superres-kf-qthresh` | 32 | Mode 3: the same threshold for keyframes. |\n\n</details>\n\n<details>\n<summary>Film grain and denoising (5 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--denoise-noise-level` | 0 (off) | Film-grain synthesis: estimate the source grain, denoise before encoding and signal grain for the decoder to add back. 0–50; keep it low (single digits to about 10) to avoid patterned grain. |\n| `--denoise-block-size` | 32 | Block size in pixels for the grain estimator. |\n| `--enable-dnl-denoising` | 1 (on) | Encode the denoised frame. With 0 the original frame is encoded and only the estimated grain parameters are added, which avoids the denoiser's smearing. |\n| `--film-grain-table` | unset | Read film-grain parameters from a table file, such as a photon-noise table from Av1an or grav1synth, instead of estimating them. |\n| `--film-grain-test` | 0 (off) | Use one of libaom's 16 built-in film-grain test parameter sets (1–16). |\n\n</details>\n\n<details>\n<summary>Entropy coding and cost updates (5 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--cdf-update-mode` | 1 | Adaptation of the entropy-coding probabilities (CDFs): 0 never, 1 every frame, 2 selectively. |\n| `--coeff-cost-upd-freq` | 0 (superblock) | How often the encoder refreshes its coefficient rate estimates: 0 each superblock, 1 each superblock row, 2 each tile, 3 never. Higher values are faster. |\n| `--mode-cost-upd-freq` | 0 (superblock) | Refresh interval for mode rate estimates, with the same values. |\n| `--mv-cost-upd-freq` | 0 (superblock) | Refresh interval for motion-vector rate estimates, with the same values. |\n| `--dv-cost-upd-freq` | 0 (superblock) | Refresh interval for intra-block-copy vector rate estimates, with the same values. |\n\n</details>\n\n<details>\n<summary>Signalling, levels and error resilience (12 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--color-primaries` | `unspecified` | Colour primaries (CICP) written to the sequence header; signalling only, no conversion. Values: `bt709`, `unspecified`, `bt601`, `bt470m`, `bt470bg`, `smpte240`, `film`, `bt2020`, `xyz`, `smpte431`, `smpte432`, `ebu3213`. |\n| `--transfer-characteristics` | `unspecified` | Transfer characteristics (CICP), e.g. `bt709`, `smpte2084` (PQ) or `hlg`. Values: `unspecified`, `bt709`, `bt470m`, `bt470bg`, `bt601`, `smpte240`, `lin`, `log100`, `log100sq10`, `iec61966`, `bt1361`, `srgb`, `bt2020-10bit`, `bt2020-12bit`, `smpte2084`, `hlg`, `smpte428`. |\n| `--matrix-coefficients` | `unspecified` | Matrix coefficients (CICP). Values: `identity`, `bt709`, `unspecified`, `fcc73`, `bt470bg`, `bt601`, `smpte240`, `ycgco`, `bt2020ncl`, `bt2020cl`, `smpte2085`, `chromncl`, `chromcl`, `ictcp`, `ipt-c2`, `ycgco-re`, `ycgco-ro`. |\n| `--chroma-sample-position` | `unknown` | 4:2:0 chroma siting: `unknown`, `vertical` (left, as MPEG-2) or `colocated` (top-left, as BT.2020). |\n| `--timing-info` | `unspecified` | Timing information in the sequence header: `unspecified`, `constant` (fixed frame rate) or `model` (decoder model; not with hidden frames or super-resolution). |\n| `--target-seq-level-idx` | 31 (unconstrained) | Target level per operating point, written `ABxy`: operating point AB, level index xy, where index = (major − 2) × 4 + minor (8 is level 4.0, 19 is 6.3). The encoder limits its decisions to meet it. |\n| `--strict-level-conformance` | 0 (off) | Stop with an error if the stream cannot meet `--target-seq-level-idx`. |\n| `--set-tier-mask` | 0 (Main) | Bit mask of operating points that use the High tier instead of Main (bit n is point n). |\n| `--full-still-picture-hdr` | off | For single-frame encodes, write the full sequence header instead of the reduced still-picture header. |\n| `--error-resilient` | 0 (off) | Error-resilient frames, which stay decodable when references are lost. Range 0–1. |\n| `--global-error-resilient` | 0 (off) | Same effect as `--error-resilient`, set through the generic encoder configuration (the two are combined). |\n| `--frame-parallel` | 0 (off) | Disable backward probability adaptation so that a decoder can decode frames in parallel. Range 0–1. |\n\n</details>\n"
}
