Compatibility (FATE)
Live decode compatibility — measured against FFmpeg's own FATE suite on two axes, coverage and byte-for-byte correctness, charted per codec.
wasmpeg is tracked against FFmpeg’s FATE regression suite — the same samples FFmpeg uses to test itself — on two axes:
- Coverage — does a sample decode without erroring? (
tests/compat.mjs→COMPAT.md) - Correctness — does every decoded frame match FFmpeg’s reference output byte-for-byte?
(
tests/fate.mjs→CORRECTNESS.md)
Correctness is the number that matters: not “does it run,” but “does it produce the exact right pixels.” The figures below are read from those reports at build time, so they track the repository.
| Codec | Type | Pass | Total | Rate |
|---|---|---|---|---|
other | video | 271 | 364 | |
h264 | video | 209 | 212 | |
aac | audio | 94 | 95 | |
exr | video | 74 | 74 | |
pcm | video | 36 | 63 | |
wavpack | video | 30 | 30 | |
ac3 | audio | 25 | 26 | |
utvideo | video | 23 | 23 | |
vorbis | audio | 23 | 23 | |
amr | audio | 18 | 18 | |
mpeg2 | video | 4 | 17 | |
jpeg2000 | video | 16 | 16 | |
hevc | video | 15 | 15 | |
bmp | video | 14 | 14 | |
hap | video | 13 | 13 | |
prores | video | 12 | 12 | |
vc1 | video | 5 | 11 | |
png | video | 10 | 10 | |
dnxhd | video | 3 | 9 | |
lagarith | video | 9 | 9 | |
mpeg4 | video | 8 | 9 | |
qtrle | video | 9 | 9 | |
vp6 | video | 9 | 9 | |
canopus | video | 8 | 8 | |
g723 | video | 8 | 8 | |
tiff | video | 5 | 8 | |
dts | audio | 6 | 7 | |
magicyuv | video | 7 | 7 | |
psd | video | 7 | 7 | |
webp | video | 7 | 7 | |
bink | audio | 6 | 6 | |
gif | video | 6 | 6 | |
jpegls | video | 4 | 6 | |
mss2 | video | 6 | 6 | |
ape | video | 5 | 5 | |
mjpeg | video | 5 | 5 | |
truehd | video | 5 | 5 | |
musepack | audio | 2 | 4 | |
sipr | audio | 4 | 4 | |
vp8 | video | 4 | 4 | |
cfhd | video | 3 | 3 | |
svq3 | video | 3 | 3 | |
theora | video | 3 | 3 | |
vp9 | video | 3 | 3 | |
wmav | audio | 3 | 3 | |
atrac | audio | 2 | 2 | |
dolby_e | audio | 2 | 2 | |
dpx | video | 2 | 2 | |
flac | video | 2 | 2 | |
gsm | video | 2 | 2 | |
mp3 | video | 2 | 2 | |
msvideo1 | video | 2 | 2 | |
svq1 | video | 2 | 2 | |
tta | audio | 1 | 2 | |
vp7 | video | 2 | 2 | |
wmapro | audio | 2 | 2 | |
wmv3 | video | 2 | 2 | |
alac | video | 1 | 1 | |
av1 | video | 0 | 1 | |
cinepak | video | 1 | 1 | |
cook | audio | 1 | 1 | |
dsf | audio | 0 | 1 | |
g722 | video | 1 | 1 | |
g728 | audio | 1 | 1 | |
imc | audio | 1 | 1 | |
nellymoser | audio | 1 | 1 | |
opus | video | 1 | 1 | |
qcelp | audio | 1 | 1 | |
qdm2 | audio | 1 | 1 | |
ra_288 | audio | 1 | 1 | |
ra4 | audio | 1 | 1 | |
shorten | video | 1 | 1 | |
tga | video | 0 | 1 | |
truespeech | audio | 1 | 1 | |
twinvq | audio | 1 | 1 | |
vp3 | video | 1 | 1 |
Why FATE
FATE is FFmpeg’s own regression suite — the set of real-world and synthetic samples its maintainers use to catch decode regressions. Testing wasmpeg against the same samples means the bar is FFmpeg’s bar, not one we picked to flatter the numbers. The vendored reference output that correctness compares against comes straight from FFmpeg, so a passing correctness test means wasmpeg agrees with upstream FFmpeg on that exact file.
What “coverage” means
A coverage test passes if the sample decodes without erroring — the demuxer opens it, the decoder accepts every packet, and frames come out. It says nothing about whether those frames are correct; it’s the “does it run” bar. High coverage means you can throw real-world files at wasmpeg and expect them to play.
What “correctness” means
A correctness test is far stricter: every decoded frame’s checksum must be byte-identical to FFmpeg’s own reference output. One off-by-one pixel anywhere in the clip fails the whole test. This is the bar that tells you wasmpeg produces the same image FFmpeg would — the number that actually matters for anything pixel-sensitive (thumbnails, frame extraction, visual diffing).
Correctness is only measured on pure-decode video tests, so its codec list is smaller than coverage (which includes audio and container handling too).
Why the two bars differ
A codec can sit at 100% coverage but lower correctness. That’s expected and not a red flag — it usually means the decoder runs end-to-end but diverges on something subtle: chroma rounding, an uncommon bit-depth, or a profile/feature that isn’t fully implemented. The clip still decodes and looks right to the eye; it just isn’t bit-exact.
Reading the chart
Each bar is a codec’s pass rate, colored by how high it is:
- Emerald (≥95%) — effectively complete.
- Sky (≥80%) — solid, with a few edge cases.
- Amber (≥50%) — partial; works for common files, gaps on specific profiles.
- Rose (below 50%) — early or limited support.
A low bar almost always points at a specific feature, not the whole codec — e.g. one
interlaced profile or a rare pixel format among many that pass. The pass/total count next to
each bar shows how many samples that represents.
Choosing wasmpeg for your codec
- Find your codec in the coverage chart — green or sky means everyday files will decode.
- If you need exact pixels, check the correctness chart for the same codec.
- A low or missing bar isn’t a dead end: try a real sample, and if it fails, open an issue with the file — many gaps are narrow and quick to close.
For the full per-test breakdown see
COMPAT.md and
CORRECTNESS.md in the repo,
and the list of compiled codecs for what’s in the build at all.