2026-05-23: First LOC encoder/decoder library merged in the moq stack — PR #1388 MERGED May 22 22:53 UTC by kixelated (+844/−16, 30 files). New
moq-locRust crate +@moq/locJS package providingencode()/decode()for the LOC frame wire format, integrated intomoq-mux+ hang catalog + watch player. Implementation chooses moq-transport-18 §15.8-2 property type IDs (TIMESTAMP=0x06, TIMESCALE=0x08) over the conflicting historical draft-ietf-moq-loc-02 values (TIMESTAMP=0x02) — kixelated effectively votes-with-code for the moq-transport-18 assignments to win the cross-spec coordination dispute surfaced by Issue #20. Catalog timescale defaults to 1,000,000 microseconds; per-frame timescale override supported via 0x08 property. LOC preference in audio source selection: prioritized after legacy, before CMAF. Carry-forward: until LOC spec PR #1624 (provisional IANA registry) propagates into a draft-ietf-moq-loc-03 with aligned values, the moq-dev/moq LOC implementation is the de facto reference for post-draft-18 property type assignments.
draft-ietf-moq-loc-02 | 19 pages | Expires 2026-03-15
Authors
- Mo Zanaty (Cisco)
- suhas-nandakumar (Cisco)
- Peter Thatcher (Microsoft)
Abstract
LOC presents a container format for encoded audio and video media intended primarily for interactive streaming over QUIC. It emphasizes minimal encapsulation overhead and compatibility with WebCodecs standards.
Key Features
- Minimal overhead: Designed for low-latency interactive use cases
- WebCodecs compatible: Aligns with browser WebCodecs API
- Codec agnostic: Metadata properties for both audio and video
- E2E encryption: Supports moq-secure-objects integration
- Extension mechanism: Header extensions for timestamps, video frame marking, audio level
Extensions (draft-02)
LOC uses numbered extensions in the object header:
- Timestamp
- Video Frame Marking (ID=4)
- Audio Level
- Note: Issue #13 - Duplicate extension ID (0x06) for Timestamp and Audio Level
Active Issues (moq-wg/loc)
- #20 (May 14 03:18 UTC, yuanchao-chris) - LOC-02: Properties Type collision. Reports that draft-ietf-moq-transport-18 §15.8-2 and draft-ietf-moq-loc-02 commit history diverge on assigned Property Type IDs: MOQ-18 has TIMESTAMP=0x06 / TIMESCALE=0x08 / AUDIO_LEVEL=0x0C / VIDEO_FRAME_MARKING=0x0A / VIDEO_CONFIG=0x0D, while LOC-02 records TIMESTAMP=0x02 / AUDIO_LEVEL=0x06 / VIDEO_FRAME_MARKING=0x04. Twin issue moq-transport #1632 filed simultaneously 6 minutes later. First post-draft-18 cross-spec coordination failure — PR #1624 (Apr 30, “provisional IANA registry for LOC properties”) was supposed to prevent this but did not propagate into the draft-18 §15.8-2 assignment. See discussions-2026-05.
- #19 (May 5, Luke Curley) - How do you encode LOC Private Properties?
- #18 - Moving redundant properties in the catalog?
- #17 - Delta compress timestamps
- #16 - Unix epoch + Timescale
- #15 - Ambiguity in Video Frame Marking vi64 encoding
- #14 - WebCodecs issue: fix new avc3/hev1 formats
- #13 - Duplicate extension ID for Timestamp and Audio Level
- #10 (Apr 16, yuanchao-chris) - Properties Type collision between moqt-draft17 and loc-01. Properties Type (Extensions Type) 0x02 and 0x04 are defined in both specs with different semantics. Cross-references transport issue #1550. Now superseded by #20 as collisions persist between LOC-02 and MOQ-18.
- #9 - Track Property can’t be authenticated
- #5 - Move LOC header metadata from object header extensions to object payload
Related
- moq-transport - Transport layer
- moq-msf - Streaming format that uses LOC
- moq-cmsf - CMAF variant that also supports LOC
- media-packaging - Comparison with CMAF approach
Design Tension: LOC vs CMAF
LOC represents the “low overhead” approach optimized for interactive/real-time use cases, while moq-cmsf provides CMAF compatibility for traditional OTT streaming. luke-curley has proposed CMAF compression as a potential bridge between the two approaches.
Implementation tracking
- moqtail — full LOC encode/decode in
moqtail-rs(sample app + draft-16 catalog plumbing). - moqlivemock / warp-player (Eyevinn) — LOC pipeline added in v0.8.0 (May 5, 2026), including HEVC LOC and a WebCodecs LOC pipeline.
- moq-dev (Luke Curley) — PR #1388 OPENED May 7 2026 (+799/−17, link). New
moq-locRust crate +@moq/locJS package implementing encode/decode for the LOC wire format. Hang catalog gainsContainer::Loc { timescale }(default 1,000,000 µs); audio source selection prioritizes LOC after legacy, before CMAF. First adoption of an IETF-spec media container format in moq-dev/moq alongside its native Hang stack. Per-frame timescale (0x08 property) overrides catalog default.