Skip to content

aom-av1-lavish

currentMigrated from docs/encoders/aom-av1-lavish.mdx at 37c3317fd058; modified for Encode Wiki · CC BY-SA 4.0
No commits since Nov 2022

A fork of aom-av1-psy, which is a fork of aomenc. Designed to open up the encoder for hyper-tuning and fidelity.

Last commit
License
BSD-2-Clause
Stars
59

aom-av1-lavish is a fork of aomenc by Clybius. It builds on BlueSwordM’s aom-av1-psy and was “designed to open up the encoder for hyper-tuning and fidelity”. It was popular for high-fidelity Av1an encodes in 2022–2023.

BranchContents
Endless_Possibility (default)The main psy and configuration changes.
Endless_InstabilityUnstable and public-testing changes.
Endless_MergingEndless_Instability merged with libaom updates up to 3.6.0. This is the branch community guides and builds used.
Endless_ButterTemporary experimental Butteraugli fixes.
opmox/mainline-mergeEndless_Merging plus seven experimental commits from November 2023, including the fork’s own --deltaq-mode=6, which is unrelated to mainline’s Variance Boost.

Endless_Merging no longer builds with current toolchains as is. Its CMake check rejects NASM 3.x (libaom fixed this upstream in 2025), and GCC 14 and later stop on a missing include (the fix is in the repository’s unmerged pull request 1). Patch both and build:

Terminal window
git clone -b Endless_Merging https://github.com/Clybius/aom-av1-lavish
cd aom-av1-lavish
sed -i 's/if(NOT "${nasm_helptext}" MATCHES "-Ox")/if(FALSE)/' build/cmake/aom_optimization.cmake
sed -i '/#include "av1\/encoder\/encodeframe_utils.h"/a #include "av1/encoder/aq_variance.h"' av1/encoder/encodeframe_utils.c
cmake -S . -B aom_build -DCMAKE_BUILD_TYPE=Release -DENABLE_TESTS=0 -DENABLE_DOCS=0
cmake --build aom_build -j"$(nproc)"

aom_build/aomenc --help should report AOMedia Project AV1 Encoder Psy v3.6.0. The lavish and butteraugli tunes also need -DCONFIG_TUNE_BUTTERAUGLI=1 and libjxl. The VMAF-based tunes need -DCONFIG_TUNE_VMAF=1 and libvmaf. Keep the binary out of your system paths if you also use mainline libaom, and put it first in PATH when running Av1an.

This is the Av1an parameter set from community guides, without options that restate defaults or that Av1an adds itself:

Terminal window
--end-usage=q --cq-level=24 --cpu-used=4 --threads=2 --lag-in-frames=64 --tune-content=psy --tune=ssim --enable-qm=1 --deltaq-mode=0 --quant-b-adapt=1 --arnr-strength=1

Most options mean the same as in mainline aomenc. The differences:

  • Lavish allows --lag-in-frames up to 128; mainline caps it at 48.
  • --tune-content=psy enables the fork’s perceptual adjustments to adaptive quantisation and mode decisions. Community guides advise against it for live action above about --cq-level=30.
  • --arnr-strength=1 suits animation and clean CGI. Use the default (5) or higher for noisy live action.
  • The default --cpu-used is 3 instead of mainline’s 0.

The same guides add film-grain synthesis with --denoise-noise-level=8 --enable-dnl-denoising=0 (see film grain synthesis).

OptionDefaultWhat it does
--tunepsnrAdds lavish (Butteraugli-driven RD with SSIM-style scaling; needs a Butteraugli build), lavish_fast (the same curve adjustment without Butteraugli), lavish_vmaf_rd, omni, ipq, ipq_vmaf_psy, vmaf_psy_qp and experimental. psnr, ssim, lavish_fast, omni and ipq work in any build.
--tune-contentdefaultAdds psy, animation and default_no_screen.
--quant-sharpness0−7 to 7. Non-zero values narrow the quantiser’s dead zone so that more small coefficients (fine detail) survive, at some bitrate cost.
--loopfilter-sharpness00–7. Sets loop-filter sharpness. Higher values reduce deblocking blur but allow more artefacts.
--luma-bias1−5 to 5. Scales each block’s RD multiplier by brightness, so positive values give brighter blocks relatively more bits and negative values favour dark blocks. Upstream recommends leaving it at the default.
--chroma-q-offset-u, --chroma-q-offset-v0−63 to 63. Adjusts the automatic chroma quantiser offsets.
--dq-modulate1Selects the perceptual modulation used by --deltaq-mode=2 (1 = wavelet). It is marked work in progress.
--delta-qindex-mult, --delta-qindex-pos, --delta-qindex-neg100, −1, −1Scale how strongly delta-q (the TPL model) changes the quantiser, overall or separately for positive and negative changes.
--ssim-rd-mult, --tpl-rd-mult, --vmaf-rd-mult, --butteraugli-rd-mult100RD multipliers for hyper-tuning the corresponding tunes.
--butteraugli-resize-factor10 = full resolution, 1 = half, 2 = quarter. Community guides use 2 to speed up the Butteraugli tunes with little loss.
--butteraugli-intensity-target100Display brightness in nits that Butteraugli assumes. Match it to your viewing brightness (guides used 250).
--enable-experimental-psy0Experimental changes (VP9-style film modifications). Upstream warns that it may hurt quality.

VMAF tunes also need --vmaf-model-path pointing to a VMAF model file.

Every option aomenc accepts on the default Endless_Possibility branch (commit 52f6a00b, based on libaom 3.4.0), including those that need optional build features. Defaults are for good-quality mode in a normal (not realtime-only) build. Rows note where the fork changes a default or where its --help text is wrong. Endless_Merging (commit 83500ccf) adds --butteraugli-loop-count, --butteraugli-quant-mult, --butteraugli-quant-pos, --butteraugli-quant-neg, --global-motion-method, --sb-qp-sweep, --enable-rate-guide-deltaq and --rate-distribution-info.

Application and output (19 options)
OptionDefaultDescription
--help—Print the full option list and exit.
--cfg, -cunsetRead low-level tool settings from a key–value file in the format of libaom’s Sample.cfg. Only the first --cfg is used.
--debug, -DoffLeave the application version out of the WebM tags so that repeated encodes are byte-identical.
--output, -orequiredOutput file. A .ivf or .obu extension selects that format unless --webm is given; any other name gets WebM.
--codecav1Encoder to use. libaom builds contain only av1.
--limit0 (all frames)Stop after this many input frames.
--skip0Skip this many input frames before encoding.
--quiet, -qoffDo not print progress.
--verbose, -voffPrint the encoder configuration before encoding.
--psnr0 (off)Report PSNR: 1 at the input bit depth, 2 at the stream bit depth. --psnr without a value means 1.
--test-decodeoffDecode every frame while encoding and compare it with the encoder’s reconstruction: warn reports a mismatch, fatal stops the encode.
--webmonWebM output. Requires a build with WebM I/O (CONFIG_WEBM_IO, on by default); without it the default output is raw OBU.
--ivfoffIVF output, the minimal frame container used by libaom’s own tools and test vectors.
--obuoffRaw low-overhead OBU stream (AV1 Section 5) with no container.
--annexb0 (off)Write the length-delimited Annex B bitstream format instead of Section 5 OBUs. Range 0–1.
--q-hist0 (off)After encoding, print a histogram of frame quantisers with this many buckets.
--rate-hist0 (off)After encoding, print a histogram of frame bitrates with this many buckets.
--disable-warningsoffSuppress the warnings about questionable settings.
--disable-warning-prompt, -yoffPrint those warnings but do not stop to ask whether to continue.
Usage modes and passes (12 options)
OptionDefaultDescription
--goodselectedGood-quality mode (--usage=0), the normal mode for offline video.
--rtoffRealtime mode (--usage=1): one pass, no lookahead, speeds 5–12, for low-latency streaming and conferencing.
--allintraoffAll-intra mode (--usage=2): every frame is a keyframe, no lookahead, speeds 0–9. Meant for still images and image sequences; it also turns CDEF off and changes the QM range and screen-content detection defaults.
--usage, -u0 (good)Usage mode by number: 0 good quality, 1 realtime, 2 all-intra. Same as --good, --rt and --allintra.
--passes, -p2 (1 in realtime and all-intra)Number of passes, 1–3. Two-pass good-quality encodes use the first-pass statistics even in q mode; realtime and all-intra always run one pass. Three passes add a half-resolution second pass whose decisions guide the final pass.
--passall passesRun only pass 1, 2 or 3 of a multi-pass encode, so that the passes can run as separate processes (each needs the same --fpf).
--fpfin memoryFirst-pass statistics file. Needed when passes run as separate processes; otherwise the statistics stay in memory.
--two-pass-output<output>_pass2_<n>.ivfThree-pass encoding: IVF file that receives the second (downscaled) pass.
--second-pass-log, -spfunsetThree-pass encoding: file in which the second pass stores its GOP and TPL decisions for the third pass.
--two-pass-inputunsetThree-pass encoding: an already-downscaled source to read in the second pass instead of scaling the input to half size.
--two-pass-width0 (half the input)Three-pass encoding: frame width of the second pass (and of raw --two-pass-input).
--two-pass-height0 (half the input)Three-pass encoding: frame height of the second pass (and of raw --two-pass-input).
Input format (19 options)
OptionDefaultDescription
--i420on for raw inputRaw input is 4:2:0 planar (I420). Y4M input takes its format from the header.
--yv12offRaw input is YV12 (4:2:0 planar with V before U).
--nv12offRaw input is NV12 (4:2:0 with interleaved U and V).
--i422offRaw input is 4:2:2 planar.
--i444offRaw input is 4:4:4 planar.
--width, -wfrom Y4MFrame width in pixels. Required for raw input.
--height, -hfrom Y4MFrame height in pixels. Required for raw input.
--fpsfrom Y4M (raw: 30/1)Frame rate as a fraction, e.g. 24000/1001.
--timebase1/fpsTimestamp precision in fractional seconds. aomenc overwrites it with the inverse frame rate before encoding, so setting it has no effect.
--bit-depth, -b8 (or the input’s, if higher)Bit depth of the encoded stream: 8, 10 or 12. Encoding 8-bit sources at 10 bits reduces banding and usually improves efficiency. --help claims a 10-bit default, but the code default is 8.
--input-bit-depthfrom Y4M (raw: --bit-depth)Bit depth of raw input when it differs from the stream bit depth.
--input-chroma-subsampling-x0Horizontal chroma subsampling (0 or 1) of 12-bit raw input in profile 2. Y4M input supplies it from the header.
--input-chroma-subsampling-y0Vertical chroma subsampling (0 or 1) of 12-bit raw input in profile 2.
--profile0 (Main)AV1 profile: 0 Main (4:2:0 and monochrome, 8–10 bit), 1 High (adds 4:4:4), 2 Professional (adds 4:2:2 and 12 bit). aomenc raises it when the input needs a higher profile.
--monochromeoffEncode luma only, with no chroma planes.
--use-16bit-internaloff (on above 8 bit)Use the high-bit-depth (16-bit) pipeline for an 8-bit encode.
--stereo-modemonoStereo 3D layout written to the WebM header: mono, left-right, bottom-top, top-bottom or right-left. Requires a build with WebM I/O.
--forced_max_frame_width0 (first frame)Maximum frame width written to the sequence header, so that later frames (for example after a resize) may be wider than the first.
--forced_max_frame_height0 (first frame)Maximum frame height written to the sequence header.
Rate control (23 options)
OptionDefaultDescription
--end-usagevbr (q in all-intra, cbr in realtime)Rate-control mode: vbr, cbr, cq (constrained quality: --cq-level capped by --target-bitrate) or q (constant quality at --cq-level). Quality-targeted encodes use q.
--target-bitrate256Target bitrate in kbit/s for vbr and cbr, and the bitrate cap in cq mode.
--cq-level10Quality level for q and cq modes, 0–63; lower is better. It maps to qindex 4×N (255 at 63). The scale does not match x264, x265 or SVT-AV1 CRF values.
--min-q0Best (lowest) quantiser rate control may use, 0–63. In q mode --cq-level must not be below it.
--max-q63Worst (highest) quantiser rate control may use, 0–63.
--lossless0 (off)Mathematically lossless coding (qindex 0 with the lossless transform). Range 0–1.
--undershoot-pct25How far below the target bitrate a GOP may fall, in percent (0–100), before rate control compensates.
--overshoot-pct25How far above the target bitrate a GOP may go, in percent (0–100), before rate control compensates.
--buf-sz6000Decoder buffer size in milliseconds at the target bitrate, for the rate-control buffer model.
--buf-initial-sz4000Initial decoder buffer fill in milliseconds.
--buf-optimal-sz5000Target decoder buffer fill in milliseconds.
--bias-pct50Two-pass VBR bit distribution, 0–100: 0 spreads bits evenly like CBR, 100 follows frame complexity fully. Ignored in one pass.
--minsection-pct0Lowest bitrate a GOP may get in two-pass VBR, as a percentage of the target. Ignored in one pass.
--maxsection-pct2000Highest bitrate a GOP may get in two-pass VBR, as a percentage of the target. Ignored in one pass.
--drop-frame0 (off)Drop frames when the rate buffer falls below this fill level (percent, 0–100). Used with CBR.
--max-intra-rate0 (unlimited)Cap on keyframe size as a percentage of the average frame size (450 allows 4.5 frames’ worth).
--max-inter-rate0 (unlimited)Cap on inter-frame size as a percentage of the average frame size.
--gf-cbr-boost0 (off)Extra bits for golden frames in CBR mode, as a percentage of the average frame bitrate.
--frame-boost0 (off)Periodic quantiser boost (0–1). The setting is accepted but the AV1 encoder does not use it.
--vbr-corpus-complexity-lap0 (off)One-pass VBR with lookahead only: average complexity per macroblock of the content corpus (0–10000), used to distribute bits.
--min-cr0 (off)Minimum compression ratio per frame ×100 (850 means 8.5:1), used to stay within level limits.
--use-fixed-qp-offsets0 (adaptive)q mode only: 1 uses fixed per-layer quantiser offsets derived from --cq-level instead of adaptive ones. Range 0–1.
--fixed-qp-offsetsunsetMeant to give five offsets (keyframe, ALTREF and three internal alt-ref levels). aomenc only uses it to switch on --use-fixed-qp-offsets=1 and ignores the values.
Keyframes and GOP structure (12 options)
OptionDefaultDescription
--kf-min-dist12Minimum keyframe interval in frames. Set it equal to --kf-max-dist for a fixed interval. Mainline defaults to 0.
--kf-max-dist240 (0 in all-intra)Maximum keyframe interval in frames; scene-cut keyframes can come sooner. For standalone encodes set it to the seek granularity you want, e.g. ten seconds of frames. Mainline defaults to 9999.
--disable-kfoffPlace no keyframes after the first frame. Av1an sets this for each chunk.
--enable-fwd-kf0 (off)Forward keyframes (open GOP): the keyframe is coded early as an alt-ref, so frames shown before it can reference it. Range 0–1.
--fwd-kf-dist-1 (off)Distance in frames between repeated forward keyframes.
--sframe-dist0 (off)Insert a switch frame (S-frame, a point where a player can switch between streams) every N frames.
--sframe-mode1S-frame placement, 1–2: 1 turns the frame into an S-frame only if it is an alt-ref, 2 uses the next alt-ref.
--min-gf-interval0 (auto)Shortest golden-frame group (distance between alt-refs) in frames, up to 127.
--max-gf-interval0 (auto)Longest golden-frame group in frames, 2–127.
--gf-min-pyr-height0Minimum depth of the hierarchical reference pyramid in a GF group, 0–5.
--gf-max-pyr-height4Maximum depth of the hierarchical reference pyramid in a GF group, 0–5. Lower values mean fewer reference layers and less temporal quality variation. --help still says 5, the mainline default.
--kf-max-pyr-height-1 (off)Maximum pyramid depth for the GF group that starts at a keyframe, −1–5; the smaller of this and --gf-max-pyr-height applies.
Lookahead, alt-refs and temporal filtering (7 options)
OptionDefaultDescription
--lag-in-frames35 (0 in realtime and all-intra)Lookahead in frames for frame-type, alt-ref and rate-control decisions, 0–128 (mainline allows 48). Larger values use more memory.
--auto-alt-ref1 (on)Use alternate reference frames: hidden, temporally filtered frames that the frames around them predict from. Values above 1 are treated as 1.
--enable-overlay1 (on)Code an overlay frame where a filtered alt-ref is displayed. With 0 the filtered alt-ref is shown as it is.
--enable-tpl-model1 (on)Temporal dependency model (TPL): estimates how much later frames reference each block and spends bits accordingly. Required by --deltaq-mode=1 and 2.
--enable-keyframe-filtering1Temporal filtering of keyframes: 0 off, 1 on, 2 on with an overlay frame (experimental; can break seeking in players).
--arnr-maxframes7Number of frames, 0–15, that the alt-ref temporal filter averages; 0 or 1 disables filtering.
--arnr-strength5Alt-ref temporal filter strength, 0–6. Lower values keep more fine detail; community guides use 1–2 for animation and clean CGI.
Speed and tuning (8 options)
OptionDefaultDescription
--cpu-used3Speed preset; lower is slower and more efficient. Good-quality mode uses 0–6 (the library accepts up to 9, but nothing changes beyond 6), realtime 5–10, all-intra 0–9. Mainline defaults to 0; a realtime-only build of the fork (CONFIG_REALTIME_ONLY) defaults to 7.
--tunepsnrMetric that RD decisions optimise: psnr, ssim, lavish_fast, omni and ipq work in any build; butteraugli, lavish (Butteraugli RD with SSIM-style scaling) and experimental need -DCONFIG_TUNE_BUTTERAUGLI=1; lavish_vmaf_rd, ipq_vmaf_psy, vmaf_psy_qp, experimental and the vmaf* tunes need -DCONFIG_TUNE_VMAF=1 and --vmaf-model-path. The fork predates iq and ssimulacra2.
--tune-contentdefaultContent type: screen (screen-content tools), default_no_screen (never uses screen-content tools), film (synthesised grain with a fixed pattern), animation (full CDEF search at speeds up to 5 and all-intra-style intra RD) and psy (no screen-content tools, 64×64 superblocks at --cq-level 30 or lower up to 4K, self-guided restoration only and all-intra-style intra and partition decisions). Community guides advise against psy for live action above about --cq-level=30.
--dist-metricpsnrDistortion measure inside block decisions: psnr, or qm-psnr, which weights errors by the quantisation matrices.
--sharpness0Bias, 0–7, of coefficient RD decisions towards keeping block detail. Loop-filter sharpness is the separate --loopfilter-sharpness.
--static-thresh0Motion threshold inherited from VP8/VP9. The setting is accepted but the AV1 encoder does not use it.
--noise-sensitivity0 (off)Temporal denoiser strength, 0–6, for realtime encodes. Requires a build with -DCONFIG_AV1_TEMPORAL_DENOISING=1 and only acts on 8-bit encodes at speed 8 and above.
--vmaf-model-path/usr/local/share/model/vmaf_v0.6.1.jsonVMAF model file used by the vmaf* tunes. Requires a build with -DCONFIG_TUNE_VMAF=1.
Adaptive quantisation and delta-q (6 options)
OptionDefaultDescription
--deltaq-mode1 (objective)Per-superblock quantiser modulation: 0 off; 1 objective, from the TPL model; 2 perceptual (see --dq-modulate); 3 perceptual for all-intra; 4 user-rating-based (all-intra); 5 HDR (only for 10-bit BT.2020 input). Modes 1 and 2 need --enable-tpl-model=1. The fork predates Variance Boost (mode 6).
--deltaq-strength100Strength of --deltaq-mode=4, in percent (0–1000).
--delta-lf-mode0 (off)Also vary the loop-filter level per superblock. Only works with a non-zero --deltaq-mode. Range 0–1.
--aq-mode0 (off)Segment-based adaptive quantisation, separate from delta-q: 0 off, 1 variance, 2 complexity, 3 cyclic refresh (realtime).
--enable-chroma-deltaq1 (on)Automatic chroma quantiser offsets (4:2:0 −2, 4:2:2 −1, 4:4:4 +2 qindex). The fork applies them only when --chroma-q-offset-u and --chroma-q-offset-v are both non-zero, so the default changes nothing on its own.
--auto-intra-tools-off0 (off)All-intra with --deltaq-mode=3: let the encoder switch off intra tools that rarely pay off.
Quantisation (5 options)
OptionDefaultDescription
--enable-qm0 (off)Quantisation matrices: quantise high frequencies more coarsely than low ones. Commonly enabled for perceptual encodes.
--qm-min5Lowest QM level, 0–15 (15 is flat, lower levels weight frequencies more strongly). The level used rises with the quantiser from --qm-min to --qm-max. --help claims 8, but the code default is 5.
--qm-max9Highest QM level, 0–15. --help claims 15, but the code default is 9.
--quant-b-adapt0 (off)Adaptive quantiser: a wider dead zone for the trailing (highest-frequency) coefficients of each block, and a lone ±1 coefficient is dropped. Saves bits on fine noise. --help claims 1, but the code default is 0.
--disable-trellis-quant3Trellis (RD-optimised) coefficient quantisation: 0 always, 1 never, 2 not during the RD search, 3 not in the fast luma RD estimate.
Threads and tiles (10 options)
OptionDefaultDescription
--threads, -t0 (one thread)Maximum number of worker threads. aomenc stays single-threaded unless this is set.
--row-mt1 (on)Row-based multithreading inside tiles; needs --threads above 1. Range 0–1.
--fp-mt0 (off)Frame-parallel multithreading: encode several frames at once for more speed with many threads, at a small efficiency cost. Range 0–1.
--tile-columns0Number of tile columns as log2, 0–6 (2 means four columns). Tiles let encoder and decoder work in parallel but cost some efficiency; the frame width limits how many are possible.
--tile-rows0Number of tile rows as log2, 0–6.
--tile-widthunset (uniform)Non-uniform tile widths in superblocks, comma-separated; the list repeats across the frame. Needs --tile-height as well.
--tile-heightunset (uniform)Non-uniform tile heights in superblocks, comma-separated; the list repeats down the frame.
--large-scale-tile0 (off)Large-scale tile coding for random access to individual tiles (light-field and VR use). IVF output only. Range 0–1.
--num-tile-groups1Maximum number of tile groups (OBUs) per frame. --mtu-size overrides it.
--mtu-size0 (off)Maximum bytes per tile group, for packetised transport. A single tile larger than this still goes in one group.
Partitioning and superblocks (7 options)
OptionDefaultDescription
--sb-sizedynamicSuperblock size: dynamic (the encoder picks 64×64 or 128×128 from resolution and speed), 64 or 128.
--enable-rect-partitions1 (on)Rectangular partitions (horizontal and vertical halves).
--enable-ab-partitions1 (on)AB partitions: a split into one half and two quarters.
--enable-1to4-partitions1 (on)1:4 and 4:1 partitions (four horizontal or vertical strips).
--min-partition-size4Smallest block size searched: 4, 8, 16, 32, 64 or 128. At 4K and above, or at faster speeds, it is at least 8.
--max-partition-size128Largest block size searched: 4, 8, 16, 32, 64 or 128.
--partition-info-path.Directory for partition statistics read and written by libaom’s partition experiments.
Intra prediction (11 options)
OptionDefaultDescription
--enable-directional-intra1 (on)Directional (angular) intra modes.
--enable-diagonal-intra1 (on)The diagonal subset of directional modes (D45 to D203). No effect when directional modes are off.
--enable-angle-delta1 (on)Fine angle offsets (up to ±3 steps of 3°) on directional modes.
--enable-intra-edge-filter1 (on)Smoothing and upsampling of the reference edge used for directional prediction.
--enable-smooth-intra1 (on)Smooth, smooth-horizontal and smooth-vertical intra modes, which interpolate between edges.
--enable-paeth-intra1 (on)Paeth intra predictor, which picks the left, top or top-left neighbour per pixel.
--enable-filter-intra1 (on)Filter-intra modes: recursive filtered prediction in 4×2 cells, for smooth texture.
--enable-cfl-intra1 (on)Chroma from luma: chroma predicted from the reconstructed luma.
--enable-palette1 (on)Palette mode, which codes a block as up to eight colours. Used only when screen-content tools are active.
--enable-intrabc1 (on)Intra block copy from an already coded area of the same frame. Used only in intra frames with screen-content tools.
--force-video-mode0 (off)Use video coding settings even when only one frame is encoded, instead of still-picture settings. --help claims 1, but the code default is 0.
Inter prediction (16 options)
OptionDefaultDescription
--max-reference-frames7Maximum number of reference frames searched per frame, 3–7.
--reduced-reference-set0 (off)Search a reduced set of single and compound references, which is faster.
--enable-order-hint1 (on)Frame order hints. Distance-weighted compound, temporal motion-vector projection and reference sign bias depend on them.
--enable-ref-frame-mvs1 (on)Temporal motion-vector prediction from the motion fields of reference frames.
--enable-dual-filter1 (on)Separate interpolation filters for horizontal and vertical sub-pixel motion.
--enable-global-motion1 (on)Frame-level global motion models for camera pans, zooms and rotation.
--enable-warped-motion1 (on)Local warped motion: a per-block affine model derived from neighbouring motion vectors.
--enable-obmc1 (on)Overlapped block motion compensation: blends in predictions made with neighbouring blocks’ motion to soften block edges.
--enable-dist-wtd-comp1 (on)Distance-weighted compound prediction, weighting two references by their temporal distance. Off when order hints are off.
--enable-onesided-comp1 (on)Compound prediction from two references on the same side (both past or both future).
--enable-masked-comp1 (on)Masked compound prediction (wedge and difference-weighted); 0 turns both off.
--enable-diff-wtd-comp1 (on)Difference-weighted compound, with a mask derived from the difference between the two predictions.
--enable-interinter-wedge1 (on)Wedge-shaped masks for compound prediction from two references.
--enable-interintra-comp1 (on)Inter-intra prediction: an inter prediction blended with an intra prediction.
--enable-smooth-interintra1 (on)Smooth (gradual) blending for inter-intra prediction.
--enable-interintra-wedge1 (on)Wedge-shaped masks for inter-intra prediction.
Transforms (8 options)
OptionDefaultDescription
--enable-tx641 (on)64-point transforms for blocks of 64 pixels and larger.
--enable-flip-idtx1 (on)Extended transform types: flipped ADST, identity and one-dimensional (horizontal or vertical) transforms.
--enable-rect-tx1 (on)Rectangular transforms. They need rectangular partitions.
--enable-tx-size-search1 (on)Search the transform size per block. With 0 each block uses its largest possible transform.
--reduced-tx-type-set0 (off)Search a reduced set of transform types, which is faster.
--use-intra-dct-only0 (off)Use only the DCT for intra blocks.
--use-inter-dct-only0 (off)Use only the DCT for inter blocks.
--use-intra-default-tx-only0 (off)Use only the default transform type of each intra mode.
Loop filters (3 options)
OptionDefaultDescription
--loopfilter-control1 (all frames)Deblocking filter: 0 off, 1 all frames, 2 skip non-reference frames, 3 skip low-motion frames.
--enable-cdef1 (0 in all-intra)CDEF, the constrained directional enhancement (deringing) filter: 0 off, 1 all frames, 2 reference frames only.
--enable-restoration1 (0 in realtime)Loop restoration (Wiener and self-guided filters). It is slow to search and is always off in realtime mode.
Resize and super-resolution (8 options)
OptionDefaultDescription
--resize-mode0 (off)Code frames at a lower resolution while the render size keeps the original: 0 off, 1 fixed (--resize-denominator), 2 random (testing), 3 dynamic (realtime CBR).
--resize-denominator8Resize factor 8/N for non-key frames, N = 8–16 (16 halves both dimensions).
--resize-kf-denominator8Resize factor 8/N for keyframes, N = 8–16.
--superres-mode0 (off)Super-resolution: code frames at reduced width and let the decoder upscale them in-loop: 0 off, 1 fixed, 2 random, 3 above a quantiser threshold, 4 automatic.
--superres-denominator8Horizontal super-resolution factor 8/N for non-key frames, N = 8–16.
--superres-kf-denominator8Horizontal super-resolution factor 8/N for keyframes, N = 8–16.
--superres-qthresh63Mode 3: use super-resolution on non-key frames whose quantiser (1–63) exceeds this.
--superres-kf-qthresh32Mode 3: the same threshold for keyframes.
Film grain and denoising (5 options)
OptionDefaultDescription
--denoise-noise-level0 (off)Film-grain synthesis: estimate the source grain, denoise before encoding and signal grain for the decoder to add back. 0–50; keep it low (single digits to about 10) to avoid patterned grain.
--denoise-block-size32Block size in pixels for the grain estimator.
--enable-dnl-denoising0 (off)Encode the denoised frame. With the fork’s default 0 the original frame is encoded and only the estimated grain parameters are added, which avoids the denoiser’s smearing. Mainline defaults to 1.
--film-grain-tableunsetRead film-grain parameters from a table file, such as a photon-noise table from Av1an or grav1synth, instead of estimating them.
--film-grain-test0 (off)Use one of libaom’s 16 built-in film-grain test parameter sets (1–16).
Entropy coding and cost updates (5 options)
OptionDefaultDescription
--cdf-update-mode1Adaptation of the entropy-coding probabilities (CDFs): 0 never, 1 every frame, 2 selectively.
--coeff-cost-upd-freq0 (superblock)How often the encoder refreshes its coefficient rate estimates: 0 each superblock, 1 each superblock row, 2 each tile, 3 never. Higher values are faster.
--mode-cost-upd-freq0 (superblock)Refresh interval for mode rate estimates, with the same values.
--mv-cost-upd-freq0 (superblock)Refresh interval for motion-vector rate estimates, with the same values.
--dv-cost-upd-freq0 (superblock)Refresh interval for intra-block-copy vector rate estimates, with the same values.
Signalling, levels and error resilience (12 options)
OptionDefaultDescription
--color-primariesunspecifiedColour primaries (CICP) written to the sequence header; signalling only, no conversion. Values: bt709, unspecified, bt601, bt470m, bt470bg, smpte240, film, bt2020, xyz, smpte431, smpte432, ebu3213.
--transfer-characteristicsunspecifiedTransfer characteristics (CICP), e.g. bt709, smpte2084 (PQ) or hlg. Values: unspecified, bt709, bt470m, bt470bg, bt601, smpte240, lin, log100, log100sq10, iec61966, bt1361, srgb, bt2020-10bit, bt2020-12bit, smpte2084, hlg, smpte428.
--matrix-coefficientsunspecifiedMatrix coefficients (CICP). Values: identity, bt709, unspecified, fcc73, bt470bg, bt601, smpte240, ycgco, bt2020ncl, bt2020cl, smpte2085, chromncl, chromcl, ictcp.
--chroma-sample-positionunknown4:2:0 chroma siting: unknown, vertical (left, as MPEG-2) or colocated (top-left, as BT.2020).
--timing-infounspecifiedTiming information in the sequence header: unspecified, constant (fixed frame rate) or model (decoder model; not with hidden frames or super-resolution).
--target-seq-level-idx31 (unconstrained)Target level per operating point, written ABxy: operating point AB, level index xy, where index = (major − 2) × 4 + minor (8 is level 4.0, 19 is 6.3). The encoder limits its decisions to meet it.
--strict-level-conformance0 (off)Stop with an error if the stream cannot meet --target-seq-level-idx.
--set-tier-mask0 (Main)Bit mask of operating points that use the High tier instead of Main (bit n is point n).
--full-still-picture-hdroffFor single-frame encodes, write the full sequence header instead of the reduced still-picture header.
--error-resilient0 (off)Error-resilient frames, which stay decodable when references are lost. Range 0–1.
--global-error-resilient0 (off)Same effect as --error-resilient, set through the generic encoder configuration (the two are combined).
--frame-parallel0 (off)Disable backward probability adaptation so that a decoder can decode frames in parallel. Range 0–1.
Options added by aom-av1-lavish (21 options)
OptionDefaultDescription
--quant-sharpness0−7–7. Any non-zero value narrows the quantiser dead zone and raises rounding so that more small coefficients (fine detail) survive, more so at larger magnitudes; the sign makes no difference in the code. Costs bitrate.
--loopfilter-sharpness0Deblocking-filter sharpness, 0–7. Higher values filter block edges less, keeping detail but leaving more blocking.
--luma-bias1−5–5. Scales each block’s RD multiplier by 1 − brightness × bias / 5100 (brightness 0–255), so positive values give brighter blocks relatively more bits and negative values favour dark blocks. Upstream recommends leaving it alone.
--chroma-q-offset-u0Chroma qindex offset for the U plane, −63–63 (positive is coarser).
--chroma-q-offset-v0Chroma qindex offset for the V plane, −63–63.
--dq-modulate1 (wavelet)Activity measure for --deltaq-mode=2: 1 block wavelet energy, 0 block variance. Marked work in progress.
--delta-qindex-mult1000–1000 (%). Scales the TPL-based superblock quantiser offsets of --deltaq-mode=1 and the matching RD multipliers; 100 is mainline behaviour.
--delta-qindex-pos-1 (use --delta-qindex-mult)−1–1000 (%). Separate RD-multiplier scaling for superblocks whose delta-q is positive.
--delta-qindex-neg-1 (use --delta-qindex-mult)−1–1000 (%). Separate RD-multiplier scaling for superblocks whose delta-q is negative.
--ssim-rd-mult1001–1000 (%). Scales the SSIM-based RD multiplier of --tune=ssim and the ipq tunes.
--tpl-rd-mult1001–1000 (%). Scales the RD-multiplier factors derived from the TPL model.
--vmaf-motion-mult1001–1000 (%). Scales the motion term of the VMAF tunes’ quantiser adjustment; only active with those tunes.
--vmaf-rd-mult1001–1000 (%). Scales the RD multiplier of tunes that use VMAF RD. Requires a build with -DCONFIG_TUNE_VMAF=1.
--vmaf-resize-factor0 (half)Downscale for VMAF calculations in the VMAF tunes: 0 half resolution, 1 quarter. Requires a build with -DCONFIG_TUNE_VMAF=1.
--vmaf-preprocessing0 (off)Force libaom’s VMAF preprocessing (sharpening) whatever the tune: 0 off, 1 VMAF-NEG, 2 block-based, 3 frame-based. Requires a build with -DCONFIG_TUNE_VMAF=1.
--vmaf-quantization0 (off)Force the VMAF tunes’ quantiser adjustment whatever the tune. Range 0–1. Requires a build with -DCONFIG_TUNE_VMAF=1.
--butteraugli-intensity-target100Display brightness in nits (0–2000) that Butteraugli assumes. Requires a build with -DCONFIG_TUNE_BUTTERAUGLI=1.
--butteraugli-hf-asymmetry5Butteraugli’s high-frequency asymmetry parameter ×10, 0–100 (5 means 0.5). Requires a build with -DCONFIG_TUNE_BUTTERAUGLI=1.
--butteraugli-rd-mult1001–1000 (%). Scales the RD multiplier of the Butteraugli-based tunes. Requires a build with -DCONFIG_TUNE_BUTTERAUGLI=1.
--butteraugli-resize-factor1 (half)Downscale for Butteraugli calculations: 0 full resolution, 1 half, 2 quarter. Community guides use 2 to speed up the Butteraugli tunes. Requires a build with -DCONFIG_TUNE_BUTTERAUGLI=1.
--enable-experimental-psy0 (off)Experimental changes, currently VP9-style film tuning and RD tweaks. Upstream warns that they may hurt quality. Range 0–1.