# ECM

Canonical URL: https://encode.wiki/codecs/video/ecm/
Content version: ca42e61ede0a24f789d7287a0001244ad22f4abf
Status: current
License: CC BY-SA 4.0
Checksum (SHA-256): c4b1c8dc86f7acb8dc3e0c31a5f218c57cf04882eed885a9f9a7c38063d63135

ECM (Enhanced Compression Model) is the reference software JVET uses to explore compression tools beyond [VVC](/codecs/video/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.

## Build

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

```sh
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/`.

## 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:

```sh
./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.
