Skip to content

SVT-AV1

currentMigrated from docs/encoders/SVT-AV1.mdx at 37c3317fd058; modified for Encode Wiki · CC BY-SA 4.0

Welcome to the Gitlab repo for the SVT-AV1!

Latest release
v4.2.0
Last commit
License
BSD-3-Clause-Clear
Stars
305

SVT-AV1 (Scalable Video Technology for AV1) is the AV1 encoder founded by Intel with Netflix and maintained since 2020 by AOMedia’s Software Implementation Working Group. It is the usual choice for AV1 encoding on a CPU: it is much faster than aomenc at comparable efficiency, and it parallelises without tiles, so threading costs no quality. A single 1080p encode at presets 4–6 uses about 16 cores well; beyond that, chunked encoding with Av1an is the way to fill a bigger CPU. Since v2.1 it has also absorbed much of the psychovisual work from the community SVT-AV1-PSY fork.

The current release is v4.2.0 (14 July 2026). SVT-AV1 is licensed under BSD 3-Clause Clear plus the AOMedia Patent License 1.0.

SVT-AV1 encodes 8-bit and 10-bit 4:2:0 only. There is no 4:2:2, 4:4:4 or 12-bit support; use aomenc or rav1e for those.

  • FFmpeg exposes it as libsvtav1 when built with --enable-libsvtav1. Most distribution and static FFmpeg builds include it. The SVT-AV1 version is whatever library FFmpeg was linked against, which is often older than the latest release.
  • SvtAv1EncApp is the standalone encoder. Distributions package it (often as svt-av1), or build it from the GitLab repository with CMake, NASM and GCC or Clang:
Terminal window
git clone --depth 1 --branch v4.2.0 https://gitlab.com/AOMediaCodec/SVT-AV1.git
cd SVT-AV1/Build/linux
./build.sh release static

The binary ends up in Bin/Release/SvtAv1EncApp. build.sh compiles with -march=native by default, so the binary may not run on other CPUs; add disable-native for a portable build. LTO is on by default with GCC 9+ or Clang 12+, and enable-pgo adds a profile-guided build (see ./build.sh --help).

With FFmpeg, for a typical 1080p film or episode:

Terminal window
ffmpeg -i input.mkv -c:v libsvtav1 -preset 4 -crf 30 -pix_fmt yuv420p10le \
-svtav1-params tune=0:enable-variance-boost=1:keyint=10s -c:a copy output.mkv

-pix_fmt yuv420p10le gives 10-bit output even from an 8-bit source, tune=0 selects the visual-quality tune instead of the PSNR-optimised default, variance boost protects low-contrast areas, and keyint=10s sets a 10-second GOP instead of the default of about 5 s. For grainy live-action sources, add :film-grain=8 (see film grain).

With SvtAv1EncApp, feed it Y4M from FFmpeg and mux the IVF output afterwards:

Terminal window
ffmpeg -i input.mkv -pix_fmt yuv420p10le -strict -1 -f yuv4mpegpipe - \
| SvtAv1EncApp -i stdin --preset 4 --crf 30 --tune 0 --enable-variance-boost 1 --keyint 10s -b video.ivf
mkvmerge -o output.mkv video.ivf -D input.mkv

FFmpeg still needs -strict -1 to write 10-bit Y4M. -D input.mkv takes everything except the video track from the source. The standalone encoder is what tools such as Av1an drive. For a step-by-step walkthrough, see AV1 with SVT-AV1.

The SvtAv1EncApp spelling is shown. In FFmpeg, pass the same names without -- through -svtav1-params key=value:key=value. The exceptions are preset, CRF and GOP length, which have FFmpeg equivalents (-preset, -crf, -g).

OptionDefaultWhat to use
--preset8Speed/efficiency trade-off, -1 (slowest, research) to 13. 2–6 for quality-focused encodes: upstream calls 1–3 “extremely high efficiency” and 4–6 the common balance. 7–9 for fast encodes. Use the slowest preset you can afford.
--crf35Quality target, 1–70, lower is better. Upstream suggests 30 as a 1080p starting point; high-fidelity encodes usually land in the low-to-mid 20s, small files at 35–40. Quarter steps (e.g. 27.25) are allowed.
--tune1 (PSNR)Use 0 (VQ) for video meant to be watched. See tunes.
--input-depth8Output bit depth follows the input. Feed 10-bit (yuv420p10le) to get a 10-bit encode. 10-bit output is the usual choice even for 8-bit sources because it reduces banding and rounding error.
--film-grain0 (off)Grain synthesis level, 1–50. 8 for normally grainy live action, 10–15 for very noisy sources, ~4 for hand-drawn animation.
--film-grain-denoise00 keeps the source pixels and adds synthetic grain on top; 1 also denoises the picture before encoding.
--keyint-2 (~5 s)Keyframe interval in frames, or seconds with an s suffix (10s). The default is 5 s rounded up to whole mini-GOPs (160 frames at 24 fps). 5–10 s is typical for files; streaming needs shorter, segment-aligned GOPs.
--enable-variance-boost0Set to 1 for most content. Raises quality in low-contrast areas (skin, sky, dark scenes) that AQ otherwise starves.
--variance-boost-strength21 for flat, untextured animation, 2 for most content, 3 for films that mix very dark and high-contrast scenes. 4 is rarely worth the bitrate.
--variance-octile5Which part of a superblock’s variance distribution decides the boost, 1–8. Upstream recommends 4–7; the PSY forks used 6. Lower boosts more blocks and costs more bitrate.
--enable-qm0Quantisation matrices. 1 is a common addition. --qm-min (default 8, range 0–15) sets the steepest matrix allowed: lower values give smaller files at slightly lower quality for the same CRF, most noticeably at low CRF.
--tf-strength3Temporal filtering strength on alt-ref frames, 0–4. Strong filtering smooths fine texture and grain; 1–2 keeps more of it, and the PSY-derived forks default to 1.
--sharpness0-7 to 7. Positive values bias deblocking and RD towards sharper output.
--ac-bias0.0Psychovisual energy preservation, like x264/x265 psy-rd. 1.0–1.5 retains texture; 4–6, with --enable-tf 0 and --enable-cdef 0, is for preserving heavy grain.
--qp-scale-compress-strength00–3. 1 evens out quality between frames of a mini-GOP at almost no cost; 2–3 at very high quality.
TuneOptimises forNotes
0VQ (visual quality)The tune for viewing. Sharper, psychovisually tuned; forced to 1 in low-delay mode.
1PSNRDefault. Scores well on PSNR and looks softer.
2SSIMCRF only.
3IQ (image quality)Still images (all-intra) only; rejected for normal random-access video.
4MS-SSIM / SSIMULACRA2CRF only. Overrides sharpness, variance boost and QM settings.
5VMAFCRF only, added in v4.2.0. Applies unsharp-mask preprocessing to raise VMAF scores. Use it only when VMAF itself is the delivery target.

Tunes 1, 2, 4 and 5 optimise for a metric, so judge them by watching the result rather than by the score they target. If you also use metrics, use perceptual ones such as SSIMULACRA2 or Butteraugli.

Grain and sensor noise are expensive to code, and at normal bitrates the encoder smooths them away. With --film-grain N, SVT-AV1 denoises a copy of each frame, models the removed noise, and signals grain parameters that the decoder re-synthesises on playback. This can save a lot of bitrate on grainy sources while keeping their look.

  • With the default --film-grain-denoise 0, the encoder still codes the original (noisy) frames and adds synthetic grain on top. Too high a level then stacks synthetic grain over real grain, so match the level to the source.
  • --film-grain-denoise 1 codes the denoised frames. This compresses better, but denoising can also remove fine detail (small particles, skin texture).
  • Clean digital and CGI content gains nothing from grain synthesis. It costs detail and decoder work, so leave it off.
  • Synthetic grain is random, so full-reference metrics (PSNR, SSIM, VMAF, SSIMULACRA2) score grain-synthesised encodes badly even when they look closer to the source. Compare encoders with grain synthesis off, or judge by eye.

CRF is the right mode for files. When you need a bitrate, use two-pass VBR (--rc 1, --tbr in kbps):

Terminal window
SvtAv1EncApp -i input.y4m --preset 6 --rc 1 --tbr 3000 --passes 2 -b output.ivf

Two-pass needs a seekable file: with stdin the encoder warns and falls back to one pass. CBR (--rc 2) is one-pass, requires the low-delay prediction structure (--pred-struct 1) and is meant for real-time use.

  • No scene-cut keyframes. SVT-AV1 never places keyframes at scene changes (--scd is ignored), so --keyint is a fixed interval. If you want keyframes on scene cuts, split the video by scenes with Av1an and set --keyint -1 (or 0) so the encoder adds none of its own within a chunk.
  • FFmpeg’s -crf is an integer from 0 to 63. -crf 27.5 is silently rounded to 28. Pass -svtav1-params crf=27.5 for quarter steps or values above 63. -crf 0 and -preset -2 are FFmpeg’s “unset” sentinels, not lossless or a real preset.
  • keyint in seconds (10s) works in SvtAv1EncApp and -svtav1-params. FFmpeg’s -g only takes frames.
  • Fast presets outside real-time mode. Presets 12 and 13 are mapped to 11 unless --rtc 1 is set, and the encoder warns that presets 10 and above are meant for automated tooling and may show visual artefacts.
  • Threads. SVT-AV1 picks its parallelism automatically, and in CRF mode the output does not depend on --lp. Lower --lp only when running several encodes in parallel, for example under Av1an.
  • Fork options don’t transfer. --psy-rd, --spy-rd, --complex-hvs, --noise-norm-strength and similar options exist only in forks. Fork tune numbers also differ: SVT-AV1-PSY’s tune 3 was “Subjective SSIM”, not IQ.
  • HDR metadata. FFmpeg’s wrapper passes colour primaries, transfer, matrix, range, chroma location, mastering display and content light metadata from the source. With SvtAv1EncApp you must set --color-primaries, --transfer-characteristics, --matrix-coefficients, --mastering-display and --content-light yourself (--color-help lists the syntax). See High dynamic range.
  • Decoding cost. If the target device struggles, try --fast-decode 1 (or 2) before resorting to tiles; it was tuned with --tune 1, so check the result when combining it with tune 0. Grain synthesis and 10-bit also add some decoder load on weak software decoders.

Community forks change defaults and add psychovisual options on top of mainline. Most of the original fork’s features are now in mainline, and the forks vary in how current they are:

  • SVT-AV1-PSY: the original psychovisual fork, discontinued in 2025 and archived.
  • SVT-AV1-PSYEX: a continuation of PSY based on SVT-AV1 3.0.2, now on hold.
  • SVT-AV1-HDR: the actively developed successor named by the PSY project, with SDR and HDR perceptual tuning.
  • SVT-AV1-5fish and SVT-AV1-Essential: other community forks with their own defaults.

Fork pages describe their differences from mainline. Defaults and tune numbers differ between forks, so a command line copied from one fork may not work on another.

FFmpeg’s libsvtav1 wrapper has five private options. Everything else goes through -svtav1-params, whose keys are the native option names without --; application-only options such as --progress, --stats and the input/output options are not accepted. -svtav1-params is applied last, so its keys override the direct and generic options. These generic FFmpeg options also reach the encoder:

  • -g N sets the keyframe interval in frames (-g 1 makes every frame a keyframe). The default -1 keeps SVT-AV1’s own keyint.
  • -b:v selects VBR, or CBR when -maxrate equals -b:v; -qmin/-qmax (wrapper defaults 1 and 63) then limit the QP, and -bufsize sets the buffer. -maxrate with CRF gives capped CRF.
  • The wrapper sets +cgop by default, so keyframes are closed-GOP; -flags -cgop switches to open GOP.
  • Colour primaries, transfer, matrix, range, chroma location, profile and level come from the stream or the matching FFmpeg options, and mastering-display and content-light side data are passed through.
Private AVOptions (5 options)
OptionDefaultType and rangeDescription
-preset-2 (unset)int, −2–13Encoder preset. −2 leaves the library default (8); −1 and up are passed through.
-crf0 (unset)int, 0–63CRF as an integer; 0 means unset, not lossless. For quarter steps or values above 63 use -svtav1-params crf=27.25.
-qp0 (unset)int, 0–63Constant QP with adaptive quantization off (aq-mode 0); used only when -crf is not set.
-svtav1-paramsnonekey=value:key=valueNative options without --, e.g. tune=0:enable-variance-boost=1:keyint=10s. Unknown keys or bad values only warn unless -err_detect explode is set.
-dolbyvisionautobooleanWrite the stream’s Dolby Vision RPU side data into the encode: auto when present, 0 off, 1 on.

Every option SvtAv1EncApp v4.2.0 accepts, grouped by purpose; aliases share a row. “auto” defaults are resolved from the preset, tune and input. --tier and --intra-period work but are missing from --help.

Input, output and application (20 options)
OptionDefaultDescription
--help—Print the option list and exit.
--version—Print the library version and exit.
--input, -irequiredInput file, Y4M or raw YUV; - or stdin reads from a pipe. Raw YUV also needs --width, --height, the frame rate and --input-depth.
--allow-mmap-file1Memory-map regular input files instead of reading them (0 or 1); the speed difference depends on the platform.
--output, -bnoneOutput file; - or stdout writes to a pipe. An .obu extension selects raw OBU output, anything else IVF.
--ivfonWrite an IVF file (the default unless the output name ends in .obu).
--obuoffWrite a raw OBU stream without the IVF wrapper; an .obu output extension does the same.
--config, -cnoneRead options from a configuration file of Name : value lines (the config-file names, e.g. EncoderMode).
--errlogstderrWrite warnings and errors to this file.
--recon, -ononeWrite the reconstructed (decoded) frames as raw YUV, for debugging or metrics.
--stat-filenoneWrite per-frame PSNR and SSIM to this file; needs --enable-stat-report 1.
--progress1Progress output: 0 none, 1 normal, 2 detailed.
--no-progress0--no-progress 1 is the same as --progress 0.
--svtav1-paramsnoneColon-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.
--frames, -n0 (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.
--skip0Skip this many frames at the start of the input.
--nb-1 (off)Preload this many frames into memory and encode only those, for benchmarking without I/O.
--inj0Feed frames to the encoder at a fixed rate (--inj-frm-rt) to simulate live input.
--inj-frm-rt60Injection rate in frames per second (0–240) for --inj 1.
--enable-stat-report0Compute PSNR and SSIM against the source and print a summary at the end; per-frame values go to --stat-file. Slows encoding.
Source format, profile and level (11 options)
OptionDefaultDescription
--width, -w0 (from Y4M)Frame width in pixels, 4–16384. Required for raw YUV; Y4M headers supply it.
--height, -h0 (from Y4M)Frame height in pixels, 4–8704. Required for raw YUV.
--forced-max-frame-width0 (input width)Maximum frame width written to the sequence header (4–16384), for streams whose frame size changes later.
--forced-max-frame-height0 (input height)Maximum frame height written to the sequence header (4–8704).
--color-format1 (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.
--profile0 (main)AV1 profile: 0 main, 1 high, 2 professional. Main covers 8- and 10-bit 4:2:0, which is all mainline can encode.
--level0 (auto)AV1 level to signal, 2.0–7.3 (e.g. 5.1); 0 derives it from the input.
--fps-num60000Frame-rate numerator for raw input; Y4M headers override it.
--fps-denom1000Frame-rate denominator; the default pair means 60 fps.
--input-depth8Bit depth of raw input and of the encode, 8 or 10; Y4M headers supply it. Feeding 10-bit (-pix_fmt yuv420p10le) usually improves efficiency even for 8-bit sources.
--tier0 (main)AV1 tier: 0 main, 1 high (higher bitrate limits for levels 4.0 and up). Accepted but not listed in --help.
Preset, tune and threading (6 options)
OptionDefaultDescription
--preset8Speed/efficiency trade-off, −1–13; lower is slower and more efficient. 2–6 is the usual range for quality encodes and −1 is for debugging; the encoder warns that 10 and up (outside RTC) are meant for automated tooling. Above 11 runs as 11 except in RTC mode (all-intra stops at 9), and 8K inputs need preset 5 or faster.
--asmmaxHighest 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.
--lp0 (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.
--fast-decode0Decoder-speed optimizations, 0–2 (2 decodes fastest) at a small efficiency cost. Developed with --tune 1; the encoder warns when it is combined with --tune 0. Try it before tiles.
--tune1 (PSNR)0 VQ (psychovisual; the usual choice for watching), 1 PSNR, 2 SSIM, 3 IQ (still images; all-intra, or low delay experimentally), 4 MS-SSIM (MS-SSIM/SSIMULACRA2-oriented), 5 VMAF (video only).
--hbd-mds-1 (preset)Precision of mode decision for 10-bit input: −1 preset default, 0 8-bit, 1 10-bit (slower), 2 hybrid 8/10-bit.
Rate control and passes (23 options)
OptionDefaultDescription
--rc0Rate-control mode: 0 CRF (or CQP with --aq-mode 0), 1 VBR, 2 CBR, both with --tbr. VBR needs random access and CBR needs low delay (--pred-struct 1).
--qp, -q35Base QP, 1–63: the fixed QP in CQP and the starting point otherwise. For constant quality use --crf.
--crf35Constant rate factor, 1–70 in 0.25 steps; lower is higher quality and larger. Same as --rc 0 --aq-mode 2 --qp N on a finer scale.
--cqpoffConstant QP, 1–70 in 0.25 steps; same as --rc 0 --aq-mode 0 --qp N. No adaptive quantization, so it is mainly for testing.
--tbr2000 kbpsTarget bitrate for VBR and CBR in kbps (1–100000); b, k and m suffixes are accepted, e.g. --tbr 3.5m.
--mbr0 (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-qp63Highest QP rate control may use, 0–63; mainly for VBR and CBR.
--min-qpauto (0 for CRF, 4 for VBR/CBR)Lowest QP rate control may use, 0–63; mainly for VBR and CBR.
--undershoot-pctauto (50 for VBR, 25 for CBR)How far below the target VBR/CBR may undershoot, in percent (0–100).
--overshoot-pctauto (25)How far above the target VBR/CBR may overshoot, in percent (0–100).
--mbr-overshoot-pct50Allowed overshoot of --mbr in capped CRF, in percent (0–100).
--max-intra-bitrate-pct300Cap intra frames at this percentage of the per-frame target bitrate; 0 removes the cap. VBR/CBR only.
--max-inter-bitrate-pct0 (off)Cap inter frames at this percentage of the per-frame target bitrate; 0 means no cap. VBR/CBR only.
--gop-constraint-rc0Make VBR hit the target within each GOP instead of over the whole clip; useful for chunked or segmented encoding.
--buf-sz1000CBR decoder buffer size in milliseconds (20–10000).
--buf-initial-sz600CBR initial buffer level in milliseconds (20–10000); must be below --buf-sz.
--buf-optimal-sz600CBR target buffer level in milliseconds (20–10000).
--recode-loop4 (preset-based)Re-encode frames that miss the rate target (VBR, capped CRF and RTC CBR only): 0 off, 1 key frames and oversized frames, 2 key/alt-ref/golden frames, 3 all frames, 4 auto (level 2 for capped CRF and presets ≤3, otherwise 1).
--minsection-pct0VBR: lowest bitrate a GOP may get, as a percentage of the target (0–100).
--maxsection-pct2000VBR: highest bitrate a GOP may get, as a percentage of the target (0–10000).
--pass0Run 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.
--statssvtav1_2pass.logStatistics file written by the first pass and read by the second.
--passes1--passes 2 runs both passes of a VBR two-pass encode in one command.
Quantization offsets and matrices (20 options)
OptionDefaultDescription
--use-q-file0Take per-frame QPs from --qpfile instead of the encoder’s own assignment.
--qpfilenoneFile with one QP per line, one line per frame, for --use-q-file 1.
--aq-mode2Adaptive quantization: 0 off (constant QP), 1 variance-based segments, 2 delta-q from TPL prediction efficiency.
--use-fixed-qindex-offsets0Override 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-offset0Q-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-offset0Chroma q-index offset for key frames, −64–63.
--qindex-offsets0 per layerComma-separated luma q-index offsets, one per temporal layer (each −64–63), for --use-fixed-qindex-offsets.
--chroma-qindex-offsets0 per layerComma-separated chroma q-index offsets, one per temporal layer (each −64–63).
--luma-y-dc-qindex-offset0Luma DC quantizer offset in q-index steps (−64–63); positive values quantize DC more coarsely.
--chroma-u-dc-qindex-offset0Cb DC quantizer offset in q-index steps (−64–63).
--chroma-u-ac-qindex-offset0Cb AC quantizer offset in q-index steps (−64–63).
--chroma-v-dc-qindex-offset0Cr DC quantizer offset in q-index steps (−64–63).
--chroma-v-ac-qindex-offset0Cr AC quantizer offset in q-index steps (−64–63).
--lambda-scale-factors128 for every frame typeComma-separated RD lambda multipliers per frame-update type, in units of 1/128 (128 = 1.0). A research control.
--enable-qm0Use quantization matrices, which quantize high frequencies more coarsely than low ones.
--qm-min8Lowest (steepest) luma QM level the encoder may pick, 0–15; 15 is flat.
--qm-max15Highest (flattest) luma QM level, 0–15.
--chroma-qm-min8Lowest chroma QM level, 0–15.
--chroma-qm-max15Highest chroma QM level, 0–15.
--roi-map-filenoneRegion-of-interest file giving per-block QP offsets for chosen frames.
GOP structure and keyframes (12 options)
OptionDefaultDescription
--keyint-2 (about 5 s)Maximum keyframe interval in frames, or seconds with an s suffix (--keyint 10s). −2 is about 5 seconds; −1 or 0 means no periodic keyframes (CRF only).
--irefresh-type2 (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.
--scd0Scene-change detection. v4.2.0 switches it back off with a warning: scene changes are handled inside mode decision and no keyframe is inserted.
--lookahead-1 (auto)Frames of extra look-ahead for rate control and TPL, 0–120, beyond the mini-GOP and temporal-filter window.
--hierarchical-levelsauto (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-struct2 (random access)Prediction structure: 1 low delay, 2 random access (normal for files). 0 all-intra is also accepted.
--rtc0Real-time mode: fast low-delay settings; forces --pred-struct 1.
--force-key-framesnoneComma-separated keyframe positions: a number followed by f for frames or s for seconds (e.g. 0f,120f,30.5s).
--startup-mg-size0 (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.
--startup-qp-offset0QP offset (−63–63) for that startup mini-GOP.
--enable-dg1Dynamic mini-GOP: adapt the hierarchical structure to the content.
--intra-period-2Deprecated form of --keyint, counted as keyint − 1. Not listed in --help.
Filters and coding tools (15 options)
OptionDefaultDescription
--tf-strength3Alt-ref temporal filter strength, 0–4; higher filters more. Lower values keep more fine detail and grain.
--tile-rowsautoTile 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-columnsautoTile columns as log2 (0–4); at most 128 tiles in total.
--enable-dlf1Deblocking filter: 0 off, 1 on, 2 more accurate and slower.
--enable-cdefauto (on)CDEF deringing filter, 0 or 1.
--enable-restorationauto (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-tf1Temporal filtering of alt-ref frames: 0 off, 1 on, 2 adaptive strength per 64×64 block (overrides --tf-strength).
--enable-kf-tf1Apply temporal filtering to key frames as well.
--enable-overlays0Insert overlay frames after filtered alt-refs as extra references. Not supported with low delay or multi-pass.
--scm2 (detect)Screen-content tools (palette, intra block copy): 0 off, 1 on, 2 detect per frame, 3 detect with anti-aliasing awareness.
--enable-intrabc1Allow intra block copy when screen-content tools are active (preset-dependent).
--lossless0Lossless coding.
--avif0Still-picture mode for AVIF and single images: better efficiency and less memory.
--max-tx-size64Largest transform size, 32 or 64. 32 can help detail at high-fidelity CRFs.
Super-resolution, resizing and switch frames (16 options)
OptionDefaultDescription
--superres-mode0 (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-denom8Mode 1 scale: width × 8/denom, 8–16 (8 none, 16 half width).
--superres-kf-denom8Mode 1 scale for key frames, 8–16.
--superres-qthres43Mode 3: frames with QP above this (0–63) use super-resolution.
--superres-kf-qthres43Mode 3 threshold for key frames, 0–63.
--sframe-dist0 (off)Insert a switch frame every N frames; S-frames let a decoder switch between streams.
--sframe-mode2S-frame placement: 1 only if that frame is an alt-ref, 2 the next alt-ref, 3 exactly at --sframe-posi (mini-GOP adjusted), 4 the same in decode order.
--sframe-posinoneComma-separated frame numbers (0-based) for S-frames in modes 3 and 4.
--sframe-qpnoneQP for each S-frame (1–63), comma-separated; a single value applies to all.
--sframe-qp-offsetnoneQP offset for each S-frame (−63–63), comma-separated; a single value applies to all.
--resize-mode0 (off)Reference scaling (resize frames inside the codec loop): 0 off, 1 fixed, 2 random, 3 dynamic, 4 per-event list.
--resize-denom8Mode 1 scale 8/denom, 8–16.
--resize-kf-denom8Mode 1 scale for key frames, 8–16.
--frame-resz-eventsnoneMode 4: comma-separated frame numbers (0-based) where a new scale starts.
--frame-resz-kf-denomsnoneMode 4: key-frame denominators (8–16), one per event.
--frame-resz-denomsnoneMode 4: denominators (8–16), one per event.
Film grain (4 options)
OptionDefaultDescription
--film-grain0 (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-denoise01 also codes a denoised picture at the --film-grain strength; 0 codes the source picture and only adds the grain parameters.
--fgs-tablenoneUse a pre-made grain table file (aomenc --film-grain-table format) instead of estimating grain.
--adaptive-film-grain1Choose the grain-estimation block size from the resolution, which reduces visible repeating grain patterns.
Colour and HDR metadata (8 options)
OptionDefaultDescription
--color-help—Print the colour-metadata reference (primaries, transfer and matrix names, mastering-display syntax) and exit.
--color-primaries2 (unspecified)Colour primaries, 0–12 or 22, by number or name (bt709, bt2020…); see --color-help. Signalling only: pixels are not converted.
--transfer-characteristics2 (unspecified)Transfer function, 0–22 (bt709, smpte2084 for PQ, hlg…).
--matrix-coefficients2 (unspecified)YUV matrix, 0–14 (bt709, bt2020-ncl…). 0 (identity) needs 4:4:4.
--color-range0 (limited)0 limited (studio) range, 1 full range.
--chroma-sample-positionunknownChroma siting: unknown, vertical/left or colocated/topleft.
--mastering-displaynoneSMPTE 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-lightnoneContent light level as MaxCLL,MaxFALL in cd/m², e.g. 1000,400.
Psychovisual tuning (8 options)
OptionDefaultDescription
--luminance-qp-bias0Spend more bits on dark frames: lowers frame QP based on average luma, strength 0–100.
--sharpness0Bias deblocking and RD decisions toward sharpness (positive) or smoothness (negative), −7–7.
--enable-variance-boost0Variance Boost: lower QP in low-contrast superblocks to prevent banding and blocking in flat and dark areas, at some bitrate cost.
--variance-boost-strength2Variance 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-octile5How 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.
--variance-boost-curve0Variance Boost curve: 0 default, 1 low-to-medium contrast boost, 2 still-picture curve.
--qp-scale-compress-strength0Compress QP differences between temporal layers, 0–3, for steadier quality within a mini-GOP; helps grain and fast motion.
--ac-bias0.0Psychovisual RD bias toward keeping high-frequency energy, 0.0–8.0; helps texture and grain retention.