SVT-AV1
37c3317fd058; modified for Encode Wiki · CC BY-SA 4.0Welcome to the Gitlab repo for the SVT-AV1!
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.
Get it
Section titled “Get it”- FFmpeg exposes it as
libsvtav1when 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. SvtAv1EncAppis the standalone encoder. Distributions package it (often assvt-av1), or build it from the GitLab repository with CMake, NASM and GCC or Clang:
git clone --depth 1 --branch v4.2.0 https://gitlab.com/AOMediaCodec/SVT-AV1.gitcd SVT-AV1/Build/linux./build.sh release staticThe 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).
Starting commands
Section titled “Starting commands”With FFmpeg, for a typical 1080p film or episode:
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:
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.ivfmkvmerge -o output.mkv video.ivf -D input.mkvFFmpeg 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.
Options that matter
Section titled “Options that matter”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).
| Option | Default | What to use |
|---|---|---|
--preset | 8 | Speed/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. |
--crf | 35 | Quality 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. |
--tune | 1 (PSNR) | Use 0 (VQ) for video meant to be watched. See tunes. |
--input-depth | 8 | Output 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-grain | 0 (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-denoise | 0 | 0 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-boost | 0 | Set to 1 for most content. Raises quality in low-contrast areas (skin, sky, dark scenes) that AQ otherwise starves. |
--variance-boost-strength | 2 | 1 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-octile | 5 | Which 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-qm | 0 | Quantisation 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-strength | 3 | Temporal 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. |
--sharpness | 0 | -7 to 7. Positive values bias deblocking and RD towards sharper output. |
--ac-bias | 0.0 | Psychovisual 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-strength | 0 | 0–3. 1 evens out quality between frames of a mini-GOP at almost no cost; 2–3 at very high quality. |
| Tune | Optimises for | Notes |
|---|---|---|
| 0 | VQ (visual quality) | The tune for viewing. Sharper, psychovisually tuned; forced to 1 in low-delay mode. |
| 1 | PSNR | Default. Scores well on PSNR and looks softer. |
| 2 | SSIM | CRF only. |
| 3 | IQ (image quality) | Still images (all-intra) only; rejected for normal random-access video. |
| 4 | MS-SSIM / SSIMULACRA2 | CRF only. Overrides sharpness, variance boost and QM settings. |
| 5 | VMAF | CRF 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.
Film grain synthesis
Section titled “Film grain synthesis”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 1codes 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.
Bitrate-targeted encoding
Section titled “Bitrate-targeted encoding”CRF is the right mode for files. When you need a bitrate, use two-pass VBR (--rc 1, --tbr in kbps):
SvtAv1EncApp -i input.y4m --preset 6 --rc 1 --tbr 3000 --passes 2 -b output.ivfTwo-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.
Pitfalls
Section titled “Pitfalls”- No scene-cut keyframes. SVT-AV1 never places keyframes at scene changes (
--scdis ignored), so--keyintis a fixed interval. If you want keyframes on scene cuts, split the video by scenes with Av1an and set--keyint -1(or0) so the encoder adds none of its own within a chunk. - FFmpeg’s
-crfis an integer from 0 to 63.-crf 27.5is silently rounded to 28. Pass-svtav1-params crf=27.5for quarter steps or values above 63.-crf 0and-preset -2are FFmpeg’s “unset” sentinels, not lossless or a real preset. keyintin seconds (10s) works inSvtAv1EncAppand-svtav1-params. FFmpeg’s-gonly takes frames.- Fast presets outside real-time mode. Presets 12 and 13 are mapped to 11 unless
--rtc 1is 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--lponly when running several encodes in parallel, for example under Av1an. - Fork options don’t transfer.
--psy-rd,--spy-rd,--complex-hvs,--noise-norm-strengthand 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
SvtAv1EncAppyou must set--color-primaries,--transfer-characteristics,--matrix-coefficients,--mastering-displayand--content-lightyourself (--color-helplists 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 libsvtav1 private options (n9.0.2)
Section titled “FFmpeg libsvtav1 private options (n9.0.2)”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 Nsets the keyframe interval in frames (-g 1makes every frame a keyframe). The default-1keeps SVT-AV1’s ownkeyint.-b:vselects VBR, or CBR when-maxrateequals-b:v;-qmin/-qmax(wrapper defaults 1 and 63) then limit the QP, and-bufsizesets the buffer.-maxratewith CRF gives capped CRF.- The wrapper sets
+cgopby default, so keyframes are closed-GOP;-flags -cgopswitches 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)
| Option | Default | Type and range | Description |
|---|---|---|---|
-preset | -2 (unset) | int, −2–13 | Encoder preset. −2 leaves the library default (8); −1 and up are passed through. |
-crf | 0 (unset) | int, 0–63 | CRF as an integer; 0 means unset, not lossless. For quarter steps or values above 63 use -svtav1-params crf=27.25. |
-qp | 0 (unset) | int, 0–63 | Constant QP with adaptive quantization off (aq-mode 0); used only when -crf is not set. |
-svtav1-params | none | key=value:key=value | Native 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. |
-dolbyvision | auto | boolean | Write the stream’s Dolby Vision RPU side data into the encode: auto when present, 0 off, 1 on. |
Complete native parameter reference
Section titled “Complete native parameter reference”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)
| 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. |
--allow-mmap-file | 1 | Memory-map regular input files instead of reading them (0 or 1); the speed difference depends on the platform. |
--output, -b | none | Output file; - or stdout writes to a pipe. An .obu extension selects raw OBU output, anything else IVF. |
--ivf | on | Write an IVF file (the default unless the output name ends in .obu). |
--obu | off | Write a raw OBU stream without the IVF wrapper; an .obu output extension does the same. |
--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. |
--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. |
--skip | 0 | Skip 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. |
--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. |
Source format, profile and level (11 options)
| 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-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 | 8 | Bit 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. |
--tier | 0 (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)
| Option | Default | Description |
|---|---|---|
--preset | 8 | Speed/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. |
--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. |
--fast-decode | 0 | Decoder-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. |
--tune | 1 (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)
| Option | Default | Description |
|---|---|---|
--rc | 0 | Rate-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, -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. Same as --rc 0 --aq-mode 2 --qp N on a finer scale. |
--cqp | off | Constant 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. |
--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 | auto (0 for CRF, 4 for VBR/CBR) | Lowest QP rate control may use, 0–63; mainly for VBR and CBR. |
--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). |
--max-intra-bitrate-pct | 300 | Cap intra frames at this percentage of the per-frame target bitrate; 0 removes the cap. VBR/CBR only. |
--max-inter-bitrate-pct | 0 (off) | Cap inter frames at this percentage of the per-frame target bitrate; 0 means no cap. VBR/CBR only. |
--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 (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-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. |
Quantization offsets and matrices (20 options)
| 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 | 0 | Use quantization matrices, which quantize high frequencies more coarsely than low ones. |
--qm-min | 8 | Lowest (steepest) luma QM level the encoder may pick, 0–15; 15 is flat. |
--qm-max | 15 | Highest (flattest) luma QM level, 0–15. |
--chroma-qm-min | 8 | Lowest chroma QM level, 0–15. |
--chroma-qm-max | 15 | Highest chroma QM level, 0–15. |
--roi-map-file | none | Region-of-interest file giving per-block QP offsets for chosen frames. |
GOP structure and keyframes (12 options)
| Option | Default | Description |
|---|---|---|
--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-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 | 0 | Scene-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-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. |
--rtc | 0 | Real-time mode: fast low-delay settings; forces --pred-struct 1. |
--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. |
--startup-qp-offset | 0 | QP offset (−63–63) for that startup mini-GOP. |
--enable-dg | 1 | Dynamic mini-GOP: adapt the hierarchical structure to the content. |
--intra-period | -2 | Deprecated form of --keyint, counted as keyint − 1. Not listed in --help. |
Filters and coding tools (15 options)
| Option | Default | Description |
|---|---|---|
--tf-strength | 3 | Alt-ref temporal filter strength, 0–4; higher filters more. Lower values keep more fine detail and grain. |
--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-kf-tf | 1 | Apply temporal filtering to key frames as well. |
--enable-overlays | 0 | Insert overlay frames after filtered alt-refs as extra references. Not supported with low delay or multi-pass. |
--scm | 2 (detect) | Screen-content tools (palette, intra block copy): 0 off, 1 on, 2 detect per frame, 3 detect with anti-aliasing awareness. |
--enable-intrabc | 1 | Allow intra block copy when screen-content tools are active (preset-dependent). |
--lossless | 0 | Lossless coding. |
--avif | 0 | Still-picture mode for AVIF and single images: better efficiency and less memory. |
--max-tx-size | 64 | Largest transform size, 32 or 64. 32 can help detail at high-fidelity CRFs. |
Super-resolution, resizing and switch frames (16 options)
| 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, 3 exactly at --sframe-posi (mini-GOP adjusted), 4 the same in decode order. |
--sframe-posi | none | Comma-separated frame numbers (0-based) for S-frames in modes 3 and 4. |
--sframe-qp | none | QP for each S-frame (1–63), comma-separated; a single value applies to all. |
--sframe-qp-offset | none | QP offset for each S-frame (−63–63), comma-separated; a single value applies to all. |
--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. |
Film grain (4 options)
| 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. |
--adaptive-film-grain | 1 | Choose the grain-estimation block size from the resolution, which reduces visible repeating grain patterns. |
Colour and HDR metadata (8 options)
| Option | Default | Description |
|---|---|---|
--color-help | — | Print the colour-metadata reference (primaries, transfer and matrix names, mastering-display syntax) and exit. |
--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. |
Psychovisual tuning (8 options)
| Option | Default | Description |
|---|---|---|
--luminance-qp-bias | 0 | Spend more bits on dark frames: lowers frame QP based on average luma, strength 0–100. |
--sharpness | 0 | Bias deblocking and RD decisions toward sharpness (positive) or smoothness (negative), −7–7. |
--enable-variance-boost | 0 | Variance Boost: lower QP in low-contrast superblocks to prevent banding and blocking in flat and dark areas, at some bitrate cost. |
--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. |
--variance-boost-curve | 0 | Variance Boost curve: 0 default, 1 low-to-medium contrast boost, 2 still-picture curve. |
--qp-scale-compress-strength | 0 | Compress QP differences between temporal layers, 0–3, for steadier quality within a mini-GOP; helps grain and fast motion. |
--ac-bias | 0.0 | Psychovisual RD bias toward keeping high-frequency energy, 0.0–8.0; helps texture and grain retention. |