# 5fish/SVT-AV1

Canonical URL: https://encode.wiki/tools/software-encoders/svt-av1-5fish/
Content version: ca42e61ede0a24f789d7287a0001244ad22f4abf
Status: current
License: CC BY-SA 4.0
Checksum (SHA-256): eccd3dcf9d7b382802aa8a7c7514f4d0b257a497d0e6ad1c9b424c8511cd391e

> **Repository:** [5fish/SVT-AV1](https://github.com/5fish/SVT-AV1). Focused on high efficiency and high fidelity encoding, with additional parameters tailored for 2D content. Latest release: [v2.3.261005](https://github.com/5fish/SVT-AV1/releases/tag/v2.3.261005), Oct 5, 2026. Last commit: Oct 5, 2026. License: BSD-3-Clause-Clear. Stars: 24.

5fish/SVT-AV1 is a fork of [SVT-AV1](/tools/software-encoders/svt-av1/) aimed at high-efficiency and high-fidelity encoding of 2D content such as anime and games. Akatsumekusa (Akatmks) is the main developer, alongside 5fish. It pulls in work from [SVT-AV1-PSY](/tools/software-encoders/svt-av1-psy/), [SVT-AV1-HDR](/tools/software-encoders/svt-av1-hdr/), [SVT-AV1-PSYEX](/tools/software-encoders/svt-av1-psyex/) and [SVT-AV1-Essential](/tools/software-encoders/svt-av1-essential/), and adds its own "psy-bias" system for line art and texture. The project judges changes by visual quality, not metric scores.

The codebase descends from SVT-AV1-PSY 2.3.0, which was based on mainline SVT-AV1 2.3.0. That is why version numbers start with 2.3 (`v2.3.YYMMDD`). Mainline 3.x/4.x options such as `--avif`, `--lossless`, `--rtc` and `--max-tx-size` are not available, and the tune list is PSY's, not mainline's.

## Versions and downloads

Releases are dated builds published often. The latest as of October 8, 2026 is **v2.3.261005** (October 5, 2026); some intermediate builds are marked as pre-releases. [GitHub Releases](https://github.com/5fish/SVT-AV1/releases) has LTO + PGO builds of `SvtAv1EncApp` for Linux and Windows x86-64, Windows arm64 and macOS arm64, with Dolby Vision and HDR10+ support. On x86-64, try `icelake-server+znver5` first, then `znver2`, then `x86-64-v3+znver2`; a build that crashes immediately needs CPU features your machine lacks.

[HandBrake builds](https://github.com/Uranite/HandBrake-5fish-SVT-AV1) are maintained separately. To build it yourself, upstream recommends Clang and `Build/linux/build.sh --native --static --release --enable-lto --enable-pgo`.

## Start with four parameters

Upstream asks you to start with `--preset`, `--crf`, `--lineart-psy-bias` and `--texture-psy-bias` on their own, and **not** to paste parameters from other SVT-AV1 forks: many newer 5fish features conflict with options commonly used elsewhere. This is upstream's example for a small ("mini") encode:

```sh
ffmpeg -i input.mkv -strict -1 -f yuv4mpegpipe -pix_fmt yuv420p10le - | SvtAv1EncApp -i - --preset 2 --crf 26 --lineart-psy-bias 3 --texture-psy-bias 3 --color-primaries 1 --transfer-characteristics 1 --matrix-coefficients 1 -b output.ivf
```

`-strict -1` is needed because 10-bit Y4M is outside the official Y4M spec. The colour flags signal BT.709; Y4M carries no colour description, so set them to match your source. Mux the IVF with [MKVToolNix](/tools/utilities/mkvtoolnix/) afterwards.

**Preset.** Upstream recommends `--preset 2` for the best quality, `--preset 4` or at most `--preset 6` for speed. They currently advise against `--preset 0`: preset 2's candidate filtering often beats preset 0's exhaustive search.

**CRF.** The community bands upstream uses:

| CRF | Typical use |
| --- | --- |
| ≤ 12 | High-fidelity encodes |
| 16–20 | High-quality encodes |
| 24–28 | Larger mini encodes |
| 32–40 | Tiny mini encodes |

**Psy-bias.** Higher values make the encoder try harder to retain that kind of detail. Set both together.

| Situation | Starting point |
| --- | --- |
| High-quality and high-fidelity encodes | `--lineart-psy-bias 5 --texture-psy-bias 4` |
| Mini encodes | `--lineart-psy-bias 3 --texture-psy-bias 3` |
| Weak line art | raise `--lineart-psy-bias` to 6–7 |
| Heavy texture or noise | raise `--texture-psy-bias` to 5–7 (in mini encodes, too high can cause blocking on noisy sources) |
| Little texture | lower `--texture-psy-bias` to 3 or less to save bits |
| Almost everything is texture | lower `--lineart-psy-bias` to 3 |

If you set neither, both are 0 (off). If you set only one, the other defaults to the smaller of that value and 2. Each level switches on a bundle of internal tweaks (mode decision, deblocking, CDEF, QM and rate-control biases); [Parameters.md](https://github.com/5fish/SVT-AV1/blob/v2.3.261005/Docs/Parameters.md) has the full per-level tables. Upstream points to Parameters.md rather than `--help` for explanations.

## Tunes and defaults

The tune list comes from SVT-AV1-PSY 2.3, so the numbers do not match mainline 4.x or SVT-AV1-HDR:

| --tune | 5fish/SVT-AV1 |
| --- | --- |
| 0 | VQ (default) |
| 1 | PSNR |
| 2 | SSIM |
| 3 | Subjective SSIM |
| 4 | Still Picture |

Other defaults that differ from mainline SVT-AV1 4.2: `--preset 4` (mainline 8), scene-change detection on, so it places keyframes at scene cuts (mainline ignores `--scd`), quantization matrices on with `--qm-min 8`, or 9 when `--texture-psy-bias` is 3 or higher (mainline QMs off), `--sharpness 2` (mainline 0) and `--tf-strength 1` (mainline 3).

## Fork-specific options

The options you are most likely to touch after the four above. Many more `--psy-bias-*`, `--dlf-bias-*` and `--cdef-bias-*` controls exist; the psy-bias levels set most of them for you.

| Option | Range (default) | What it does |
| --- | --- | --- |
| `--lineart-psy-bias` | 0–7 (0) | Line-art retention level. `-2` is a test mode for tuning the variance threshold. |
| `--texture-psy-bias` | 0–7 (0) | Texture retention level. |
| `--noise-psy-bias` | 0–7 (0) | Noise retention. Set automatically to 2/4/6 by `--texture-psy-bias` 5/6/7, and to 4 by high-fidelity mode. |
| `--lineart-variance-thr`, `--texture-variance-thr` | 0.0–16.0 (5.5) | Variance thresholds that decide what counts as line art and texture. |
| `--high-quality-encode-psy-bias` | 0–1 | Extra biases for high-quality encodes. On automatically at CRF ≤ 24 when a psy-bias is set. |
| `--high-fidelity-encode-psy-bias` | 0–1 | Aims to match the source frame by frame rather than just keep texture. On automatically at CRF ≤ 16 when a psy-bias is set. |
| `--balancing-q-bias` | 0–1 | Biases TPL per frame and per superblock for detail retention. On automatically when a psy-bias is set. |
| `--noise-level-thr` | −2, −1, >0 (−1) | Noise threshold above which CDEF, restoration and some mode decisions are disabled. `-2` prints each frame's noise level so you can choose a value. |
| `--satd-bias` | 0.0–16.0 (0.0) | Adds SATD to the distortion calculation; upstream suggests trying 0.5 for some textures. |
| `--photon-noise` | 0–100000 (0) | Generates a photon-noise grain table at the given ISO. `--photon-noise-chroma 1` adds chroma noise. |
| `--chroma-grain` | 0–1 (1) | Whether film-grain synthesis applies to chroma. |
| `--auto-tiling` | 0–1 (0) | Essential's automatic tile layout, off by default here. |
| `--min-keyint` | −1, 0+ (−1) | Minimum distance between scene-cut keyframes. |
| `--frame-luma-bias` | 0–100 (0) | Raises quality in dark frames. This is PSY's name for mainline's `--luminance-qp-bias`. |
| `--max-32-tx-size` | 0–1 (0) | Limits transforms to 32×32 (mainline uses `--max-tx-size 32`). |
| `--pin`, `--ss` | | Pin to the first N cores; choose a CPU socket. |

For texture-heavy sources, upstream also recommends `--enable-cdef 0` whenever the source and the target size allow it.

## Complete native parameter reference

Every option 5fish/SVT-AV1 v2.3.261005 accepts, grouped by purpose; aliases share a row. Many defaults are “auto”: they are resolved at startup from `--lineart-psy-bias`, `--texture-psy-bias`, CRF and preset, and the value in brackets is what you get with neither psy-bias set. The fork’s own [Parameters.md](https://github.com/5fish/SVT-AV1/blob/v2.3.261005/Docs/Parameters.md) has the full tables of what each psy-bias level switches on.

<details>
<summary>Input, output and application (17 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--help` | — | Print the option list and exit. |
| `--version` | — | Print the library version and exit. |
| `--input`, `-i` | required | Input file, Y4M or raw YUV; `-` or `stdin` reads from a pipe. Raw YUV also needs `--width`, `--height`, the frame rate and `--input-depth`. |
| `--output`, `-b` | none | Output IVF file; `-` or `stdout` writes to a pipe. |
| `--config`, `-c` | none | Read options from a configuration file of `Name : value` lines (the config-file names, e.g. `EncoderMode`). |
| `--errlog` | stderr | Write warnings and errors to this file. |
| `--recon`, `-o` | none | Write the reconstructed (decoded) frames as raw YUV, for debugging or metrics. |
| `--stat-file` | none | Write per-frame PSNR and SSIM to this file; needs `--enable-stat-report 1`. |
| `--progress` | 1 | Progress output: 0 none, 1 normal, 2 detailed. |
| `--no-progress` | 0 | `--no-progress 1` is the same as `--progress 0`. |
| `--svtav1-params` | none | Colon-separated `key=value` list using option names without `--`, e.g. `tune=0:enable-variance-boost=1`. Handy when a wrapper passes a single parameter string. |
| `--skip` | 0 | Skip this many frames at the start of the input. |
| `--frames`, `-n` | 0 (all) | Number of frames to encode; 0 encodes to the end of the input. A count longer than the input loops back to the start. |
| `--nb` | -1 (off) | Preload this many frames into memory and encode only those, for benchmarking without I/O. |
| `--inj` | 0 | Feed frames to the encoder at a fixed rate (`--inj-frm-rt`) to simulate live input. |
| `--inj-frm-rt` | 60 | Injection rate in frames per second (0–240) for `--inj 1`. |
| `--enable-stat-report` | 0 | Compute PSNR and SSIM against the source and print a summary at the end; per-frame values go to `--stat-file`. Slows encoding. |

</details>

<details>
<summary>Source format, profile and level (12 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--width`, `-w` | 0 (from Y4M) | Frame width in pixels, 4–16384. Required for raw YUV; Y4M headers supply it. |
| `--height`, `-h` | 0 (from Y4M) | Frame height in pixels, 4–8704. Required for raw YUV. |
| `--forced-max-frame-width` | 0 (input width) | Maximum frame width written to the sequence header (4–16384), for streams whose frame size changes later. |
| `--forced-max-frame-height` | 0 (input height) | Maximum frame height written to the sequence header (4–8704). |
| `--color-format` | 1 (4:2:0) | Chroma format of raw input: 0 4:0:0, 1 4:2:0, 2 4:2:2, 3 4:4:4. Mainline encodes 4:2:0 only. |
| `--profile` | 0 (main) | AV1 profile: 0 main, 1 high, 2 professional. Main covers 8- and 10-bit 4:2:0, which is all mainline can encode. |
| `--level` | 0 (auto) | AV1 level to signal, 2.0–7.3 (e.g. `5.1`); 0 derives it from the input. |
| `--fps` | 60 | Integer frame rate for raw input, 1–240; Y4M headers override it. Use `--fps-num`/`--fps-denom` for fractional rates. |
| `--fps-num` | 60000 | Frame-rate numerator for raw input; Y4M headers override it. |
| `--fps-denom` | 1000 | Frame-rate denominator; the default pair means 60 fps. |
| `--input-depth` | 10 | Bit depth of raw input and of the encode, 8 or 10; Y4M headers supply it. Raw input defaults to 10-bit. |
| `--tier` | 0 (main) | AV1 tier: 0 main, 1 high (higher bitrate limits for levels 4.0 and up). Accepted but not listed in `--help`. |

</details>

<details>
<summary>Preset, tune and threading (8 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--preset` | 4 | Speed/efficiency trade-off, −3–13; lower is slower. Upstream recommends 2 for best quality and 4–6 for speed, and advises against 0. Above 11 runs as 11 (10 for 4K and larger random-access encodes), and 8K inputs need preset 2 or faster. |
| `--asm` | max | Highest instruction set to use. x86: `c`, `mmx`, `sse` … `sse4_2`, `avx`, `avx2`, `avx512`, `max`; Arm: `c`, `neon`, `crc32`, `neon_dotprod`, `neon_i8mm`, `sve`, `sve2`, `max`. Lower it only to debug or compare. |
| `--lp` | 0 (auto) | Level of parallelism, 1–6: higher levels create more threads and picture buffers and use more memory. 0 picks a level from the core count. It is not a thread count. |
| `--pin` | 0 (off) | Pin the encoder to the first N logical cores; 0 disables pinning. |
| `--ss` | -1 (any) | CPU socket to run on: −1 any, 0 or 1 a specific socket of a two-socket system. |
| `--fast-decode` | 0 | Decoder-speed optimizations, 0–2 (2 decodes fastest) at a small efficiency cost. Try it before tiles. |
| `--tune` | 0 (VQ) | 0 VQ, 1 PSNR, 2 SSIM, 3 Subjective SSIM, 4 Still Picture (all-intra images). |
| `--hbd-mds` | 0 (preset) | Precision of mode decision for 10-bit input: 0 preset default, 1 10-bit, 2 hybrid 8/10-bit, 3 8-bit. |

</details>

<details>
<summary>Rate control and passes (21 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--rc` | 0 | Rate-control mode: 0 CRF (or CQP with `--aq-mode 0`), 1 VBR, 2 CBR, both with `--tbr`. |
| `--qp`, `-q` | 35 | Base QP, 1–63: the fixed QP in CQP and the starting point otherwise. For constant quality use `--crf`. |
| `--crf` | 35 | Constant rate factor, 1–70 in 0.25 steps; lower is higher quality and larger. Equivalent to `--rc 0 --aq-mode 2 --qp N` on a finer scale. |
| `--tbr` | 2000 kbps | Target bitrate for VBR and CBR in kbps (1–100000); `b`, `k` and `m` suffixes are accepted, e.g. `--tbr 3.5m`. |
| `--mbr` | 0 (off) | Maximum bitrate for capped CRF, in kbps (same suffixes). Dropped with a warning when TPL is off: `--aq-mode 0`, all-intra or low-delay. |
| `--max-qp` | 63 | Highest QP rate control may use, 0–63; mainly for VBR and CBR. |
| `--min-qp` | 1 | Lowest QP rate control may use in VBR/CBR, 1–63; CRF always uses 1. |
| `--undershoot-pct` | auto (50 for VBR, 25 for CBR) | How far below the target VBR/CBR may undershoot, in percent (0–100). |
| `--overshoot-pct` | auto (25) | How far above the target VBR/CBR may overshoot, in percent (0–100). |
| `--mbr-overshoot-pct` | 50 | Allowed overshoot of `--mbr` in capped CRF, in percent (0–100). |
| `--gop-constraint-rc` | 0 | Make VBR hit the target within each GOP instead of over the whole clip; useful for chunked or segmented encoding. |
| `--buf-sz` | 1000 | CBR decoder buffer size in milliseconds (20–10000). |
| `--buf-initial-sz` | 600 | CBR initial buffer level in milliseconds (20–10000); must be below `--buf-sz`. |
| `--buf-optimal-sz` | 600 | CBR target buffer level in milliseconds (20–10000). |
| `--recode-loop` | 4 (preset-based) | Re-encode frames that miss the rate target: 0 off, 1 key frames and oversized frames, 2 key/alt-ref/golden frames, 3 all frames, 4 preset-based. |
| `--minsection-pct` | 0 | VBR: lowest bitrate a GOP may get, as a percentage of the target (0–100). |
| `--maxsection-pct` | 2000 | VBR: highest bitrate a GOP may get, as a percentage of the target (0–10000). |
| `--pass` | 0 | Run one pass of a two-pass encode: 0 single pass, 1 first pass, 2 second pass (VBR only). Use the same `--stats` file in both. |
| `--stats` | svtav1_2pass.log | Statistics file written by the first pass and read by the second. |
| `--passes` | 1 | `--passes 2` runs both passes of a VBR two-pass encode in one command. |
| `--enable-tpl-la` | 1 | Temporal dependency (TPL) model. The library forces it on for CRF/CQP, so 0 only matters in VBR/CBR. |

</details>

<details>
<summary>Quantization offsets and matrices (20 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--use-q-file` | 0 | Take per-frame QPs from `--qpfile` instead of the encoder’s own assignment. |
| `--qpfile` | none | File with one QP per line, one line per frame, for `--use-q-file 1`. |
| `--aq-mode` | 2 | Adaptive quantization: 0 off (constant QP), 1 variance-based segments, 2 delta-q from TPL prediction efficiency. |
| `--use-fixed-qindex-offsets` | 0 | Override per-layer QP assignment: 1 use the base q-index plus `--qindex-offsets` and `--key-frame-qindex-offset`, 2 add those offsets on top of the encoder’s own assignment. |
| `--key-frame-qindex-offset` | 0 | Q-index offset for key frames, −64–63, used with `--use-fixed-qindex-offsets`. Q-index runs 0–255, about four steps per QP. |
| `--key-frame-chroma-qindex-offset` | 0 | Chroma q-index offset for key frames, −64–63. |
| `--qindex-offsets` | 0 per layer | Comma-separated luma q-index offsets, one per temporal layer (each −64–63), for `--use-fixed-qindex-offsets`. |
| `--chroma-qindex-offsets` | 0 per layer | Comma-separated chroma q-index offsets, one per temporal layer (each −64–63). |
| `--luma-y-dc-qindex-offset` | 0 | Luma DC quantizer offset in q-index steps (−64–63); positive values quantize DC more coarsely. |
| `--chroma-u-dc-qindex-offset` | 0 | Cb DC quantizer offset in q-index steps (−64–63). |
| `--chroma-u-ac-qindex-offset` | 0 | Cb AC quantizer offset in q-index steps (−64–63). |
| `--chroma-v-dc-qindex-offset` | 0 | Cr DC quantizer offset in q-index steps (−64–63). |
| `--chroma-v-ac-qindex-offset` | 0 | Cr AC quantizer offset in q-index steps (−64–63). |
| `--lambda-scale-factors` | 128 for every frame type | Comma-separated RD lambda multipliers per frame-update type, in units of 1/128 (128 = 1.0). A research control. |
| `--enable-qm` | 1 | Use quantization matrices, which quantize high frequencies more coarsely than low ones. |
| `--qm-min` | auto (8; 9 with texture psy-bias ≥3) | Lowest (steepest) luma QM level, 0–15; 15 is flat. |
| `--qm-max` | 15 | Highest (flattest) luma QM level, 0–15. |
| `--roi-map-file` | none | Region-of-interest file giving per-block QP offsets for chosen frames. |
| `--chroma-qm-min` | auto (10; 11 with lineart psy-bias ≥3) | Lowest chroma QM level, 0–15. |
| `--chroma-qm-max` | 15 | Highest chroma QM level, 0–15. |

</details>

<details>
<summary>GOP structure and keyframes (10 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--keyint` | -2 (257 frames) | Maximum keyframe interval in frames: −2 is 257 frames, −1 no periodic keyframes (CRF with `--scd 0`), 0 no periodic keyframes (CRF). |
| `--min-keyint` | -1 (33 frames) | Minimum distance between scene-change keyframes: −1 is 33 frames (129 with `--balancing-q-bias 1`), 0 no minimum. |
| `--irefresh-type` | 2 (closed GOP) | Keyframe type at each interval: 1 forward keyframe (open GOP), 2 key frame (closed GOP). Open GOP is slightly more efficient; closed GOP makes every keyframe a clean seek point. |
| `--scd` | 1 | Scene-change detection: insert keyframes at scene cuts (0 or 1). |
| `--lookahead` | -1 (auto) | Frames of extra look-ahead for rate control and TPL, 0–120, beyond the mini-GOP and temporal-filter window. |
| `--hierarchical-levels` | auto (5; 4 above preset 12) | Temporal layers above the base layer, 0–5; 5 gives 32-frame mini-GOPs. Fewer levels lower latency and memory use. |
| `--pred-struct` | 2 (random access) | Prediction structure: 1 low delay, 2 random access (normal for files). 0 all-intra is also accepted. |
| `--force-key-frames` | none | Comma-separated keyframe positions: a number followed by `f` for frames or `s` for seconds (e.g. `0f,120f,30.5s`). |
| `--startup-mg-size` | 0 (off) | Use a smaller mini-GOP right after each keyframe: 2, 3 or 4 temporal layers (4, 8 or 16 frames). CRF only, and not above `--hierarchical-levels`. |
| `--enable-dg` | 1 | Dynamic mini-GOP: adapt the hierarchical structure to the content. |

</details>

<details>
<summary>Filters and coding tools (16 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--auto-tiling` | 0 | Choose tile rows and columns from the resolution to speed up decoding, when they are not set manually. |
| `--tile-rows` | auto | Tile rows as log2 (0–6; 2 means 4 rows). Tiles help decoder threading at a small efficiency cost; the encoder does not need them for its own threading. |
| `--tile-columns` | auto | Tile columns as log2 (0–4); at most 128 tiles in total. |
| `--enable-dlf` | 1 | Deblocking filter: 0 off, 1 on, 2 more accurate and slower. |
| `--enable-cdef` | auto (on) | CDEF deringing filter, 0 or 1. |
| `--enable-restoration` | auto (on) | Loop restoration filter (Wiener and self-guided), 0 or 1. |
| `--enable-mfmv` | -1 (auto) | Motion-field motion vector projection, 0 or 1; −1 lets the preset decide. |
| `--enable-tf` | 1 | Temporal filtering of alt-ref frames: 0 off, 1 on, 2 adaptive strength per 64×64 block (overrides `--tf-strength`). |
| `--enable-overlays` | 0 | Insert overlay frames after filtered alt-refs as extra references. Not supported with low delay or multi-pass. |
| `--scm` | auto (2; 0 with psy-bias) | Screen-content tools (palette, intra block copy): 0 off, 1 on, 2 detect per frame. Defaults to 0 when `--lineart-psy-bias` or `--texture-psy-bias` is 1 or more. |
| `--rmv` | 0 | Restrict motion vectors so they never point outside the picture. |
| `--max-32-tx-size` | 0 | Limit transforms to 32×32 (0 or 1); can help detail at high-fidelity CRFs. |
| `--tf-strength` | 1 | Alt-ref temporal filter strength, 0–4; each step doubles it. The default 1 is 4× weaker than mainline’s 3, which keeps more detail and grain. |
| `--kf-tf-strength` | 1 | Temporal filter strength on key frames, 0–4; each step doubles it (1 is 4× weaker than mainline). Removes keyframe artifacts from strong filtering. |
| `--filtering-noise-detection` | 0 (tune default) | Noise detection that turns CDEF and restoration off on noisy frames: 0 tune default (on for tunes 0 and 3), 1 on, 2 off, 3 CDEF only, 4 restoration only. |
| `--alt-tf-decay` | 0 | Apply tune 0/3’s alt-ref temporal-filter decay to any tune. |

</details>

<details>
<summary>Super-resolution, resizing and switch frames (13 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--superres-mode` | 0 (off) | Super-resolution (code at reduced width, upscale in the decoder): 0 off, 1 fixed, 2 random, 3 by QP threshold, 4 auto. Not available with two-pass. |
| `--superres-denom` | 8 | Mode 1 scale: width × 8/denom, 8–16 (8 none, 16 half width). |
| `--superres-kf-denom` | 8 | Mode 1 scale for key frames, 8–16. |
| `--superres-qthres` | 43 | Mode 3: frames with QP above this (0–63) use super-resolution. |
| `--superres-kf-qthres` | 43 | Mode 3 threshold for key frames, 0–63. |
| `--sframe-dist` | 0 (off) | Insert a switch frame every N frames; S-frames let a decoder switch between streams. |
| `--sframe-mode` | 2 | S-frame placement: 1 only if that frame is an alt-ref, 2 the next alt-ref. |
| `--resize-mode` | 0 (off) | Reference scaling (resize frames inside the codec loop): 0 off, 1 fixed, 2 random, 3 dynamic, 4 per-event list. |
| `--resize-denom` | 8 | Mode 1 scale 8/denom, 8–16. |
| `--resize-kf-denom` | 8 | Mode 1 scale for key frames, 8–16. |
| `--frame-resz-events` | none | Mode 4: comma-separated frame numbers (0-based) where a new scale starts. |
| `--frame-resz-kf-denoms` | none | Mode 4: key-frame denominators (8–16), one per event. |
| `--frame-resz-denoms` | none | Mode 4: denominators (8–16), one per event. |

</details>

<details>
<summary>Film grain (8 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--film-grain` | 0 (off) | Film-grain synthesis, 1–50: estimate grain from the source and signal it for the decoder to add back. Saves a lot of bitrate on grainy sources; the encoder warns about the compute cost above preset 6. |
| `--film-grain-denoise` | 0 | 1 also codes a denoised picture at the `--film-grain` strength; 0 codes the source picture and only adds the grain parameters. |
| `--fgs-table` | none | Use a pre-made grain table file (aomenc `--film-grain-table` format) instead of estimating grain. |
| `--photon-noise` | 0 (off) | Add synthetic photon (sensor) noise through a generated grain table, as an ISO value 1–100000. |
| `--photon-noise-chroma` | 0 | Also add chroma noise with `--photon-noise`. |
| `--static-fgs-seed` | 0 (off) | Fixed random seed for grain synthesis: 0 off, −2 built-in seed, 1–65535 custom. With `--photon-noise` or `--fgs-table` this gives static noise. |
| `--adaptive-film-grain` | 0 | Choose the grain-estimation block size from the resolution, which reduces visible repeating grain patterns. |
| `--chroma-grain` | 1 | Apply synthesized grain to the chroma planes too. |

</details>

<details>
<summary>Colour and HDR metadata (11 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--color-help` | — | Print the colour-metadata reference (primaries, transfer and matrix names, mastering-display syntax) and exit. |
| `--enable-hdr` | 0 | Accepted (0 or 1) but read by nothing else in this release; HDR metadata comes from `--mastering-display` and `--content-light`. |
| `--color-primaries` | 2 (unspecified) | Colour primaries, 0–12 or 22, by number or name (`bt709`, `bt2020`…); see `--color-help`. Signalling only: pixels are not converted. |
| `--transfer-characteristics` | 2 (unspecified) | Transfer function, 0–22 (`bt709`, `smpte2084` for PQ, `hlg`…). |
| `--matrix-coefficients` | 2 (unspecified) | YUV matrix, 0–14 (`bt709`, `bt2020-ncl`…). 0 (identity) needs 4:4:4. |
| `--color-range` | 0 (limited) | 0 limited (studio) range, 1 full range. |
| `--chroma-sample-position` | unknown | Chroma siting: `unknown`, `vertical`/`left` or `colocated`/`topleft`. |
| `--mastering-display` | none | SMPTE ST 2086 mastering display as `G(x,y)B(x,y)R(x,y)WP(x,y)L(max,min)`: CIE xy chromaticities and luminance in cd/m². |
| `--content-light` | none | Content light level as `MaxCLL,MaxFALL` in cd/m², e.g. `1000,400`. |
| `--dolby-vision-rpu` | none | Dolby Vision RPU file to embed, frame-aligned with the encode. Requires a build with libdovi. |
| `--hdr10plus-json` | none | HDR10+ JSON metadata file to embed. Requires a build with hdr10plus support. |

</details>

<details>
<summary>Psychovisual tuning (18 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--enable-variance-boost` | auto (1; 0 with psy-bias) | Variance Boost (0 or 1): lower QP in low-contrast superblocks. Off by default when `--lineart-psy-bias` or `--texture-psy-bias` is 1 or more. |
| `--variance-boost-strength` | 2 | Variance Boost strength: 1 mild, 2 gentle, 3 medium, 4 aggressive. Upstream suggests 1 for smooth animation and 3 for stills or very contrasty films. |
| `--variance-octile` | 5 | How much of a superblock must be low-contrast before it is boosted, 1–8 (1 boosts readily, 8 only uniform blocks). Lower values spend more bits; upstream recommends 4–7. |
| `--enable-alt-curve` | 0 | Alternative Variance Boost curve with different boost trade-offs. |
| `--sharpness` | 2 | Bias RD decisions toward block sharpness, −14–14. |
| `--qp-scale-compress-strength` | auto (1.0; 0 with balancing-q-bias) | Compress QP differences between temporal layers, 0.0–8.0 (mainline allows 0–3), for steadier quality within a mini-GOP; helps grain and fast motion. Defaults to 0 when `--balancing-q-bias` is on, which psy-bias turns on. |
| `--frame-luma-bias` | 0 | Spend more bits on dark frames: lowers frame QP based on average luma, strength 0–100. |
| `--luminance-qp-bias` | 0 | Alias of `--frame-luma-bias`; if both are given, the larger value wins. |
| `--noise-norm-strength` | auto (1) | Noise normalization, 0–4: boosts some AC coefficients so fine texture survives in otherwise flat areas. Auto is 1; 4 with `--texture-psy-bias` 5+; 0 with `--lineart-psy-bias` 5+ and texture below 4. |
| `--ac-bias` | auto (1.0) | Psychovisual RD bias toward keeping high-frequency energy, 0.0–8.0. Auto is 1.0; 1.5 in high-fidelity mode with texture psy-bias 1–4; 2.5 with texture psy-bias 5+. |
| `--texture-ac-bias` | auto (follows `--ac-bias`) | `--ac-bias` strength in low-variance (texture) regions, 0.0–64.0. Auto follows `--ac-bias`, or 2.5–6.0 with `--texture-psy-bias` 4+. |
| `--lineart-energy-bias` | auto (1.0) | Prefer more energy than the source in high-variance (lineart) regions, 0.667–1.5. Auto is 1.0, 0.98 in high-quality mode; upstream suggests trying 0.98. |
| `--texture-energy-bias` | auto (1.0) | Prefer more energy than the source in low-variance regions, 0.667–1.5. Auto is 1.0, or 1.02–1.10 with `--texture-psy-bias` 3+. |
| `--satd-bias` | auto (0.0) | Add SATD to the distortion measure, 0.0–16.0; upstream suggests trying 0.5. |
| `--tx-bias` | 0 | Bias transform size/type choices toward sharpness and detail, at some risk of blocking and banding: 0 off, 1 full, 2 transform size only, 3 interpolation filter only. Psy-bias 3+ is meant to replace it. |
| `--low-q-taper` | 0 | Taper Variance Boost so that boosted blocks do not reach extremely low q (below q 11). |
| `--sharp-tx` | 1 | Sharp transform optimizations: cleaner detail with a slightly higher risk of artifacts; pair with `--ac-bias`. |
| `--alt-ssim-tuning` | 0 | Tunes 2 and 4: add VQ optimizations and an alternative SSIM calculation. |

</details>

<details>
<summary>Psy-bias controls (20 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--noise-level-thr` | -1 (auto) | Noise level above which noise-sensitive features switch off: −1 encoder default, −2 print each frame’s noise level, a positive value sets the threshold. |
| `--lineart-psy-bias` | off | Lineart retention for 2D content, 0–7; higher is more aggressive. Set it together with `--texture-psy-bias`: if only one is given, the other becomes min(value, 2). Upstream starting points: 3 for small encodes, 5 for high quality, 6–7 for weak lineart. −2 tests the variance threshold. |
| `--texture-psy-bias` | off | Texture and noise retention, 0–7. Upstream starting points: 3 for small encodes, 4 for high quality, 5–7 for heavy texture or noise; 3 or lower for sources with little texture. |
| `--noise-psy-bias` | auto (0) | Noise retention, 0–7. Auto is 0, or 2, 4 and 6 with `--texture-psy-bias` 5, 6 and 7 (4 in high-fidelity mode). |
| `--lineart-variance-thr` | 5.5 | Variance threshold on a log2 scale, 0.0–16.0, above which detail counts as lineart for `--lineart-psy-bias`. |
| `--texture-variance-thr` | 5.5 | Variance threshold on a log2 scale, 0.0–16.0, below which detail counts as texture for `--texture-psy-bias`. |
| `--psy-bias-mds0-sad` | auto (0) | Use SAD in the first mode-decision stage; auto on with lineart psy-bias 2+ or texture 3+. |
| `--psy-bias-disable-warped-motion` | auto (0) | Disable warped motion; auto on with lineart psy-bias 3+. |
| `--psy-bias-disable-me-8x8` | auto (0) | Disable 8×8 motion estimation and 8×8 temporal-filter prediction; auto on with lineart psy-bias 3+ outside high-fidelity mode. |
| `--psy-bias-disable-sgrproj` | auto (0) | Disable the self-guided restoration filter; auto on with lineart psy-bias 4+. |
| `--psy-bias-coeff-lvl-offset` | auto (0) | Offset the encoder’s coefficient-level classification, −3–3; auto 2 with texture psy-bias 5+. |
| `--psy-bias-mds0-intra-inter-mode-bias` | auto (0) | Favour intra modes in base layers and inter modes in higher layers; auto on with noise psy-bias 4+. |
| `--psy-bias-inter-mode-bias` | auto (0) | Bias against intra modes in non-base layers, 0–5; auto 1 with lineart or texture psy-bias 3+ or noise psy-bias 1+. |
| `--psy-bias-qm-bias` | auto (0) | Use higher QM levels in higher temporal layers; auto on with psy-bias 2+. |
| `--psy-bias-sharpness-rounding` | auto (64; 48 for tune 3) | Quantization rounding offset, 1–256. |
| `--psy-bias-optimize-b` | auto (0) | Slow full-distortion quantization optimization: 0 off, 1 optimize end-of-block then the normal pass, 2 replace the normal pass (EOB and coefficients), 4 EOB only, −2 normal pass off. Auto 1 with psy-bias at presets ≤4. |
| `--texture-psy-bias-optimize-b` | auto (follows `--psy-bias-optimize-b`) | The same choices for low-variance regions; auto 4 with texture psy-bias 3+ or 2 with lineart 4+, at presets ≤4. |
| `--psy-bias-dg` | auto (1) | Psychovisual dynamic mini-GOP decisions (0 or 1); forced on while `--balancing-mg-dist-q-bias` is active, as it is by default. −2 prints mini-GOP distances. |
| `--high-quality-encode-psy-bias` | auto (0) | High-quality mode for several features; auto on when a psy-bias is set and CRF ≤24. |
| `--high-fidelity-encode-psy-bias` | auto (0) | High-fidelity mode (implies high-quality mode); auto on when a psy-bias is set and CRF ≤16. |

</details>

<details>
<summary>Balancing (TPL) controls (8 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--balancing-q-bias` | auto (0; 1 with psy-bias) | Bias TPL at frame and superblock level toward detail retention (0 or 1). |
| `--balancing-r0-dampening-layer` | auto (1) | Dampen TPL r0 boosting in temporal layers at or above hierarchical levels plus this value, −5–1 (1 off). Auto −2 with balancing-q-bias, −3 with texture psy-bias 5+ or noise psy-bias 3+. |
| `--balancing-mg-dist-q-bias` | 3 | Strengthen balancing-q-bias by mini-GOP distortion; the value is a log2 exponent, 0.0–8.0, and −2 disables it. Also forces `--psy-bias-dg 1` and `--enable-dg 1`. |
| `--balancing-noise-level-q-bias` | 1 | Strengthen balancing-q-bias by frame noise level; log2 exponent 0.0–8.0, −2 disables. Setting this and `--balancing-mg-dist-q-bias` both to −2 restores the older balancing behaviour. |
| `--balancing-luminance-q-bias` | auto (0; 4.0 with balancing-q-bias) | Boost dark superblocks, 0.0–25.0; auto 4.0 (6.0 with lineart psy-bias 5+) when balancing-q-bias is on. |
| `--balancing-luminance-lambda-bias` | auto (0.0) | Bias the mode-decision lambda in dark superblocks, 0.0–0.999. |
| `--balancing-texture-lambda-bias` | auto (0.0) | Bias the mode-decision lambda in low-variance regions, 0.0–0.999; upstream suggests trying 0.5. |
| `--balancing-tpl-intra-mode-beta-bias` | auto (0) | Boost superblocks whose TPL search prefers intra prediction; auto on with noise psy-bias 1+. Needs balancing-q-bias. |

</details>

<details>
<summary>Deblocking and CDEF bias (12 options)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--dlf-bias` | 0 (1 with psy-bias) | Alternative deblocking search with its own AC bias and strength limits (`--dlf-bias-max-dlf`, `--dlf-bias-min-dlf`); psy-bias 1+ turns it on. |
| `--dlf-sharpness` | auto (1) | Deblocking sharpness, 0–7, also usable without `--dlf-bias`; auto 7 with lineart psy-bias 5+ and texture below 4. |
| `--dlf-bias-max-dlf` | auto (8,2) | Maximum deblocking strength as `luma,chroma` (each 0–63) for `--dlf-bias`; auto rises with `--texture-psy-bias` 4+ above CRF 28. |
| `--dlf-bias-min-dlf` | auto (2,0) | Minimum deblocking strength as `luma,chroma`; strength 0 is not tried when the minimum is above 0. |
| `--cdef-bias` | 0 (1 with psy-bias) | Alternative CDEF search (signalling fix, SAD/MSE distortion, strength taper) limited by the CDEF-bias strength options; psy-bias 1+ turns it on. |
| `--cdef-bias-max-cdef` | auto (4,1,2,0) | Maximum CDEF strengths as `Y primary,Y secondary,UV primary,UV secondary`; primary 0–15, secondary 0, 1, 2 or 4. |
| `--cdef-bias-min-cdef` | auto (0,0,0,0) | Minimum CDEF strengths in the same order; strength 0 is always tried. |
| `--cdef-bias-max-sec-cdef-rel` | 0 | Cap each block’s secondary CDEF strength at its primary strength plus this value, −12–4. |
| `--texture-cdef-bias-max-cdef` | auto (follows `--cdef-bias-max-cdef`) | Maximum CDEF strengths in low-variance regions; 1,0,0,0 in high-fidelity mode. |
| `--texture-cdef-bias-min-cdef` | auto (follows `--cdef-bias-min-cdef`) | Minimum CDEF strengths in low-variance regions. |
| `--texture-cdef-bias-max-sec-cdef-rel` | 0 | `--cdef-bias-max-sec-cdef-rel` for low-variance regions. |
| `--cdef-bias-damping-offset` | 0 | Offset the CDEF damping that is normally derived from each frame’s q-index, −4–8. |

</details>
