# aom-av1-lavish

Canonical URL: https://encode.wiki/tools/software-encoders/aom-av1-lavish/
Content version: ca42e61ede0a24f789d7287a0001244ad22f4abf
Status: current
License: CC BY-SA 4.0
Checksum (SHA-256): 656b638088afb0ea128575f334aa7327fa042e8f3d32a915fa103ffdcbe99c4f

> **Repository:** [Clybius/aom-av1-lavish](https://github.com/Clybius/aom-av1-lavish) (No commits since Nov 2022). A fork of aom-av1-psy, which is a fork of aomenc. Designed to open up the encoder for hyper-tuning and fidelity. Last commit: Nov 20, 2022. License: BSD-2-Clause. Stars: 59.

aom-av1-lavish is a fork of [aomenc](/tools/software-encoders/aomenc/) by Clybius. It builds on BlueSwordM's aom-av1-psy and was "designed to open up the encoder for hyper-tuning and fidelity". It was popular for high-fidelity Av1an encodes in 2022–2023.

> **Caution — Unmaintained.**
>
> Development has stopped. The default branch was last changed on 20 November 2022, `Endless_Merging` on 4 March 2023, and the repository as a whole on 14 November 2023. `Endless_Merging` is based on libaom 3.6.0 (February 2023) and the default branch on 3.4.0, so both lack later libaom work such as `--tune=iq`, Variance Boost and three years of speed and efficiency improvements. For new encodes, use [aom-psy101](/tools/software-encoders/aom-psy101/), which carries several lavish patches on current libaom, or mainline aomenc.
## Branches

| Branch                          | Contents                                                                                                                                                           |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `Endless_Possibility` (default) | The main psy and configuration changes.                                                                                                                            |
| `Endless_Instability`           | Unstable and public-testing changes.                                                                                                                               |
| `Endless_Merging`               | `Endless_Instability` merged with libaom updates up to 3.6.0. This is the branch community guides and builds used.                                                 |
| `Endless_Butter`                | Temporary experimental Butteraugli fixes.                                                                                                                          |
| `opmox/mainline-merge`          | `Endless_Merging` plus seven experimental commits from November 2023, including the fork's own `--deltaq-mode=6`, which is unrelated to mainline's Variance Boost. |

## Building

`Endless_Merging` no longer builds with current toolchains as is. Its CMake check rejects NASM 3.x (libaom fixed this upstream in 2025), and GCC 14 and later stop on a missing include (the fix is in the repository's unmerged pull request 1). Patch both and build:

```sh
git clone -b Endless_Merging https://github.com/Clybius/aom-av1-lavish
cd aom-av1-lavish
sed -i 's/if(NOT "${nasm_helptext}" MATCHES "-Ox")/if(FALSE)/' build/cmake/aom_optimization.cmake
sed -i '/#include "av1\/encoder\/encodeframe_utils.h"/a #include "av1/encoder/aq_variance.h"' av1/encoder/encodeframe_utils.c
cmake -S . -B aom_build -DCMAKE_BUILD_TYPE=Release -DENABLE_TESTS=0 -DENABLE_DOCS=0
cmake --build aom_build -j"$(nproc)"
```

`aom_build/aomenc --help` should report `AOMedia Project AV1 Encoder Psy v3.6.0`. The `lavish` and `butteraugli` tunes also need `-DCONFIG_TUNE_BUTTERAUGLI=1` and libjxl. The VMAF-based tunes need `-DCONFIG_TUNE_VMAF=1` and libvmaf. Keep the binary out of your system paths if you also use mainline libaom, and put it first in `PATH` when running Av1an.

## Community settings

This is the Av1an parameter set from community guides, without options that restate defaults or that Av1an adds itself:

```sh
--end-usage=q --cq-level=24 --cpu-used=4 --threads=2 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-qm=1 --deltaq-mode=0 --quant-b-adapt=1 --arnr-strength=1
```

Most options mean the same as in [mainline aomenc](/tools/software-encoders/aomenc/#options-that-matter-for-quality). The differences:

- Lavish allows `--lag-in-frames` up to 128; mainline caps it at 48.
- `--tune-content=psy` enables the fork's perceptual adjustments to adaptive quantisation and mode decisions. Community guides advise against it for live action above about `--cq-level=30`.
- `--arnr-strength=1` suits animation and clean CGI. Use the default (5) or higher for noisy live action.
- The default `--cpu-used` is 3 instead of mainline's 0.

The same guides add film-grain synthesis with `--denoise-noise-level=8 --enable-dnl-denoising=0` (see [film grain synthesis](/tools/software-encoders/aomenc/#film-grain-synthesis)).

## Fork-specific options

| Option                                                                       | Default     | What it does                                                                                                                                                                                                                                                                            |
| ---------------------------------------------------------------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--tune`                                                                     | `psnr`      | Adds `lavish` (Butteraugli-driven RD with SSIM-style scaling; needs a Butteraugli build), `lavish_fast` (the same curve adjustment without Butteraugli), `lavish_vmaf_rd`, `omni`, `ipq`, `ipq_vmaf_psy`, `vmaf_psy_qp` and `experimental`. `psnr`, `ssim`, `lavish_fast`, `omni` and `ipq` work in any build. |
| `--tune-content`                                                             | `default`   | Adds `psy`, `animation` and `default_no_screen`.                                                                                                                                                                                                                                        |
| `--quant-sharpness`                                                          | 0           | −7 to 7. Non-zero values narrow the quantiser's dead zone so that more small coefficients (fine detail) survive, at some bitrate cost.                                                                                                                                                  |
| `--loopfilter-sharpness`                                                     | 0           | 0–7. Sets loop-filter sharpness. Higher values reduce deblocking blur but allow more artefacts.                                                                                                                                                                                         |
| `--luma-bias`                                                                | 1           | −5 to 5. Scales each block's RD multiplier by brightness, so positive values give brighter blocks relatively more bits and negative values favour dark blocks. Upstream recommends leaving it at the default.                                                                                                                                                                        |
| `--chroma-q-offset-u`, `--chroma-q-offset-v`                                 | 0           | −63 to 63. Adjusts the automatic chroma quantiser offsets.                                                                                                                                                                                                                              |
| `--dq-modulate`                                                              | 1           | Selects the perceptual modulation used by `--deltaq-mode=2` (1 = wavelet). It is marked work in progress.                                                                                                                                                                               |
| `--delta-qindex-mult`, `--delta-qindex-pos`, `--delta-qindex-neg`            | 100, −1, −1 | Scale how strongly delta-q (the TPL model) changes the quantiser, overall or separately for positive and negative changes.                                                                                                                                                              |
| `--ssim-rd-mult`, `--tpl-rd-mult`, `--vmaf-rd-mult`, `--butteraugli-rd-mult` | 100         | RD multipliers for hyper-tuning the corresponding tunes.                                                                                                                                                                                                                                |
| `--butteraugli-resize-factor`                                                | 1           | 0 = full resolution, 1 = half, 2 = quarter. Community guides use 2 to speed up the Butteraugli tunes with little loss.                                                                                                                                                                  |
| `--butteraugli-intensity-target`                                             | 100         | Display brightness in nits that Butteraugli assumes. Match it to your viewing brightness (guides used 250).                                                                                                                                                                             |
| `--enable-experimental-psy`                                                  | 0           | Experimental changes (VP9-style film modifications). Upstream warns that it may hurt quality.                                                                                                                                                                                           |

VMAF tunes also need `--vmaf-model-path` pointing to a VMAF model file.

## Complete native parameter reference

Every option aomenc accepts on the default `Endless_Possibility` branch (commit `52f6a00b`, based on libaom 3.4.0), including those that need optional build features. Defaults are for good-quality mode in a normal (not realtime-only) build. Rows note where the fork changes a default or where its `--help` text is wrong. `Endless_Merging` (commit `83500ccf`) adds `--butteraugli-loop-count`, `--butteraugli-quant-mult`, `--butteraugli-quant-pos`, `--butteraugli-quant-neg`, `--global-motion-method`, `--sb-qp-sweep`, `--enable-rate-guide-deltaq` and `--rate-distribution-info`.

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

| Option | Default | Description |
| --- | --- | --- |
| `--help` | — | Print the full option list and exit. |
| `--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. |
| `--debug`, `-D` | off | Leave the application version out of the WebM tags so that repeated encodes are byte-identical. |
| `--output`, `-o` | required | Output file. A `.ivf` or `.obu` extension selects that format unless `--webm` is given; any other name gets WebM. |
| `--codec` | `av1` | Encoder to use. libaom builds contain only `av1`. |
| `--limit` | 0 (all frames) | Stop after this many input frames. |
| `--skip` | 0 | Skip this many input frames before encoding. |
| `--quiet`, `-q` | off | Do not print progress. |
| `--verbose`, `-v` | off | Print the encoder configuration before encoding. |
| `--psnr` | 0 (off) | Report PSNR: 1 at the input bit depth, 2 at the stream bit depth. `--psnr` without a value means 1. |
| `--test-decode` | off | Decode every frame while encoding and compare it with the encoder's reconstruction: `warn` reports a mismatch, `fatal` stops the encode. |
| `--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. |
| `--ivf` | off | IVF output, the minimal frame container used by libaom's own tools and test vectors. |
| `--obu` | off | Raw low-overhead OBU stream (AV1 Section 5) with no container. |
| `--annexb` | 0 (off) | Write the length-delimited Annex B bitstream format instead of Section 5 OBUs. Range 0–1. |
| `--q-hist` | 0 (off) | After encoding, print a histogram of frame quantisers with this many buckets. |
| `--rate-hist` | 0 (off) | After encoding, print a histogram of frame bitrates with this many buckets. |
| `--disable-warnings` | off | Suppress the warnings about questionable settings. |
| `--disable-warning-prompt`, `-y` | off | Print those warnings but do not stop to ask whether to continue. |

</details>

<details>
<summary>Usage modes and passes (12 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--good` | selected | Good-quality mode (`--usage=0`), the normal mode for offline video. |
| `--rt` | off | Realtime mode (`--usage=1`): one pass, no lookahead, speeds 5–12, for low-latency streaming and conferencing. |
| `--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. |
| `--usage`, `-u` | 0 (good) | Usage mode by number: 0 good quality, 1 realtime, 2 all-intra. Same as `--good`, `--rt` and `--allintra`. |
| `--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. |
| `--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`). |
| `--fpf` | in memory | First-pass statistics file. Needed when passes run as separate processes; otherwise the statistics stay in memory. |
| `--two-pass-output` | `<output>_pass2_<n>.ivf` | Three-pass encoding: IVF file that receives the second (downscaled) pass. |
| `--second-pass-log`, `-spf` | unset | Three-pass encoding: file in which the second pass stores its GOP and TPL decisions for the third pass. |
| `--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. |
| `--two-pass-width` | 0 (half the input) | Three-pass encoding: frame width of the second pass (and of raw `--two-pass-input`). |
| `--two-pass-height` | 0 (half the input) | Three-pass encoding: frame height of the second pass (and of raw `--two-pass-input`). |

</details>

<details>
<summary>Input format (19 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--i420` | on for raw input | Raw input is 4:2:0 planar (I420). Y4M input takes its format from the header. |
| `--yv12` | off | Raw input is YV12 (4:2:0 planar with V before U). |
| `--nv12` | off | Raw input is NV12 (4:2:0 with interleaved U and V). |
| `--i422` | off | Raw input is 4:2:2 planar. |
| `--i444` | off | Raw input is 4:4:4 planar. |
| `--width`, `-w` | from Y4M | Frame width in pixels. Required for raw input. |
| `--height`, `-h` | from Y4M | Frame height in pixels. Required for raw input. |
| `--fps` | from Y4M (raw: 30/1) | Frame rate as a fraction, e.g. `24000/1001`. |
| `--timebase` | 1/fps | Timestamp precision in fractional seconds. aomenc overwrites it with the inverse frame rate before encoding, so setting it has no effect. |
| `--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. `--help` claims a 10-bit default, but the code default is 8. |
| `--input-bit-depth` | from Y4M (raw: `--bit-depth`) | Bit depth of raw input when it differs from the stream bit depth. |
| `--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. |
| `--input-chroma-subsampling-y` | 0 | Vertical chroma subsampling (0 or 1) of 12-bit raw input in profile 2. |
| `--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. |
| `--monochrome` | off | Encode luma only, with no chroma planes. |
| `--use-16bit-internal` | off (on above 8 bit) | Use the high-bit-depth (16-bit) pipeline for an 8-bit encode. |
| `--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. |
| `--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. |
| `--forced_max_frame_height` | 0 (first frame) | Maximum frame height written to the sequence header. |

</details>

<details>
<summary>Rate control (23 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--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`. |
| `--target-bitrate` | 256 | Target bitrate in kbit/s for `vbr` and `cbr`, and the bitrate cap in `cq` mode. |
| `--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. |
| `--min-q` | 0 | Best (lowest) quantiser rate control may use, 0–63. In `q` mode `--cq-level` must not be below it. |
| `--max-q` | 63 | Worst (highest) quantiser rate control may use, 0–63. |
| `--lossless` | 0 (off) | Mathematically lossless coding (qindex 0 with the lossless transform). Range 0–1. |
| `--undershoot-pct` | 25 | How far below the target bitrate a GOP may fall, in percent (0–100), before rate control compensates. |
| `--overshoot-pct` | 25 | How far above the target bitrate a GOP may go, in percent (0–100), before rate control compensates. |
| `--buf-sz` | 6000 | Decoder buffer size in milliseconds at the target bitrate, for the rate-control buffer model. |
| `--buf-initial-sz` | 4000 | Initial decoder buffer fill in milliseconds. |
| `--buf-optimal-sz` | 5000 | Target decoder buffer fill in milliseconds. |
| `--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. |
| `--minsection-pct` | 0 | Lowest bitrate a GOP may get in two-pass VBR, as a percentage of the target. Ignored in one pass. |
| `--maxsection-pct` | 2000 | Highest bitrate a GOP may get in two-pass VBR, as a percentage of the target. Ignored in one pass. |
| `--drop-frame` | 0 (off) | Drop frames when the rate buffer falls below this fill level (percent, 0–100). Used with CBR. |
| `--max-intra-rate` | 0 (unlimited) | Cap on keyframe size as a percentage of the average frame size (450 allows 4.5 frames' worth). |
| `--max-inter-rate` | 0 (unlimited) | Cap on inter-frame size as a percentage of the average frame size. |
| `--gf-cbr-boost` | 0 (off) | Extra bits for golden frames in CBR mode, as a percentage of the average frame bitrate. |
| `--frame-boost` | 0 (off) | Periodic quantiser boost (0–1). The setting is accepted but the AV1 encoder does not use it. |
| `--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. |
| `--min-cr` | 0 (off) | Minimum compression ratio per frame ×100 (850 means 8.5:1), used to stay within level limits. |
| `--use-fixed-qp-offsets` | 0 (adaptive) | `q` mode only: 1 uses fixed per-layer quantiser offsets derived from `--cq-level` instead of adaptive ones. Range 0–1. |
| `--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. |

</details>

<details>
<summary>Keyframes and GOP structure (12 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--kf-min-dist` | 12 | Minimum keyframe interval in frames. Set it equal to `--kf-max-dist` for a fixed interval. Mainline defaults to 0. |
| `--kf-max-dist` | 240 (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. Mainline defaults to 9999. |
| `--disable-kf` | off | Place no keyframes after the first frame. Av1an sets this for each chunk. |
| `--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. |
| `--fwd-kf-dist` | -1 (off) | Distance in frames between repeated forward keyframes. |
| `--sframe-dist` | 0 (off) | Insert a switch frame (S-frame, a point where a player can switch between streams) every N frames. |
| `--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. |
| `--min-gf-interval` | 0 (auto) | Shortest golden-frame group (distance between alt-refs) in frames, up to 127. |
| `--max-gf-interval` | 0 (auto) | Longest golden-frame group in frames, 2–127. |
| `--gf-min-pyr-height` | 0 | Minimum depth of the hierarchical reference pyramid in a GF group, 0–5. |
| `--gf-max-pyr-height` | 4 | Maximum depth of the hierarchical reference pyramid in a GF group, 0–5. Lower values mean fewer reference layers and less temporal quality variation. `--help` still says 5, the mainline default. |
| `--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. |

</details>

<details>
<summary>Lookahead, alt-refs and temporal filtering (7 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--lag-in-frames` | 35 (0 in realtime and all-intra) | Lookahead in frames for frame-type, alt-ref and rate-control decisions, 0–128 (mainline allows 48). Larger values use more memory. |
| `--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. |
| `--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. |
| `--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` and `2`. |
| `--enable-keyframe-filtering` | 1 | Temporal filtering of keyframes: 0 off, 1 on, 2 on with an overlay frame (experimental; can break seeking in players). |
| `--arnr-maxframes` | 7 | Number of frames, 0–15, that the alt-ref temporal filter averages; 0 or 1 disables filtering. |
| `--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. |

</details>

<details>
<summary>Speed and tuning (8 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--cpu-used` | 3 | 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–10, all-intra 0–9. Mainline defaults to 0; a realtime-only build of the fork (`CONFIG_REALTIME_ONLY`) defaults to 7. |
| `--tune` | `psnr` | Metric that RD decisions optimise: `psnr`, `ssim`, `lavish_fast`, `omni` and `ipq` work in any build; `butteraugli`, `lavish` (Butteraugli RD with SSIM-style scaling) and `experimental` need `-DCONFIG_TUNE_BUTTERAUGLI=1`; `lavish_vmaf_rd`, `ipq_vmaf_psy`, `vmaf_psy_qp`, `experimental` and the `vmaf*` tunes need `-DCONFIG_TUNE_VMAF=1` and `--vmaf-model-path`. The fork predates `iq` and `ssimulacra2`. |
| `--tune-content` | `default` | Content type: `screen` (screen-content tools), `default_no_screen` (never uses screen-content tools), `film` (synthesised grain with a fixed pattern), `animation` (full CDEF search at speeds up to 5 and all-intra-style intra RD) and `psy` (no screen-content tools, 64×64 superblocks at `--cq-level` 30 or lower up to 4K, self-guided restoration only and all-intra-style intra and partition decisions). Community guides advise against `psy` for live action above about `--cq-level=30`. |
| `--dist-metric` | `psnr` | Distortion measure inside block decisions: `psnr`, or `qm-psnr`, which weights errors by the quantisation matrices. |
| `--sharpness` | 0 | Bias, 0–7, of coefficient RD decisions towards keeping block detail. Loop-filter sharpness is the separate `--loopfilter-sharpness`. |
| `--static-thresh` | 0 | Motion threshold inherited from VP8/VP9. The setting is accepted but the AV1 encoder does not use it. |
| `--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. |
| `--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`. |

</details>

<details>
<summary>Adaptive quantisation and delta-q (6 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--deltaq-mode` | 1 (objective) | Per-superblock quantiser modulation: 0 off; 1 objective, from the TPL model; 2 perceptual (see `--dq-modulate`); 3 perceptual for all-intra; 4 user-rating-based (all-intra); 5 HDR (only for 10-bit BT.2020 input). Modes 1 and 2 need `--enable-tpl-model=1`. The fork predates Variance Boost (mode 6). |
| `--deltaq-strength` | 100 | Strength of `--deltaq-mode=4`, in percent (0–1000). |
| `--delta-lf-mode` | 0 (off) | Also vary the loop-filter level per superblock. Only works with a non-zero `--deltaq-mode`. Range 0–1. |
| `--aq-mode` | 0 (off) | Segment-based adaptive quantisation, separate from delta-q: 0 off, 1 variance, 2 complexity, 3 cyclic refresh (realtime). |
| `--enable-chroma-deltaq` | 1 (on) | Automatic chroma quantiser offsets (4:2:0 −2, 4:2:2 −1, 4:4:4 +2 qindex). The fork applies them only when `--chroma-q-offset-u` and `--chroma-q-offset-v` are both non-zero, so the default changes nothing on its own. |
| `--auto-intra-tools-off` | 0 (off) | All-intra with `--deltaq-mode=3`: let the encoder switch off intra tools that rarely pay off. |

</details>

<details>
<summary>Quantisation (5 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--enable-qm` | 0 (off) | Quantisation matrices: quantise high frequencies more coarsely than low ones. Commonly enabled for perceptual encodes. |
| `--qm-min` | 5 | 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`. `--help` claims 8, but the code default is 5. |
| `--qm-max` | 9 | Highest QM level, 0–15. `--help` claims 15, but the code default is 9. |
| `--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. `--help` claims 1, but the code default is 0. |
| `--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. |

</details>

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

| Option | Default | Description |
| --- | --- | --- |
| `--threads`, `-t` | 0 (one thread) | Maximum number of worker threads. aomenc stays single-threaded unless this is set. |
| `--row-mt` | 1 (on) | Row-based multithreading inside tiles; needs `--threads` above 1. Range 0–1. |
| `--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. |
| `--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. |
| `--tile-rows` | 0 | Number of tile rows as log2, 0–6. |
| `--tile-width` | unset (uniform) | Non-uniform tile widths in superblocks, comma-separated; the list repeats across the frame. Needs `--tile-height` as well. |
| `--tile-height` | unset (uniform) | Non-uniform tile heights in superblocks, comma-separated; the list repeats down the frame. |
| `--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. |
| `--num-tile-groups` | 1 | Maximum number of tile groups (OBUs) per frame. `--mtu-size` overrides it. |
| `--mtu-size` | 0 (off) | Maximum bytes per tile group, for packetised transport. A single tile larger than this still goes in one group. |

</details>

<details>
<summary>Partitioning and superblocks (7 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--sb-size` | `dynamic` | Superblock size: `dynamic` (the encoder picks 64×64 or 128×128 from resolution and speed), `64` or `128`. |
| `--enable-rect-partitions` | 1 (on) | Rectangular partitions (horizontal and vertical halves). |
| `--enable-ab-partitions` | 1 (on) | AB partitions: a split into one half and two quarters. |
| `--enable-1to4-partitions` | 1 (on) | 1:4 and 4:1 partitions (four horizontal or vertical strips). |
| `--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. |
| `--max-partition-size` | 128 | Largest block size searched: 4, 8, 16, 32, 64 or 128. |
| `--partition-info-path` | `.` | Directory for partition statistics read and written by libaom's partition experiments. |

</details>

<details>
<summary>Intra prediction (11 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--enable-directional-intra` | 1 (on) | Directional (angular) intra modes. |
| `--enable-diagonal-intra` | 1 (on) | The diagonal subset of directional modes (D45 to D203). No effect when directional modes are off. |
| `--enable-angle-delta` | 1 (on) | Fine angle offsets (up to ±3 steps of 3°) on directional modes. |
| `--enable-intra-edge-filter` | 1 (on) | Smoothing and upsampling of the reference edge used for directional prediction. |
| `--enable-smooth-intra` | 1 (on) | Smooth, smooth-horizontal and smooth-vertical intra modes, which interpolate between edges. |
| `--enable-paeth-intra` | 1 (on) | Paeth intra predictor, which picks the left, top or top-left neighbour per pixel. |
| `--enable-filter-intra` | 1 (on) | Filter-intra modes: recursive filtered prediction in 4×2 cells, for smooth texture. |
| `--enable-cfl-intra` | 1 (on) | Chroma from luma: chroma predicted from the reconstructed luma. |
| `--enable-palette` | 1 (on) | Palette mode, which codes a block as up to eight colours. Used only when screen-content tools are active. |
| `--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. |
| `--force-video-mode` | 0 (off) | Use video coding settings even when only one frame is encoded, instead of still-picture settings. `--help` claims 1, but the code default is 0. |

</details>

<details>
<summary>Inter prediction (16 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--max-reference-frames` | 7 | Maximum number of reference frames searched per frame, 3–7. |
| `--reduced-reference-set` | 0 (off) | Search a reduced set of single and compound references, which is faster. |
| `--enable-order-hint` | 1 (on) | Frame order hints. Distance-weighted compound, temporal motion-vector projection and reference sign bias depend on them. |
| `--enable-ref-frame-mvs` | 1 (on) | Temporal motion-vector prediction from the motion fields of reference frames. |
| `--enable-dual-filter` | 1 (on) | Separate interpolation filters for horizontal and vertical sub-pixel motion. |
| `--enable-global-motion` | 1 (on) | Frame-level global motion models for camera pans, zooms and rotation. |
| `--enable-warped-motion` | 1 (on) | Local warped motion: a per-block affine model derived from neighbouring motion vectors. |
| `--enable-obmc` | 1 (on) | Overlapped block motion compensation: blends in predictions made with neighbouring blocks' motion to soften block edges. |
| `--enable-dist-wtd-comp` | 1 (on) | Distance-weighted compound prediction, weighting two references by their temporal distance. Off when order hints are off. |
| `--enable-onesided-comp` | 1 (on) | Compound prediction from two references on the same side (both past or both future). |
| `--enable-masked-comp` | 1 (on) | Masked compound prediction (wedge and difference-weighted); 0 turns both off. |
| `--enable-diff-wtd-comp` | 1 (on) | Difference-weighted compound, with a mask derived from the difference between the two predictions. |
| `--enable-interinter-wedge` | 1 (on) | Wedge-shaped masks for compound prediction from two references. |
| `--enable-interintra-comp` | 1 (on) | Inter-intra prediction: an inter prediction blended with an intra prediction. |
| `--enable-smooth-interintra` | 1 (on) | Smooth (gradual) blending for inter-intra prediction. |
| `--enable-interintra-wedge` | 1 (on) | Wedge-shaped masks for inter-intra prediction. |

</details>

<details>
<summary>Transforms (8 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--enable-tx64` | 1 (on) | 64-point transforms for blocks of 64 pixels and larger. |
| `--enable-flip-idtx` | 1 (on) | Extended transform types: flipped ADST, identity and one-dimensional (horizontal or vertical) transforms. |
| `--enable-rect-tx` | 1 (on) | Rectangular transforms. They need rectangular partitions. |
| `--enable-tx-size-search` | 1 (on) | Search the transform size per block. With 0 each block uses its largest possible transform. |
| `--reduced-tx-type-set` | 0 (off) | Search a reduced set of transform types, which is faster. |
| `--use-intra-dct-only` | 0 (off) | Use only the DCT for intra blocks. |
| `--use-inter-dct-only` | 0 (off) | Use only the DCT for inter blocks. |
| `--use-intra-default-tx-only` | 0 (off) | Use only the default transform type of each intra mode. |

</details>

<details>
<summary>Loop filters (3 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--loopfilter-control` | 1 (all frames) | Deblocking filter: 0 off, 1 all frames, 2 skip non-reference frames, 3 skip low-motion frames. |
| `--enable-cdef` | 1 (0 in all-intra) | CDEF, the constrained directional enhancement (deringing) filter: 0 off, 1 all frames, 2 reference frames only. |
| `--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. |

</details>

<details>
<summary>Resize and super-resolution (8 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--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). |
| `--resize-denominator` | 8 | Resize factor 8/N for non-key frames, N = 8–16 (16 halves both dimensions). |
| `--resize-kf-denominator` | 8 | Resize factor 8/N for keyframes, N = 8–16. |
| `--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. |
| `--superres-denominator` | 8 | Horizontal super-resolution factor 8/N for non-key frames, N = 8–16. |
| `--superres-kf-denominator` | 8 | Horizontal super-resolution factor 8/N for keyframes, N = 8–16. |
| `--superres-qthresh` | 63 | Mode 3: use super-resolution on non-key frames whose quantiser (1–63) exceeds this. |
| `--superres-kf-qthresh` | 32 | Mode 3: the same threshold for keyframes. |

</details>

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

| Option | Default | Description |
| --- | --- | --- |
| `--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. |
| `--denoise-block-size` | 32 | Block size in pixels for the grain estimator. |
| `--enable-dnl-denoising` | 0 (off) | Encode the denoised frame. With the fork's default 0 the original frame is encoded and only the estimated grain parameters are added, which avoids the denoiser's smearing. Mainline defaults to 1. |
| `--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. |
| `--film-grain-test` | 0 (off) | Use one of libaom's 16 built-in film-grain test parameter sets (1–16). |

</details>

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

| Option | Default | Description |
| --- | --- | --- |
| `--cdf-update-mode` | 1 | Adaptation of the entropy-coding probabilities (CDFs): 0 never, 1 every frame, 2 selectively. |
| `--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. |
| `--mode-cost-upd-freq` | 0 (superblock) | Refresh interval for mode rate estimates, with the same values. |
| `--mv-cost-upd-freq` | 0 (superblock) | Refresh interval for motion-vector rate estimates, with the same values. |
| `--dv-cost-upd-freq` | 0 (superblock) | Refresh interval for intra-block-copy vector rate estimates, with the same values. |

</details>

<details>
<summary>Signalling, levels and error resilience (12 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--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`. |
| `--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`. |
| `--matrix-coefficients` | `unspecified` | Matrix coefficients (CICP). Values: `identity`, `bt709`, `unspecified`, `fcc73`, `bt470bg`, `bt601`, `smpte240`, `ycgco`, `bt2020ncl`, `bt2020cl`, `smpte2085`, `chromncl`, `chromcl`, `ictcp`. |
| `--chroma-sample-position` | `unknown` | 4:2:0 chroma siting: `unknown`, `vertical` (left, as MPEG-2) or `colocated` (top-left, as BT.2020). |
| `--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). |
| `--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. |
| `--strict-level-conformance` | 0 (off) | Stop with an error if the stream cannot meet `--target-seq-level-idx`. |
| `--set-tier-mask` | 0 (Main) | Bit mask of operating points that use the High tier instead of Main (bit n is point n). |
| `--full-still-picture-hdr` | off | For single-frame encodes, write the full sequence header instead of the reduced still-picture header. |
| `--error-resilient` | 0 (off) | Error-resilient frames, which stay decodable when references are lost. Range 0–1. |
| `--global-error-resilient` | 0 (off) | Same effect as `--error-resilient`, set through the generic encoder configuration (the two are combined). |
| `--frame-parallel` | 0 (off) | Disable backward probability adaptation so that a decoder can decode frames in parallel. Range 0–1. |

</details>

<details>
<summary>Options added by aom-av1-lavish (21 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--quant-sharpness` | 0 | −7–7. Any non-zero value narrows the quantiser dead zone and raises rounding so that more small coefficients (fine detail) survive, more so at larger magnitudes; the sign makes no difference in the code. Costs bitrate. |
| `--loopfilter-sharpness` | 0 | Deblocking-filter sharpness, 0–7. Higher values filter block edges less, keeping detail but leaving more blocking. |
| `--luma-bias` | 1 | −5–5. Scales each block's RD multiplier by 1 − brightness × bias / 5100 (brightness 0–255), so positive values give brighter blocks relatively more bits and negative values favour dark blocks. Upstream recommends leaving it alone. |
| `--chroma-q-offset-u` | 0 | Chroma qindex offset for the U plane, −63–63 (positive is coarser). |
| `--chroma-q-offset-v` | 0 | Chroma qindex offset for the V plane, −63–63. |
| `--dq-modulate` | 1 (wavelet) | Activity measure for `--deltaq-mode=2`: 1 block wavelet energy, 0 block variance. Marked work in progress. |
| `--delta-qindex-mult` | 100 | 0–1000 (%). Scales the TPL-based superblock quantiser offsets of `--deltaq-mode=1` and the matching RD multipliers; 100 is mainline behaviour. |
| `--delta-qindex-pos` | -1 (use `--delta-qindex-mult`) | −1–1000 (%). Separate RD-multiplier scaling for superblocks whose delta-q is positive. |
| `--delta-qindex-neg` | -1 (use `--delta-qindex-mult`) | −1–1000 (%). Separate RD-multiplier scaling for superblocks whose delta-q is negative. |
| `--ssim-rd-mult` | 100 | 1–1000 (%). Scales the SSIM-based RD multiplier of `--tune=ssim` and the `ipq` tunes. |
| `--tpl-rd-mult` | 100 | 1–1000 (%). Scales the RD-multiplier factors derived from the TPL model. |
| `--vmaf-motion-mult` | 100 | 1–1000 (%). Scales the motion term of the VMAF tunes' quantiser adjustment; only active with those tunes. |
| `--vmaf-rd-mult` | 100 | 1–1000 (%). Scales the RD multiplier of tunes that use VMAF RD. Requires a build with `-DCONFIG_TUNE_VMAF=1`. |
| `--vmaf-resize-factor` | 0 (half) | Downscale for VMAF calculations in the VMAF tunes: 0 half resolution, 1 quarter. Requires a build with `-DCONFIG_TUNE_VMAF=1`. |
| `--vmaf-preprocessing` | 0 (off) | Force libaom's VMAF preprocessing (sharpening) whatever the tune: 0 off, 1 VMAF-NEG, 2 block-based, 3 frame-based. Requires a build with `-DCONFIG_TUNE_VMAF=1`. |
| `--vmaf-quantization` | 0 (off) | Force the VMAF tunes' quantiser adjustment whatever the tune. Range 0–1. Requires a build with `-DCONFIG_TUNE_VMAF=1`. |
| `--butteraugli-intensity-target` | 100 | Display brightness in nits (0–2000) that Butteraugli assumes. Requires a build with `-DCONFIG_TUNE_BUTTERAUGLI=1`. |
| `--butteraugli-hf-asymmetry` | 5 | Butteraugli's high-frequency asymmetry parameter ×10, 0–100 (5 means 0.5). Requires a build with `-DCONFIG_TUNE_BUTTERAUGLI=1`. |
| `--butteraugli-rd-mult` | 100 | 1–1000 (%). Scales the RD multiplier of the Butteraugli-based tunes. Requires a build with `-DCONFIG_TUNE_BUTTERAUGLI=1`. |
| `--butteraugli-resize-factor` | 1 (half) | Downscale for Butteraugli calculations: 0 full resolution, 1 half, 2 quarter. Community guides use 2 to speed up the Butteraugli tunes. Requires a build with `-DCONFIG_TUNE_BUTTERAUGLI=1`. |
| `--enable-experimental-psy` | 0 (off) | Experimental changes, currently VP9-style film tuning and RD tweaks. Upstream warns that they may hurt quality. Range 0–1. |

</details>
