← Immersive Audio Model and Formats (IAMF) decoding support
v153 · media · audio · shipped
the iamf.* codecs parameter
The codecs string that tells MSE an MP4 source contains an IAMF immersive-audio track — its grammar, profile fields, sub-codec elements, and exactly how Chromium's parser accepts or rejects it. Defined by IAMF §6.4 on top of RFC 6381; parsed in Chromium by ParseIamfCodecId. Identity: chromestatus.com/feature/5113656292540416.
This string only reports supported where the IAMF build and the kIamfAudioDecoding runtime feature allow it — see the overview warn-block for the current flag state and the v152/v153 dual listing.
grammar
Per IAMF §6.4, the codecs parameter string for an IAMF track SHALL be:
iamf.<primary_profile>.<additional_profile>.<sub-codec codecs elements>
- The first element is the fourcc
iamf. - The second element indicates the
primary_profile— three digits in the range 0 to 255. - The third element indicates the
additional_profile— three digits in the range 0 to 255. - The fourth element (and any additional elements) SHALL be the elements of the codecs parameter string the stream would carry in its own track, unencapsulated.
The spec's own examples: iamf.xxx.yyy.Opus, iamf.xxx.yyy.mp4a.40.2, iamf.xxx.yyy.fLaC, iamf.xxx.yyy.ipcm, where xxx/yyy are the three-digit profile fields.
field reference
| Field | Contract |
|---|---|
primary_profile | Three decimal digits, 0–255. Values: 0 = IA Simple Profile, 1 = IA Base Profile, 2 = IA Base-Enhanced Profile (added in IAMF v1.1.0), 3–255 reserved for future profiles. Simple and Base comply with IAMF v1.0.0-errata. |
additional_profile | Same three-digit mapping. An additional profile the IA Sequence complies with; if the sequence only complies with the primary profile, this field SHALL be set to the same value as primary_profile (hence e.g. iamf.000.000.opus). |
| sub-codec element(s) | The codecs string of the audio stream as if carried in its own track: opus (Opus), mp4a.40.2 (AAC-LC — object type indication 40, audio object type 2), fLaC (FLAC), ipcm (LPCM). |
chromium parser behavior
Chromium's ParseIamfCodecId (compiled when IAMF audio is enabled) accepts a string as IAMF when:
- it starts with
iamf— and, “for test purposes only”, the bare stringiamfwith no further elements is accepted; - otherwise it must split into at least four period-delimited elements:
iamf, a three-digit primary profile ≤ 255, a three-digit additional profile ≤ 255, and a sub-codec element; - the sub-codec element (lower-cased) must be exactly
opus,mp4a,flac, oripcm; formp4atwo further elements are required — object type indication hex40and audio object type hex2(i.e. AAC-LC); - the whole string is length-capped (fourcc + two profile fields + one sub-codec element at most).
Strings that fail parsing are simply not recognized as IAMF (support queries fall through to “unrecognized codec id”). A code comment (crbug.com/438106645) records that profile handling after parsing is still to be completed, “especially if [IAMF streams] end up containing xHE-AAC audio” — so profile fields currently identify the family rather than gate fine-grained capability.
Source: audio_codecs.cc — ParseIamfCodecId; mime_util_internal.cc — fetched 2026-07-29.examples
| String | Reading |
|---|---|
iamf.000.000.opus | Simple profile only, Opus substream — the minimal modern spelling |
iamf.001.001.mp4a.40.2 | Base profile, AAC-LC substream |
iamf.000.000.fLaC | Simple profile, FLAC substream (case per the spec's example) |
iamf.000.000.ipcm | Simple profile, LPCM (uncompressed) substream |
iamf.002.002.opus | Base-Enhanced profile (IAMF v1.1.0), Opus substream |
Rejected by the Chromium parser (non-exhaustive): iamf.0.0.opus (profile fields must be three digits), iamf.256.000.opus (profile > 255), iamf.000.000.vorbis (sub-codec not in the accepted set), iamf.000.000.mp4a (mp4a requires the 40.2 fields), and any string with extra elements beyond the length cap.
// Feature-detect a specific packaging before fetching media:
const candidates = [
'audio/mp4; codecs="iamf.000.000.opus"',
'audio/mp4; codecs="iamf.001.001.mp4a.40.2"',
];
const supported = candidates.find((m) => MediaSource.isTypeSupported(m));
if (!supported) throw new Error('no supported IAMF packaging');
const sourceBuffer = mediaSource.addSourceBuffer(supported);
Source: grammar per IAMF §6.4; acceptance/rejection behavior per ParseIamfCodecId.
usage context
The parameter appears wherever an MP4 MIME type is declared for MSE: MediaSource.isTypeSupported(mime) support queries and MediaSource.addSourceBuffer(mime). Chromium registers the iamf and iamf.* codec patterns for both audio/mp4 and video/mp4 containers (stream_parser_factory.cc), so an IAMF audio track can ride alongside video in the same MP4 or be delivered audio-only. It has no meaning for direct file playback (<audio src>), which does not route through the IAMF-capable parser in the sources read — delivery is MSE-only, matching the explainer’s framing (“zero changes to existing MSE workflows”).
compatibility
Interim table. No BCD or web-features entry exists for the iamf codecs string (2026-07-29); rows are compiled from the linked primary sources.
| Browser | Support | Evidence |
|---|---|---|
| Chrome | 153 (desktop, Android, WebView) per listing; flag-state caveat applies | milestone=153 listing; flag state |
| Edge | Not separately reported | Chromium-based; no separate position on the record |
| Firefox | No signal | ChromeStatus API record |
| Safari | No signal | ChromeStatus API record |
security and privacy
- The string is declarative metadata: it describes the bitstream a page intends to append and reveals nothing about the user beyond the same codec-support bit every MSE codec exposes.
- Parser robustness for malformed strings is bounded — unknown or malformed values fail closed (treated as unsupported) rather than producing partial matches.
- The bitstream-level security considerations (software decoding of remote media) are covered on the overview.