Skip to content

VTM

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

jvet/VVCSoftware_VTM

vcgit.hhi.fraunhofer.de

VVC VTM reference software

Latest release
VTM-24.0
Last commit
License
BSD-3-Clause

VTM (VVC Test Model) is the reference encoder and decoder for H.266 / 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’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. The HEVC and AVC equivalents are HM and JM.

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

Terminal window
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/.

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.

Terminal window
./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 or MP4Box if you need a container.