{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/tools/software-encoders/svt-av1-psyex",
  "collection": "docs",
  "title": "SVT-AV1-PSYEX",
  "description": "SVT-AV1-PSYEX is BlueSwordM's continuation of SVT-AV1-PSY, now on hold, that adds psy-rd, complex HVS and other perceptual options on top of SVT-AV1 3.0.2.",
  "canonicalUrl": "https://encode.wiki/tools/software-encoders/svt-av1-psyex/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/tools/software-encoders/svt-av1-psyex.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/tools/software-encoders/svt-av1-psyex.md",
  "status": "current",
  "tags": [
    "av1",
    "encoder",
    "svt-av1-family"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "SVT-AV1-PSYEX repository README",
      "url": "https://github.com/BlueSwordM/svt-av1-psyex/blob/master/README.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "SVT-AV1-PSYEX v3.0.2-B release",
      "url": "https://github.com/BlueSwordM/svt-av1-psyex/releases/tag/v3.0.2-B",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "SVT-AV1-PSYEX v3.0.2-B application option registration",
      "url": "https://github.com/BlueSwordM/svt-av1-psyex/blob/3beb4aee471c686ecb05089b29b0e676026aea1b/Source/App/app_config.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "SVT-AV1-PSYEX v3.0.2-B encoder defaults",
      "url": "https://github.com/BlueSwordM/svt-av1-psyex/blob/3beb4aee471c686ecb05089b29b0e676026aea1b/Source/Lib/Globals/enc_settings.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "SVT-AV1-PSY README (PSYEX on hold, SVT-AV1-HDR recommended)",
      "url": "https://github.com/psy-ex/svt-av1-psy/blob/master/README.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "SVT-AV1 v4.2.0 parameter documentation",
      "url": "https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/v4.2.0/Docs/Parameters.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "headings": [
    {
      "depth": 2,
      "text": "Get it",
      "anchor": "get-it"
    },
    {
      "depth": 2,
      "text": "Starting commands",
      "anchor": "starting-commands"
    },
    {
      "depth": 2,
      "text": "Differences from mainline",
      "anchor": "differences-from-mainline"
    },
    {
      "depth": 3,
      "text": "Defaults",
      "anchor": "defaults"
    },
    {
      "depth": 3,
      "text": "Fork-only options",
      "anchor": "fork-only-options"
    },
    {
      "depth": 2,
      "text": "Complete native parameter reference",
      "anchor": "complete-native-parameter-reference"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/svt-av1-psyex/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/_preamble.md",
      "checksum": "8c85f821fba8b896c197b8695c4074ff91149b80615779097bc89570c4a688f8",
      "bytes": 1561
    },
    {
      "id": "get-it",
      "title": "Get it",
      "depth": 2,
      "anchor": "get-it",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/svt-av1-psyex/#get-it",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/get-it.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/get-it.md",
      "checksum": "2a2dccb896959ab41a437551deae791149912f42883248560200b81e6012caa4",
      "bytes": 646
    },
    {
      "id": "starting-commands",
      "title": "Starting commands",
      "depth": 2,
      "anchor": "starting-commands",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/svt-av1-psyex/#starting-commands",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/starting-commands.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/starting-commands.md",
      "checksum": "fbf1891414ceafafc0226a8691b54247817cc8a3c754cb7bcd770434734fac21",
      "bytes": 624
    },
    {
      "id": "differences-from-mainline",
      "title": "Differences from mainline",
      "depth": 2,
      "anchor": "differences-from-mainline",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/svt-av1-psyex/#differences-from-mainline",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/differences-from-mainline.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/differences-from-mainline.md",
      "checksum": "4370887b5c276141f62d83bb44bf7e4788c23a4b582ce18bbc2b21fb9162454a",
      "bytes": 2643
    },
    {
      "id": "defaults",
      "title": "Defaults",
      "depth": 3,
      "anchor": "defaults",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/svt-av1-psyex/#defaults",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/defaults.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/defaults.md",
      "checksum": "d3a33490db6baa986cd03af0e43e4a8f52aa7924af68b9355809a71c9d2ddfd5",
      "bytes": 894
    },
    {
      "id": "fork-only-options",
      "title": "Fork-only options",
      "depth": 3,
      "anchor": "fork-only-options",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/svt-av1-psyex/#fork-only-options",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/fork-only-options.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/fork-only-options.md",
      "checksum": "72f01a98db95ace24e40054b6bd877b1dad3a2e99b3f4b4d70cfd00fd2ecc1a0",
      "bytes": 1718
    },
    {
      "id": "complete-native-parameter-reference",
      "title": "Complete native parameter reference",
      "depth": 2,
      "anchor": "complete-native-parameter-reference",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/svt-av1-psyex/#complete-native-parameter-reference",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/complete-native-parameter-reference.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/svt-av1-psyex/complete-native-parameter-reference.md",
      "checksum": "5d2b29ba154e400612f476b97d650dfb93698c29d3eee88af68dfc4a6209e92c",
      "bytes": 20052
    }
  ],
  "outboundReferences": [
    "/tools/software-encoders/svt-av1-hdr/",
    "/tools/software-encoders/svt-av1-psy/",
    "/tools/software-encoders/svt-av1/",
    "https://github.com/BlueSwordM/svt-av1-psyex",
    "https://github.com/BlueSwordM/svt-av1-psyex/releases/tag/v3.0.2-B"
  ],
  "checksum": "3e6bb3e895aacd0dd0f62d0b7528724428c2ac865130983366ff9449de6fa77c",
  "contentFormat": "markdown",
  "markdown": "> **Repository:** [BlueSwordM/svt-av1-psyex](https://github.com/BlueSwordM/svt-av1-psyex). The Scalable Video Technology for AV1 (SVT-AV1 Encoder and Decoder) with perceptual enhancements for psychovisually optimal AV1 encoding. Latest release: [v3.0.2-B](https://github.com/BlueSwordM/svt-av1-psyex/releases/tag/v3.0.2-B), Sep 27, 2025. Last commit: Nov 9, 2025. License: BSD-3-Clause-Clear. Stars: 185.\n\nSVT-AV1-PSYEX (\"psychovisually extended\") is BlueSwordM's continuation of [SVT-AV1-PSY](/tools/software-encoders/svt-av1-psy/), started when PSY ended in 2025. It keeps PSY's perceptual options and adds stronger ones, chiefly a higher-quality psy-rd path (`--complex-hvs`) and control over noise-adaptive filtering. It is built on mainline [SVT-AV1](/tools/software-encoders/svt-av1/) **3.0.2**.\n\n**Status:** the latest release is **v3.0.2-B** \"Solid-state stability\" (27 September 2025), and the last commit was in November 2025. The repository is not archived. However, the PSY project's README says BlueSwordM has put PSYEX on hold to work on [SVT-AV1-HDR](/tools/software-encoders/svt-av1-hdr/), and names SVT-AV1-HDR as the recommended continuation.\n\nBecause it is based on mainline 3.0.2, PSYEX lacks newer mainline work: the 3.1–4.2 speed and efficiency improvements and the IQ, MS-SSIM and VMAF tunes. Mainline's `--ac-bias` is absent too; PSYEX's `--psy-rd` is the equivalent. It does have PSY's quarter-step CRF up to 70. Use PSYEX if you specifically want its psy-rd and complex HVS behaviour. Otherwise, use SVT-AV1-HDR or current mainline.\n\n## Get it\n\nThe [v3.0.2-B release](https://github.com/BlueSwordM/svt-av1-psyex/releases/tag/v3.0.2-B) has x86-64 binaries for Linux (AVX2 and AVX-512) and Windows. To build it yourself, use the same steps as mainline:\n\n```sh\ngit clone --depth 1 --branch v3.0.2-B https://github.com/BlueSwordM/svt-av1-psyex.git\ncd svt-av1-psyex/Build/linux\n./build.sh release\n```\n\nAdd `enable-dovi` or `enable-hdr10plus` to `build.sh` to accept Dolby Vision RPU (`--dolby-vision-rpu`) or HDR10+ JSON (`--hdr10plus-json`) input; the build needs libdovi or libhdr10plus to be installed. The result is another `SvtAv1EncApp`, so keep it apart from a mainline binary.\n\n## Starting commands\n\nPSYEX's defaults are already tuned for visual quality, so start with preset and CRF only:\n\n```sh\nSvtAv1EncApp -i input.y4m --preset 4 --crf 30 -b output.ivf\n```\n\nFor more fidelity at preset 6 or slower, raise psy-rd and enable the complex HVS model:\n\n```sh\nSvtAv1EncApp -i input.y4m --preset 4 --crf 30 --psy-rd 1.5 --complex-hvs 1 -b output.ivf\n```\n\nFeed 10-bit Y4M from FFmpeg (`-pix_fmt yuv420p10le -strict -1 -f yuv4mpegpipe -`) as with mainline. The maintainer recommends presets 2–6 and advises against copying long setting strings: keep the defaults, then change preset, CRF and psy-rd first.\n\n## Differences from mainline\n\n### Defaults\n\n| Setting | PSYEX v3.0.2-B | Mainline v4.2.0 |\n| --- | --- | --- |\n| `--tune` | 0 (VQ) | 1 (PSNR) |\n| `--noise-adaptive-filtering` | 0 (CDEF/restoration always on) | not available |\n| `--enable-variance-boost` | 1 | 0 |\n| `--enable-qm` / `--qm-min` / `--chroma-qm-min` | 1 / 4 / 10 | 0 / 8 / 8 |\n| `--tf-strength` / `--kf-tf-strength` | 1 / 1 | 3 / not available |\n| `--sharpness` | 1 | 0 |\n| `--qp-scale-compress-strength` | 1.0 (0.0–8.0) | 0 (0–3) |\n| `--psy-rd` / `--sharp-tx` | 1.0 / 1 | not available |\n| `--keyint` default | ~10 s | ~5 s |\n\nPSYEX made tune 0 the default in v3.0.2-B. It also disabled tune 0's noise-adaptive filtering by default because switching CDEF and restoration off on noisy frames hurt line stability, especially in 2D animation at lower bitrates.\n\nTune numbers follow PSY, not mainline: 0 VQ, 1 PSNR, 2 SSIM, 3 Subjective SSIM, 4 Still Picture.\n\n### Fork-only options\n\n| Option | Default | What it does |\n| --- | --- | --- |\n| `--psy-rd` | 1.0 | Psychovisual RD strength, 0.0–6.0. Preserves high-frequency energy (texture, grain). A higher-quality mode activates at 1.2 and above on preset 6 or slower. |\n| `--complex-hvs` | 0 | 1 switches mode decisions to an SSD-based metric, so psy-rd behaves like a cheap PSNR-HVS. Recommended with psy-rd at preset 6 and slower; the maintainer estimates ~20% slower encodes. |\n| `--spy-rd` | 0 | Alternative psychovisual pathways biased to sharpness: 1 = full, 2 = partial. Can increase blocking and banding. |\n| `--sharp-tx` | 1 | Disables some transform optimisations so psy-rd has more effect. Turn off if you set `--psy-rd 0`. |\n| `--noise-norm-strength` | 1 | 0–4. Boosts AC coefficients in fine textures and flat areas; 3 for difficult content. |\n| `--noise-adaptive-filtering` | 0 | 0 always filter; 1 noise-adaptive CDEF and restoration; 2 tune default; 3 CDEF only; 4 restoration only (keeps CDEF cleaning lines, useful for anime). |\n| `--kf-tf-strength` | 1 | Temporal-filter strength on keyframes, 0–4. |\n| `--low-q-taper` | 0 | Tapers QP boosts below q11, which helps efficiency at very low CRF. |\n| `--hbd-mds` | 0 | 0 preset default, 1 10-bit, 2 hybrid, 3 8-bit mode decision. The values differ from mainline's (-1 default, 0 8-bit, 1 10-bit, 2 hybrid). |\n| `--max-32-tx-size` | 0 | 1 limits transforms to 32×32 (mainline: `--max-tx-size 32`). |\n| `--preset -2`, `-3` | | Extra research presets, slower than -1. |\n\nThe maintainer's other suggestions: `--qp-scale-compress-strength 2` for more frame-to-frame consistency, `--hbd-mds 1` at preset 3 and faster, and `--enable-dlf 2` at preset 4 and faster.\n\n## Complete native parameter reference\n\nEvery option SVT-AV1-PSYEX v3.0.2-B accepts, grouped by purpose; aliases share a row. “auto” defaults are resolved from the preset, tune and input.\n\n<details>\n<summary>Input, output and application (17 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--help` | — | Print the option list and exit. |\n| `--version` | — | Print the library version and exit. |\n| `--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`. |\n| `--output`, `-b` | none | Output IVF file; `-` or `stdout` writes to a pipe. |\n| `--config`, `-c` | none | Read options from a configuration file of `Name : value` lines (the config-file names, e.g. `EncoderMode`). |\n| `--errlog` | stderr | Write warnings and errors to this file. |\n| `--recon`, `-o` | none | Write the reconstructed (decoded) frames as raw YUV, for debugging or metrics. |\n| `--stat-file` | none | Write per-frame PSNR and SSIM to this file; needs `--enable-stat-report 1`. |\n| `--progress` | 1 | Progress output: 0 none, 1 normal, 2 aomenc-style, 3 detailed. |\n| `--no-progress` | 0 | `--no-progress 1` is the same as `--progress 0`. |\n| `--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. |\n| `--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. |\n| `--skip` | 0 | Skip this many frames at the start of the input. |\n| `--nb` | -1 (off) | Preload this many frames into memory and encode only those, for benchmarking without I/O. |\n| `--inj` | 0 | Feed frames to the encoder at a fixed rate (`--inj-frm-rt`) to simulate live input. |\n| `--inj-frm-rt` | 60 | Injection rate in frames per second (0–240) for `--inj 1`. |\n| `--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. |\n\n</details>\n\n<details>\n<summary>Source format, profile and level (12 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--width`, `-w` | 0 (from Y4M) | Frame width in pixels, 4–16384. Required for raw YUV; Y4M headers supply it. |\n| `--height`, `-h` | 0 (from Y4M) | Frame height in pixels, 4–8704. Required for raw YUV. |\n| `--forced-max-frame-width` | 0 (input width) | Maximum frame width written to the sequence header (4–16384), for streams whose frame size changes later. |\n| `--forced-max-frame-height` | 0 (input height) | Maximum frame height written to the sequence header (4–8704). |\n| `--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. |\n| `--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. |\n| `--level` | 0 (auto) | AV1 level to signal, 2.0–7.3 (e.g. `5.1`); 0 derives it from the input. |\n| `--fps` | 60 | Integer frame rate for raw input, 1–240; Y4M headers override it. Use `--fps-num`/`--fps-denom` for fractional rates. |\n| `--fps-num` | 60000 | Frame-rate numerator for raw input; Y4M headers override it. |\n| `--fps-denom` | 1000 | Frame-rate denominator; the default pair means 60 fps. |\n| `--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. |\n| `--tier` | 0 (main) | AV1 tier: 0 main, 1 high (higher bitrate limits for levels 4.0 and up). Accepted but not listed in `--help`. |\n\n</details>\n\n<details>\n<summary>Preset, tune and threading (8 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--preset` | 8 | Speed/efficiency trade-off, −3–13; lower is slower and more efficient. −2 and −3 are extremely slow research modes. Presets above 10 run as 10, and 8K inputs need preset 2 or faster. |\n| `--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. |\n| `--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. |\n| `--pin` | 0 (off) | Pin the encoder to the first N logical cores; 0 disables pinning. |\n| `--ss` | -1 (any) | CPU socket to run on: −1 any, 0 or 1 a specific socket of a two-socket system. |\n| `--fast-decode` | 0 | Decoder-speed optimizations, 0–2 (2 decodes fastest) at a small efficiency cost. Try it before tiles. |\n| `--tune` | 0 (VQ) | 0 VQ, 1 PSNR, 2 SSIM, 3 Subjective SSIM (tune 2 with psychovisual tweaks), 4 Still Picture (all-intra images). |\n| `--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. |\n\n</details>\n\n<details>\n<summary>Rate control and passes (21 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--rc` | 0 | Rate-control mode: 0 CRF (or CQP with `--aq-mode 0`), 1 VBR, 2 CBR, both with `--tbr`. |\n| `--qp`, `-q` | 35 | Base QP, 1–63: the fixed QP in CQP and the starting point otherwise. For constant quality use `--crf`. |\n| `--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. |\n| `--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`. |\n| `--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. |\n| `--max-qp` | 63 | Highest QP rate control may use, 0–63; mainly for VBR and CBR. |\n| `--min-qp` | auto (0 for CRF, 4 for VBR/CBR) | Lowest QP rate control may use, 0–63; mainly for VBR and CBR. |\n| `--undershoot-pct` | auto (50 for VBR, 25 for CBR) | How far below the target VBR/CBR may undershoot, in percent (0–100). |\n| `--overshoot-pct` | auto (25) | How far above the target VBR/CBR may overshoot, in percent (0–100). |\n| `--mbr-overshoot-pct` | 50 | Allowed overshoot of `--mbr` in capped CRF, in percent (0–100). |\n| `--gop-constraint-rc` | 0 | Make VBR hit the target within each GOP instead of over the whole clip; useful for chunked or segmented encoding. |\n| `--buf-sz` | 1000 | CBR decoder buffer size in milliseconds (20–10000). |\n| `--buf-initial-sz` | 600 | CBR initial buffer level in milliseconds (20–10000); must be below `--buf-sz`. |\n| `--buf-optimal-sz` | 600 | CBR target buffer level in milliseconds (20–10000). |\n| `--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. |\n| `--minsection-pct` | 0 | VBR: lowest bitrate a GOP may get, as a percentage of the target (0–100). |\n| `--maxsection-pct` | 2000 | VBR: highest bitrate a GOP may get, as a percentage of the target (0–10000). |\n| `--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. |\n| `--stats` | svtav1_2pass.log | Statistics file written by the first pass and read by the second. |\n| `--passes` | 1 | `--passes 2` runs both passes of a VBR two-pass encode in one command. |\n| `--enable-tpl-la` | 1 | Temporal dependency (TPL) model. The library forces it on for CRF/CQP, so 0 only matters in VBR/CBR. |\n\n</details>\n\n<details>\n<summary>Quantization offsets and matrices (20 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--use-q-file` | 0 | Take per-frame QPs from `--qpfile` instead of the encoder’s own assignment. |\n| `--qpfile` | none | File with one QP per line, one line per frame, for `--use-q-file 1`. |\n| `--aq-mode` | 2 | Adaptive quantization: 0 off (constant QP), 1 variance-based segments, 2 delta-q from TPL prediction efficiency. |\n| `--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. |\n| `--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. |\n| `--key-frame-chroma-qindex-offset` | 0 | Chroma q-index offset for key frames, −64–63. |\n| `--qindex-offsets` | 0 per layer | Comma-separated luma q-index offsets, one per temporal layer (each −64–63), for `--use-fixed-qindex-offsets`. |\n| `--chroma-qindex-offsets` | 0 per layer | Comma-separated chroma q-index offsets, one per temporal layer (each −64–63). |\n| `--luma-y-dc-qindex-offset` | 0 | Luma DC quantizer offset in q-index steps (−64–63); positive values quantize DC more coarsely. |\n| `--chroma-u-dc-qindex-offset` | 0 | Cb DC quantizer offset in q-index steps (−64–63). |\n| `--chroma-u-ac-qindex-offset` | 0 | Cb AC quantizer offset in q-index steps (−64–63). |\n| `--chroma-v-dc-qindex-offset` | 0 | Cr DC quantizer offset in q-index steps (−64–63). |\n| `--chroma-v-ac-qindex-offset` | 0 | Cr AC quantizer offset in q-index steps (−64–63). |\n| `--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. |\n| `--enable-qm` | 1 | Use quantization matrices, which quantize high frequencies more coarsely than low ones. |\n| `--qm-min` | 4 | Lowest (steepest) luma QM level the encoder may pick, 0–15; 15 is flat. |\n| `--qm-max` | 15 | Highest (flattest) luma QM level, 0–15. |\n| `--roi-map-file` | none | Region-of-interest file giving per-block QP offsets for chosen frames. |\n| `--chroma-qm-min` | 10 | Lowest chroma QM level, 0–15. |\n| `--chroma-qm-max` | 15 | Highest chroma QM level, 0–15. |\n\n</details>\n\n<details>\n<summary>GOP structure and keyframes (11 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--keyint` | -2 (about 10 s) | Maximum keyframe interval in frames, or seconds with an `s` suffix. −2 is about 10 seconds; −1 or 0 means no periodic keyframes (CRF only). |\n| `--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. |\n| `--scd` | 0 | Scene-change detection. The encoder switches it back off with a warning: scene changes are handled inside mode decision and no keyframe is inserted. |\n| `--lookahead` | -1 (auto) | Frames of extra look-ahead for rate control and TPL, 0–120, beyond the mini-GOP and temporal-filter window. |\n| `--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. |\n| `--pred-struct` | 2 (random access) | Prediction structure: 1 low delay, 2 random access (normal for files). 0 all-intra is also accepted. |\n| `--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`). |\n| `--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`. |\n| `--startup-qp-offset` | 0 | QP offset (−63–63) for that startup mini-GOP. |\n| `--enable-dg` | 1 | Dynamic mini-GOP: adapt the hierarchical structure to the content. |\n| `--intra-period` | -2 | Deprecated form of `--keyint`, counted as keyint − 1. Not listed in `--help`. |\n\n</details>\n\n<details>\n<summary>Filters and coding tools (15 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--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. |\n| `--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. |\n| `--tile-columns` | auto | Tile columns as log2 (0–4); at most 128 tiles in total. |\n| `--enable-dlf` | 1 | Deblocking filter: 0 off, 1 on, 2 more accurate and slower. |\n| `--enable-cdef` | auto (on) | CDEF deringing filter, 0 or 1. |\n| `--enable-restoration` | auto (on) | Loop restoration filter (Wiener and self-guided), 0 or 1. |\n| `--enable-mfmv` | -1 (auto) | Motion-field motion vector projection, 0 or 1; −1 lets the preset decide. |\n| `--enable-tf` | 1 | Temporal filtering of alt-ref frames: 0 off, 1 on, 2 adaptive strength per 64×64 block (overrides `--tf-strength`). |\n| `--enable-overlays` | 0 | Insert overlay frames after filtered alt-refs as extra references. Not supported with low delay or multi-pass. |\n| `--scm` | 2 (detect) | Screen-content tools (palette, intra block copy): 0 off, 1 on, 2 detect per frame. |\n| `--lossless` | 0 | Lossless coding. |\n| `--avif` | 0 | Still-picture mode for AVIF and single images: better efficiency and less memory. |\n| `--max-32-tx-size` | 0 | Limit transforms to 32×32 (0 or 1); can help detail at high-fidelity CRFs. |\n| `--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. |\n| `--noise-adaptive-filtering` | 0 | Noise-adaptive filtering turns CDEF and restoration off on noisy frames: 0 off (filters always available), 1 both, at every tune and preset, 2 tune default, 3 CDEF only, 4 restoration only. The fork defaults to 0 so that tune 0 stays stable on 2D animation and at low bitrates. |\n\n</details>\n\n<details>\n<summary>Super-resolution, resizing and switch frames (13 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--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. |\n| `--superres-denom` | 8 | Mode 1 scale: width × 8/denom, 8–16 (8 none, 16 half width). |\n| `--superres-kf-denom` | 8 | Mode 1 scale for key frames, 8–16. |\n| `--superres-qthres` | 43 | Mode 3: frames with QP above this (0–63) use super-resolution. |\n| `--superres-kf-qthres` | 43 | Mode 3 threshold for key frames, 0–63. |\n| `--sframe-dist` | 0 (off) | Insert a switch frame every N frames; S-frames let a decoder switch between streams. |\n| `--sframe-mode` | 2 | S-frame placement: 1 only if that frame is an alt-ref, 2 the next alt-ref. |\n| `--resize-mode` | 0 (off) | Reference scaling (resize frames inside the codec loop): 0 off, 1 fixed, 2 random, 3 dynamic, 4 per-event list. |\n| `--resize-denom` | 8 | Mode 1 scale 8/denom, 8–16. |\n| `--resize-kf-denom` | 8 | Mode 1 scale for key frames, 8–16. |\n| `--frame-resz-events` | none | Mode 4: comma-separated frame numbers (0-based) where a new scale starts. |\n| `--frame-resz-kf-denoms` | none | Mode 4: key-frame denominators (8–16), one per event. |\n| `--frame-resz-denoms` | none | Mode 4: denominators (8–16), one per event. |\n\n</details>\n\n<details>\n<summary>Film grain (4 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--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. |\n| `--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. |\n| `--fgs-table` | none | Use a pre-made grain table file (aomenc `--film-grain-table` format) instead of estimating grain. |\n| `--adaptive-film-grain` | 1 | Choose the grain-estimation block size from the resolution, which reduces visible repeating grain patterns. |\n\n</details>\n\n<details>\n<summary>Colour and HDR metadata (10 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--color-help` | — | Print the colour-metadata reference (primaries, transfer and matrix names, mastering-display syntax) and exit. |\n| `--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. |\n| `--transfer-characteristics` | 2 (unspecified) | Transfer function, 0–22 (`bt709`, `smpte2084` for PQ, `hlg`…). |\n| `--matrix-coefficients` | 2 (unspecified) | YUV matrix, 0–14 (`bt709`, `bt2020-ncl`…). 0 (identity) needs 4:4:4. |\n| `--color-range` | 0 (limited) | 0 limited (studio) range, 1 full range. |\n| `--chroma-sample-position` | unknown | Chroma siting: `unknown`, `vertical`/`left` or `colocated`/`topleft`. |\n| `--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². |\n| `--content-light` | none | Content light level as `MaxCLL,MaxFALL` in cd/m², e.g. `1000,400`. |\n| `--dolby-vision-rpu` | none | Dolby Vision RPU file to embed, frame-aligned with the encode. Requires a build with libdovi. |\n| `--hdr10plus-json` | none | HDR10+ JSON metadata file to embed. Requires a build with hdr10plus support. |\n\n</details>\n\n<details>\n<summary>Psychovisual tuning (13 options)</summary>\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `--luminance-qp-bias` | 0 | Spend more bits on dark frames: lowers frame QP based on average luma, strength 0–100. |\n| `--sharpness` | 1 | Bias deblocking and RD decisions toward sharpness (positive) or smoothness (negative), −7–7. |\n| `--enable-variance-boost` | 1 | Variance Boost: lower QP in low-contrast superblocks to prevent banding and blocking in flat and dark areas, at some bitrate cost. |\n| `--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. |\n| `--variance-octile` | 6 | 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. |\n| `--variance-boost-curve` | 0 | Variance Boost curve: 0 default, 1 low-to-medium contrast boost, 2 still-picture curve. |\n| `--qp-scale-compress-strength` | 1 | 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. Upstream: higher values have diminishing returns. |\n| `--noise-norm-strength` | 1 | Noise normalization, 0–4: boosts some AC coefficients so fine texture survives in otherwise flat areas. Upstream suggests 3 for tune 3 and difficult content. |\n| `--psy-rd` | 1.0 | Psychovisual RD strength, 0.0–6.0: tries to keep the energy of high-frequency detail and texture. At 1.2 and above with presets ≤6 it also enables a slower high-quality mode; preset −1 adds the complex HVS model. |\n| `--spy-rd` | 0 | Alternative psychovisual RD pathways that favour sharpness and detail, at some risk of blocking and banding: 0 off, 1 full (most aggressive), 2 partial. |\n| `--low-q-taper` | 0 | Taper boosts that would push blocks or keyframes below q 11, so the encoder avoids extremely low quantizers; helps efficiency at very low CRF. |\n| `--sharp-tx` | 1 | Skip conventional transform optimizations and let other metrics such as psy-rd decide, which makes psy-rd much stronger. Upstream suggests turning it off if you set `--psy-rd 0`. |\n| `--complex-hvs` | 0 | Switch mode and transform decisions from SAD/variance to SSD (0 or 1), about 20% slower. Mainly worth it with `--psy-rd` at preset 6 and slower. |\n\n</details>\n"
}
