Skip to content

VVenC

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

VVenC, the Fraunhofer Versatile Video Encoder

Latest release
v1.14.0
Last commit
License
BSD-3-Clause-Clear
Stars
1,214

VVenC is the Fraunhofer HHI encoder for H.266 / VVC and the practical choice for encoding VVC: it is hundreds of times faster than the VTM reference encoder with compression close to it (Fraunhofer measures medium with 8 threads at about 280× VTM’s speed on HD and 380× on UHD test sequences), scales across many threads, and has a perceptual mode (QPA, based on XPSNR). The current release is v1.14.0 (January 2026), under the BSD-3-Clause-Clear license. Its decoder counterpart is VVdeC (v3.2.1).

InterfaceUse it for
vvencappThe simple command-line encoder. Reads Y4M or raw YUV. This is what most people want.
vvencFFappThe “expert” encoder with VTM-style config files and every tuning option. It is built with the project but not installed by default (install-ffapp=1 with the Makefile, or -DVVENC_INSTALL_FULLFEATURE_APP=ON).
FFmpeg libvvencEncoding straight from any source FFmpeg can read, and muxing to MP4 in one step. Needs FFmpeg 7.1 or newer built with --enable-libvvenc; the wrapper only accepts yuv420p10le, so output is always 10-bit.

The two standalone apps write a raw VVC stream (.266). See muxing below.

There are no official binaries; build from source with CMake or use a package (brew install vvenc on macOS, vvenc and vvenc-git in the Arch AUR).

Terminal window
git clone --branch v1.14.0 https://github.com/fraunhoferhhi/vvenc.git
cmake -S vvenc -B vvenc/build -DCMAKE_BUILD_TYPE=Release
cmake --build vvenc/build --parallel

The executables land in vvenc/bin/release-static/. For FFmpeg, install VVenC where pkg-config finds it, then configure FFmpeg with --enable-libvvenc; the VVenC wiki has per-platform steps.

With vvencapp (constant QP, perceptual QPA on by default):

Terminal window
vvencapp -i input.y4m --preset medium --qp 32 -o output.266

With FFmpeg:

Terminal window
ffmpeg -i input.mkv -c:v libvvenc -preset medium -qp 32 output.mp4

Piping from FFmpeg into vvencapp:

Terminal window
ffmpeg -i input.mkv -f yuv4mpegpipe - | vvencapp -i - --y4m --preset medium -o output.266

For 10-bit sources use -pix_fmt yuv420p10le -strict -1 in the FFmpeg command (FFmpeg refuses to write 10-bit Y4M without it) and keep --internal-bitdepth 10, the default. Raw YUV input has no header, so give -s 1920x1080 --fps 24 (and --format yuv420_10 for 10-bit); Y4M carries all of that itself.

With the expert encoder, using the shipped config files:

Terminal window
vvencFFapp -c cfg/randomaccess_medium.cfg -i input.y4m -t -1 -q 32 --PerceptQPA=1 -b output.266

Unlike vvencapp, the expert app leaves perceptual QP adaptation off unless you set --PerceptQPA=1, and runs single-threaded unless you pass -t (-1 picks the thread count from the resolution). Don’t add the shipped cfg/sequence.cfg as is: it forces level 4.1 and 600 frames. Here -b is the bitstream and -o is the reconstructed YUV, the opposite of vvencapp’s -o.

--preset takes faster, fast, medium, slow or slower, and defaults to medium. Slower presets enable more coding tools and a deeper search for better compression. Fraunhofer recommends medium as the speed/efficiency trade-off; faster is for when speed matters most and slower gives the best compression. There is also medium_lowDecEnergy, a medium variant tuned for lower decoding energy. Set the preset first on expert command lines, because presets reset groups of tools.

  • Constant QP (--qp, 0–63, default 32): the default. Fraunhofer reports good results between QP 21 and 47. Lower is higher quality. QPA varies the QP per block by perceptual activity, so the picture-level QP is only a base.
  • Capped quality (-q 27 -m 5M): constant QP with a maximum bitrate for peaks.
  • Bitrate (-b 2M, optionally -m 5M): rate control, two-pass by default (-p 2; -p 1 for single pass). The max rate should be at least 1.5× the target. To run the passes separately, use --pass 1 and --pass 2 with the same --rcstatsfile stats.json and identical other options.

In vvencapp bitrates are in bits per second (1500k, 2M), so a bare -b 2000 is 2 kbit/s, unlike x264 and x265’s native kbit/s. Rate control needs the correct frame rate. Setting a bitrate switches to rate control, which derives the QP itself, so --qp no longer controls quality.

OptionDefaultNotes
--presetmediumSpeed/efficiency trade-off, see above.
-q, --qp32Quantizer, 0–63. FFmpeg: -qp.
--qpaonPerceptual QP adaptation. Turn off only when you are scoring with PSNR. FFmpeg: -qpa 0.
-b, -m, -poff, off, 2Bitrate, max bitrate, passes. FFmpeg: -b:v, -maxrate, -pass.
-rs, --refreshsec1Intra refresh period in seconds, using CRA pictures. Raise it for files that don’t need frequent random access. FFmpeg: -period.
-rt, --refreshtypecraidr for closed GOPs (FFmpeg: -flags +cgop), cra_cre for chunked adaptive-streaming output.
-t, --threadsby resolution4 below 720p, 8 up to 5K, 12 above. VVenC scales well to many cores.
--internal-bitdepth10Coded bit depth. Streams are Main 10 (--profile accepts auto, main_10 and main_10_still_picture).
--sdr, --hdroffWrites colour signalling (VUI) for BT.709/BT.2020 SDR, PQ or HLG. Without one of these the stream has no colour tags.
--additionalExpert options as colon-separated name=value pairs, e.g. --additional "MCTF=0:BIM=0" to turn off the temporal pre-filter.

In FFmpeg, anything else goes through -vvenc-params "name=value:name=value".

Raw .266 files play in few things. Put the stream in MP4 (ffmpeg -framerate 24 -i output.266 -c copy output.mp4, or MP4Box) and decode with FFmpeg or VVdeC. FFmpeg cannot mux a raw .266 straight into Matroska (“unknown timestamp”) and MKVToolNix does not read raw VVC, so mux to MP4 first.

  • FFmpeg has a native VVC decoder: experimental in 7.0, normal from 7.1. Hardware decoding exists through Intel QSV (7.1) and VAAPI (8.0). Otherwise decoding is in software.
  • VVdeC (vvdecapp) is Fraunhofer’s software decoder, which also has a WebAssembly build for browsers.
  • VVC remains far less widely supported than HEVC or AV1 on TVs, phones and in browsers. Check your target device before encoding an archive in it.

Related: uvg266, VTM, FFmpeg, MP4Box.

Every option of the VVenC 1.14.0 command-line encoders and of FFmpeg’s libvvenc wrapper. The sections above cover normal use.

Complete simple-application parameter reference

Section titled “Complete simple-application parameter reference”

The vvencapp options, with the value used when an option is not given. Names are lower case. Expert options from the next section can be added with --additional, e.g. --additional "MCTF=0:BIM=0".

General Options
OptionDefaultDescription
-h, --help0Print the short option list.
--fullhelp0Print every option with its default.
-v, --verbosityinfoLog level: silent, error, warning, info, notice, verbose, details, or 0–6.
--stats1Print encoding speed, bitrate and an estimate of the remaining time while encoding; 0 hides them.
--version0Print the version and exit.
--additionalnoneExpert options as Name=value pairs separated by :, e.g. MCTF=0:BIM=0. Any vvencFFapp option name works; parsed after all other options.
Input Options
OptionDefaultDescription
-i, --inputnoneInput file: raw YUV, or Y4M (detected by the .y4m extension or --y4m). - reads stdin.
-s, --size1920x1080Raw input size as WIDTHxHEIGHT. Y4M input carries its own size.
-c, --formatyuv420Raw input format: yuv420, yuv420_10, yuv420_10_packed, yuv400 (gray), yuv400_10 (gray10).
-r, --framerate60Frame-rate numerator, e.g. 24, 30000. Y4M input carries its own rate.
--framescale1Frame-rate denominator, e.g. 1001 for 30000/1001.
--fps60/1Frame rate as an integer or fraction (24, 24000/1001); sets the numerator and denominator together.
--tickspersec27000000Clock rate for the generated decode timestamps, 1–27000000; -1 uses one tick per frame.
-f, --frames0Number of frames to encode; 0 encodes the whole input.
-fs, --frameskip0Skip this many frames at the start of the input.
--segmentoffPosition of this chunk when a video is encoded in separately encoded segments that are concatenated afterwards: first, mid, last. Not available with rate control or --maxrate.
--y4m0Force Y4M parsing. Needed when piping Y4M through stdin; .y4m files are detected by extension.
--logofilenoneJSON file describing a logo image (raw YUV, position, opacity) to overlay on every input frame.
Output Options
OptionDefaultDescription
-o, --outputnoneOutput file: raw VVC Annex B bitstream (.266).
Encoder Options
OptionDefaultDescription
--presetmediumfaster, fast, medium, slow, slower, or medium_lowDecEnergy (medium with tools that cost the decoder less energy). Slower presets enable more tools and search.
-b, --bitrate0Target bitrate in bits/s (1500k, 2M, 2Mbps); a bare number is bits/s. 0 encodes at constant QP. A bitrate enables rate control, two-pass unless --passes 1.
-m, --maxrate0Approximate maximum instantaneous bitrate in bits/s, or a multiple of the target such as 1.5x. Without --bitrate it caps a constant-QP encode. 0 means no cap.
-p, --passes-1 (auto)Rate-control passes, 1 or 2. -1 uses two passes when a bitrate is set, otherwise one.
--pass-1Run only pass 1 or 2 of a two-pass encode, storing statistics in --rcstatsfile; -1 runs both passes in one call.
--rcstatsfilenoneRate-control statistics file (JSON) shared by separate --pass 1 and --pass 2 runs.
-q, --qp-1 (auto: 32, or set by rate control)Base quantizer, 0–63; lower is higher quality. -1 means 32 at constant QP; with a bitrate, rate control picks it.
--qpaonPerceptual QP adaptation based on an XPSNR model: varies the QP per block. Turn off (0) only when you are measuring PSNR.
-t, --threads-1 (auto)Worker threads. -1 uses 4 when the shorter picture side is below 720, 8 below 2880 and 12 above, capped at the CPU count. 0 runs single-threaded.
--mtprofileautoPicks tiles, WPP and IFP for the thread count: auto, 0 off, or 1–3 for increasing parallelism. auto uses 0 unless --threads exceeds the default for the resolution.
-rt, --refreshtypecraRandom-access point type: cra (open GOP), idr (closed GOP), cra_cre (CRA with constrained RASL pictures, for segment switching), idr_no_radl (IDR without leading pictures, for DASH), rpsei (recovery point SEI), none.
-rs, --refreshsec1Random-access (intra) period in seconds; rounded to a multiple of 8 frames. Used when --intraperiod is 0.
-ip, --intraperiod0Intra period in frames; best as a multiple of the GOP size (32). 0 uses --refreshsec.
--internal-bitdepth10Coded bit depth, 8 or 10. HDR modes need 10.
--ifpautoInter-frame parallelism: a frame starts coding before its reference frames are finished, staying two CTU lines behind them. auto follows --mtprofile.
--tiles-1x-1Tile columns×rows, e.g. 2x2. -1x-1 lets --mtprofile decide (2x2 or 2x1 for HD when enabled).
-aud, --accessunitdelimiterautoWrite access unit delimiter NAL units: auto (only when another option needs them), 0, 1.
-vui, --vuiparameterspresentautoWrite VUI: auto (when colour, range or aspect information is set), 0, 1.
-hrd, --hrdparameterspresent1Write HRD (hypothetical reference decoder) parameters; needed for buffering-period and picture-timing SEI.
-dph, --decodedpicturehashoffDecoded picture hash SEI for conformance checks: off/0, md5/1, crc/2, checksum/3.
Profile, Level, Tier
OptionDefaultDescription
--profileautoauto, main_10 or main_10_still_picture (the parser also takes the 4:4:4 and multilayer names). auto picks Main 10, or Main 10 Still Picture for a single frame.
--levelautoLevel limit: auto, 1.0, 2.0, 2.1, 3.0, 3.1, 4.0, 4.1, 5.0, 5.1, 5.2, 6.0–6.3, 15.5. auto picks the lowest level that fits size, frame rate and bitrate.
--tiermainmain or high. High tier allows higher bitrates at the same level.
HDR/SDR and Color Options
OptionDefaultDescription
--sdroffWrite SDR colour signalling (no pixel conversion): sdr/sdr_709 (BT.709), sdr_2020 (BT.2020), sdr_470bg (BT.470BG), or off.
--hdroffSet HDR mode and colour signalling (no pixel conversion): pq/hdr10 and pq_2020/hdr10_2020 (PQ, BT.709 or BT.2020 primaries), hlg and hlg_2020 (HLG, with an alternative transfer characteristics SEI). Also tunes chroma QP for HDR. Needs 10-bit.
--rangeunknownSignal sample range: limited (mpeg, tv, 0) or full (jpeg, pc, 1). Setting it turns on VUI colour description.
Tracing
OptionDefaultDescription
--tracechannellist0List the trace channels. Tracing works only in builds configured with VVENC_ENABLE_TRACING=ON.
--tracerulenoneDebug: trace rule, e.g. "D_CABAC:poc==8". Needs a tracing build.
--tracefilenoneDebug: trace output file. Needs a tracing build.
Film grain analysis
OptionDefaultDescription
--fga0Experimental film-grain analysis: estimates the source grain and writes a film grain characteristics (FGC) SEI so decoders that support it can re-synthesize grain.

Complete expert/configuration parameter reference

Section titled “Complete expert/configuration parameter reference”

The vvencFFapp options. Names are case-insensitive and work on the command line (--Name=value) and in config files (Name : value lines, loaded with -c). The defaults are the library’s built-in configuration: the medium preset’s coding tools, but with QPA off, single-threaded, and no default input size or frame rate, so they differ from vvencapp. -1 and auto values are resolved from other settings when the encoder starts.

General Options
OptionDefaultDescription
-h, --help0Print the short option list.
--fullhelp0Print every option with its default.
-v, --VerbosityverboseLog level: silent, error, warning, info, notice, verbose, details, or 0–6.
--stats1Print encoding speed, bitrate and an estimate of the remaining time while encoding; 0 hides them.
--version0Print the version and exit.
--additionalnoneExpert options as Name=value pairs separated by :, e.g. MCTF=0:BIM=0. Any vvencFFapp option name works; parsed after all other options.
-cnoneRead a configuration file (Name : value lines). Repeat to layer files; later values win.
--WriteConfignoneWrite the parsed configuration to this file (before -1/auto values are resolved).
-w, --WarnUnknowParameter0Warn about unknown options instead of stopping. (The option name is spelled this way.)
--SIMDnoneForce a SIMD level: SCALAR, SSE41, SSE42, AVX, AVX2, AVX512 on x86 (NEON on Arm). Empty uses the best available.
Input Options
OptionDefaultDescription
-i, --InputFilenoneInput file: raw YUV, or Y4M (detected by the .y4m extension or --y4m). - reads stdin.
-s, --Size0x0Raw input size as WIDTHxHEIGHT; same as SourceWidth and SourceHeight. Required for raw YUV.
--InputBitDepth8Bit depth of the raw input file, 8 or 10.
-f, --FramesToBeEncoded0Number of frames to encode; 0 encodes the whole input.
-fr, --FrameRate0Frame-rate numerator, e.g. 24, 30000. Required for raw YUV.
--FrameScale1Frame-rate denominator, e.g. 1001 for 30000/1001.
--fps0/1Frame rate as an integer or fraction (24, 24000/1001); sets the numerator and denominator together.
--TicksPerSecond27000000Clock rate for the generated decode timestamps, 1–27000000; -1 uses one tick per frame.
--LeadFrames0Frames read before the first encoded frame, for encoding a video in overlapping chunks. Up to 64.
--TrailFrames0Frames read after the last encoded frame, for encoding in overlapping chunks. Up to 6.
-fs, --FrameSkip0Skip this many frames at the start of the input.
--segmentoffPosition of this chunk when a video is encoded in separately encoded segments that are concatenated afterwards: first, mid, last. Not available with rate control or --maxrate.
--y4m0Force Y4M parsing. Needed when piping Y4M through stdin; .y4m files are detected by extension.
--logofilenoneJSON file describing a logo image (raw YUV, position, opacity) to overlay on every input frame.
--SourceWidth0Input picture width in pixels.
--SourceHeight0Input picture height in pixels.
--ConformanceWindowMode10 none, 1 pad automatically to the minimum coding size and crop on decode, 2 use HorizontalPadding/VerticalPadding, 3 use the ConfWin* offsets.
--ConfWinLeft0Left crop offset in pixels for ConformanceWindowMode=3.
--ConfWinRight0Right crop offset for ConformanceWindowMode=3.
--ConfWinTop0Top crop offset for ConformanceWindowMode=3.
--ConfWinBottom0Bottom crop offset for ConformanceWindowMode=3.
--HorizontalPadding0Pixels of padding added to the right for ConformanceWindowMode=2.
--VerticalPadding0Pixels of padding added at the bottom for ConformanceWindowMode=2.
--InputChromaFormat420Chroma format of the raw input: 400, 420, 422, 444. The encoder codes 4:0:0 and 4:2:0 only.
--PackedInput0Read 10-bit input packed as 4 samples in 5 bytes.
--MaxPicSize0x0Maximum picture size WIDTHxHEIGHT signalled for resolution changes (RPR); needs RPR enabled.
--MaxPicWidth0Maximum picture width for resolution changes.
--MaxPicHeight0Maximum picture height for resolution changes.
--HorCollocatedChroma1Signal horizontal chroma siting for reference picture resampling: 1 co-sited with luma, 0 shifted by half a luma sample.
--VerCollocatedChroma0Signal vertical chroma siting for CCLM and resampling: 0 shifted by half a luma sample (MPEG-2 style 4:2:0), 1 co-sited. HDR and BT.2020 modes set 1.
--ClipInputVideoToRec709Range0Clip input samples to the nominal Rec. 709 range when reducing bit depth on input.
Output options
OptionDefaultDescription
-b, --BitstreamFilenoneOutput bitstream file (.266).
-o, --ReconFilenoneWrite the reconstructed (decoded) video as raw YUV. Note that -o is this, not the bitstream.
--OutputBitDepth0Bit depth of the reconstructed YUV file; 0 uses the internal bit depth.
Threading, performance
OptionDefaultDescription
-t, --Threads0 (single-threaded)Worker threads. 0 (the expert-app default) runs single-threaded; -1 uses 4 when the shorter picture side is below 720, 8 below 2880 and 12 above, capped at the CPU count.
--MTProfileoffPicks tiles, WPP and IFP for the thread count: auto, 0 off, or 1–3 for increasing parallelism.
--presetmediumfaster, fast, medium, slow, slower, medium_lowDecEnergy. Applies a group of tool settings, so put it before options that should override it. The built-in defaults are medium.
--Tiles-1x-1Tile columns×rows, e.g. 2x2; -1x-1 lets MTProfile decide.
--MaxParallelFrames-1Frames encoded in parallel; -1 uses up to 4 with threading, 0 off. Rate control allows at most 4.
--WppBitEqual-1WPP-style CTU-line context handling for threaded encoding: 0 off (sequential), 1 copy contexts from the line above, 2 reset per line. -1 picks 1 with threads; threading requires it.
--EnablePicPartitioning0Allow multiple tiles/slices. Turned on automatically when tiles are set.
--TileColumnWidthArraynoneExplicit tile column widths in CTUs, comma-separated; the last value repeats.
--TileRowHeightArraynoneExplicit tile row heights in CTUs, comma-separated; the last value repeats.
--TileParallelCtuEnc1Search CTUs in different tiles in parallel.
--FppLinesSynchro-1Deprecated name for IFPLines.
--IFPLines-1IFP sync offset in CTU lines; -1 uses 2.
--IFPautoInter-frame parallelism: a frame starts coding before its reference frames are finished, staying IFPLines CTU lines behind them. auto follows MTProfile. Incompatible with ALFTempPred.
--NumParallelGOPs0Additional GOPs encoded in parallel. Needs threads, parallel frames and IFP.
Slice decision options
OptionDefaultDescription
-ip, --IntraPeriod0Intra period in frames; best as a multiple of GOPSize. 0 uses RefreshSec; 1 encodes all-intra.
-rs, --RefreshSec1Random-access (intra) period in seconds; rounded to a multiple of 8 frames. Used when IntraPeriod is 0.
-dr, --DecodingRefreshTypecraRandom-access point type: cra (open GOP), idr (closed GOP), cra_cre, idr_no_radl (for DASH), rpsei, none.
-g, --GOPSize32GOP (hierarchy) size. Built-in GOPs exist for 32 and 16 (random access), 8 (low delay, needs PicReordering=0) and 1 (all-intra); others need Frame1… entries.
--PicReordering1Allow out-of-order (B-pyramid) coding. 0 for low delay.
--POC0IDR0Code the first picture as IDR. Required for all-intra and low delay (set automatically for all-intra).
Rate control, Perceptual Quantization
OptionDefaultDescription
--NumPasses-1Rate-control passes, 1 or 2. -1 uses two when a bitrate is set, otherwise one.
--Passes-1Same as NumPasses.
--Pass-1Run only pass 1 or 2 of a two-pass encode with RCStatsFile; -1 runs both.
--LookAhead-1Pre-analysis look-ahead for single-pass rate control: -1 auto (on for one-pass RC), 0, 1. Not used with two passes or constant QP.
--RCStatsFilenoneRate-control statistics file (JSON) for separate Pass=1 and Pass=2 runs.
--TargetBitrate0Target bitrate in bits/s (1500k, 2M); 0 encodes at constant QP.
--MaxBitrate0Approximate maximum instantaneous bitrate in bits/s, or a multiple of the target (1.5x). Without a target bitrate it caps a constant-QP encode.
-qpa, --PerceptQPA0Perceptual QP adaptation (XPSNR model). Off in the expert app unless set, e.g. by cfg/qpa.cfg; vvencapp turns it on by default.
--STA-1Slice type adaptation: insert intra pictures at scene cuts. -1 auto (on for GOP size above 8), 0 off, 1 adapt slice type, 2 also adapt the NAL unit type.
--MinIntraDistance-1With STA, minimum distance in frames from the previous intra picture. -1 uses the GOP size.
--RCInitialQP0Rate control: base QP for the first pass. 0 lets the encoder estimate it from the bitrate.
--PerceptQPATempFiltIPic-1Temporal high-pass filtering in the QPA activity of key pictures: 0 off, 1 on, 2 also reduce temporal pumping, 3/4 = 1/2 without the forced second-order filter. -1 auto (2 for two-pass RC, otherwise 1; off without QPA or MCTF).
Quantization parameters
OptionDefaultDescription
-q, --QP32Base quantizer, 0–63; lower is higher quality.
--SameCQPTablesForAllChroma1Use one chroma QP mapping table for Cb, Cr and joint Cb-Cr. PQ mode turns this off.
--IntraQPOffset-3QP offset for intra pictures relative to the base QP.
--LambdaFromQpEnable1Derive lambda directly from the QP (then IntraQPOffset is used for intra pictures).
--LambdaModifier1x1x1x1x1x1x1Lambda multipliers for temporal layers 0–6, x-separated.
--LambdaModifierInoneLambda multipliers for intra pictures per temporal layer, comma-separated; empty uses LambdaModifier.
--IQPFactor-1Intra QP factor for the lambda calculation; negative derives it from the GOP size.
--QpInValCb17,22,34,42Input QPs of the Cb chroma QP mapping table (piecewise-linear points).
--QpInValCrnoneInput QPs of the Cr mapping table; empty reuses Cb when SameCQPTablesForAllChroma=1.
--QpInValCbCrnoneInput QPs of the joint Cb-Cr mapping table.
--QpOutValCb17,23,35,39Output QPs of the Cb chroma QP mapping table.
--QpOutValCrnoneOutput QPs of the Cr mapping table.
--QpOutValCbCrnoneOutput QPs of the joint Cb-Cr mapping table.
--MaxCuDQPSubdiv-1Finest CU subdivision that can carry a luma QP delta. -1 auto: 2 with QPA at QP ≤ 42 when the shorter side is at most 1280, otherwise 0.
--MaxCuChromaQpOffsetSubdiv-1Finest CU subdivision for chroma QP offsets; negative disables CU chroma QP offsets.
--CbQpOffset0Cb QP offset.
--CrQpOffset0Cr QP offset.
--CbQpOffsetDualTree0Cb QP offset for dual-tree intra slices.
--CrQpOffsetDualTree0Cr QP offset for dual-tree intra slices.
--CbCrQpOffset-1QP offset for joint Cb-Cr coding, −12 to 12.
--CbCrQpOffsetDualTree0Joint Cb-Cr QP offset for dual-tree intra slices.
--SliceChromaQPOffsetPeriodicity-1Apply the slice-level chroma QP offsets periodically: 0 off, 1 on. -1 auto (on with QPA).
--SliceCbQpOffsetIntraOrPeriodic0Slice-level Cb QP offset for intra or periodic slices.
--SliceCrQpOffsetIntraOrPeriodic0Slice-level Cr QP offset for intra or periodic slices.
--LumaLevelToDeltaQPMode0Luma-level-dependent QP: 0 off, 1 from the CTU average luma.
--GOPQPAautoGOP-level QP cascade. -1 auto: on when QPA is off; cannot be combined with QPA.
Profile, Level, Tier
OptionDefaultDescription
--Profileautoauto, main_10 or main_10_still_picture (the parser also takes the 4:4:4 and multilayer names). auto picks Main 10, or Main 10 Still Picture for a single frame.
--LevelautoLevel limit: auto, 1.0, 2.0, 2.1, 3.0, 3.1, 4.0, 4.1, 5.0, 5.1, 5.2, 6.0–6.3, 15.5. auto picks the lowest level that fits size, frame rate and bitrate.
--Tiermainmain or high. High tier allows higher bitrates at the same level.
--SubProfile0Value written as sub-profile IDC.
--MaxBitDepthConstraint10Bit-depth constraint for profile signalling; 0 derives it.
--IntraConstraintFlag0Set general_intra_constraint_flag (intra-only stream).
HDR/SDR and Color Options
OptionDefaultDescription
--SdroffWrite SDR colour signalling (no pixel conversion): sdr/sdr_709, sdr_2020, sdr_470bg, or off.
--HdroffHDR mode and colour signalling (no pixel conversion): pq/hdr10, pq_2020/hdr10_2020, hlg, hlg_2020. Also tunes chroma QP. Setting mastering-display or content-light-level data turns on PQ.
SEI and auxiliary options
OptionDefaultDescription
-dph, --SEIDecodedPictureHashoffDecoded picture hash SEI: off/0, md5/1, crc/2, checksum/3.
--SEIBufferingPeriod0Write buffering-period SEI. Needs rate control and HRD parameters.
--SEIPictureTiming0Write picture-timing SEI. Needs rate control and HRD parameters.
--SEIDecodingUnitInfo0Write decoding-unit information SEI.
--MasteringDisplayColourVolumenoneMastering display SEI (SMPTE ST 2086): Gx,Gy,Bx,By,Rx,Ry,WPx,WPy,Lmax,Lmin, chromaticities in 1/50000, luminance in 1/10000 cd/m². P3-D65 1000 nits: 13250,34500,7500,3000,34000,16000,15635,16450,10000000,1.
--MaxContentLightLevelnoneContent light level SEI as MaxCLL,MaxFALL in cd/m², e.g. 1000,400.
--PreferredTransferCharacteristicsautoAlternative transfer characteristics SEI value (same names as TransferCharacteristics). auto writes arib-std-b67 in HLG modes.
-aud, --AccessUnitDelimiterautoWrite access unit delimiter NAL units: auto (only when another option needs them), 0, 1.
-hrd, --HrdParametersPresent1Write HRD parameters; needed for buffering-period and picture-timing SEI.
--EnableDecodingParameterSet0Write a decoding capability information NAL unit.
VUI options
OptionDefaultDescription
-vui, --VuiParametersPresentautoWrite VUI: auto (when colour, range or aspect information is set), 0, 1.
--AspectRatioInfoPresent0Write aspect_ratio_idc in the VUI.
--AspectRatioIdc1Sample aspect ratio code: 1 = 1:1, 14 = 4:3, 15 = 3:2, 16 = 2:1, 255 = use SarWidth/SarHeight; other codes per H.273.
--Sar0x0Sample aspect ratio as WIDTHxHEIGHT.
--SarWidth0Horizontal part of the sample aspect ratio.
--SarHeight0Vertical part of the sample aspect ratio.
--ColourDescriptionPresent0Write colour primaries, transfer and matrix in the VUI. Set automatically by Sdr, Hdr and Range.
--ColourPrimariesunknownColour primaries: bt709, unknown, bt470bg, smpte170m, bt2020, smpte432 (P3-D65) and other H.273 names or numbers 0–12.
--TransferCharacteristicsunknownTransfer function: bt709, unknown, smpte2084 (PQ), arib-std-b67 (HLG), bt2020-10, iec61966-2-1 (sRGB) and other H.273 names or numbers 0–18.
--MatrixCoefficientsunknownYCbCr matrix: bt709, unknown, bt470bg, smpte170m, bt2020nc, bt2020c, ictcp, gbr and other H.273 names or numbers 0–14.
--ChromaLocInfoPresentautoWrite chroma sample location in the VUI: auto, 0, 1.
--ChromaSampleLocType-1Chroma sample location type 0–5; -1 derives it from the chroma siting flags.
--OverscanInfoPresent0Write overscan information in the VUI.
--OverscanAppropriate0Signal that the picture is suitable for overscan display.
--VideoFullRangeunknownSame as Range.
--RangeunknownSignal sample range: limited (mpeg, tv, 0) or full (jpeg, pc, 1); turns on the VUI colour description.
Quality reporting metrics
OptionDefaultDescription
--MSEBasedSequencePSNR0Also report sequence PSNR computed from the average MSE, not only the average of frame PSNRs.
--PrintHexPSNR0Also print per-frame PSNR in hexadecimal (bit-exact comparisons).
--PrintFrameMSE0Print per-frame MSE.
--PrintSequenceMSE0Print sequence MSE.
Bitstream options
OptionDefaultDescription
--CabacZeroWordPaddingEnabled1Add CABAC zero words where the standard requires them for conformance.
Coding structure parameters
OptionDefaultDescription
--ReWriteParamSets1Repeat the parameter sets before every random-access point, so decoding can start there.
--IDRRefParamList0Write reference picture list syntax in IDR slice headers.
Misc. options
OptionDefaultDescription
-cf, --ChromaFormatIDC0Coded chroma format, 400 or 420; 0 uses the input format.
--UseIdentityTableForNon420Chroma1Use identity chroma QP tables for 4:2:2/4:4:4.
--InputBitDepthC0Chroma input bit depth; 0 uses InputBitDepth.
--InternalBitDepth10Coded bit depth, 8 or 10. HDR modes need 10.
--OutputBitDepthC0Chroma bit depth of the reconstructed file; 0 uses OutputBitDepth.
--MSBExtendedBitDepth0Luma bit depth after padding the input with zero MSBs; 0 uses InputBitDepth.
--MSBExtendedBitDepthC0Chroma equivalent of MSBExtendedBitDepth.
--WaveFrontSynchroautoWavefront parallel processing (entropy coding sync): auto (follows MTProfile), 0, 1.
--EntryPointsPresent1Write entry points for tiles/WPP substreams in slice headers.
--TreatAsSubPic0Make the stream usable for subpicture merging; disables LMCS, ALF temporal prediction and joint Cb-Cr.
--ExplicitAPSid0ALF adaptation parameter set ID to use.
--AddGOP32refPics0GOP 32 with alternative QP offsets and reference pictures.
--NumRefPics222221Reference pictures per list. 0 uses the GOP default, 1–9 applies to all temporal layers, longer numbers give one digit per layer (last digit = highest layer). Medium: 222221.
--NumRefPicsSCC0Reference pictures for screen content pictures, same format as NumRefPics; -1 copies NumRefPics.
--ForceSCC0Override screen content detection: 0 detect, 1 treat all frames as camera content, 2 weak SCC, 3 strong SCC.
Low-level QT-BTT partitioning options
OptionDefaultDescription
--CTUSize128CTU size: 32, 64 or 128.
--MinQTISlice8Minimum quadtree leaf size for luma in intra slices.
--MinQTLumaISlice8Same as MinQTISlice.
--MinQTNonISlice8Minimum quadtree leaf size in inter slices.
--MinQTChromaISliceInChromaSamples4Minimum quadtree leaf size for chroma in intra slices, in chroma samples.
--MaxMTTDepth1Maximum binary/ternary split depth in inter slices; longer numbers give one digit per temporal layer.
--MaxMTTDepthI2Maximum binary/ternary split depth for luma in intra slices.
--MaxMTTDepthISliceL2Same as MaxMTTDepthI.
--MaxMTTDepthISliceC-1Maximum binary/ternary split depth for chroma in intra slices; -1 uses MaxMTTDepthI.
--MaxBTLumaISlice32Largest block that may be binary-split, luma in intra slices.
--MaxBTChromaISlice64Largest block that may be binary-split, chroma in intra slices.
--MaxBTNonISlice128Largest block that may be binary-split in inter slices.
--MaxTTLumaISlice32Largest block that may be ternary-split, luma in intra slices.
--MaxTTChromaISlice32Largest block that may be ternary-split, chroma in intra slices.
--MaxTTNonISlice64Largest block that may be ternary-split in inter slices.
--DualITree1Separate luma and chroma partitioning trees in intra slices.
--Log2MaxTbSize6Maximum transform size, log2 (6 = 64×64).
--Log2MinCodingBlockSize2Minimum coding block size, log2.
Coding tools
OptionDefaultDescription
--CostModelossyRD cost mode: lossy, sequence_level_lossless, lossless, mixed_lossless_lossy.
--ASR1Adaptive motion search range.
--HadamardME1Use Hadamard (SATD) cost in fractional-pel motion estimation.
--FastHAD0Sub-sampled Hadamard for square blocks of 32×32 and larger.
--RDOQ1Rate-distortion optimized quantization.
--RDOQTS1RDOQ for transform-skip blocks.
--SelectiveRDOQ0Selective RDOQ: 0 never, 1 always, 2 for camera content only.
--JointCbCr1Joint coding of chroma residuals (JCCR).
--CabacInitPresent-1Choose CABAC initialisation tables per slice from the previous frame. -1 auto (only single-threaded).
--LCTUFast1Speed-ups for 128×128 CTUs.
--PBIntraFast1Skip intra search when inter prediction is clearly better: 0 off, 1–2 faster.
--FastMrg3Fast merge-mode decisions, 0–3.
--AMaxBT-1Adapt the maximum binary-tree size per picture. -1 auto (only single-threaded).
--FastQtBtEnc1Fast QTBT partition search.
--ContentBasedFastQtbt1Skip partition tests based on the block content.
--FEN3Fast inter search mode, 0–3.
--ECU0Early CU termination: 0 off, 1 limited to some block sizes and layers, 2 unconstrained.
--FDM1Fast merge RD decision.
--DisableIntraInInter0Disallow intra CUs in inter slices.
--FastUDIUseMPMEnabled1Fast intra direction search using the most probable modes.
--FastMEForGenBLowDelayEnabled1Fast motion estimation for low-delay B slices.
--MTSImplicit1Implicit multiple transform selection when explicit MTS is off.
--TMVPMode1Temporal motion vector prediction: 0 off, 1 all slices, 2 some slices.
--DepQuant1Dependent quantization (trellis-coded quantization). Sign hiding is only used when it is off.
--QuantThrVal-1Threshold for the dependent-quantization last-coefficient search; -1 uses 8.
--SignHideFlag0Sign data hiding. Only used without dependent quantization.
--MIP1Matrix-based intra prediction.
--FastMIP3Fast MIP search, 0–3.
--MaxNumMergeCand5Maximum merge candidates, 1–6.
--MaxNumAffineMergeCand3Maximum affine merge candidates.
--Geo4Geometric partitioning mode: 0 off, 1 on, 2–4 faster searches.
--MaxNumGeoCand3Maximum geometric partitioning candidates.
--FastIntraTools1Speed-ups for LFNST, ISP and MTS: 0 off, 1, 2.
--IntraEstDecBit2Test only every 2^N-th intra direction in the first estimation pass.
--SMVD3Symmetric MVD: 0 off, 1 full search, 2 fast, 3 faster.
--AMVR5Adaptive motion vector resolution: 0 off, 1–7 speed settings.
--IMV5Same as AMVR (VTM name).
--LMChroma1Cross-component linear model (CCLM) chroma prediction.
--MRL1Multiple reference lines for intra prediction.
--BDOF1Bi-directional optical flow.
--BIO1Same as BDOF (VTM name).
--DMVR1Decoder-side motion vector refinement.
--EncDbOpt2Account for deblocking in mode decisions: 0 off, 1 full, 2 fast.
--EDO2Same as EncDbOpt.
--LMCSEnable0Luma mapping with chroma scaling. Deprecated.
--LMCS0Same as LMCSEnable. Deprecated.
--LMCSSignalType0LMCS signal type: 0 SDR, 1 PQ, 2 HLG. Set by the HDR modes.
--LMCSUpdateCtrl0LMCS model update: 0 random access, 1 all-intra, 2 low delay.
--LMCSAdpOption0LMCS adaptation option, 0 automatic or 1–4.
--LMCSInitialCW0LMCS initial total codeword, 0–1023, when LMCSAdpOption > 0.
--LMCSOffset6LMCS chroma residual scaling offset.
--ALF1Adaptive loop filter.
--ALFSpeed0Skip ALF on the highest N temporal layers; 0 filters all.
--CCALF1Cross-component ALF.
--UseNonLinearAlfLuma0Non-linear ALF for luma.
--UseNonLinearAlfChroma0Non-linear ALF for chroma.
--MaxNumAlfAlternativesChroma8Maximum alternative chroma ALF filters, 1–8.
--ALFTempPred-1Reuse ALF parameters from earlier pictures. -1 auto (off with IFP).
--ALFUnitSize-1ALF search unit size; -1 uses the CTU size.
--PROF1Prediction refinement with optical flow for affine blocks.
--Affine4Affine motion prediction: 0 off, 1–5 speed settings.
--AffineType1Allow the 6-parameter affine model.
--MMVD3Merge with motion vector difference: 0 off, 1–4 speed settings.
--MmvdDisNum6Number of MMVD distance entries.
--AllowDisFracMMVD1Allow disabling fractional MMVD distances per picture.
--MCTF2Motion-compensated temporal pre-filter (denoising): 0 off, 1 all frames, 2 off for detected screen content.
--MCTFSpeed2MCTF speed, 0 (best) to 4 (fastest).
--MCTFUnitSize-1MCTF block size, 8–32; -1 uses 8 below 720 lines and 16 otherwise.
--MCTFFutureReference1Let MCTF use future frames. Turn off for low delay.
--MCTFFramenoneFrames (POCs within the GOP) that MCTF filters; empty derives them from the GOP size and QP.
--MCTFStrengthnoneFilter strength for each MCTFFrame entry; empty derives them from the QP.
--BIM1Block importance mapping: adjusts block QPs by how much later frames reference them, using MCTF motion data. Needs MCTF.
--FastLocalDualTreeMode1Fast intra coding for local dual trees: 0 off, 1 threshold, 2 one intra mode only.
--QtbttExtraFast3Extra partitioning speed-ups not in VTM, 0–7.
--FastTTSplit5Fast ternary-split decisions, 0–7.
--SbTMVP1Subblock-based temporal motion vector prediction.
--CIIP0Combined inter/intra prediction: 0 off, 1 full, 2 fast, 3 faster.
--SBT0Subblock transform for inter blocks: 0 off, 1 full, 2 fast, 3 faster.
--LFNST1Low-frequency non-separable transform.
--MTS0Explicit multiple transform selection.
--MTSIntraMaxCand3Additional MTS candidates tested in intra slices.
--ISP3Intra subpartitions: 0 off, 1 full, 2 fast, 3 faster.
--TransformSkip2Transform skip: 0 off, 1 on, 2 only for detected screen content.
--TransformSkipLog2MaxSize4Largest transform-skip block, log2, 2–5.
--ChromaTS0Transform skip for chroma (needs TransformSkip).
--BDPCM2Block DPCM: 0 off, 1 on, 2 only for detected screen content.
--RPR-1Reference picture resampling: 0 off, 1 on, 2 RPR-ready (for cra_cre/idr_no_radl). -1 picks 2 for those refresh types, else 0.
--IBC2Intra block copy: 0 off, 1 on, 2 only for detected screen content.
--IBCFastMethod3IBC speed-ups: 1 default, 2–6 faster.
--BCW0Bi-prediction with CU-level weights: 0 off, 1 on, 2 fast.
--FastInferMerge0Skip inter/intra modes after merge decisions: 0 off, 1–4 faster.
--NumIntraModesFullRD-1Intra modes evaluated with full RD cost, 1–3; -1 auto.
--ReduceIntraChromaModesFullRD1Evaluate fewer chroma intra modes with full RD cost.
--FirstPassMode0Speed of the first rate-control pass: 0 normal, 1 faster, 2 plus temporal downsampling, 3 plus spatial downsampling, 4 both. 3/4 fall back to 1/2 below 720 lines or with one pass.
Motion search options
OptionDefaultDescription
--FastSearch4Motion search: 0 full, 1 diamond, 3 enhanced diamond, 4 fast diamond.
--FastSearchSCC2Motion search for screen content: 0 same as FastSearch, 2 diamond SCC, 3 fast diamond SCC.
-sr, --SearchRange384Motion search range in luma samples.
--BipredSearchRange4Search range for bi-prediction refinement.
--MinSearchWindow96Minimum search window for adaptive search range.
--ClipForBiPredMEEnabled0Clip samples during bi-prediction motion estimation.
--FastMEAssumingSmootherMVEnabled1Fast motion estimation assuming a smooth motion field.
--IntegerET0Early termination of integer-pel motion search.
--FastSubPel1Sub-pel motion estimation: 0 normal, 1 fast, 2 disabled.
--ReduceFilterME2Interpolation filter taps during sub-pel refinement: 0 8-tap, 1 6-tap, 2 4-tap.
Loop filters (deblock and SAO)
OptionDefaultDescription
--LoopFilterDisable0Disable the deblocking filter.
--LoopFilterOffsetInPPS1Signal deblocking offsets in the PPS instead of slice headers.
--LoopFilterBetaOffset_div20Luma deblocking β offset ÷ 2, −12 to 12; positive filters more, negative less.
--LoopFilterTcOffset_div20Luma deblocking tC offset ÷ 2, −12 to 12; positive filters more, negative less.
--LoopFilterCbBetaOffset_div20Cb deblocking β offset ÷ 2.
--LoopFilterCbTcOffset_div20Cb deblocking tC offset ÷ 2.
--LoopFilterCrBetaOffset_div20Cr deblocking β offset ÷ 2.
--LoopFilterCrTcOffset_div20Cr deblocking tC offset ÷ 2.
--DeblockLastTLayers0Deblock only the highest N temporal layers; 0 deblocks all.
--DisableLoopFilterAcrossTiles0Do not filter across tile boundaries.
--DisableLoopFilterAcrossSlices0Do not filter across slice boundaries.
--SAO1Sample adaptive offset: 0 off, 1 on, 2 only for screen content pictures. --fullhelp prints 0, but the presets turn SAO on.
--SaoEncodingRate-1Early SAO termination rate, 0–1; -1 auto (0.75 single-threaded, 0 with threads).
--SaoEncodingRateChroma-1Early SAO termination rate for chroma; -1 auto (0.5 single-threaded, 0 with threads).
--SaoLumaOffsetBitShift0Luma SAO offset bit shift; negative derives it from bit depth and QP.
--SaoChromaOffsetBitShift0Chroma SAO offset bit shift; negative derives it from bit depth and QP.
Summary options (debugging)
OptionDefaultDescription
--SummaryOutFilenamenoneDebug: write a summary file.
--SummaryPicFilenameBasenoneDebug: base name for per-slice-type summary files (I.txt, P.txt, B.txt appended).
--SummaryVerboseness0Debug: summary verbosity level.
Reconstructed video options
OptionDefaultDescription
--ClipOutputVideoToRec709Range0Clip the reconstructed YUV to the nominal Rec. 709 range when reducing bit depth.
--PYUV0Write the reconstructed 10/12-bit YUV packed (5 or 3 bytes per group).
Tracing
OptionDefaultDescription
--tracechannellist0List the trace channels. Tracing works only in builds configured with VVENC_ENABLE_TRACING=ON.
--tracerulenoneDebug: trace rule, e.g. "D_CABAC:poc==8". Needs a tracing build.
--tracefilenoneDebug: trace output file. Needs a tracing build.
Film grain analysis
OptionDefaultDescription
--fga0Experimental film-grain analysis: estimates the source grain and writes a film grain characteristics (FGC) SEI so decoders that support it can re-synthesize grain.
Custom GOP entries (config files; not listed by —fullhelp)
OptionDefaultDescription
--Frame1 … --Frame64noneCustom GOP entry, one per picture of the GOP, given in a config file together with GOPSize (see cfg/gop32.cfg). Fields: type, POC, QP offset, QP offset model offset and scale, Cb/Cr QP offsets, QP factor, tC and β offsets, four Cb/Cr offset fields that VVenC reads but ignores, temporal ID, then active/total reference pictures and deltas for L0 and L1. Without entries the built-in GOP for GOPSize is used.
vvencapp names also accepted by vvencFFapp (not listed by —fullhelp)
OptionDefaultDescription
--tickspersec27000000Same as --TicksPerSecond.
--framerate0Same as FrameRate.
--frames0Same as FramesToBeEncoded.
--bitrate0Same as TargetBitrate.
--maxrate0Same as MaxBitrate.
--qpa0Same as PerceptQPA.
--internal-bitdepth10Same as InternalBitDepth.
--refreshtypecraSame as DecodingRefreshType.
--decodedpicturehashoffSame as SEIDecodedPictureHash.

The private options of the libvvenc wrapper in FFmpeg 9.0.2. The wrapper also uses FFmpeg’s generic options: -b:v switches to rate control (single pass with look-ahead, or two passes with -pass 1/-pass 2), -maxrate caps the bitrate (also without -b:v), -threads sets the thread count, -g 1 encodes all-intra (other -g values are ignored) and -flags +cgop uses IDR instead of CRA. -color_trc smpte2084 selects PQ mode and arib-std-b67 or bt2020-10 selects HLG mode. Input must be yuv420p10le, and the wrapper always writes access unit delimiters.

All libvvenc private options
OptionTypeDefaultDescription
-presetint2 (medium)faster (0), fast (1), medium (2), slow (3) or slower (4).
-qpint32Base QP, −1 to 63, for constant-QP encoding; ignored when -b:v is set.
-qpabooleantruePerceptual QP adaptation; -qpa 0 turns it off.
-passlogfilestringunsetStatistics file for two-pass encoding with -pass 1 and -pass 2. Same option as -stats.
-statsstringunsetSame as -passlogfile.
-periodint1Intra (random-access) period in seconds, 1 or more. Ignored with -g 1.
-vvenc-paramsdictionaryunsetLibrary options as name=value pairs separated by :, using the expert option names, e.g. -vvenc-params "MCTF=0:BIM=0". rcstatsfile, passes and pass are rejected; use -passlogfile and -pass.
-levelstringunsetLevel such as 5.1; unset chooses the level automatically.
-tierint0 (main)main (0) or high (1).