# aom-psy101

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

> **Repository:** [damian101/aom-psy101](https://gitlab.com/damian101/aom-psy101). Latest release: [2023-12-03](https://gitlab.com/damian101/aom-psy101/-/releases/2023-12-03), Dec 2, 2023. Last commit: Jun 2, 2026. License: BSD-2-Clause. Stars: 7.

aom-psy101 is a fork of [libaom/aomenc](/tools/software-encoders/aomenc/) maintained by Damian Höster (damian101) at [gitlab.com/damian101/aom-psy101](https://gitlab.com/damian101/aom-psy101). It combines selected patches from aom-av1-psy and [aom-av1-lavish](/tools/software-encoders/aom-av1-lavish/) with its own changes, and it keeps tracking current libaom.

**Status:** the default `psy101` branch last merged upstream libaom on 2 June 2026, and the binary reports `3.14.1-174-g74890d72b`. The fork's own changes were last updated on 21 February 2025. The project has no release builds and no usage documentation beyond `--help`.

This page covers only what the fork changes. For rate control, presets, Av1an usage, grain synthesis and the other mainline options, see [aomenc](/tools/software-encoders/aomenc/).

## Building

```sh
git clone https://gitlab.com/damian101/aom-psy101.git
cmake -S aom-psy101 -B psy101_build -DCMAKE_BUILD_TYPE=Release -DENABLE_TESTS=0 -DENABLE_DOCS=0
cmake --build psy101_build -j"$(nproc)"
```

`psy101_build/aomenc --help` should list `AOMedia Project AV1 Encoder Psy101`. Av1an runs whichever `aomenc` comes first in `PATH`, so put the fork's binary there or in a directory you prepend. FFmpeg's `libaom-av1` uses the fork only if FFmpeg is built against the fork's libaom.

## Encoding

The fork's defaults are already perceptually oriented, so a plain constant-quality command is a good start:

```sh
aomenc --end-usage=q --cq-level=24 --bit-depth=10 -o output.webm input.y4m
```

Add `--tune-content=psy101` to use the fork's preset (described below). Everything else works as in mainline: piping, two-pass behaviour and Av1an usage are described on the [aomenc page](/tools/software-encoders/aomenc/#constant-quality-encoding).

## Defaults that differ from mainline

| Option                                | psy101                     | Mainline 3.15.1  |
| ------------------------------------- | -------------------------- | ---------------- |
| `--cpu-used`                          | 4 (good-quality range 0–9) | 0 (0–6)          |
| `--tune`                              | `ssim`                     | `psnr`           |
| `--enable-qm`, `--qm-min`             | 1, 0 (4 in all-intra)      | 0, 5             |
| `--kf-min-dist`                       | 12                         | 0                |
| `--enable-chroma-deltaq`              | 1                          | 0                |
| `--quant-b-adapt`                     | 1                          | 0                |
| `--enable-cdef`                       | 0 (off)                    | 1                |
| `--arnr-strength`, `--arnr-maxframes` | 2 (range 0–4), 15          | 5 (0–6), 7       |
| `--lag-in-frames` maximum             | 128                        | 48               |
| `--denoise-block-size`                | 16                         | 32               |
| Automatic tiling                      | `--auto-tiling=3`          | `--auto-tiles=0` |

CDEF, AV1's deringing filter, is off by default. If ringing or mosquito noise shows up around edges at lower bitrates, turn it back on with `--enable-cdef=1`, or use `--enable-cdef=3` for CDEF that adapts to the frame qindex.

## Fork-specific options

| Option                               | Default | What it does                                                                                                                                                                                                                                                                                                              |
| ------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--tune-content=psy101`              | —       | Applies the fork's preset. It disables loop restoration and 64-point transforms, forces 64×64 superblocks and caps the GF pyramid height at 4. It uses perceptual delta-q (`--deltaq-mode=2`) in two-pass encodes and Variance Boost (`--deltaq-mode=6`) in all-intra mode, whatever `--deltaq-mode` says.                |
| `--tune-content=psy`                 | —       | Perceptual adjustments to intra-mode, partition and RD decisions without the psy101 tool restrictions. It was retuned for low-bitrate encoding in January 2025.                                                                                                                                                           |
| `--tune=image_perceptual_quality`    | —       | An SSIM-style tune that scales rate–distortion decisions with libaom's user-rating variance model, adjusted by `cq-level`. Mainline's `iq` and `ssimulacra2` tunes are also available.                                                                                                                                    |
| `--luma-bias`                        | 0       | 0–15. Lowers the RD multiplier in dark blocks so they get more bits, which counters crushed or blocky shadows. It is ignored for PQ (`smpte2084`) and log transfer characteristics.                                                                                                                                       |
| `--auto-tiling`                      | 3       | 0–7. Sets the minimum tile size: higher values pick more, smaller tiles for better encoder and decoder threading, so the default already tiles larger frames. Values above 5 also force 64×64 superblocks. Explicit `--tile-columns` and `--tile-rows` take precedence. With Av1an, set `--auto-tiling=0` to avoid tiles. |
| `--fast-decode`                      | 0       | 0–3. Trades efficiency for easier decoding. Level 1 and above cap the GF pyramid height, 2 and above also disable loop restoration, and 3 also enables frame-parallel decoding mode.                                                                                                                                      |
| `--ssim-rd-mult`                     | 100     | Scales the SSIM-based RD multiplier used by `--tune=ssim`, `iq`, `ssimulacra2` and `image_perceptual_quality`.                                                                                                                                                                                                                                                                  |
| `--ssim-vmaf-rd`, `--vmaf-rd-resize` | 0, 1    | Mix SSIM RD into VMAF RD (percent) and set the VMAF RD downscale. They need a build with `-DCONFIG_TUNE_VMAF=1`.                                                                                                                                                                                                          |

## Complete native parameter reference

Every option aomenc accepts at psy101 commit `74890d72` (libaom 3.14.1 plus later upstream commits), including those that need optional build features. Defaults are for good-quality mode; rows note where the fork changes a default or behaviour, or where its `--help` text is wrong.

<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 (20 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. |
| `--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. |
| `--validate-hbd-input` | 1 (on) | Check that every high-bit-depth input sample lies within the range of the bit depth. Range 0–1. |
| `--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 (24 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 (50 in realtime) | How far below the target bitrate a GOP may fall, in percent (0–100), before rate control compensates. |
| `--overshoot-pct` | 25 (50 in realtime) | How far above the target bitrate a GOP may go, in percent (0–100), before rate control compensates. |
| `--buf-sz` | 6000 (1000 in realtime) | Decoder buffer size in milliseconds at the target bitrate, for the rate-control buffer model. |
| `--buf-initial-sz` | 4000 (600 in realtime) | Initial decoder buffer fill in milliseconds. |
| `--buf-optimal-sz` | 5000 (600 in realtime) | 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: 0 derives per-layer quantiser offsets from `--cq-level` adaptively, 1 uses fixed offsets, 2 codes every frame at `--cq-level` with no offsets. |
| `--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. |
| `--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. |

</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` | 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. |
| `--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` | 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. `--tune-content=psy101` and `--fast-decode` lower the default 5 to 4. |
| `--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`. |
| `--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` | 15 | Number of frames, 0–15, that the alt-ref temporal filter averages; 0 or 1 disables filtering. Mainline defaults to 7. |
| `--arnr-strength` | 2 | Alt-ref temporal filter strength, 0–4 (mainline allows 0–6 and defaults to 5). Lower values keep more fine detail. |

</details>

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

| Option | Default | Description |
| --- | --- | --- |
| `--cpu-used` | 4 | Speed preset; lower is slower and more efficient. Good-quality mode accepts 0–9, but as in mainline its speed features stop at 6; realtime uses 5–12 and all-intra 0–9. Mainline defaults to 0. |
| `--tune` | `ssim` | Metric that RD decisions optimise: `ssim`, `psnr`, `image_perceptual_quality` (the fork's SSIM-based tune, scaled by libaom's user-rating variance model and adjusted by `--cq-level`), mainline's `iq` and `ssimulacra2`, `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`). Mainline defaults to `psnr`. |
| `--tune-content` | `default` | Content type: `screen`, `film` (synthesised grain with a fixed pattern), `psy` (perceptual intra-mode, partition and RD adjustments) and `psy101`, the fork's preset: it also disables loop restoration and 64-point transforms, forces 64×64 superblocks, caps the GF pyramid at 4 and uses `--deltaq-mode=2` in two-pass encodes and `6` in all-intra, whatever `--deltaq-mode` says. |
| `--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`). |
| `--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. |
| `--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. |
| `--screen-detection-mode` | 1 (2 in all-intra) | Screen-content detection: 1 standard, 2 also recognises anti-aliased text and graphics. |
| `--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. |
| `--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 (8 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--deltaq-mode` | 1 (objective) | Per-superblock quantiser modulation: 0 off; 1 objective, from the TPL model; 2 perceptual (wavelet energy); 3 perceptual for all-intra; 4 user-rating-based (all-intra); 5 HDR (BT.2020 input); 6 Variance Boost, which gives flat, low-variance areas more bits. Modes 1 and 2 need `--enable-tpl-model=1`. `--tune-content=psy101` overrides it. |
| `--deltaq-strength` | 100 | Strength of `--deltaq-mode=4` and `6`, 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) | Chroma quantiser offsets. In all-intra mode with `--tune=iq` or `ssimulacra2` they follow mainline's subsampling-dependent values; otherwise 4:2:0 gets no offset and 4:2:2 and 4:4:4 get +3 and +6 qindex (coarser chroma). Mainline defaults to 0. |
| `--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`. |
| `--rate-distribution-info` | `./rate_map.txt` | Rate-distribution file for `--enable-rate-guide-deltaq`. |
| `--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` | 1 (on) | Quantisation matrices: quantise high frequencies more coarsely than low ones. Commonly enabled for perceptual encodes. Mainline defaults to 0. |
| `--qm-min` | 0 (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`. Mainline defaults to 5. |
| `--qm-max` | 9 (10 in all-intra) | Highest QM level, 0–15. |
| `--quant-b-adapt` | 1 (on) | 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. Mainline defaults to 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. A non-zero value takes precedence over `--auto-tiling`. |
| `--tile-rows` | 0 | Number of tile rows as log2, 0–6. A non-zero value takes precedence over `--auto-tiling`. |
| `--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`. `--tune-content=psy101` and `--auto-tiling` above 5 force `64`. |
| `--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. |

</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. `--tune-content=psy101` turns it off. |
| `--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` | 0 (off) | CDEF, the constrained directional enhancement (deringing) filter: 0 off, 1 all frames, 2 reference frames only, 3 adaptive, which weakens it at high quality. Mainline enables it; turn it back on with 1 or 3 if ringing shows around edges at low bitrates. |
| `--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. `--tune-content=psy101` and `--fast-decode=2` or higher turn it off. |

</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` | 16 | Block size in pixels for the grain estimator. Mainline defaults to 32. |
| `--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. `--help` claims 0, but the default in normal builds is 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`, `ipt-c2`, `ycgco-re`, `ycgco-ro`. |
| `--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. `--fast-decode=3` turns it on. |

</details>

<details>
<summary>Options added by aom-psy101 (8 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--auto-tiling` | 3 | Automatic tiling, 0–7 (0 off). Higher values allow smaller tiles: at least 32 superblocks per tile side at 1, down to 4 at 7 (halved with 128×128 superblocks). It fills in only tile columns and rows not set explicitly; values above 5 force 64×64 superblocks. With Av1an, set 0 to avoid tiles. Replaces mainline's `--auto-tiles`. |
| `--fast-decode` | 0 (off) | Easier decoding at some efficiency cost, 0–3: 1 caps the GF pyramid height at 4, 2 also disables loop restoration, 3 also enables frame-parallel decoding mode. |
| `--luma-bias` | 0 (off) | 0–15. Lowers the RD multiplier of dark blocks by a perceptual (PQ-slope) weight of their brightness, so shadows get more bits. Ignored for PQ (`smpte2084`) and log transfer characteristics. |
| `--ssim-rd-mult` | 100 | 0–1000 (%). Scales the SSIM-based RD multiplier used by `--tune=ssim`, `iq`, `ssimulacra2` and `image_perceptual_quality`. |
| `--ssim-vmaf-rd` | 0 | Share of SSIM RD, in percent (0–100), that replaces VMAF RD in the VMAF tunes. Requires a build with `-DCONFIG_TUNE_VMAF=1`. |
| `--vmaf-rd-resize` | 1 (half) | Downscale for VMAF RD calculations: 0 full resolution, 1 half, 2 quarter, 3 eighth. Requires a build with `-DCONFIG_TUNE_VMAF=1`. |
| `--vmaf-preprocessing` | 0 (off) | Force libaom's VMAF preprocessing (sharpening) whatever the tune: 0 off, 1 block-based 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`. |

</details>
