|
| 1 | + |
| 2 | + |
| 3 | + |
| 4 | + |
| 5 | +moq L. Curley |
| 6 | +Internet-Draft 17 March 2026 |
| 7 | +Intended status: Informational |
| 8 | +Expires: 18 September 2026 |
| 9 | + |
| 10 | + |
| 11 | + Media over QUIC - Hang |
| 12 | + draft-lcurley-moq-hang-latest |
| 13 | + |
| 14 | +Abstract |
| 15 | + |
| 16 | + Hang is a real-time conferencing protocol built on top of moq-lite. |
| 17 | + A room consists of multiple participants who publish media tracks. |
| 18 | + All updates are live, such as a change in participants or media |
| 19 | + tracks. |
| 20 | + |
| 21 | +Discussion Venues |
| 22 | + |
| 23 | + This note is to be removed before publishing as an RFC. |
| 24 | + |
| 25 | + Discussion of this document takes place on the Media Over QUIC |
| 26 | + Working Group mailing list (moq@ietf.org), which is archived at |
| 27 | + https://mailarchive.ietf.org/arch/browse/moq/. |
| 28 | + |
| 29 | + Source for this draft and an issue tracker can be found at |
| 30 | + https://github.com/kixelated/moq-drafts. |
| 31 | + |
| 32 | +Status of This Memo |
| 33 | + |
| 34 | + This Internet-Draft is submitted in full conformance with the |
| 35 | + provisions of BCP 78 and BCP 79. |
| 36 | + |
| 37 | + Internet-Drafts are working documents of the Internet Engineering |
| 38 | + Task Force (IETF). Note that other groups may also distribute |
| 39 | + working documents as Internet-Drafts. The list of current Internet- |
| 40 | + Drafts is at https://datatracker.ietf.org/drafts/current/. |
| 41 | + |
| 42 | + Internet-Drafts are draft documents valid for a maximum of six months |
| 43 | + and may be updated, replaced, or obsoleted by other documents at any |
| 44 | + time. It is inappropriate to use Internet-Drafts as reference |
| 45 | + material or to cite them other than as "work in progress." |
| 46 | + |
| 47 | + This Internet-Draft will expire on 18 September 2026. |
| 48 | + |
| 49 | +Copyright Notice |
| 50 | + |
| 51 | + Copyright (c) 2026 IETF Trust and the persons identified as the |
| 52 | + document authors. All rights reserved. |
| 53 | + |
| 54 | + This document is subject to BCP 78 and the IETF Trust's Legal |
| 55 | + Provisions Relating to IETF Documents (https://trustee.ietf.org/ |
| 56 | + license-info) in effect on the date of publication of this document. |
| 57 | + Please review these documents carefully, as they describe your rights |
| 58 | + and restrictions with respect to this document. Code Components |
| 59 | + extracted from this document must include Revised BSD License text as |
| 60 | + described in Section 4.e of the Trust Legal Provisions and are |
| 61 | + provided without warranty as described in the Revised BSD License. |
| 62 | + |
| 63 | +Table of Contents |
| 64 | + |
| 65 | + 1. Conventions and Definitions |
| 66 | + 2. Terminology |
| 67 | + 3. Discovery |
| 68 | + 4. Catalog |
| 69 | + 4.1. Root |
| 70 | + 4.2. Video |
| 71 | + 4.3. Audio |
| 72 | + 5. Container |
| 73 | + 6. Security Considerations |
| 74 | + 7. IANA Considerations |
| 75 | + 8. Normative References |
| 76 | + Acknowledgments |
| 77 | + Author's Address |
| 78 | + |
| 79 | +1. Conventions and Definitions |
| 80 | + |
| 81 | + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", |
| 82 | + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and |
| 83 | + "OPTIONAL" in this document are to be interpreted as described in |
| 84 | + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all |
| 85 | + capitals, as shown here. |
| 86 | + |
| 87 | +2. Terminology |
| 88 | + |
| 89 | + Hang is built on top of moq-lite [moql] and uses much of the same |
| 90 | + terminology. A quick recap: |
| 91 | + |
| 92 | + * *Broadcast*: A collection of Tracks from a single publisher. |
| 93 | + |
| 94 | + * *Track*: An series of Groups, each of which can be delivered and |
| 95 | + decoded _out-of-order_. |
| 96 | + |
| 97 | + * *Group*: An series of Frames, each of which must be delivered and |
| 98 | + decoded _in-order_. |
| 99 | + |
| 100 | + * *Frame*: A sized payload of bytes representing a single moment in |
| 101 | + time. |
| 102 | + |
| 103 | + Hang introduces additional terminology: |
| 104 | + |
| 105 | + * *Room*: A collection of participants, publishing under a common |
| 106 | + prefix. |
| 107 | + |
| 108 | + * *Participant*: A moq-lite broadcaster that may produce any number |
| 109 | + of media tracks. |
| 110 | + |
| 111 | + * *Catalog*: A JSON document that describes each available media |
| 112 | + track, supporting live updates. |
| 113 | + |
| 114 | + * *Container*: A tiny header in front of each media payload |
| 115 | + containing the timestamp. |
| 116 | + |
| 117 | +3. Discovery |
| 118 | + |
| 119 | + The first requirement for a real-time conferencing application is to |
| 120 | + discover other participants in the same room. Hang does this using |
| 121 | + moq-lite's ANNOUNCE capabilities. |
| 122 | + |
| 123 | + A room consists of a path. Any participants within the room MUST |
| 124 | + publish a broadcast with the room path as a prefix which SHOULD end |
| 125 | + with the .hang suffix. |
| 126 | + |
| 127 | + For example: |
| 128 | + |
| 129 | + /room123/alice.hang |
| 130 | + /room123/bob.hang |
| 131 | + /room456/zoe.hang |
| 132 | + |
| 133 | + A participant issues an ANNOUNCE_PLEASE message to discover any other |
| 134 | + participants in the same room. The server (relay) will then respond |
| 135 | + with an ANNOUNCE message for any matching broadcasts, including their |
| 136 | + own. |
| 137 | + |
| 138 | + For example: |
| 139 | + |
| 140 | + ANNOUNCE_PLEASE prefix=/room/ |
| 141 | + ANNOUNCE suffix=alice.hang active=true |
| 142 | + ANNOUNCE suffix=bob.hang active=true |
| 143 | + |
| 144 | + If a publisher no longer wants to participant, or is disconnected |
| 145 | + somehow, their presence will be unannounced. Publishers and |
| 146 | + subscribers SHOULD terminate any subscriptions once a participant is |
| 147 | + unannounced. |
| 148 | + |
| 149 | + ANNOUNCE suffix=alice.hang active=false |
| 150 | + |
| 151 | +4. Catalog |
| 152 | + |
| 153 | + The catalog describes the available media tracks for a single |
| 154 | + participant. It's a JSON document that extends the the W3C WebCodecs |
| 155 | + specification. |
| 156 | + |
| 157 | + The catalog is published as a catalog.json track within the broadcast |
| 158 | + so it can be updated live as the participant's media tracks change. |
| 159 | + A participant MAY forgo publishing a catalog if it does not wish to |
| 160 | + publish any media tracks now and in the future. |
| 161 | + |
| 162 | + The catalog track consists of multiple groups, one for each update. |
| 163 | + Each group contains a single frame with UTF-8 JSON. |
| 164 | + |
| 165 | + A publisher MUST NOT write multiple frames to a group until a future |
| 166 | + specification includes a delta-encoding mechanism (via JSON Patch |
| 167 | + most likely). |
| 168 | + |
| 169 | +4.1. Root |
| 170 | + |
| 171 | + The root of the catalog is a JSON document with the following schema: |
| 172 | + |
| 173 | + type Catalog = { |
| 174 | + "audio": AudioSchema | undefined, |
| 175 | + "video": VideoSchema | undefined, |
| 176 | + // ... any custom fields ... |
| 177 | + } |
| 178 | + |
| 179 | + Additional fields MAY be added based on the application. The catalog |
| 180 | + SHOULD be mostly static, delegating any dynamic content to other |
| 181 | + tracks. |
| 182 | + |
| 183 | + For example, a "chat" section should include the name of a chat |
| 184 | + track, not individual chat messages. This way catalog updates are |
| 185 | + rare and a client MAY choose to not subscribe. |
| 186 | + |
| 187 | + This specification currently only defines audio and video tracks. |
| 188 | + |
| 189 | +4.2. Video |
| 190 | + |
| 191 | + A video track contains the necessary information to decode a video |
| 192 | + stream. |
| 193 | + |
| 194 | + type VideoSchema = { |
| 195 | + "renditions": Map<TrackName, VideoDecoderConfig>, |
| 196 | + "priority": u8, |
| 197 | + "display": { |
| 198 | + "width": number, |
| 199 | + "height": number, |
| 200 | + } | undefined, |
| 201 | + "rotation": number | undefined, |
| 202 | + "flip": boolean | undefined, |
| 203 | + } |
| 204 | + |
| 205 | + The renditions field contains a map of track names to video decoder |
| 206 | + configurations. See the WebCodecs specification |
| 207 | + (https://www.w3.org/TR/webcodecs/#video-decoder-config) for specifics |
| 208 | + and registered codecs. Any Uint8Array fields are hex-encoded as a |
| 209 | + string. |
| 210 | + |
| 211 | + For example: |
| 212 | + |
| 213 | + { |
| 214 | + "renditions": { |
| 215 | + "720p": { |
| 216 | + "codec": "avc1.64001f", |
| 217 | + "codedWidth": 1280, |
| 218 | + "codedHeight": 720, |
| 219 | + "bitrate": 6000000, |
| 220 | + "framerate": 30.0 |
| 221 | + }, |
| 222 | + "480p": { |
| 223 | + "codec": "avc1.64001e", |
| 224 | + "codedWidth": 848, |
| 225 | + "codedHeight": 480, |
| 226 | + "bitrate": 2000000, |
| 227 | + "framerate": 30.0 |
| 228 | + } |
| 229 | + }, |
| 230 | + "priority": 2, |
| 231 | + "display": { |
| 232 | + "width": 1280, |
| 233 | + "height": 720 |
| 234 | + }, |
| 235 | + "rotation": 0, |
| 236 | + "flip": false, |
| 237 | + } |
| 238 | + |
| 239 | +4.3. Audio |
| 240 | + |
| 241 | + An audio track contains the necessary information to decode an audio |
| 242 | + stream. |
| 243 | + |
| 244 | + type AudioSchema = { |
| 245 | + "renditions": Map<TrackName, AudioDecoderConfig>, |
| 246 | + "priority": u8, |
| 247 | + } |
| 248 | + |
| 249 | + The renditions field contains a map of track names to audio decoder |
| 250 | + configurations. See the WebCodecs specification |
| 251 | + (https://www.w3.org/TR/webcodecs/#audio-decoder-config) for specifics |
| 252 | + and registered codecs. Any Uint8Array fields are hex-encoded as a |
| 253 | + string. |
| 254 | + |
| 255 | + For example: |
| 256 | + |
| 257 | + { |
| 258 | + "renditions": { |
| 259 | + "stereo": { |
| 260 | + "codec": "opus", |
| 261 | + "sampleRate": 48000, |
| 262 | + "numberOfChannels": 2, |
| 263 | + "bitrate": 128000 |
| 264 | + }, |
| 265 | + "mono": { |
| 266 | + "codec": "opus", |
| 267 | + "sampleRate": 48000, |
| 268 | + "numberOfChannels": 1, |
| 269 | + "bitrate": 64000 |
| 270 | + } |
| 271 | + }, |
| 272 | + "priority": 1, |
| 273 | + } |
| 274 | + |
| 275 | +5. Container |
| 276 | + |
| 277 | + Audio and video tracks use a lightweight container to encapsulate the |
| 278 | + media payload. |
| 279 | + |
| 280 | + Each moq-lite group MUST start with a keyframe. If codec does not |
| 281 | + support delta frames (ex. audio), then a group MAY consist of |
| 282 | + multiple keyframes. Otherwise, a group MUST consist of a single |
| 283 | + keyframe followed by zero or more delta frames. |
| 284 | + |
| 285 | + Each frame starts with a timestamp, a QUIC variable-length integer |
| 286 | + (62-bit max) encoded in microseconds. The remainder of the payload |
| 287 | + is codec specific; see the WebCodecs specification for specifics. |
| 288 | + |
| 289 | + For example, h.264 with no description field would be annex.b |
| 290 | + encoded, while h.264 with a description field would be AVCC encoded. |
| 291 | + |
| 292 | +6. Security Considerations |
| 293 | + |
| 294 | + TODO Security |
| 295 | + |
| 296 | +7. IANA Considerations |
| 297 | + |
| 298 | + This document has no IANA actions. |
| 299 | + |
| 300 | +8. Normative References |
| 301 | + |
| 302 | + [moql] Curley, L., "Media over QUIC - Lite", Work in Progress, |
| 303 | + Internet-Draft, draft-lcurley-moq-lite-02, 12 November |
| 304 | + 2025, <https://datatracker.ietf.org/doc/html/draft- |
| 305 | + lcurley-moq-lite-02>. |
| 306 | + |
| 307 | + [moqt] Nandakumar, S., Vasiliev, V., Swett, I., and A. Frindell, |
| 308 | + "Media over QUIC Transport", Work in Progress, Internet- |
| 309 | + Draft, draft-ietf-moq-transport-17, 2 March 2026, |
| 310 | + <https://datatracker.ietf.org/doc/html/draft-ietf-moq- |
| 311 | + transport-17>. |
| 312 | + |
| 313 | + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate |
| 314 | + Requirement Levels", BCP 14, RFC 2119, |
| 315 | + DOI 10.17487/RFC2119, March 1997, |
| 316 | + <https://www.rfc-editor.org/rfc/rfc2119>. |
| 317 | + |
| 318 | + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC |
| 319 | + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, |
| 320 | + May 2017, <https://www.rfc-editor.org/rfc/rfc8174>. |
| 321 | + |
| 322 | +Acknowledgments |
| 323 | + |
| 324 | + TODO acknowledge. |
| 325 | + |
| 326 | +Author's Address |
| 327 | + |
| 328 | + Luke Curley |
| 329 | + Email: kixelated@gmail.com |
0 commit comments