# VVenC

Canonical URL: https://encode.wiki/tools/software-encoders/vvenc/
Content version: ca42e61ede0a24f789d7287a0001244ad22f4abf
Status: current
License: CC BY-SA 4.0
Checksum (SHA-256): 162061754b5ef18e971e543bd97a4292b6c2b17f136a186d34ccb3f361073ce8

> **Repository:** [fraunhoferhhi/vvenc](https://github.com/fraunhoferhhi/vvenc). VVenC, the Fraunhofer Versatile Video Encoder. Latest release: [v1.14.0](https://github.com/fraunhoferhhi/vvenc/releases/tag/v1.14.0), Jan 21, 2026. Last commit: Oct 2, 2026. License: BSD-3-Clause-Clear. Stars: 1,214.

VVenC is the Fraunhofer HHI encoder for [H.266 / VVC](/codecs/video/vvc/) and the practical choice for encoding VVC: it is hundreds of times faster than the [VTM](/tools/software-encoders/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](/reference/metrics/xpsnr/)). The current release is **v1.14.0** (January 2026), under the BSD-3-Clause-Clear license. Its decoder counterpart is [VVdeC](https://github.com/fraunhoferhhi/vvdec) (v3.2.1).

## Pick an interface

| Interface         | Use it for                                                                                                                                                                                                          |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `vvencapp`        | The simple command-line encoder. Reads Y4M or raw YUV. This is what most people want.                                                                                                                               |
| `vvencFFapp`      | The "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 `libvvenc` | Encoding 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](#mux-and-play) below.

## Get it

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).

```sh
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](https://github.com/fraunhoferhhi/vvenc/wiki/FFmpeg-Integration) has per-platform steps.

## Starting commands

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

```sh
vvencapp -i input.y4m --preset medium --qp 32 -o output.266
```

With FFmpeg:

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

Piping from FFmpeg into `vvencapp`:

```sh
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:

```sh
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`.

## Presets

`--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.

## Rate control

- **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.

## Options that matter

| Option                 | Default       | Notes                                                                                                                              |
| ---------------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `--preset`             | `medium`      | Speed/efficiency trade-off, see above.                                                                                             |
| `-q`, `--qp`           | `32`          | Quantizer, 0–63. FFmpeg: `-qp`.                                                                                                    |
| `--qpa`                | on            | Perceptual QP adaptation. Turn off only when you are scoring with PSNR. FFmpeg: `-qpa 0`.                                          |
| `-b`, `-m`, `-p`       | off, off, `2` | Bitrate, max bitrate, passes. FFmpeg: `-b:v`, `-maxrate`, `-pass`.                                                                 |
| `-rs`, `--refreshsec`  | `1`           | Intra refresh period in seconds, using CRA pictures. Raise it for files that don't need frequent random access. FFmpeg: `-period`. |
| `-rt`, `--refreshtype` | `cra`         | `idr` for closed GOPs (FFmpeg: `-flags +cgop`), `cra_cre` for chunked adaptive-streaming output.                                   |
| `-t`, `--threads`      | by resolution | 4 below 720p, 8 up to 5K, 12 above. VVenC scales well to many cores.                                                               |
| `--internal-bitdepth`  | `10`          | Coded bit depth. Streams are Main 10 (`--profile` accepts `auto`, `main_10` and `main_10_still_picture`).                          |
| `--sdr`, `--hdr`       | off           | Writes colour signalling (VUI) for BT.709/BT.2020 SDR, PQ or HLG. Without one of these the stream has no colour tags.              |
| `--additional`         |               | Expert 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"`.

## Mux and play

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](/tools/software-encoders/uvg266/), [VTM](/tools/software-encoders/vtm/), [FFmpeg](/tools/utilities/ffmpeg/), [MP4Box](/tools/utilities/mp4box/).

## Full option reference

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

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"`.

<details>
<summary>General Options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-h`, `--help` | `0` | Print the short option list. |
| `--fullhelp` | `0` | Print every option with its default. |
| `-v`, `--verbosity` | `info` | Log level: `silent`, `error`, `warning`, `info`, `notice`, `verbose`, `details`, or `0`–`6`. |
| `--stats` | `1` | Print encoding speed, bitrate and an estimate of the remaining time while encoding; `0` hides them. |
| `--version` | `0` | Print the version and exit. |
| `--additional` | none | Expert options as `Name=value` pairs separated by `:`, e.g. `MCTF=0:BIM=0`. Any `vvencFFapp` option name works; parsed after all other options. |

</details>

<details>
<summary>Input Options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-i`, `--input` | none | Input file: raw YUV, or Y4M (detected by the `.y4m` extension or `--y4m`). `-` reads stdin. |
| `-s`, `--size` | `1920x1080` | Raw input size as `WIDTHxHEIGHT`. Y4M input carries its own size. |
| `-c`, `--format` | `yuv420` | Raw input format: `yuv420`, `yuv420_10`, `yuv420_10_packed`, `yuv400` (`gray`), `yuv400_10` (`gray10`). |
| `-r`, `--framerate` | `60` | Frame-rate numerator, e.g. `24`, `30000`. Y4M input carries its own rate. |
| `--framescale` | `1` | Frame-rate denominator, e.g. `1001` for 30000/1001. |
| `--fps` | `60/1` | Frame rate as an integer or fraction (`24`, `24000/1001`); sets the numerator and denominator together. |
| `--tickspersec` | `27000000` | Clock rate for the generated decode timestamps, 1–27000000; `-1` uses one tick per frame. |
| `-f`, `--frames` | `0` | Number of frames to encode; `0` encodes the whole input. |
| `-fs`, `--frameskip` | `0` | Skip this many frames at the start of the input. |
| `--segment` | `off` | Position 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`. |
| `--y4m` | `0` | Force Y4M parsing. Needed when piping Y4M through stdin; `.y4m` files are detected by extension. |
| `--logofile` | none | JSON file describing a logo image (raw YUV, position, opacity) to overlay on every input frame. |

</details>

<details>
<summary>Output Options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-o`, `--output` | none | Output file: raw VVC Annex B bitstream (`.266`). |

</details>

<details>
<summary>Encoder Options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--preset` | `medium` | `faster`, `fast`, `medium`, `slow`, `slower`, or `medium_lowDecEnergy` (medium with tools that cost the decoder less energy). Slower presets enable more tools and search. |
| `-b`, `--bitrate` | `0` | Target 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`, `--maxrate` | `0` | Approximate 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` | `-1` | Run only pass `1` or `2` of a two-pass encode, storing statistics in `--rcstatsfile`; `-1` runs both passes in one call. |
| `--rcstatsfile` | none | Rate-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. |
| `--qpa` | `on` | Perceptual 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. |
| `--mtprofile` | `auto` | Picks 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`, `--refreshtype` | `cra` | Random-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`, `--refreshsec` | `1` | Random-access (intra) period in seconds; rounded to a multiple of 8 frames. Used when `--intraperiod` is 0. |
| `-ip`, `--intraperiod` | `0` | Intra period in frames; best as a multiple of the GOP size (32). `0` uses `--refreshsec`. |
| `--internal-bitdepth` | `10` | Coded bit depth, `8` or `10`. HDR modes need 10. |
| `--ifp` | `auto` | Inter-frame parallelism: a frame starts coding before its reference frames are finished, staying two CTU lines behind them. `auto` follows `--mtprofile`. |
| `--tiles` | `-1x-1` | Tile columns×rows, e.g. `2x2`. `-1x-1` lets `--mtprofile` decide (2x2 or 2x1 for HD when enabled). |
| `-aud`, `--accessunitdelimiter` | `auto` | Write access unit delimiter NAL units: `auto` (only when another option needs them), `0`, `1`. |
| `-vui`, `--vuiparameterspresent` | `auto` | Write VUI: `auto` (when colour, range or aspect information is set), `0`, `1`. |
| `-hrd`, `--hrdparameterspresent` | `1` | Write HRD (hypothetical reference decoder) parameters; needed for buffering-period and picture-timing SEI. |
| `-dph`, `--decodedpicturehash` | `off` | Decoded picture hash SEI for conformance checks: `off`/`0`, `md5`/`1`, `crc`/`2`, `checksum`/`3`. |

</details>

<details>
<summary>Profile, Level, Tier</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--profile` | `auto` | `auto`, `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. |
| `--level` | `auto` | Level 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. |
| `--tier` | `main` | `main` or `high`. High tier allows higher bitrates at the same level. |

</details>

<details>
<summary>HDR/SDR and Color Options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--sdr` | `off` | Write SDR colour signalling (no pixel conversion): `sdr`/`sdr_709` (BT.709), `sdr_2020` (BT.2020), `sdr_470bg` (BT.470BG), or `off`. |
| `--hdr` | `off` | Set 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. |
| `--range` | `unknown` | Signal sample range: `limited` (`mpeg`, `tv`, `0`) or `full` (`jpeg`, `pc`, `1`). Setting it turns on VUI colour description. |

</details>

<details>
<summary>Tracing</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--tracechannellist` | `0` | List the trace channels. Tracing works only in builds configured with `VVENC_ENABLE_TRACING=ON`. |
| `--tracerule` | none | Debug: trace rule, e.g. `"D_CABAC:poc==8"`. Needs a tracing build. |
| `--tracefile` | none | Debug: trace output file. Needs a tracing build. |

</details>

<details>
<summary>Film grain analysis</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--fga` | `0` | Experimental film-grain analysis: estimates the source grain and writes a film grain characteristics (FGC) SEI so decoders that support it can re-synthesize grain. |

</details>

## 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.

<details>
<summary>General Options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-h`, `--help` | `0` | Print the short option list. |
| `--fullhelp` | `0` | Print every option with its default. |
| `-v`, `--Verbosity` | `verbose` | Log level: `silent`, `error`, `warning`, `info`, `notice`, `verbose`, `details`, or `0`–`6`. |
| `--stats` | `1` | Print encoding speed, bitrate and an estimate of the remaining time while encoding; `0` hides them. |
| `--version` | `0` | Print the version and exit. |
| `--additional` | none | Expert options as `Name=value` pairs separated by `:`, e.g. `MCTF=0:BIM=0`. Any `vvencFFapp` option name works; parsed after all other options. |
| `-c` | none | Read a configuration file (`Name : value` lines). Repeat to layer files; later values win. |
| `--WriteConfig` | none | Write the parsed configuration to this file (before `-1`/`auto` values are resolved). |
| `-w`, `--WarnUnknowParameter` | `0` | Warn about unknown options instead of stopping. (The option name is spelled this way.) |
| `--SIMD` | none | Force a SIMD level: `SCALAR`, `SSE41`, `SSE42`, `AVX`, `AVX2`, `AVX512` on x86 (`NEON` on Arm). Empty uses the best available. |

</details>

<details>
<summary>Input Options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-i`, `--InputFile` | none | Input file: raw YUV, or Y4M (detected by the `.y4m` extension or `--y4m`). `-` reads stdin. |
| `-s`, `--Size` | `0x0` | Raw input size as `WIDTHxHEIGHT`; same as `SourceWidth` and `SourceHeight`. Required for raw YUV. |
| `--InputBitDepth` | `8` | Bit depth of the raw input file, 8 or 10. |
| `-f`, `--FramesToBeEncoded` | `0` | Number of frames to encode; `0` encodes the whole input. |
| `-fr`, `--FrameRate` | `0` | Frame-rate numerator, e.g. `24`, `30000`. Required for raw YUV. |
| `--FrameScale` | `1` | Frame-rate denominator, e.g. `1001` for 30000/1001. |
| `--fps` | `0/1` | Frame rate as an integer or fraction (`24`, `24000/1001`); sets the numerator and denominator together. |
| `--TicksPerSecond` | `27000000` | Clock rate for the generated decode timestamps, 1–27000000; `-1` uses one tick per frame. |
| `--LeadFrames` | `0` | Frames read before the first encoded frame, for encoding a video in overlapping chunks. Up to 64. |
| `--TrailFrames` | `0` | Frames read after the last encoded frame, for encoding in overlapping chunks. Up to 6. |
| `-fs`, `--FrameSkip` | `0` | Skip this many frames at the start of the input. |
| `--segment` | `off` | Position 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`. |
| `--y4m` | `0` | Force Y4M parsing. Needed when piping Y4M through stdin; `.y4m` files are detected by extension. |
| `--logofile` | none | JSON file describing a logo image (raw YUV, position, opacity) to overlay on every input frame. |
| `--SourceWidth` | `0` | Input picture width in pixels. |
| `--SourceHeight` | `0` | Input picture height in pixels. |
| `--ConformanceWindowMode` | `1` | `0` none, `1` pad automatically to the minimum coding size and crop on decode, `2` use `HorizontalPadding`/`VerticalPadding`, `3` use the `ConfWin*` offsets. |
| `--ConfWinLeft` | `0` | Left crop offset in pixels for `ConformanceWindowMode=3`. |
| `--ConfWinRight` | `0` | Right crop offset for `ConformanceWindowMode=3`. |
| `--ConfWinTop` | `0` | Top crop offset for `ConformanceWindowMode=3`. |
| `--ConfWinBottom` | `0` | Bottom crop offset for `ConformanceWindowMode=3`. |
| `--HorizontalPadding` | `0` | Pixels of padding added to the right for `ConformanceWindowMode=2`. |
| `--VerticalPadding` | `0` | Pixels of padding added at the bottom for `ConformanceWindowMode=2`. |
| `--InputChromaFormat` | `420` | Chroma format of the raw input: `400`, `420`, `422`, `444`. The encoder codes 4:0:0 and 4:2:0 only. |
| `--PackedInput` | `0` | Read 10-bit input packed as 4 samples in 5 bytes. |
| `--MaxPicSize` | `0x0` | Maximum picture size `WIDTHxHEIGHT` signalled for resolution changes (RPR); needs RPR enabled. |
| `--MaxPicWidth` | `0` | Maximum picture width for resolution changes. |
| `--MaxPicHeight` | `0` | Maximum picture height for resolution changes. |
| `--HorCollocatedChroma` | `1` | Signal horizontal chroma siting for reference picture resampling: `1` co-sited with luma, `0` shifted by half a luma sample. |
| `--VerCollocatedChroma` | `0` | Signal 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`. |
| `--ClipInputVideoToRec709Range` | `0` | Clip input samples to the nominal Rec. 709 range when reducing bit depth on input. |

</details>

<details>
<summary>Output options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-b`, `--BitstreamFile` | none | Output bitstream file (`.266`). |
| `-o`, `--ReconFile` | none | Write the reconstructed (decoded) video as raw YUV. Note that `-o` is this, not the bitstream. |
| `--OutputBitDepth` | `0` | Bit depth of the reconstructed YUV file; `0` uses the internal bit depth. |

</details>

<details>
<summary>Threading, performance</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-t`, `--Threads` | `0` (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. |
| `--MTProfile` | `off` | Picks tiles, WPP and IFP for the thread count: `auto`, `0` off, or `1`–`3` for increasing parallelism. |
| `--preset` | `medium` | `faster`, `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-1` | Tile columns×rows, e.g. `2x2`; `-1x-1` lets `MTProfile` decide. |
| `--MaxParallelFrames` | `-1` | Frames encoded in parallel; `-1` uses up to 4 with threading, `0` off. Rate control allows at most 4. |
| `--WppBitEqual` | `-1` | WPP-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. |
| `--EnablePicPartitioning` | `0` | Allow multiple tiles/slices. Turned on automatically when tiles are set. |
| `--TileColumnWidthArray` | none | Explicit tile column widths in CTUs, comma-separated; the last value repeats. |
| `--TileRowHeightArray` | none | Explicit tile row heights in CTUs, comma-separated; the last value repeats. |
| `--TileParallelCtuEnc` | `1` | Search CTUs in different tiles in parallel. |
| `--FppLinesSynchro` | `-1` | Deprecated name for `IFPLines`. |
| `--IFPLines` | `-1` | IFP sync offset in CTU lines; `-1` uses 2. |
| `--IFP` | `auto` | Inter-frame parallelism: a frame starts coding before its reference frames are finished, staying `IFPLines` CTU lines behind them. `auto` follows `MTProfile`. Incompatible with `ALFTempPred`. |
| `--NumParallelGOPs` | `0` | Additional GOPs encoded in parallel. Needs threads, parallel frames and IFP. |

</details>

<details>
<summary>Slice decision options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-ip`, `--IntraPeriod` | `0` | Intra period in frames; best as a multiple of `GOPSize`. `0` uses `RefreshSec`; `1` encodes all-intra. |
| `-rs`, `--RefreshSec` | `1` | Random-access (intra) period in seconds; rounded to a multiple of 8 frames. Used when `IntraPeriod` is 0. |
| `-dr`, `--DecodingRefreshType` | `cra` | Random-access point type: `cra` (open GOP), `idr` (closed GOP), `cra_cre`, `idr_no_radl` (for DASH), `rpsei`, `none`. |
| `-g`, `--GOPSize` | `32` | GOP (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. |
| `--PicReordering` | `1` | Allow out-of-order (B-pyramid) coding. `0` for low delay. |
| `--POC0IDR` | `0` | Code the first picture as IDR. Required for all-intra and low delay (set automatically for all-intra). |

</details>

<details>
<summary>Rate control, Perceptual Quantization</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--NumPasses` | `-1` | Rate-control passes, `1` or `2`. `-1` uses two when a bitrate is set, otherwise one. |
| `--Passes` | `-1` | Same as `NumPasses`. |
| `--Pass` | `-1` | Run only pass `1` or `2` of a two-pass encode with `RCStatsFile`; `-1` runs both. |
| `--LookAhead` | `-1` | Pre-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. |
| `--RCStatsFile` | none | Rate-control statistics file (JSON) for separate `Pass=1` and `Pass=2` runs. |
| `--TargetBitrate` | `0` | Target bitrate in bits/s (`1500k`, `2M`); `0` encodes at constant QP. |
| `--MaxBitrate` | `0` | Approximate 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`, `--PerceptQPA` | `0` | Perceptual QP adaptation (XPSNR model). Off in the expert app unless set, e.g. by `cfg/qpa.cfg`; `vvencapp` turns it on by default. |
| `--STA` | `-1` | Slice 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` | `-1` | With STA, minimum distance in frames from the previous intra picture. `-1` uses the GOP size. |
| `--RCInitialQP` | `0` | Rate control: base QP for the first pass. `0` lets the encoder estimate it from the bitrate. |
| `--PerceptQPATempFiltIPic` | `-1` | Temporal 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). |

</details>

<details>
<summary>Quantization parameters</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-q`, `--QP` | `32` | Base quantizer, 0–63; lower is higher quality. |
| `--SameCQPTablesForAllChroma` | `1` | Use one chroma QP mapping table for Cb, Cr and joint Cb-Cr. PQ mode turns this off. |
| `--IntraQPOffset` | `-3` | QP offset for intra pictures relative to the base QP. |
| `--LambdaFromQpEnable` | `1` | Derive lambda directly from the QP (then `IntraQPOffset` is used for intra pictures). |
| `--LambdaModifier` | `1x1x1x1x1x1x1` | Lambda multipliers for temporal layers 0–6, `x`-separated. |
| `--LambdaModifierI` | none | Lambda multipliers for intra pictures per temporal layer, comma-separated; empty uses `LambdaModifier`. |
| `--IQPFactor` | `-1` | Intra QP factor for the lambda calculation; negative derives it from the GOP size. |
| `--QpInValCb` | `17,22,34,42` | Input QPs of the Cb chroma QP mapping table (piecewise-linear points). |
| `--QpInValCr` | none | Input QPs of the Cr mapping table; empty reuses Cb when `SameCQPTablesForAllChroma=1`. |
| `--QpInValCbCr` | none | Input QPs of the joint Cb-Cr mapping table. |
| `--QpOutValCb` | `17,23,35,39` | Output QPs of the Cb chroma QP mapping table. |
| `--QpOutValCr` | none | Output QPs of the Cr mapping table. |
| `--QpOutValCbCr` | none | Output QPs of the joint Cb-Cr mapping table. |
| `--MaxCuDQPSubdiv` | `-1` | Finest 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` | `-1` | Finest CU subdivision for chroma QP offsets; negative disables CU chroma QP offsets. |
| `--CbQpOffset` | `0` | Cb QP offset. |
| `--CrQpOffset` | `0` | Cr QP offset. |
| `--CbQpOffsetDualTree` | `0` | Cb QP offset for dual-tree intra slices. |
| `--CrQpOffsetDualTree` | `0` | Cr QP offset for dual-tree intra slices. |
| `--CbCrQpOffset` | `-1` | QP offset for joint Cb-Cr coding, −12 to 12. |
| `--CbCrQpOffsetDualTree` | `0` | Joint Cb-Cr QP offset for dual-tree intra slices. |
| `--SliceChromaQPOffsetPeriodicity` | `-1` | Apply the slice-level chroma QP offsets periodically: `0` off, `1` on. `-1` auto (on with QPA). |
| `--SliceCbQpOffsetIntraOrPeriodic` | `0` | Slice-level Cb QP offset for intra or periodic slices. |
| `--SliceCrQpOffsetIntraOrPeriodic` | `0` | Slice-level Cr QP offset for intra or periodic slices. |
| `--LumaLevelToDeltaQPMode` | `0` | Luma-level-dependent QP: `0` off, `1` from the CTU average luma. |
| `--GOPQPA` | `auto` | GOP-level QP cascade. `-1` auto: on when QPA is off; cannot be combined with QPA. |

</details>

<details>
<summary>Profile, Level, Tier</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--Profile` | `auto` | `auto`, `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. |
| `--Level` | `auto` | Level 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. |
| `--Tier` | `main` | `main` or `high`. High tier allows higher bitrates at the same level. |
| `--SubProfile` | `0` | Value written as sub-profile IDC. |
| `--MaxBitDepthConstraint` | `10` | Bit-depth constraint for profile signalling; `0` derives it. |
| `--IntraConstraintFlag` | `0` | Set `general_intra_constraint_flag` (intra-only stream). |

</details>

<details>
<summary>HDR/SDR and Color Options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--Sdr` | `off` | Write SDR colour signalling (no pixel conversion): `sdr`/`sdr_709`, `sdr_2020`, `sdr_470bg`, or `off`. |
| `--Hdr` | `off` | HDR 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. |

</details>

<details>
<summary>SEI and auxiliary options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-dph`, `--SEIDecodedPictureHash` | `off` | Decoded picture hash SEI: `off`/`0`, `md5`/`1`, `crc`/`2`, `checksum`/`3`. |
| `--SEIBufferingPeriod` | `0` | Write buffering-period SEI. Needs rate control and HRD parameters. |
| `--SEIPictureTiming` | `0` | Write picture-timing SEI. Needs rate control and HRD parameters. |
| `--SEIDecodingUnitInfo` | `0` | Write decoding-unit information SEI. |
| `--MasteringDisplayColourVolume` | none | Mastering 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`. |
| `--MaxContentLightLevel` | none | Content light level SEI as `MaxCLL,MaxFALL` in cd/m², e.g. `1000,400`. |
| `--PreferredTransferCharacteristics` | `auto` | Alternative transfer characteristics SEI value (same names as `TransferCharacteristics`). `auto` writes `arib-std-b67` in HLG modes. |
| `-aud`, `--AccessUnitDelimiter` | `auto` | Write access unit delimiter NAL units: `auto` (only when another option needs them), `0`, `1`. |
| `-hrd`, `--HrdParametersPresent` | `1` | Write HRD parameters; needed for buffering-period and picture-timing SEI. |
| `--EnableDecodingParameterSet` | `0` | Write a decoding capability information NAL unit. |

</details>

<details>
<summary>VUI options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-vui`, `--VuiParametersPresent` | `auto` | Write VUI: `auto` (when colour, range or aspect information is set), `0`, `1`. |
| `--AspectRatioInfoPresent` | `0` | Write `aspect_ratio_idc` in the VUI. |
| `--AspectRatioIdc` | `1` | Sample aspect ratio code: `1` = 1:1, `14` = 4:3, `15` = 3:2, `16` = 2:1, `255` = use `SarWidth`/`SarHeight`; other codes per H.273. |
| `--Sar` | `0x0` | Sample aspect ratio as `WIDTHxHEIGHT`. |
| `--SarWidth` | `0` | Horizontal part of the sample aspect ratio. |
| `--SarHeight` | `0` | Vertical part of the sample aspect ratio. |
| `--ColourDescriptionPresent` | `0` | Write colour primaries, transfer and matrix in the VUI. Set automatically by `Sdr`, `Hdr` and `Range`. |
| `--ColourPrimaries` | `unknown` | Colour primaries: `bt709`, `unknown`, `bt470bg`, `smpte170m`, `bt2020`, `smpte432` (P3-D65) and other H.273 names or numbers 0–12. |
| `--TransferCharacteristics` | `unknown` | Transfer function: `bt709`, `unknown`, `smpte2084` (PQ), `arib-std-b67` (HLG), `bt2020-10`, `iec61966-2-1` (sRGB) and other H.273 names or numbers 0–18. |
| `--MatrixCoefficients` | `unknown` | YCbCr matrix: `bt709`, `unknown`, `bt470bg`, `smpte170m`, `bt2020nc`, `bt2020c`, `ictcp`, `gbr` and other H.273 names or numbers 0–14. |
| `--ChromaLocInfoPresent` | `auto` | Write chroma sample location in the VUI: `auto`, `0`, `1`. |
| `--ChromaSampleLocType` | `-1` | Chroma sample location type 0–5; `-1` derives it from the chroma siting flags. |
| `--OverscanInfoPresent` | `0` | Write overscan information in the VUI. |
| `--OverscanAppropriate` | `0` | Signal that the picture is suitable for overscan display. |
| `--VideoFullRange` | `unknown` | Same as `Range`. |
| `--Range` | `unknown` | Signal sample range: `limited` (`mpeg`, `tv`, `0`) or `full` (`jpeg`, `pc`, `1`); turns on the VUI colour description. |

</details>

<details>
<summary>Quality reporting metrics</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--MSEBasedSequencePSNR` | `0` | Also report sequence PSNR computed from the average MSE, not only the average of frame PSNRs. |
| `--PrintHexPSNR` | `0` | Also print per-frame PSNR in hexadecimal (bit-exact comparisons). |
| `--PrintFrameMSE` | `0` | Print per-frame MSE. |
| `--PrintSequenceMSE` | `0` | Print sequence MSE. |

</details>

<details>
<summary>Bitstream options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--CabacZeroWordPaddingEnabled` | `1` | Add CABAC zero words where the standard requires them for conformance. |

</details>

<details>
<summary>Coding structure parameters</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--ReWriteParamSets` | `1` | Repeat the parameter sets before every random-access point, so decoding can start there. |
| `--IDRRefParamList` | `0` | Write reference picture list syntax in IDR slice headers. |

</details>

<details>
<summary>Misc. options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `-cf`, `--ChromaFormatIDC` | `0` | Coded chroma format, `400` or `420`; `0` uses the input format. |
| `--UseIdentityTableForNon420Chroma` | `1` | Use identity chroma QP tables for 4:2:2/4:4:4. |
| `--InputBitDepthC` | `0` | Chroma input bit depth; `0` uses `InputBitDepth`. |
| `--InternalBitDepth` | `10` | Coded bit depth, 8 or 10. HDR modes need 10. |
| `--OutputBitDepthC` | `0` | Chroma bit depth of the reconstructed file; `0` uses `OutputBitDepth`. |
| `--MSBExtendedBitDepth` | `0` | Luma bit depth after padding the input with zero MSBs; `0` uses `InputBitDepth`. |
| `--MSBExtendedBitDepthC` | `0` | Chroma equivalent of `MSBExtendedBitDepth`. |
| `--WaveFrontSynchro` | `auto` | Wavefront parallel processing (entropy coding sync): `auto` (follows `MTProfile`), `0`, `1`. |
| `--EntryPointsPresent` | `1` | Write entry points for tiles/WPP substreams in slice headers. |
| `--TreatAsSubPic` | `0` | Make the stream usable for subpicture merging; disables LMCS, ALF temporal prediction and joint Cb-Cr. |
| `--ExplicitAPSid` | `0` | ALF adaptation parameter set ID to use. |
| `--AddGOP32refPics` | `0` | GOP 32 with alternative QP offsets and reference pictures. |
| `--NumRefPics` | `222221` | Reference 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`. |
| `--NumRefPicsSCC` | `0` | Reference pictures for screen content pictures, same format as `NumRefPics`; `-1` copies `NumRefPics`. |
| `--ForceSCC` | `0` | Override screen content detection: `0` detect, `1` treat all frames as camera content, `2` weak SCC, `3` strong SCC. |

</details>

<details>
<summary>Low-level QT-BTT partitioning options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--CTUSize` | `128` | CTU size: 32, 64 or 128. |
| `--MinQTISlice` | `8` | Minimum quadtree leaf size for luma in intra slices. |
| `--MinQTLumaISlice` | `8` | Same as `MinQTISlice`. |
| `--MinQTNonISlice` | `8` | Minimum quadtree leaf size in inter slices. |
| `--MinQTChromaISliceInChromaSamples` | `4` | Minimum quadtree leaf size for chroma in intra slices, in chroma samples. |
| `--MaxMTTDepth` | `1` | Maximum binary/ternary split depth in inter slices; longer numbers give one digit per temporal layer. |
| `--MaxMTTDepthI` | `2` | Maximum binary/ternary split depth for luma in intra slices. |
| `--MaxMTTDepthISliceL` | `2` | Same as `MaxMTTDepthI`. |
| `--MaxMTTDepthISliceC` | `-1` | Maximum binary/ternary split depth for chroma in intra slices; `-1` uses `MaxMTTDepthI`. |
| `--MaxBTLumaISlice` | `32` | Largest block that may be binary-split, luma in intra slices. |
| `--MaxBTChromaISlice` | `64` | Largest block that may be binary-split, chroma in intra slices. |
| `--MaxBTNonISlice` | `128` | Largest block that may be binary-split in inter slices. |
| `--MaxTTLumaISlice` | `32` | Largest block that may be ternary-split, luma in intra slices. |
| `--MaxTTChromaISlice` | `32` | Largest block that may be ternary-split, chroma in intra slices. |
| `--MaxTTNonISlice` | `64` | Largest block that may be ternary-split in inter slices. |
| `--DualITree` | `1` | Separate luma and chroma partitioning trees in intra slices. |
| `--Log2MaxTbSize` | `6` | Maximum transform size, log2 (6 = 64×64). |
| `--Log2MinCodingBlockSize` | `2` | Minimum coding block size, log2. |

</details>

<details>
<summary>Coding tools</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--CostMode` | `lossy` | RD cost mode: `lossy`, `sequence_level_lossless`, `lossless`, `mixed_lossless_lossy`. |
| `--ASR` | `1` | Adaptive motion search range. |
| `--HadamardME` | `1` | Use Hadamard (SATD) cost in fractional-pel motion estimation. |
| `--FastHAD` | `0` | Sub-sampled Hadamard for square blocks of 32×32 and larger. |
| `--RDOQ` | `1` | Rate-distortion optimized quantization. |
| `--RDOQTS` | `1` | RDOQ for transform-skip blocks. |
| `--SelectiveRDOQ` | `0` | Selective RDOQ: `0` never, `1` always, `2` for camera content only. |
| `--JointCbCr` | `1` | Joint coding of chroma residuals (JCCR). |
| `--CabacInitPresent` | `-1` | Choose CABAC initialisation tables per slice from the previous frame. `-1` auto (only single-threaded). |
| `--LCTUFast` | `1` | Speed-ups for 128×128 CTUs. |
| `--PBIntraFast` | `1` | Skip intra search when inter prediction is clearly better: `0` off, `1`–`2` faster. |
| `--FastMrg` | `3` | Fast merge-mode decisions, `0`–`3`. |
| `--AMaxBT` | `-1` | Adapt the maximum binary-tree size per picture. `-1` auto (only single-threaded). |
| `--FastQtBtEnc` | `1` | Fast QTBT partition search. |
| `--ContentBasedFastQtbt` | `1` | Skip partition tests based on the block content. |
| `--FEN` | `3` | Fast inter search mode, `0`–`3`. |
| `--ECU` | `0` | Early CU termination: `0` off, `1` limited to some block sizes and layers, `2` unconstrained. |
| `--FDM` | `1` | Fast merge RD decision. |
| `--DisableIntraInInter` | `0` | Disallow intra CUs in inter slices. |
| `--FastUDIUseMPMEnabled` | `1` | Fast intra direction search using the most probable modes. |
| `--FastMEForGenBLowDelayEnabled` | `1` | Fast motion estimation for low-delay B slices. |
| `--MTSImplicit` | `1` | Implicit multiple transform selection when explicit MTS is off. |
| `--TMVPMode` | `1` | Temporal motion vector prediction: `0` off, `1` all slices, `2` some slices. |
| `--DepQuant` | `1` | Dependent quantization (trellis-coded quantization). Sign hiding is only used when it is off. |
| `--QuantThrVal` | `-1` | Threshold for the dependent-quantization last-coefficient search; `-1` uses 8. |
| `--SignHideFlag` | `0` | Sign data hiding. Only used without dependent quantization. |
| `--MIP` | `1` | Matrix-based intra prediction. |
| `--FastMIP` | `3` | Fast MIP search, `0`–`3`. |
| `--MaxNumMergeCand` | `5` | Maximum merge candidates, 1–6. |
| `--MaxNumAffineMergeCand` | `3` | Maximum affine merge candidates. |
| `--Geo` | `4` | Geometric partitioning mode: `0` off, `1` on, `2`–`4` faster searches. |
| `--MaxNumGeoCand` | `3` | Maximum geometric partitioning candidates. |
| `--FastIntraTools` | `1` | Speed-ups for LFNST, ISP and MTS: `0` off, `1`, `2`. |
| `--IntraEstDecBit` | `2` | Test only every 2^N-th intra direction in the first estimation pass. |
| `--SMVD` | `3` | Symmetric MVD: `0` off, `1` full search, `2` fast, `3` faster. |
| `--AMVR` | `5` | Adaptive motion vector resolution: `0` off, `1`–`7` speed settings. |
| `--IMV` | `5` | Same as `AMVR` (VTM name). |
| `--LMChroma` | `1` | Cross-component linear model (CCLM) chroma prediction. |
| `--MRL` | `1` | Multiple reference lines for intra prediction. |
| `--BDOF` | `1` | Bi-directional optical flow. |
| `--BIO` | `1` | Same as `BDOF` (VTM name). |
| `--DMVR` | `1` | Decoder-side motion vector refinement. |
| `--EncDbOpt` | `2` | Account for deblocking in mode decisions: `0` off, `1` full, `2` fast. |
| `--EDO` | `2` | Same as `EncDbOpt`. |
| `--LMCSEnable` | `0` | Luma mapping with chroma scaling. Deprecated. |
| `--LMCS` | `0` | Same as `LMCSEnable`. Deprecated. |
| `--LMCSSignalType` | `0` | LMCS signal type: `0` SDR, `1` PQ, `2` HLG. Set by the HDR modes. |
| `--LMCSUpdateCtrl` | `0` | LMCS model update: `0` random access, `1` all-intra, `2` low delay. |
| `--LMCSAdpOption` | `0` | LMCS adaptation option, `0` automatic or `1`–`4`. |
| `--LMCSInitialCW` | `0` | LMCS initial total codeword, 0–1023, when `LMCSAdpOption` > 0. |
| `--LMCSOffset` | `6` | LMCS chroma residual scaling offset. |
| `--ALF` | `1` | Adaptive loop filter. |
| `--ALFSpeed` | `0` | Skip ALF on the highest N temporal layers; `0` filters all. |
| `--CCALF` | `1` | Cross-component ALF. |
| `--UseNonLinearAlfLuma` | `0` | Non-linear ALF for luma. |
| `--UseNonLinearAlfChroma` | `0` | Non-linear ALF for chroma. |
| `--MaxNumAlfAlternativesChroma` | `8` | Maximum alternative chroma ALF filters, 1–8. |
| `--ALFTempPred` | `-1` | Reuse ALF parameters from earlier pictures. `-1` auto (off with IFP). |
| `--ALFUnitSize` | `-1` | ALF search unit size; `-1` uses the CTU size. |
| `--PROF` | `1` | Prediction refinement with optical flow for affine blocks. |
| `--Affine` | `4` | Affine motion prediction: `0` off, `1`–`5` speed settings. |
| `--AffineType` | `1` | Allow the 6-parameter affine model. |
| `--MMVD` | `3` | Merge with motion vector difference: `0` off, `1`–`4` speed settings. |
| `--MmvdDisNum` | `6` | Number of MMVD distance entries. |
| `--AllowDisFracMMVD` | `1` | Allow disabling fractional MMVD distances per picture. |
| `--MCTF` | `2` | Motion-compensated temporal pre-filter (denoising): `0` off, `1` all frames, `2` off for detected screen content. |
| `--MCTFSpeed` | `2` | MCTF speed, `0` (best) to `4` (fastest). |
| `--MCTFUnitSize` | `-1` | MCTF block size, 8–32; `-1` uses 8 below 720 lines and 16 otherwise. |
| `--MCTFFutureReference` | `1` | Let MCTF use future frames. Turn off for low delay. |
| `--MCTFFrame` | none | Frames (POCs within the GOP) that MCTF filters; empty derives them from the GOP size and QP. |
| `--MCTFStrength` | none | Filter strength for each `MCTFFrame` entry; empty derives them from the QP. |
| `--BIM` | `1` | Block importance mapping: adjusts block QPs by how much later frames reference them, using MCTF motion data. Needs MCTF. |
| `--FastLocalDualTreeMode` | `1` | Fast intra coding for local dual trees: `0` off, `1` threshold, `2` one intra mode only. |
| `--QtbttExtraFast` | `3` | Extra partitioning speed-ups not in VTM, `0`–`7`. |
| `--FastTTSplit` | `5` | Fast ternary-split decisions, `0`–`7`. |
| `--SbTMVP` | `1` | Subblock-based temporal motion vector prediction. |
| `--CIIP` | `0` | Combined inter/intra prediction: `0` off, `1` full, `2` fast, `3` faster. |
| `--SBT` | `0` | Subblock transform for inter blocks: `0` off, `1` full, `2` fast, `3` faster. |
| `--LFNST` | `1` | Low-frequency non-separable transform. |
| `--MTS` | `0` | Explicit multiple transform selection. |
| `--MTSIntraMaxCand` | `3` | Additional MTS candidates tested in intra slices. |
| `--ISP` | `3` | Intra subpartitions: `0` off, `1` full, `2` fast, `3` faster. |
| `--TransformSkip` | `2` | Transform skip: `0` off, `1` on, `2` only for detected screen content. |
| `--TransformSkipLog2MaxSize` | `4` | Largest transform-skip block, log2, 2–5. |
| `--ChromaTS` | `0` | Transform skip for chroma (needs `TransformSkip`). |
| `--BDPCM` | `2` | Block DPCM: `0` off, `1` on, `2` only for detected screen content. |
| `--RPR` | `-1` | Reference picture resampling: `0` off, `1` on, `2` RPR-ready (for `cra_cre`/`idr_no_radl`). `-1` picks `2` for those refresh types, else `0`. |
| `--IBC` | `2` | Intra block copy: `0` off, `1` on, `2` only for detected screen content. |
| `--IBCFastMethod` | `3` | IBC speed-ups: `1` default, `2`–`6` faster. |
| `--BCW` | `0` | Bi-prediction with CU-level weights: `0` off, `1` on, `2` fast. |
| `--FastInferMerge` | `0` | Skip inter/intra modes after merge decisions: `0` off, `1`–`4` faster. |
| `--NumIntraModesFullRD` | `-1` | Intra modes evaluated with full RD cost, 1–3; `-1` auto. |
| `--ReduceIntraChromaModesFullRD` | `1` | Evaluate fewer chroma intra modes with full RD cost. |
| `--FirstPassMode` | `0` | Speed 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. |

</details>

<details>
<summary>Motion search options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--FastSearch` | `4` | Motion search: `0` full, `1` diamond, `3` enhanced diamond, `4` fast diamond. |
| `--FastSearchSCC` | `2` | Motion search for screen content: `0` same as `FastSearch`, `2` diamond SCC, `3` fast diamond SCC. |
| `-sr`, `--SearchRange` | `384` | Motion search range in luma samples. |
| `--BipredSearchRange` | `4` | Search range for bi-prediction refinement. |
| `--MinSearchWindow` | `96` | Minimum search window for adaptive search range. |
| `--ClipForBiPredMEEnabled` | `0` | Clip samples during bi-prediction motion estimation. |
| `--FastMEAssumingSmootherMVEnabled` | `1` | Fast motion estimation assuming a smooth motion field. |
| `--IntegerET` | `0` | Early termination of integer-pel motion search. |
| `--FastSubPel` | `1` | Sub-pel motion estimation: `0` normal, `1` fast, `2` disabled. |
| `--ReduceFilterME` | `2` | Interpolation filter taps during sub-pel refinement: `0` 8-tap, `1` 6-tap, `2` 4-tap. |

</details>

<details>
<summary>Loop filters (deblock and SAO)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--LoopFilterDisable` | `0` | Disable the deblocking filter. |
| `--LoopFilterOffsetInPPS` | `1` | Signal deblocking offsets in the PPS instead of slice headers. |
| `--LoopFilterBetaOffset_div2` | `0` | Luma deblocking β offset ÷ 2, −12 to 12; positive filters more, negative less. |
| `--LoopFilterTcOffset_div2` | `0` | Luma deblocking tC offset ÷ 2, −12 to 12; positive filters more, negative less. |
| `--LoopFilterCbBetaOffset_div2` | `0` | Cb deblocking β offset ÷ 2. |
| `--LoopFilterCbTcOffset_div2` | `0` | Cb deblocking tC offset ÷ 2. |
| `--LoopFilterCrBetaOffset_div2` | `0` | Cr deblocking β offset ÷ 2. |
| `--LoopFilterCrTcOffset_div2` | `0` | Cr deblocking tC offset ÷ 2. |
| `--DeblockLastTLayers` | `0` | Deblock only the highest N temporal layers; `0` deblocks all. |
| `--DisableLoopFilterAcrossTiles` | `0` | Do not filter across tile boundaries. |
| `--DisableLoopFilterAcrossSlices` | `0` | Do not filter across slice boundaries. |
| `--SAO` | `1` | Sample adaptive offset: `0` off, `1` on, `2` only for screen content pictures. `--fullhelp` prints `0`, but the presets turn SAO on. |
| `--SaoEncodingRate` | `-1` | Early SAO termination rate, 0–1; `-1` auto (0.75 single-threaded, 0 with threads). |
| `--SaoEncodingRateChroma` | `-1` | Early SAO termination rate for chroma; `-1` auto (0.5 single-threaded, 0 with threads). |
| `--SaoLumaOffsetBitShift` | `0` | Luma SAO offset bit shift; negative derives it from bit depth and QP. |
| `--SaoChromaOffsetBitShift` | `0` | Chroma SAO offset bit shift; negative derives it from bit depth and QP. |

</details>

<details>
<summary>Summary options (debugging)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--SummaryOutFilename` | none | Debug: write a summary file. |
| `--SummaryPicFilenameBase` | none | Debug: base name for per-slice-type summary files (`I.txt`, `P.txt`, `B.txt` appended). |
| `--SummaryVerboseness` | `0` | Debug: summary verbosity level. |

</details>

<details>
<summary>Reconstructed video options</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--ClipOutputVideoToRec709Range` | `0` | Clip the reconstructed YUV to the nominal Rec. 709 range when reducing bit depth. |
| `--PYUV` | `0` | Write the reconstructed 10/12-bit YUV packed (5 or 3 bytes per group). |

</details>

<details>
<summary>Tracing</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--tracechannellist` | `0` | List the trace channels. Tracing works only in builds configured with `VVENC_ENABLE_TRACING=ON`. |
| `--tracerule` | none | Debug: trace rule, e.g. `"D_CABAC:poc==8"`. Needs a tracing build. |
| `--tracefile` | none | Debug: trace output file. Needs a tracing build. |

</details>

<details>
<summary>Film grain analysis</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--fga` | `0` | Experimental film-grain analysis: estimates the source grain and writes a film grain characteristics (FGC) SEI so decoders that support it can re-synthesize grain. |

</details>

<details>
<summary>Custom GOP entries (config files; not listed by --fullhelp)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--Frame1` … `--Frame64` | none | Custom 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. |

</details>

<details>
<summary>vvencapp names also accepted by vvencFFapp (not listed by --fullhelp)</summary>

| Option | Default | Description |
| --- | --- | --- |
| `--tickspersec` | `27000000` | Same as `--TicksPerSecond`. |
| `--framerate` | `0` | Same as `FrameRate`. |
| `--frames` | `0` | Same as `FramesToBeEncoded`. |
| `--bitrate` | `0` | Same as `TargetBitrate`. |
| `--maxrate` | `0` | Same as `MaxBitrate`. |
| `--qpa` | `0` | Same as `PerceptQPA`. |
| `--internal-bitdepth` | `10` | Same as `InternalBitDepth`. |
| `--refreshtype` | `cra` | Same as `DecodingRefreshType`. |
| `--decodedpicturehash` | `off` | Same as `SEIDecodedPictureHash`. |

</details>

## Complete FFmpeg libvvenc private options

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.

<details>
<summary>All libvvenc private options</summary>

| Option | Type | Default | Description |
| --- | --- | --- | --- |
| `-preset` | `int` | `2` (`medium`) | `faster` (0), `fast` (1), `medium` (2), `slow` (3) or `slower` (4). |
| `-qp` | `int` | `32` | Base QP, −1 to 63, for constant-QP encoding; ignored when `-b:v` is set. |
| `-qpa` | `boolean` | `true` | Perceptual QP adaptation; `-qpa 0` turns it off. |
| `-passlogfile` | `string` | `unset` | Statistics file for two-pass encoding with `-pass 1` and `-pass 2`. Same option as `-stats`. |
| `-stats` | `string` | `unset` | Same as `-passlogfile`. |
| `-period` | `int` | `1` | Intra (random-access) period in seconds, 1 or more. Ignored with `-g 1`. |
| `-vvenc-params` | `dictionary` | `unset` | Library 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`. |
| `-level` | `string` | `unset` | Level such as `5.1`; unset chooses the level automatically. |
| `-tier` | `int` | `0` (`main`) | `main` (0) or `high` (1). |

</details>
