ECM
37c3317fd058; modified for Encode Wiki · CC BY-SA 4.0ECM (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:
git clone -b ECM-20.0 https://vcgit.hhi.fraunhofer.de/ecm/ECM.git && cd ECMcmake -S . -B build -DCMAKE_BUILD_TYPE=Releasecmake --build build --parallelThe optional neural-network loop filter (-DEXTENSION_NNLF=ON) needs the SADL submodule and is off by default. The software manual is in doc/.
Encode and decode
Section titled “Encode and decode”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:
./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.yuvInputBitDepthdefaults to 8, so set it for 10-bit input. The shipped configs code atInternalBitDepth: 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--ReconFileor 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.