v153 · media · audio · shipped
Immersive Audio Model and Formats (IAMF) decoding support
Native decoding and playback of the Immersive Audio Model and Formats (IAMF) — the Alliance for Open Media's open, royalty-free spatial audio format — inside HTML media elements via Media Source Extensions (MSE). IAMF bitstreams carry channel-based, scene-based, and object-based audio presentations in an MP4 container; the browser demuxes and decodes them with the built-in iamf_tools software decoder and renders to the device's headphone or speaker layout. There is no new JavaScript API: existing MSE workflows gain a new supported codecs string family, iamf.*.
- Listed twice. The same feature id appears in the milestone=152 listing as “In developer trial (Behind a flag)” and in the milestone=153 listing as “Enabled by default” (both verified 2026-07-29). gendn files the reference under the ship milestone (v153) and treats the listing as authoritative for identity.
- Flag state does not visibly match the listing. The media feature
kIamfAudioDecodingisFEATURE_DISABLED_BY_DEFAULTat trunk and on the M153 branch (branch-heads/7978), both fetched 2026-07-29; there is no about://flags entry and nofieldtrial_testing_config.jsonentry. The build configuration records that “actual usage depends on thekIamfAudioDecodingfeature flag”. The server-side rollout state that reconciles this with “Enabled by default” is not visible in public source — checkchrome://media-internalsor the flag before assuming availability in a given build. For local testing, launch Chrome with--enable-features=IAMFAudioDecoding. - MSE only. The IAMF path is wired through the MSE MP4 stream parser (
has_iamfin the chunk-demuxer path); the FFmpeg-based demuxer used for direct<audio src>/<video src>file playback has no IAMF handling in the sources read. Plan on MSE delivery. - No encrypted IAMF. The decoder rejects encrypted configurations (
kUnsupportedEncryptionMode) — IAMF content cannot be played through EME on this path.
at a glance
| What it is | Browser-native decoding of IAMF (Immersive Audio Model and Formats) audio tracks packaged in ISO-BMFF (MP4), exposed through the standard MSE pipeline |
|---|---|
| Milestone listing | Chrome 153 — Enabled by default (listing, verified 2026-07-29; also in the v152 listing as a developer trial — see the warn-block) |
| Developer surface | No new JS API. MediaSource.isTypeSupported() and addSourceBuffer() accept audio/mp4/video/mp4 with an iamf.* codecs parameter; playback, controls, and events are the ordinary HTML media element ones |
| Container | ISO-BMFF MP4; the track's sample description carries an IA Sample Entry (AudioSampleEntry('iamf')) with a mandatory IA Configuration Box (iacb) holding the descriptor OBUs |
| Profiles | 0 = Simple, 1 = Base (both per IAMF v1.0.0-errata), 2 = Base-Enhanced (added in v1.1.0); 3–255 reserved |
| Sub-codecs in IAMF | Opus (opus), AAC-LC (mp4a.40.2), FLAC (fLaC), LPCM (ipcm) |
| Rendering | Software decode via iamf_tools; output mixed for the device's layout — mono, stereo (incl. binaural for headphones), 5.1, 7.1; 5.1.4 and 7.1.4 only when the separately-gated high-channel-layout support is enabled, otherwise discrete 10/12-channel |
| Encrypted content | Not supported — encrypted configurations are rejected during decoder initialization |
| WPT | None found (2026-07-29); Chromium exercises the path with its own test bitstreams |
| ChromeStatus | 5113656292540416 — Immersive Audio Model and Formats (IAMF) decoding support (Blink component Blink>Media>Audio; tracking bug crbug.com/535279329) |
reference routes
the iamf.* codecs parameter
Full grammar of the codecs string — profile fields, sub-codec elements, valid and invalid examples, and how Chromium parses it for isTypeSupported().
why it exists
Before native IAMF support, sites wanting immersive audio had two main options, per the feature explainer:
- License proprietary spatial formats — which can impose royalty costs on hardware manufacturers and fragment the ecosystem.
- Build complex Web Audio node graphs in application JavaScript to simulate immersiveness — significant development effort, and the result does not travel as a single standard bitstream.
IAMF is the Alliance for Open Media's answer: an open, royalty-free container-and-model standard for channel-based, scene-based (Ambisonics), and object-based audio, with a reference implementation (iamf-tools) that Chrome embeds. Native decoding lets the browser render one standard bitstream to arbitrary headphone and surround-speaker setups, so media providers only need to package content with an IAMF-enabled encoder. The explainer notes that initial support focuses on royalty-free multichannel beds and surround audio, with native object-based streams (elements repositioned in real time) planned for future iterations.
Source: Native IAMF MP4 Playback explainer; ChromeStatus API record — summary.how it works: container and playback path
IAMF reaches the renderer as an audio track inside a standard MP4 file, per IAMF §6 (IAMF in ISO-BMFF):
- The track's sample description box (
stsd) carries an IA Sample Entry —AudioSampleEntry('iamf')— which contains a mandatory IA Configuration Box (iacb,configurationVersion = 1) holding the sequence's descriptor OBUs. (The explainer loosely callsiacbthe “sample entry descriptor box”; per the spec the sample entry type isiamfandiacbis the configuration box inside it.)
The encapsulation in spec syntax (IAMF §6.2, quoted):
class IASampleEntry extends AudioSampleEntry('iamf') {
IAConfigurationBox ia_configuration_box;
}
class IAConfigurationBox extends Box('iacb') {
unsigned int (8) configurationVersion = 1;
leb128() configOBUs_size;
unsigned int (8 x configOBUs_size) configOBUs;
}
Playback path, end to end:
- The page appends MP4 segments through MSE:
MediaSource.isTypeSupported()→addSourceBuffer()→SourceBuffer.appendBuffer(). When the declared codecs string matchesiamf/iamf.*, Chromium's MSE stream-parser factory builds its MP4 stream parser withhas_iamf = true(stream_parser_factory.cc). - The demuxed IA Samples feed
IamfAudioDecoder, a software decoder built on the bundlediamf_toolslibrary (built in by default —media_use_iamf_tools = truein media_options.gni; no platform/hardware IAMF path is enabled,enable_platform_iamf_audio = false). - The decoder renders to a target hardware layout: it decodes for the device's output layout, emitting signed-32-bit PCM, and records whether it down-mixed, up-mixed, or passed the mix through. Direct file playback (
<audio src>) does not use this path — the FFmpeg demuxer has no IAMF handling in the sources read — so delivery is via MSE.
syntax: the codecs parameter
The developer-facing string is the codecs parameter of the MSE MIME type, defined by IAMF §6.4 on top of RFC 6381:
iamf.<primary_profile>.<additional_profile>.<sub-codec elements>
# e.g. IAMF (simple profile only) carrying an Opus substream:
audio/mp4; codecs="iamf.000.000.opus"
Profile fields are three digits each (0–255): 0 Simple, 1 Base, 2 Base-Enhanced, 3–255 reserved. The sub-codec element is the codecs string the stream would have outside IAMF: opus, mp4a.40.2 (AAC-LC), fLaC, or ipcm. The full field-by-field grammar, Chromium's parser rules, and worked valid/invalid strings are on the child page: the iamf.* codecs parameter.
decoding and rendering behavior
Once a stream initializes, IamfAudioDecoder (iamf_audio_decoder.cc) imposes a concrete behavior contract:
| Aspect | Behavior (from source) |
|---|---|
| Initialization rejects | Non-IAMF codec (kUnsupportedCodec); any encrypted configuration (kUnsupportedEncryptionMode); missing descriptor extra-data (kUnsupportedConfig, “requires extra_data descriptors”) |
| Output format | Signed 32-bit little-endian PCM (kInt32LittleEndian is verified at init) |
| Output layouts | IAMF output layouts map to Chromium channel layouts: mono (Sound System Extension 0.1.0); stereo (ITU 0.2.0 and IAMF binaural — headphone rendering arrives as stereo); 5.1 (Sound System B 0.5.0); 7.1 (Sound System I 0.7.0) |
| High channel counts | 5.1.4 (Sound System D 4.5.0) and 7.1.4 (Sound System J 4.7.0) map to the high-channel layouts only when kEnableHighChannelLayouts is enabled — itself FEATURE_DISABLED_BY_DEFAULT at trunk (2026-07-29); otherwise the stream falls back to discrete 10- or 12-channel output |
| Mix reporting | Decoder records down-mix / up-mix / no-mix against the configured output layout via UMA; other IAMF layouts log an “Unsupported IAMF layout” warning and fail initialization |
| Sample-rate / frame limits | Output sample rate must sit within Chromium's global audio limits; zero or oversized frame sizes are rejected |
Decoder support for AudioCodec::kIAMF is compiled in when IAMF audio is enabled at build time (IsDecoderIamfBuiltInAudioType() in supported_types.cc) and — per media_options.gni — gated at runtime by the kIamfAudioDecoding feature (see the warn-block for its current state).
examples
Capability detection and MSE setup for an IAMF (simple profile, Opus substream) audio track:
const mime = 'audio/mp4; codecs="iamf.000.000.opus"';
if (!MediaSource.isTypeSupported(mime)) {
// No IAMF decoding in this browser/build — fall back to a flat mix.
throw new Error('IAMF playback not supported');
}
const mediaSource = new MediaSource();
const audio = document.querySelector('audio');
audio.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', async () => {
const sourceBuffer = mediaSource.addSourceBuffer(mime);
const segment = await fetch('/media/immersive-segment.mp4');
sourceBuffer.appendBuffer(await segment.arrayBuffer());
sourceBuffer.addEventListener('updateend', () => audio.play(), { once: true });
}, { once: true });
Try real bitstreams: Chromium's own test files include an IAMF stereo and an IAMF 7.1.4 sample, and AOMedia hosts an IAMF binaural web demo (verified 200, 2026-07-29). The sister Chrome Platform Showcase route for this feature returned 404 at fetch time (2026-07-29), so no live embed is included here — the snippets above and the AOMedia demo are the runnable path.
Source: snippet follows the standard MSE flow per the explainer (“zero changes to existing MSE workflows”); codec string per IAMF §6.4.web platform tests
No upstream WPT coverage was found for IAMF playback: there is no IAMF-named test under wpt/media-source, and the mediasource-is-type-supported suite does not enumerate an iamf string (both checked 2026-07-29). Chromium exercises the decoder with its own media test data (the crsrc bitstreams linked above) and the iamf_audio_decoder_unittest.cc unit suite.
browser compatibility
Interim table. There is no BCD entry for IAMF anywhere under browser-compat-data and no webstatus.dev feature (zero matches, 2026-07-29). Rows below are compiled from the linked primary sources, not from BCD.
| Browser | Support | Evidence |
|---|---|---|
| Chrome | 153 (desktop, Android, WebView) — Enabled by default per listing; see flag-state caveat | milestone=153 listing; API record; flag state |
| Edge | Not separately reported | Chromium-based; no separate position on the ChromeStatus record |
| Firefox | No signal | ChromeStatus API record vendor views |
| Safari | No signal | ChromeStatus API record vendor views |
security and privacy
- No new script-visible surface. The feature adds a codec family to the existing MSE support matrix — no new interfaces, methods, events, permissions, or storage. Fingerprinting exposure via
isTypeSupported()differences already exists for every codec; IAMF support state adds one more bit to that existing vector. - Parser/decoder attack surface. Support introduces a new demux+decode path fed by remote media. The decoder is the AOM reference implementation (iamf-tools) running inside Chromium's sandboxed media pipeline; malformed-stream hardening is inherited from that project rather than specified for web developers.
- No encrypted content. Encrypted configurations are rejected at decoder initialization (
kUnsupportedEncryptionMode), so IAMF playback cannot be combined with EME on this path — there is no DRM or license-handling surface to reason about. - Playback policies unchanged. Autoplay, volume, and output-device selection keep their existing HTML-media semantics; the decoder renders to the device-selected output layout without exposing spatial scene contents to script.
specifications
| Document | Status |
|---|---|
| AOMedia — Immersive Audio Model and Formats (IAMF) | Latest approved version, v1.1.0 (canonical). The ChromeStatus record marks standards maturity “Published standard”. Adds the Base-Enhanced profile (2). |
| IAMF v1.0.0 (-errata) | The version Chromium's codec-string parser cites; Simple (0) and Base (1) profiles comply with it |
| Native IAMF MP4 Playback — explainer | Motivation and MSE-delivery framing; short |
| RFC 6381 — The 'Codecs' and 'Profiles' Parameters | Base grammar the IAMF codecs parameter builds on |
see also
- Chrome Platform Status — IAMF decoding support (API record) · tracking bug crbug.com/535279329
- AOMediaCodec/iamf-tools — encoder + reference decoder · binaural web demo
- Chromium IamfAudioDecoder · codec-string parser · kIamfAudioDecoding flag
- MDN — Media Source Extensions API (the host API; MDN has no IAMF coverage — API URL 404, zero search hits, 2026-07-29)
- Test media: IAMF stereo · IAMF 7.1.4 (Chromium test data)