iamf-sentinel — the free IAMF conformance check the ecosystem doesn't have
Code comments throughout cite an internal numbered design docset (doc NN), ADRs, and pre-registered expectation labels — DESIGN-NOTES.md explains the notation and indexes every cited document.
One line for CI: iamf-sentinel tells your pipeline whether an IAMF file is correct —
structurally, semantically, and against a platform profile — and returns a stable exit code and a
citable list of check IDs. Pure standard-library Python; drops into any CI job with no procurement,
no native build, no toolchain.
Scope. Checks are written against the AOM IAMF v1.1.0 specification and ISO/IEC 14496-12, and cross-checked against the AOM reference tools. The tool is spec- and reference-validated, not platform-certified: a
--profilename (e.g.youtube) applies the publicly-known shape constraints for that target, not a guarantee of acceptance by that platform's private ingest pipeline. A clean report means "conformant to the spec and the references" — necessary, but not by itself sufficient for any given platform.
Why this exists
A syntactically valid, fully decodable IAMF file can ship with two height channels silently missing
and C/LFE duplicated into the surrounds — produced by plausible CLI usage, and passed clean by the
encoder, the muxer, and both AOM reference decoders. Nothing in the ecosystem flags it. This tool
does (check S-201). The encode side self-certifies and the content-QC burden falls entirely on
publishers who have had no tooling — this is that tooling, and it is free to run and free to cite.
Install
pip install iamf-sentinel # pure stdlib, Python ≥ 3.11 — no third-party runtime deps
Run
sentinel validate path/to/file.iamf # raw .iamf or IAMF-in-MP4
sentinel validate movie.mp4 --profile generic --format html -o report.html
sentinel validate file.iamf --format json # CI: machine-readable findings
sentinel batch ./deliverables # directory roll-up, worst-exit for CI
sentinel diff a.iamf b.mp4 # descriptor-structure diff (remux proof)
sentinel checks -v # list the stable check registry
Exit codes (the CI contract): 0 pass · 1 findings at/above threshold · 2 execution error.
--strict promotes WARN to failing. batch returns the worst exit across the tree.
Validate in a browser — zero install
The same core also runs client-side as a WASM inspector: a single self-contained HTML page
that validates and inspects an IAMF file in a browser tab. The file is parsed in-tab and never
leaves your machine. Build it with python3 wasm/make_inspector.py (produces
iamf-inspector.html); a native-vs-browser differential gate keeps the embedded core
finding-identical to this package.
What the free core checks
- L1 — structural (clean-room OBU parser, written from the AOM IAMF v1.1.0 spec). Every read is bounds-checked; truncated or fuzzed input yields a structured finding, never a crash (a 63k-call bounded-fuzz acceptance pass: no hangs, no uncaught exceptions).
- L2 — channel semantics (the corruption killer). Substream topology vs declared layout (coupled-pairs-first invariant), coupled/mono sanity, ambisonics (N+1)²/ACN completeness, dropped/duplicated/spurious substreams, annotation-presence.
- Descriptor-level loudness & container checks that need no decoder. Unmeasured
0.0loudness, stereo-only loudness on multichannel programs, declared clipping, RFC 6381 codec-string casing, IAMF brand / fast-start / sample-entry, ISO-BMFFiacbextraction so L1/L2 run on IAMF-in-MP4 exactly as on raw.iamf. - The CI contract. Stable check-ID taxonomy (
S-1xxstructural /S-2xxsemantic /S-3xxloudness /S-4xxcontainer), FAIL/WARN/INFO severities,json | text | htmlreports, and a declarativegenericprofile. This is the surface you cite: "passes iamf-sentinelS-1xx…S-4xxat v0.3.0."
What's in the Pro plugin (iamf-sentinel-pro) — also free, Apache-2.0
The core reads the file. The L3 rendered QC plugin decodes it and measures the truth (it is a separate package for architecture, not licensing: the core stays stdlib-pure and CI-frictionless; the decoder oracles, DSP, and their dependencies live behind the seam):
- Decode each mix presentation × declared layout through the reference decoders (as subprocess oracles) and measure BS.1770-4 integrated loudness and true peak with an independent, calibrated implementation — catching declared-vs-measured loudness lies that descriptor checks can't see.
- Channel-identity on decoded PCM — catches the pure essence-misroute corruption (descriptor-clean, PCM-scrambled) that even L2 cannot see from the bitstream alone.
- Platform profile packs (e.g. YouTube ingest) and the loudness-measurement calibration that keeps correct files from being flagged at tight tolerances.
sentinel validate --l3, diff --render, and batch --l3 activate automatically when the plugin is
installed; without it they print a one-line "requires iamf-sentinel-pro" notice and the free checks
still run. See the pro repo's
PLUGIN_SEAM.md
for the exact boundary.
Fixtures
fixtures/ ships the clean-room IAMF serializer, the mutation suite (topology / drop / dup /
ambisonics / truncation), and the corpus generator — so you can reproduce every check and build your
own regression corpus. These are part of the free core on purpose: they make the checks auditable and
the check IDs trustworthy.
Traceability
F_TO_CHECK.md maps the executed WP1/WP3 failure catalogue to the checks that catch each one —
the requirements trail and the acceptance test in one table.
Related projects
iamf-sentinel-pro— L3 rendered-QC plugin: decoder oracles, BS.1770-4 measurement, ADM fidelity, platform profile packsiamf-loom— manifest-driven IAMF packager; every output is gated by this validatoriamf-adm-corpus— synthetic ADM corpus + harness (the input-side instrument; this validator is the output-side one)iamf-sentinel-mcp— MCP server exposing the validator and packager to agent runtimes
License & support
Apache-2.0 (see LICENSE / NOTICE) — and not just this core: the whole stack is free
software under Apache-2.0 — this package, the iamf-sentinel-pro plugin (L3 rendered QC,
ADM fidelity, profile packs), the sentinel-dsp measurement kernel, and the Loom
manifest-driven packager. The parser and all checks are original clean-room works written
from the AOM IAMF v1.1.0 spec and ISO/IEC 14496-12; no reference-decoder or encoder source
is used or derived. Reference decoders are invoked only as subprocess oracles, and only by
the separate -pro plugin.
This is an independent project, not an AOM deliverable; "IAMF" appears throughout as descriptive nominative use of the format name, not as a product name.
Maintained best-effort; commercial support and consulting are available — see
SUPPORT.md.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file iamf_sentinel-0.3.0.tar.gz.
File metadata
- Download URL: iamf_sentinel-0.3.0.tar.gz
- Upload date:
- Size: 53.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3161fa9c336ff2b82aaf5bca2c588a0d5f7acf7d6fa4fce576fb645ef4483d9c
|
|
| MD5 |
93fbc7181a0afb2759d2d37ff9303868
|
|
| BLAKE2b-256 |
5105070cd5230c43102f7b991497e3cca42bf44f84cdec4dbd3d9502ac7c4aa2
|
File details
Details for the file iamf_sentinel-0.3.0-py3-none-any.whl.
File metadata
- Download URL: iamf_sentinel-0.3.0-py3-none-any.whl
- Upload date:
- Size: 52.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ffb02887a16564aa8668246089cd4c13e60f9fce57b183d8c314a3de6d9f7e7
|
|
| MD5 |
47d8f6837353ff6bfeb1ef5322843c81
|
|
| BLAKE2b-256 |
3330df427d3f2a446769ffce8a31e238c23cbf809ec0123fc99bf56111e2104f
|