# VTM

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

> **Repository:** [jvet/VVCSoftware_VTM](https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM). VVC VTM reference software. Latest release: [VTM-24.0](https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/releases/VTM-24.0), Apr 8, 2026. Last commit: Jun 30, 2026. License: BSD-3-Clause.

VTM (VVC Test Model) is the reference encoder and decoder for [H.266 / VVC](/codecs/video/vvc/), developed by JVET. It exists to define and test the standard: it produces conformance bitstreams, is the anchor for evaluating coding tools, and is the base for research on new ones.

It is not a practical encoder. VTM is single-threaded and extremely slow; Fraunhofer's benchmarks put [VVenC](/tools/software-encoders/vvenc/)'s `medium` preset, with 8 threads, at roughly 280× (HD) to 380× (UHD) the speed of VTM-19.2, with compression close to VTM's. For real VVC encodes use VVenC or [uvg266](/tools/software-encoders/uvg266/). The HEVC and AVC equivalents are [HM](/tools/software-encoders/hm/) and [JM](/tools/software-encoders/jm/).

## Build

The current release is `VTM-24.0` (April 2026). Build a 64-bit binary with CMake:

```sh
git clone --branch VTM-24.0 https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM.git
cd VVCSoftware_VTM
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel
```

Current GCC (16) stops on new warnings because the project builds with `-Werror`; add `-DCMAKE_CXX_FLAGS=-w` to the first `cmake` command to get past them. On Linux the build copies `EncoderAppStatic` and `DecoderAppStatic` into `bin/`. OpenSSL is only needed for signed-content SEI messages. The software manual is in `doc/`.

## Encode a file

VTM reads Y4M (recognised by the `.y4m` extension, which supplies size, frame rate and bit depth) or raw planar YUV. Coding settings come from a config file; `cfg/` has `encoder_randomaccess_vtm.cfg`, `encoder_lowdelay_vtm.cfg` and `encoder_intra_vtm.cfg`.

```sh
./bin/EncoderAppStatic -c cfg/encoder_randomaccess_vtm.cfg -i input.y4m -b stream.266 -o recon.yuv -q 32
./bin/DecoderAppStatic -b stream.266 -o decoded.yuv
```

For raw YUV, add `-wdt 1280 -hgt 720 -fr 24` and `--InputBitDepth=10` for 10-bit input. `-f` limits the frame count. `-q` is a fixed QP; JVET's common test conditions use 22, 27, 32 and 37. The shipped configs code at 10 bits internally, so `recon.yuv` and the decoded output are 10-bit even for 8-bit input. The decoded output should match `recon.yuv` exactly. The random-access config uses a 32-frame GOP with the intra period set as a multiple of 32 based on frame rate (`IntraPeriod`). There is a basic rate control (`RateControl`, `TargetBitrate`), off by default.

The output is a bare VVC elementary stream. Mux it with [FFmpeg](/tools/utilities/ffmpeg/) or [MP4Box](/tools/utilities/mp4box/) if you need a container.
