{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/tools/software-encoders/vtm",
  "collection": "docs",
  "title": "VTM",
  "description": "VTM is the JVET reference software for VVC, used for conformance and standards research rather than for practical encoding.",
  "canonicalUrl": "https://encode.wiki/tools/software-encoders/vtm/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/tools/software-encoders/vtm.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/tools/software-encoders/vtm.md",
  "status": "current",
  "tags": [
    "migrated"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "VTM-24.0 README (build instructions)",
      "url": "https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/blob/VTM-24.0/README.md",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "VTM-24.0 random-access configuration",
      "url": "https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/blob/VTM-24.0/cfg/encoder_randomaccess_vtm.cfg",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "VTM-24.0 encoder options (EncAppCfg.cpp)",
      "url": "https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/blob/VTM-24.0/source/App/EncoderApp/EncAppCfg.cpp",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "VTM-24.0 YUV and Y4M file I/O (VideoIOYuv.cpp)",
      "url": "https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/blob/VTM-24.0/source/Lib/Utilities/VideoIOYuv.cpp",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "VVenC encoder performance (speed and BD-rate versus VTM)",
      "url": "https://github.com/fraunhoferhhi/vvenc/wiki/Encoder-Performance",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "provenance": {
    "originUrl": "https://github.com/av1-community-contributors/codec-wiki/blob/37c3317fd058b23c71a87679bed5619a98f77752/docs/encoders/VTM.mdx",
    "originCommit": "37c3317fd058b23c71a87679bed5619a98f77752",
    "migratedAt": "2026-08-21T00:00:00.000Z",
    "modified": true,
    "originPath": "docs/encoders/VTM.mdx"
  },
  "headings": [
    {
      "depth": 2,
      "text": "Build",
      "anchor": "build"
    },
    {
      "depth": 2,
      "text": "Encode a file",
      "anchor": "encode-a-file"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/vtm/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/vtm/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/vtm/_preamble.md",
      "checksum": "f590946eafcbc3ddb5da02255c88aee053048a324a15ebb3bb38769a658060a6",
      "bytes": 1028
    },
    {
      "id": "build",
      "title": "Build",
      "depth": 2,
      "anchor": "build",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/vtm/#build",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/vtm/build.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/vtm/build.md",
      "checksum": "67c1fd2863f7eaf68d9726a9f59fabe14ec0cfd3b9632d6a6bb7903f71d7ea5f",
      "bytes": 613
    },
    {
      "id": "encode-a-file",
      "title": "Encode a file",
      "depth": 2,
      "anchor": "encode-a-file",
      "canonicalUrl": "https://encode.wiki/tools/software-encoders/vtm/#encode-a-file",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/vtm/encode-a-file.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/tools/software-encoders/vtm/encode-a-file.md",
      "checksum": "083d3e6bd3fba6fa53be044fb01069a5afd033a5a720ef3ca6fc94ec89315558",
      "bytes": 1169
    }
  ],
  "outboundReferences": [
    "/codecs/video/vvc/",
    "/tools/software-encoders/hm/",
    "/tools/software-encoders/jm/",
    "/tools/software-encoders/uvg266/",
    "/tools/software-encoders/vvenc/",
    "/tools/utilities/ffmpeg/",
    "/tools/utilities/mp4box/",
    "https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM",
    "https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/releases/VTM-24.0"
  ],
  "checksum": "9608f02bba029bbef1c6caff5a4455b5d8ab930beb9050fbfa147ecc70d74b44",
  "contentFormat": "markdown",
  "markdown": "> **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.\n\nVTM (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.\n\nIt 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/).\n\n## Build\n\nThe current release is `VTM-24.0` (April 2026). Build a 64-bit binary with CMake:\n\n```sh\ngit clone --branch VTM-24.0 https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM.git\ncd VVCSoftware_VTM\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Release\ncmake --build build --parallel\n```\n\nCurrent 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/`.\n\n## Encode a file\n\nVTM 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`.\n\n```sh\n./bin/EncoderAppStatic -c cfg/encoder_randomaccess_vtm.cfg -i input.y4m -b stream.266 -o recon.yuv -q 32\n./bin/DecoderAppStatic -b stream.266 -o decoded.yuv\n```\n\nFor 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.\n\nThe output is a bare VVC elementary stream. Mux it with [FFmpeg](/tools/utilities/ffmpeg/) or [MP4Box](/tools/utilities/mp4box/) if you need a container.\n"
}
