Skip to content

ECM

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

ECM (Enhanced Compression Model) is the reference software JVET uses to explore compression tools beyond VVC. JVET is the joint video team of ITU-T VCEG and ISO/IEC MPEG, and ECM is built on the VVC test model (VTM). The code is hosted at Fraunhofer HHI but is a joint effort, not an HHI codec.

ECM is a research platform, not a standard or a product. Its bitstreams are not VVC-compatible, can change between ECM versions, and play only in the matching ECM decoder. It is also far slower than production encoders. Use it to see what next-generation tools look like or to reproduce JVET results, not to encode video you want to keep.

The next standard is a separate process: in July 2026 ITU-T and ISO/IEC issued a joint Call for Proposals on video compression beyond VVC. Responses are evaluated in January 2027, and MPEG targets a first version of the new standard by the end of 2029.

The latest tag is ECM-20.0 (June 2026). The software is released under the BSD 3-clause licence.

ECM builds with CMake; build 64-bit. On Linux the binaries land in bin/ as EncoderAppStatic and DecoderAppStatic:

Terminal window
git clone -b ECM-20.0 https://vcgit.hhi.fraunhofer.de/ecm/ECM.git && cd ECM
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --parallel

The optional neural-network loop filter (-DEXTENSION_NNLF=ON) needs the SADL submodule and is off by default. The software manual is in doc/.

ECM reads raw planar YUV, so the source format goes on the command line. Start from a shipped configuration in cfg/ (random access is encoder_randomaccess_ecm.cfg) and override the input:

Terminal window
./bin/EncoderAppStatic -c cfg/encoder_randomaccess_ecm.cfg --InputFile=input.yuv \
--SourceWidth=1920 --SourceHeight=1080 --FrameRate=30 --FramesToBeEncoded=32 \
--InputBitDepth=10 --QP=32 --BitstreamFile=str.bin
./bin/DecoderAppStatic -b str.bin -o decoded.yuv
  • InputBitDepth defaults to 8, so set it for 10-bit input. The shipped configs code at InternalBitDepth: 10, and the decoder writes the stream’s native depth unless you pass -d 8.
  • QP (32 in the shipped config, range 0–51) is the usual way to sweep rate points.
  • The random-access config uses a GOP and intra period of 32, so encode a multiple of 32 frames.
  • The encoder also writes a reconstruction to rec.yuv (set in the config); override --ReconFile or ignore it.

Results from ECM only mean something relative to the ECM or VTM revision and configuration they were measured with, so name the tag when you quote numbers.