<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.9) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-lcurley-moq-hang-03" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="hang">Media over QUIC - Hang</title>

    <author fullname="Luke Curley">
      <organization></organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>

    <date year="2026" month="September" day="24"/>

    <area>wit</area>
    <workgroup>moq</workgroup>
    

    <abstract>


<?line 38?>

<t>Hang is a real-time conferencing protocol built on top of moq-lite.
A room consists of multiple participants who publish media tracks.
All updates are live, such as a change in participants or media tracks.</t>



    </abstract>



    <note title="Note to Readers">


<?line 44?>

<t>This document was generated by an AI model from the implementation at <eref target="https://github.com/moq-dev/moq">github.com/moq-dev/moq</eref> and is maintained alongside it.
Submit an <eref target="https://github.com/moq-dev/moq/issues">issue</eref> or <eref target="https://github.com/moq-dev/moq/pulls">PR</eref> if this spec sucks and you want to fix anything.</t>


    </note>


  </front>

  <middle>


<?line 49?>

<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="terminology"><name>Terminology</name>
<t>Hang is built on top of moq-lite <xref target="moql"></xref> and uses much of the same terminology.
A quick recap:</t>

<t><list style="symbols">
  <t><strong>Broadcast</strong>: A collection of Tracks from a single publisher.</t>
  <t><strong>Track</strong>: A series of Groups, each of which can be delivered and decoded <em>out-of-order</em>.</t>
  <t><strong>Group</strong>: A series of Frames, each of which must be delivered and decoded <em>in-order</em>.</t>
  <t><strong>Frame</strong>: A sized payload of bytes representing a single moment in time.</t>
</list></t>

<t>Hang introduces additional terminology:</t>

<t><list style="symbols">
  <t><strong>Room</strong>: A collection of participants, publishing under a common prefix.</t>
  <t><strong>Participant</strong>: A moq-lite broadcaster that may produce any number of media tracks.</t>
  <t><strong>Catalog</strong>: A JSON document that describes each available media track, supporting live updates.</t>
  <t><strong>Container</strong>: A tiny header in front of each media payload containing the timestamp.</t>
</list></t>

</section>
<section anchor="discovery"><name>Discovery</name>
<t>The first requirement for a real-time conferencing application is to discover other participants in the same room.
Hang does this using moq-lite's ANNOUNCE capabilities.</t>

<t>A room consists of a path.
Any participants within the room <bcp14>MUST</bcp14> publish a broadcast with the room path as a prefix which <bcp14>SHOULD</bcp14> end with the <spanx style="verb">.hang</spanx> suffix.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
/room123/alice.hang
/room123/bob.hang
/room456/zoe.hang
]]></artwork></figure>

<t>A participant issues an ANNOUNCE_PLEASE message to discover any other participants in the same room.
The server (relay) will then respond with an ANNOUNCE message for any matching broadcasts, including their own.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
ANNOUNCE_PLEASE prefix=/room/
ANNOUNCE suffix=alice.hang active=true
ANNOUNCE suffix=bob.hang   active=true
]]></artwork></figure>

<t>If a participant leaves or is disconnected, their broadcast is unannounced.
Publishers and subscribers <bcp14>SHOULD</bcp14> terminate any subscriptions once a participant is unannounced.</t>

<figure><artwork><![CDATA[
ANNOUNCE suffix=alice.hang active=false
]]></artwork></figure>

</section>
<section anchor="catalog"><name>Catalog</name>
<t>The catalog describes the available media tracks for a single participant.
It's a JSON document that extends the W3C WebCodecs specification <xref target="webcodecs"/>.</t>

<t>The catalog is published as a <spanx style="verb">catalog.json</spanx> track within the broadcast so it can be updated live as the participant's media tracks change.
A participant <bcp14>MAY</bcp14> forgo publishing a catalog if it does not wish to publish any media tracks now and in the future.</t>

<t>The catalog track consists of multiple groups, one for each update.
Each group contains a single frame with UTF-8 JSON.</t>

<t>A publisher <bcp14>MUST NOT</bcp14> write multiple frames to a group until a future specification includes a delta-encoding mechanism (via JSON Patch most likely).</t>

<t>A publisher <bcp14>SHOULD</bcp14> also serve the catalog as a <spanx style="verb">catalog.json.z</spanx> track: the identical JSON under the same group and frame rules, differing only by compression (<xref target="compression"/>).
A consumer reads whichever of the two tracks it prefers.</t>

<section anchor="root"><name>Root</name>
<t>The root of the catalog is a JSON document with the following schema:</t>

<figure><artwork><![CDATA[
type Catalog = {
  "audio": AudioSchema | undefined,
  "video": VideoSchema | undefined,
  "archive": ArchiveSchema | undefined,
  "clock": ClockSchema | undefined,
  "text": TextSchema | undefined,
  "json": JsonTracks | undefined,
  "binary": BinaryTracks | undefined,
  // ... any custom fields ...
}
]]></artwork></figure>

<t>Additional fields <bcp14>MAY</bcp14> be added based on the application.
The catalog <bcp14>SHOULD</bcp14> be mostly static, delegating any dynamic content to other tracks.</t>

<t>For example, a chat entry should name a chat track, not carry individual chat messages.
This way catalog updates are rare and a client <bcp14>MAY</bcp14> choose to not subscribe.
The <spanx style="verb">json</spanx> and <spanx style="verb">binary</spanx> sections (<xref target="data"/>) are how a track like that is listed.</t>

<t>This specification defines audio, video, and text media tracks, plus an optional <spanx style="verb">archive</spanx> entry (<xref target="archive-catalog"/>) naming the timeline track (<xref target="timeline"/>) that indexes their segments, an optional root <spanx style="verb">clock</spanx> entry (<xref target="clock"/>) mapping content time to wall time, and the application data tracks in <xref target="data"/>.</t>

</section>
<section anchor="clock"><name>Clock</name>
<t>The catalog's root <spanx style="verb">clock</spanx> field is the broadcast's one continuous clock:</t>

<figure><artwork><![CDATA[
type ClockSchema = {
  "wall": number,
  "timescale": number | undefined,
}
]]></artwork></figure>

<t>The <spanx style="verb">wall</spanx> field is the wall-clock time of PTS zero, in <spanx style="verb">timescale</spanx> units since the moq epoch, 2020-01-01T00:00:00Z.
A consumer derives the wall-clock time of any media timestamp as <spanx style="verb">wall + pts</spanx> after converting that timestamp into this timescale, and Unix time by adding the epoch back (for HLS <spanx style="verb">EXT-X-PROGRAM-DATE-TIME</spanx> or DASH <spanx style="verb">availabilityStartTime</spanx>).
Every media track and the archive index refer to this one mapping after timescale conversion; there are no competing wall epochs.</t>

<t>The <spanx style="verb">timescale</spanx> field is the units per second for <spanx style="verb">wall</spanx>, defaulting to 1000000 (microseconds) when absent.
A zero <spanx style="verb">timescale</spanx> is invalid, as is a <spanx style="verb">wall</spanx> outside the JSON-safe integer range; both are refused rather than truncated.</t>

<t>The mapping is fixed for the broadcast and independent of <spanx style="verb">archive</spanx>: a live-only publisher exposes its clock without creating a segment index.
A discontinuity marker is a delivery event, not a new epoch, and a system-clock adjustment never retimes the mapping.</t>

</section>
<section anchor="video"><name>Video</name>
<t>A video track contains the necessary information to decode a video stream.</t>

<figure><artwork><![CDATA[
type VideoSchema = {
  "renditions": Map<TrackName, VideoDecoderConfig>,
  "display": {
    "width": number,
    "height": number,
  } | undefined,
  "rotation": number | undefined,
  "flip": boolean | undefined,
}
]]></artwork></figure>

<t>The <spanx style="verb">renditions</spanx> field contains a map of track names to video decoder configurations.
See the <eref target="https://www.w3.org/TR/webcodecs/#video-decoder-config">WebCodecs specification</eref> for specifics and registered codecs.
Any field carrying raw bytes, notably <spanx style="verb">description</spanx>, is a hex string (<xref target="binary"/>).</t>

<t>The <spanx style="verb">display</spanx> field is the size to render the video at, in pixels.
It is separate from a rendition's <spanx style="verb">displayAspectWidth</spanx>/<spanx style="verb">displayAspectHeight</spanx> because changing it does not require reinitializing the decoder.</t>

<t>In addition to the WebCodecs fields, each rendition <bcp14>MAY</bcp14> carry the common rendition fields (<xref target="common"/>) plus:</t>

<figure><artwork><![CDATA[
type VideoDecoderConfigExtensions = {
  "displayAspectWidth": number | undefined,
  "displayAspectHeight": number | undefined,
  "stalled": boolean | undefined,
}
]]></artwork></figure>

<t><spanx style="verb">displayAspectWidth</spanx> and <spanx style="verb">displayAspectHeight</spanx> give the display aspect ratio of the media, stretching or shrinking the coded pixels.
A consumer that understands neither field <bcp14>MUST</bcp14> assume square pixels, a 1:1 ratio.
Both <bcp14>MUST</bcp14> be present together; a consumer that sees only one <bcp14>MUST</bcp14> ignore it.</t>

<t><spanx style="verb">stalled</spanx> indicates that the publisher recommends temporarily avoiding the rendition.
The track remains available when <spanx style="verb">stalled</spanx> is true.
A consumer <bcp14>SHOULD</bcp14> select an unstalled rendition when it supports one, but <bcp14>MAY</bcp14> select a stalled rendition when no unstalled rendition is suitable.
If absent, <spanx style="verb">stalled</spanx> defaults to false.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
{
  "renditions": {
    "720p": {
      "label": "HD",
      "codec": "avc1.64001f",
      "container": { "kind": "legacy" },
      "codedWidth": 1280,
      "codedHeight": 720,
      "bitrate": 6000000,
      "stalled": true,
      "framerate": 30.0,
      "jitter": 34
    },
    "480p": {
      "codec": "avc1.64001e",
      "container": { "kind": "legacy" },
      "codedWidth": 848,
      "codedHeight": 480,
      "bitrate": 2000000,
      "framerate": 30.0,
      "jitter": 34
    }
  },
  "display": {
    "width": 1280,
    "height": 720
  },
  "rotation": 0,
  "flip": false,
}
]]></artwork></figure>

</section>
<section anchor="audio"><name>Audio</name>
<t>An audio track contains the necessary information to decode an audio stream.</t>

<figure><artwork><![CDATA[
type AudioSchema = {
  "renditions": Map<TrackName, AudioDecoderConfig>,
}
]]></artwork></figure>

<t>The <spanx style="verb">renditions</spanx> field contains a map of track names to audio decoder configurations.
See the <eref target="https://www.w3.org/TR/webcodecs/#audio-decoder-config">WebCodecs specification</eref> for specifics and registered codecs.
Any field carrying raw bytes, notably <spanx style="verb">description</spanx>, is a hex string (<xref target="binary"/>).</t>

<t>In addition to the WebCodecs fields, each rendition <bcp14>MAY</bcp14> carry the common rendition fields (<xref target="common"/>).</t>

<section anchor="audio-pcm"><name>PCM</name>

<t>Hang defines the <spanx style="verb">"pcm"</spanx> audio codec for uncompressed samples.
The <spanx style="verb">sampleRate</spanx> and <spanx style="verb">numberOfChannels</spanx> fields <bcp14>MUST</bcp14> be present and greater than zero.
The <spanx style="verb">description</spanx> field <bcp14>MUST NOT</bcp14> be present.
If <spanx style="verb">bitrate</spanx> is present, it <bcp14>MUST</bcp14> equal <spanx style="verb">sampleRate * numberOfChannels * 32</spanx>.</t>

<t>Each codec payload consists of interleaved IEEE 754 binary32 samples in little-endian byte order.
Samples are ordered by sample frame, then by ascending channel index within each frame.
The payload length <bcp14>MUST</bcp14> be a non-zero multiple of <spanx style="verb">4 * numberOfChannels</spanx>.
The frame timestamp identifies the presentation time of its first sample.
The frame duration in seconds is the payload length divided by <spanx style="verb">4 * numberOfChannels * sampleRate</spanx>.</t>

<t>For example:</t>

<figure><artwork><![CDATA[
{
  "renditions": {
    "stereo": {
      "label": "English stereo",
      "codec": "opus",
      "container": { "kind": "legacy" },
      "sampleRate": 48000,
      "numberOfChannels": 2,
      "bitrate": 128000,
      "jitter": 20
    },
    "mono": {
      "codec": "opus",
      "container": { "kind": "legacy" },
      "sampleRate": 48000,
      "numberOfChannels": 1,
      "bitrate": 64000,
      "jitter": 20
    }
  },
}
]]></artwork></figure>

</section>
</section>
<section anchor="text"><name>Text</name>
<t>A text track carries timed text: captions or subtitles.
Unlike audio and video there is no WebCodecs decoder for text, so a consumer parses each cue directly and renders it as an overlay.</t>

<figure><artwork><![CDATA[
type TextSchema = {
  "renditions": Map<TrackName, TextConfig>,
}

type TextConfig = {
        "format": "vtt" | "ttml" | "utf8" | string,
        "role": "subtitle" | "caption" | string | undefined,
        "lang": string | undefined,
        // plus the common rendition fields
}
]]></artwork></figure>

<t>The <spanx style="verb">renditions</spanx> field maps track names to text configurations, typically one per language.</t>

<t>The <spanx style="verb">format</spanx> field selects the cue serialization, and tells a consumer how to parse each frame's payload:</t>

<t><list style="symbols">
  <t><spanx style="verb">vtt</spanx>: WebVTT (<eref target="https://www.w3.org/TR/webvtt1/">W3C WebVTT</eref>). Each payload is a self-contained <spanx style="verb">WEBVTT</spanx> segment whose cues carry absolute timing. A cue's embedded start time <bcp14>MUST</bcp14> match its enclosing frame timestamp.</t>
  <t><spanx style="verb">ttml</spanx>: TTML / IMSC1 (<eref target="https://www.w3.org/TR/ttml-imsc1.1/">W3C IMSC</eref>) fragment (XML) with absolute timing. A cue's embedded start time <bcp14>MUST</bcp14> match its enclosing frame timestamp.</t>
  <t><spanx style="verb">utf8</spanx>: raw UTF-8 text with no embedded timing or styling. The cue is shown from its frame timestamp until the next cue; an empty payload clears it.</t>
</list></t>

<t>A consumer <bcp14>MUST</bcp14> ignore a rendition whose <spanx style="verb">format</spanx> it does not recognize.</t>

<t>The <spanx style="verb">role</spanx> field describes the accessibility intent, defaulting to <spanx style="verb">subtitle</spanx>:</t>

<t><list style="symbols">
  <t><spanx style="verb">subtitle</spanx>: a transcription of the spoken dialogue, same-language or translated.</t>
  <t><spanx style="verb">caption</spanx>: a textual representation of all audio, including non-speech sounds, for viewers who cannot hear it.</t>
</list></t>

<t>The vocabulary is expected to grow, so a consumer <bcp14>MUST NOT</bcp14> reject a rendition whose <spanx style="verb">role</spanx> it does not recognize.
It <bcp14>SHOULD</bcp14> keep such a rendition selectable and treat the role as <spanx style="verb">subtitle</spanx>, and <bcp14>MUST</bcp14> preserve the value verbatim if it republishes the catalog.
Unlike <spanx style="verb">format</spanx>, an unrecognized <spanx style="verb">role</spanx> never prevents rendering: it describes intent, not the wire.</t>

<t>The <spanx style="verb">lang</spanx> field is the BCP-47 <xref target="RFC5646"/> language tag of the track, for example <spanx style="verb">en</spanx> or <spanx style="verb">es-419</spanx>.
Two renditions sharing a <spanx style="verb">lang</spanx> are told apart by <spanx style="verb">label</spanx> (<xref target="field-label"/>), one of the common rendition fields (<xref target="common"/>).</t>

<t>Regardless of <spanx style="verb">format</spanx>, each frame's timestamp (<xref target="container"/>) is the authoritative cue start time on the media clock, so a relay and a consumer can order and schedule cues without parsing the payload.
A text track has no delta frames: every frame is a self-contained cue, so a group <bcp14>MAY</bcp14> consist of multiple frames, following the same rule as a codec that lacks delta frames (<xref target="container"/>).</t>

<t>For example:</t>

<figure><artwork><![CDATA[
{
  "renditions": {
    "captions.en": {
      "format": "vtt",
      "container": { "kind": "legacy" },
      "role": "caption",
      "lang": "en",
      "label": "English"
    },
    "subtitles.es": {
      "format": "vtt",
      "container": { "kind": "legacy" },
      "role": "subtitle",
      "lang": "es"
    }
  }
}
]]></artwork></figure>

</section>
<section anchor="data"><name>Data Tracks</name>
<t>Beyond media, a broadcast <bcp14>MAY</bcp14> publish application data tracks: a chat log, a telemetry feed, a thumbnail, a serialized state blob.
The catalog lists them in two sections, split by payload encoding:</t>

<figure><artwork><![CDATA[
type JsonTracks = {
  "tracks": Map<TrackName, JsonSchema>,
}

type BinaryTracks = {
  "tracks": Map<TrackName, BinarySchema>,
}
]]></artwork></figure>

<t>A <spanx style="verb">json</spanx> track's frames are UTF-8 JSON values; a <spanx style="verb">binary</spanx> track's frames are opaque to everything but the application.
The split is by what a generic consumer can do without knowing the application: parse, inspect, and re-serialize a JSON track, but only copy a binary one.</t>

<t>Each map is keyed by track name, so an entry's key is the name to subscribe to.
Unlike the media sections these are not rendition sets: entries are distinct tracks, not alternatives to choose between.
A publisher <bcp14>MUST</bcp14> omit a section that holds no tracks.</t>

<t>A consumer discovers these tracks the same way it discovers media, by reading the catalog; nothing else in the broadcast announces them.</t>

<section anchor="json-tracks"><name>JSON</name>
<figure><artwork><![CDATA[
type JsonSchema = {
  "mode": Mode,
  "compression": Compression | undefined,
  "schema": string | undefined,
  "broadcast": string | undefined,
}
]]></artwork></figure>

<t>The <spanx style="verb">schema</spanx> field is an optional identifier for the shape of each value, typically the URL of a JSON Schema.
It is descriptive: a consumer that does not recognize it <bcp14>MUST</bcp14> still be able to read the track.</t>

</section>
<section anchor="binary-tracks"><name>Binary</name>
<figure><artwork><![CDATA[
type BinarySchema = {
  "mode": Mode,
  "compression": Compression | undefined,
  "mime": string | undefined,
  "broadcast": string | undefined,
}
]]></artwork></figure>

<t>The <spanx style="verb">mime</spanx> field is an optional media type (<xref target="RFC6838"/>) for each payload, for example <spanx style="verb">image/jpeg</spanx>.
It is descriptive, the same as <spanx style="verb">schema</spanx> above.</t>

</section>
<section anchor="field-mode"><name>mode</name>
<figure><artwork><![CDATA[
type Mode = "snapshot" | "stream"
]]></artwork></figure>

<t>The <spanx style="verb">mode</spanx> field says how a track's groups compose its frames into what a consumer sees.
It is <bcp14>REQUIRED</bcp14> and has no default: reading an append log as a latest-value document silently discards every payload but the last.
A consumer <bcp14>MUST</bcp14> ignore a track whose <spanx style="verb">mode</spanx> it does not recognize.</t>

<t>A <spanx style="verb">snapshot</spanx> track is lossy.
Each group is self-contained and supersedes the previous one, so a consumer reads only the newest group and a publisher <bcp14>MAY</bcp14> drop older ones.
A group's first frame is a complete value.
A <spanx style="verb">json</spanx> track <bcp14>MAY</bcp14> follow it with JSON Merge Patch (<xref target="RFC7396"/>) deltas applied in order; a <spanx style="verb">binary</spanx> track <bcp14>MUST</bcp14> write exactly one frame per group, since an opaque payload has no delta form.</t>

<t>A <spanx style="verb">stream</spanx> track is lossless in the sense that nothing supersedes anything else.
It is a single group, never rolled, carrying one self-contained payload per frame, delivered in order.</t>

<t>A publisher that cannot write a payload <bcp14>MUST</bcp14> close the track rather than continue the log in a second group.
A second group would present a gap as if it were a complete log; ending the track surfaces the failure instead, and a publisher with more to say opens a new track.</t>

<t>A consumer <bcp14>MUST NOT</bcp14> skip to the newest group, since a later group does not supersede an earlier one the way a <spanx style="verb">snapshot</spanx> group does.
It reads the one group the track carries, and <bcp14>MUST</bcp14> fail the read if the track carries a second, since whatever would have completed the first group is gone and yielding the remainder would present that gap as a continuous log.
This is why a consumer takes groups in arrival order rather than by ascending sequence: groups are separate streams, so a second group <bcp14>MAY</bcp14> arrive with a lower sequence than the first, and skipping it would report a truncated log as a whole one.</t>

<t>A consumer <bcp14>MUST NOT</bcp14> wait for the first group to end before it looks for a second.
A publisher that opens a second group while the first is still open is broken in exactly the way this rule exists to catch, and a consumer that only checks at the group boundary waits forever on a group that publisher may never finish.
A consumer <bcp14>MAY</bcp14> yield payloads it has already received from the first group before it fails, since those payloads precede the gap, but it <bcp14>MUST</bcp14> fail rather than block once they run out.</t>

<t>Retention is bounded, and this is the limit of "lossless".
A group's cache is finite, so a publisher that writes more than it holds evicts the log's earliest frames.
A consumer that has not kept up, or that subscribes later, then cannot read the log at all: the read fails once it reaches the evicted prefix, rather than silently resuming at whatever the cache still holds.
That is the intended behaviour, since a partial log presented as a whole one is exactly what this mode exists to prevent, and under compression (<xref target="compression"/>) the retained frames are undecodable anyway without the evicted prefix as context.
A publisher <bcp14>SHOULD</bcp14> therefore keep a <spanx style="verb">stream</spanx> track's log within what its groups retain, and split anything unbounded across successive tracks; a consumer that needs the whole log <bcp14>SHOULD</bcp14> subscribe before the publisher exceeds that.</t>

</section>
<section anchor="field-compression"><name>compression</name>
<figure><artwork><![CDATA[
type Compression = "deflate"
]]></artwork></figure>

<t>The <spanx style="verb">compression</spanx> field names the compression applied to the track's frames.
If absent, the frames are uncompressed.
A consumer <bcp14>MUST</bcp14> ignore a track whose <spanx style="verb">compression</spanx> it does not recognize, since it cannot decode the frames.</t>

<t>The <spanx style="verb">deflate</spanx> value is the group-scoped DEFLATE of <xref target="compression"/>.
A <spanx style="verb">snapshot</spanx> group covers a single value (plus any deltas), so its window spans that group alone; a <spanx style="verb">stream</spanx> group's frames compress against the earlier ones in the log.</t>

</section>
<section anchor="data-shared"><name>broadcast</name>
<t>The <spanx style="verb">broadcast</spanx> field carries the same meaning here as it does for a media rendition (<xref target="field-broadcast"/>).</t>

</section>
</section>
<section anchor="binary"><name>Binary Fields</name>
<t>A decoder config field carrying raw bytes, notably <spanx style="verb">description</spanx> (an <spanx style="verb">AllowSharedBufferSource</spanx> in WebCodecs), is carried in the catalog as a hex string (<xref section="8" sectionFormat="comma" target="RFC4648"/>).
A publisher <bcp14>SHOULD</bcp14> emit lowercase hexadecimal characters and <bcp14>MUST NOT</bcp14> emit a <spanx style="verb">0x</spanx> prefix or any separators.
A consumer <bcp14>MUST</bcp14> accept either case.</t>

<t>Note that this differs from the <spanx style="verb">cmaf</spanx> container's <spanx style="verb">init</spanx> field (<xref target="container"/>), which is base64 (<xref section="4" sectionFormat="comma" target="RFC4648"/>); the two alphabets overlap, so the encoding cannot be detected and must be specified.</t>

</section>
<section anchor="common"><name>Common Rendition Fields</name>
<t>Audio, video, and text renditions share the following fields, extending the WebCodecs decoder config for audio and video:</t>

<figure><artwork><![CDATA[
type CommonExtensions = {
  "broadcast": string | undefined,
  "label": string | undefined,
  "container": Container,
  "jitter": number | undefined,
}
]]></artwork></figure>

<section anchor="field-broadcast"><name>broadcast</name>
<t>By default a rendition's track lives in the same broadcast that served the catalog.
The <spanx style="verb">broadcast</spanx> field overrides that, naming a different broadcast that publishes the track.</t>

<t>The value is a relative path, resolved against the path of the broadcast that served the catalog.
It uses relative reference resolution (<xref section="5.2" sectionFormat="comma" target="RFC3986"/>): a non-empty reference replaces the catalog broadcast's last path segment before applying <spanx style="verb">.</spanx> and <spanx style="verb">..</spanx> segments.
For example, <spanx style="verb">./source</spanx> in a catalog served by <spanx style="verb">room/transcode</spanx> resolves to <spanx style="verb">room/source</spanx>, while <spanx style="verb">.</spanx> resolves to <spanx style="verb">room</spanx>.
An empty reference resolves to the catalog broadcast itself.
A publisher <bcp14>MUST NOT</bcp14> use an absolute path, nor a reference that escapes above the root.
The root is the consumer's authorized subtree, so such a reference names content the consumer cannot reach.
A consumer <bcp14>MUST</bcp14> reject a catalog containing one, rather than resolving the reference against a different broadcast or ignoring the rendition.</t>

<t>This lets a publisher author a catalog that points at tracks it does not republish.
For example, a transcoder produces a catalog listing its own downstream renditions alongside the untouched source rendition, referencing the latter in the source broadcast rather than copying the bytes through.</t>

<t>A consumer subscribes to such a rendition in the referenced broadcast, using the rendition's track name unchanged.</t>

</section>
<section anchor="field-label"><name>label</name>
<t>The <spanx style="verb">label</spanx> field is a human-readable rendition name for a track picker.
It is presentation metadata, not the track name used to subscribe.
Multiple renditions <bcp14>MAY</bcp14> use the same label.</t>

</section>
<section anchor="field-container"><name>container</name>
<t>The container used to frame this rendition's media, as described in <xref target="container"/>.
If absent, it defaults to <spanx style="verb">{ "kind": "legacy" }</spanx>.</t>

</section>
<section anchor="field-jitter"><name>jitter</name>
<t>The maximum delay, in milliseconds, between a frame being ready and the publisher flushing it.
A consumer's jitter buffer <bcp14>SHOULD</bcp14> be at least this large to avoid stalling.
If absent, a consumer <bcp14>SHOULD</bcp14> assume each frame is flushed immediately.</t>

<t>It is measured at the publisher: how far behind the media clock a frame is when the publisher hands it to the transport, whether an encoder, a reorder buffer, or a segmenter held it.
An importer can estimate this delay from the media span of a batch, such as a run of audio PES packets between video packets in TS or an fMP4 fragment, without measuring the time spent waiting for input.
It is never a measurement of the network, which a consumer observes for itself and which no two consumers of the same broadcast would agree on.</t>

<t>A publisher <bcp14>MUST</bcp14> round the value up to a whole number of milliseconds, so a consumer sizing a buffer against it is never handed a bound below the real one.
A publisher <bcp14>MUST NOT</bcp14> advertise <spanx style="verb">0</spanx>; a track that flushes each frame immediately omits the field instead.
A consumer receiving <spanx style="verb">0</spanx> <bcp14>SHOULD</bcp14> treat the field as absent, since it is a publisher rounding down rather than a claim of zero delay.
A publisher <bcp14>MUST NOT</bcp14> lower a previously advertised value, since a burst it emitted once it may emit again.</t>

<t>For example:</t>

<t><list style="symbols">
  <t>If each frame is flushed immediately, a video track's <spanx style="verb">jitter</spanx> is <spanx style="verb">1000/framerate</spanx> rounded up: 34 at 30 fps.</t>
  <t>If up to 3 B-frames may be emitted in a row, it is <spanx style="verb">3 * 1000/framerate</spanx>.</t>
  <t>If frames are buffered into 2 second segments, it is <spanx style="verb">2000</spanx>.</t>
  <t>If frames are flushed several at a time, it is the media span of the whole burst, not of one frame.</t>
</list></t>

<t>An audio frame's duration is codec dependent.
AAC often uses 1024 samples per frame, so at 44100Hz an immediately-flushed track's <spanx style="verb">jitter</spanx> is 24.</t>

</section>
</section>
</section>
<section anchor="container"><name>Container</name>
<t>Audio, video, and text tracks use a container to encapsulate the media payload.
A rendition declares its container via the <spanx style="verb">container</spanx> field of its catalog entry (<xref target="common"/>):</t>

<figure><artwork><![CDATA[
type Container =
  { "kind": "legacy" } |
  { "kind": "cmaf", "init": string } |
  { "kind": "loc" }
]]></artwork></figure>

<t>The <spanx style="verb">kind</spanx> field selects the framing; a consumer <bcp14>MUST</bcp14> ignore a rendition whose <spanx style="verb">kind</spanx> it does not recognize.
Every container shares the same group rules:</t>

<t>Each moq-lite group <bcp14>MUST</bcp14> start with a keyframe, except a group that contains only a discontinuity marker.
If the codec does not support delta frames (e.g. audio), a group <bcp14>MAY</bcp14> consist of multiple keyframes.
Otherwise, a group <bcp14>MUST</bcp14> consist of a single keyframe followed by zero or more delta frames.</t>

<t>A group with no decodable frames is a walk-now discontinuity: one empty codec payload and no media.
A consumer <bcp14>MUST NOT</bcp14> submit the marker to a decoder.
Empty groups (zero objects) are permitted and mean nothing.
After a discontinuity the timeline continues forward.
A publisher that stops producing and may resume on the same track (e.g. an encoder idle for lack of demand) <bcp14>SHOULD</bcp14> publish a discontinuity marker when it stops, so the group before the pause does not reach across the gap and read as live.
A group whose timestamps fall below the live edge earlier groups reached is malformed.
A delivered sequence hole is a playhead event unless the boundary is contiguous within 1 ms.
A consumer re-applies startup delay and skip at a playhead event; it does not reset codec state.</t>

<section anchor="legacy"><name>legacy</name>
<t>The default, used when the <spanx style="verb">container</spanx> field is absent.</t>

<t>Each frame starts with a timestamp, a QUIC variable-length integer (62-bit max) encoded in microseconds.
The remainder of the payload is codec specific; see the WebCodecs specification for specifics.</t>

<t>For video, a frame with an empty codec payload is the exclusive end of the frame before it, not media.
A video publisher <bcp14>SHOULD</bcp14> end each group with one when the exclusive end is known.
A publisher <bcp14>MAY</bcp14> estimate an unknown final duration from the frame cadence, but <bcp14>MUST NOT</bcp14> use batching or reorder delay as that duration.
For reordered video, the group presentation endpoint does not necessarily bound the preceding frame in decode order; the publisher omits the marker unless that frame's exclusive end is known.
A consumer <bcp14>MUST</bcp14> skip it and <bcp14>MUST NOT</bcp14> submit it to a decoder.
It does not mean the track ended.</t>

<t>For audio, an empty codec payload retains its terminal-trimming meaning: its timestamp is the exclusive endpoint of the source media.
When a codec must receive additional packets to emit buffered source samples, the marker <bcp14>MUST</bcp14> precede those terminal packets in the same group.
A consumer <bcp14>MUST NOT</bcp14> submit the marker to the codec decoder, <bcp14>MUST</bcp14> decode the terminal packets, and <bcp14>MUST</bcp14> discard decoded samples at or after the endpoint until a later group begins.
Audio publishers do not append per-group duration markers because the codec defines each packet's duration.
Data tracks retain empty payloads as data, without endpoint semantics.</t>

<t>For example, h.264 with no <spanx style="verb">description</spanx> field would be annex.b encoded, while h.264 with a <spanx style="verb">description</spanx> field would be AVCC encoded.
For a text track, the remainder is the cue in the track's declared <spanx style="verb">format</spanx> (for example a <spanx style="verb">WEBVTT</spanx> segment).</t>

</section>
<section anchor="cmaf"><name>cmaf</name>
<t>Each frame is a complete fragmented MP4 fragment (<spanx style="verb">moof</spanx>+<spanx style="verb">mdat</spanx>), carrying its own timestamps.
Audio samples <bcp14>MUST</bcp14> be marked as sync samples, including samples inside a group.
A sync sample does not declare an audio group boundary; the publisher chooses those boundaries.</t>

<t>The <spanx style="verb">init</spanx> field is the initialization segment (<spanx style="verb">ftyp</spanx>+<spanx style="verb">moov</spanx>) for the track, base64-encoded (<xref section="4" sectionFormat="comma" target="RFC4648"/>).
A consumer <bcp14>MUST</bcp14> feed <spanx style="verb">init</spanx> to the decoder before the first frame.</t>

</section>
<section anchor="loc"><name>loc</name>
<t>Each frame is a Low Overhead Container frame <xref target="I-D.ietf-moq-loc"/>: a property block, carrying the timestamp among other properties, followed by the codec payload.</t>

<t>For audio and video, consumers accept empty codec payload metadata with the same video-duration and audio-terminal-trimming meanings as the legacy container.
Data tracks retain empty payloads as data.
A consumer <bcp14>MUST NOT</bcp14> submit it to a decoder.</t>

</section>
</section>
<section anchor="compression"><name>Compression</name>
<t>Some metadata tracks are compressed.</t>

<t>Compression is signalled per track, never inferred from the track's name.
A data track (<xref target="data"/>) declares it with the <spanx style="verb">compression</spanx> field (<xref target="field-compression"/>).
The two tracks this specification defines as always compressed, <spanx style="verb">catalog.json.z</spanx> (<xref target="catalog"/>) and the timeline track (<xref target="timeline"/>), are identified by their role instead.
The <spanx style="verb">.z</spanx> suffix on those names is a naming convention, and a consumer <bcp14>MUST NOT</bcp14> treat it as a signal.</t>

<t>Such a track is compressed per <xref target="moqflate"/>: each group is one raw DEFLATE stream, sync flushed at each frame boundary.
The suffix is the declaration.</t>

</section>
<section anchor="timeline"><name>Timeline</name>
<t>The timeline track is the broadcast's segment index.
MoQ groups carry only an opaque sequence number; the timestamps live inside the media frames.
The timeline republishes the broadcast's segmentation as metadata: one record per segment, mapping a span of content time to the group ranges that carry it on each media track.
A consumer can answer "which groups cover time T on track X" and "where is the live edge" from a few bytes per segment, without downloading media.
This is sufficient to render an HLS or DASH playlist, seek a VOD recording, or index an archive.</t>

<t>The timeline is optional.
There is one timeline per broadcast, because its purpose is that segments are aligned across the broadcast's tracks: segment N covers the same span of content time on every track, which is what HLS requires of switchable renditions.
A broadcast that does not need aligned segments simply omits it.</t>

<section anchor="archive-catalog"><name>Catalog Section</name>
<t>The catalog's root <spanx style="verb">archive</spanx> field is the one name for the segment index, and for any durable recording of those ranges:</t>

<figure><artwork><![CDATA[
type ArchiveSchema = {
  "track": string,
  "timescale": number | undefined,
  "durationMax": number | undefined,
  "replay": string | undefined,
  "store": string | undefined,
  "version": number | undefined,
}
]]></artwork></figure>

<t>The <spanx style="verb">track</spanx> field names the MoQ track carrying the segment records.
The name <spanx style="verb">timeline.z</spanx> is <bcp14>RECOMMENDED</bcp14>; a consumer <bcp14>MUST</bcp14> use the advertised name rather than assuming it.
A live publisher without a store advertises <spanx style="verb">archive</spanx> with the timeline fields (<spanx style="verb">track</spanx>, <spanx style="verb">timescale</spanx>, <spanx style="verb">durationMax</spanx>) alone.
Every range the timeline advertises is FETCHable; with a store they are also durable.
There is no sibling <spanx style="verb">timeline</spanx> entry and no generation: a client that must tell recordings apart compares <spanx style="verb">replay</spanx> and <spanx style="verb">store</spanx>.</t>

<t>The <spanx style="verb">timescale</spanx> field is the units per second for the records' <spanx style="verb">pts</spanx> and <spanx style="verb">duration</spanx> values, and for <spanx style="verb">durationMax</spanx>.
If absent, it defaults to 1000 (milliseconds).
A zero <spanx style="verb">timescale</spanx> is invalid and <bcp14>MUST</bcp14> be refused.</t>

<t>The <spanx style="verb">durationMax</spanx> field, if present, is the declared upper bound on a segment's <spanx style="verb">duration</spanx>, in <spanx style="verb">timescale</spanx> units.
A publisher that controls its encoder knows its keyframe cadence up front, so a consumer can size buffers or write an HLS <spanx style="verb">EXT-X-TARGETDURATION</spanx> from the catalog alone, before observing a single segment.
The value <bcp14>MUST NOT</bcp14> change for the life of the broadcast, and a publisher <bcp14>MUST NOT</bcp14> emit a record whose <spanx style="verb">duration</spanx> exceeds it.
A publisher that cannot honor that <bcp14>MUST</bcp14> omit the field rather than emit a record contradicting it.</t>

<t>The field is absent when the media decides the segmentation instead, which is the common case: a real-time encoder places keyframes on demand and a single GOP may be minutes long, and a publisher importing a source it does not control cannot promise anything about that source.
A consumer needing a bound then derives one from the records it has seen, raising it as longer segments arrive.</t>

<t>Wall-clock mapping is the catalog root <spanx style="verb">clock</spanx> (<xref target="clock"/>), not this section: a consumer derives the wall-clock time of any segment as <spanx style="verb">clock.wall + pts</spanx> after converting <spanx style="verb">pts</spanx> into the clock's timescale.</t>

<t>The <spanx style="verb">replay</spanx> field, if present, is a relative MoQ broadcast path (<xref target="field-broadcast"/>) the archive is served back from.
Absent, the timeline lives on the catalog's own broadcast.
A wildcard replay path names no generation.</t>

<t>The <spanx style="verb">store</spanx> field, if present, is the object-store URL the recording objects (<xref target="recording"/>) live under.
Authorization for <spanx style="verb">replay</spanx> and <spanx style="verb">store</spanx> is external.</t>

<t>The <spanx style="verb">version</spanx> field is the recording object format version (<xref target="recording-track"/>).
It is 1 for this specification.
A publisher that exposes a store <bcp14>MUST</bcp14> set it; a publisher that does not <bcp14>MUST</bcp14> omit it.</t>

<t>A catalog that composes another broadcast's renditions <bcp14>MUST</bcp14> preserve that child's <spanx style="verb">archive</spanx> entry instead of synthesizing one.</t>

</section>
<section anchor="timeline-framing"><name>Track Framing</name>
<t>The timeline track is a sliding window of records.
An unbounded publisher only appends records, while a DVR publisher also removes records from the front as they expire.</t>

<t>The first frame of each group is a UTF-8 JSON object containing a checkpoint of the retained window:</t>

<figure><artwork><![CDATA[
{
  "offset": number,
  "start"?: number,
  "records": TimelineRecord[],
}
]]></artwork></figure>

<t>The <spanx style="verb">offset</spanx> is the absolute index of the oldest retained record.
<spanx style="verb">start</spanx> is the absolute index of <spanx style="verb">records[0]</spanx> and defaults to <spanx style="verb">offset</spanx> when omitted.
A publisher <bcp14>MAY</bcp14> omit a retained prefix from a checkpoint; a consumer that did not receive that prefix reports <spanx style="verb">offset</spanx> through <spanx style="verb">start</spanx> as skipped.
Each subsequent frame is one UTF-8 JSON operation, either <spanx style="verb">{ "push": TimelineRecord }</spanx> to append a record at the next absolute index, or <spanx style="verb">{ "pop": number }</spanx> to remove that many records from the front.
Indices <bcp14>MUST NOT</bcp14> exceed 2^53 - 1.</t>

<t>A publisher <bcp14>MAY</bcp14> roll groups to bound late-join cost or improve compression.
Each new group restates a decodable suffix of the retained window, so group boundaries are an encoding detail and <bcp14>MUST NOT</bcp14> surface as duplicate records to the application.
A consumer that missed records reports their absolute index range as skipped before continuing with the retained suffix.</t>

<t>The frames are DEFLATE-compressed (<xref target="RFC1951"/>) within each group.
The publisher ends each frame's compressed data with an empty sync-flush block (the <spanx style="verb">0x00 0x00 0xff 0xff</spanx> trailer is removed, as in <xref target="RFC7692"/>), so a consumer decompresses frames incrementally from the group's first frame.
The <spanx style="verb">.z</spanx> suffix on the <bcp14>RECOMMENDED</bcp14> track name marks this compression, mirroring the catalog's <spanx style="verb">catalog.json.z</spanx> sibling.</t>

</section>
<section anchor="timeline-records"><name>Records</name>
<t>Each record describes one complete segment:</t>

<figure><artwork><![CDATA[
type TimelineRecord = {
  "segment": number,
  "pts": number,
  "duration": number,
  "tracks": Map<TrackName, TimelineRange[]> | undefined,
}

type TimelineRange = {
  "start": number,
  "end": number,
  "keyframe": boolean | undefined,
}
]]></artwork></figure>

<t>The <spanx style="verb">segment</spanx> field is the segment's number.
Numbers are consecutive within a broadcast, anchoring HLS <spanx style="verb">EXT-X-MEDIA-SEQUENCE</spanx>; they are explicit rather than implied by record order so a reader joining mid-stream, or reading a windowed recording, keeps stable numbering.</t>

<t>The <spanx style="verb">pts</spanx> field is the segment's start and <spanx style="verb">duration</spanx> its length, both in the timeline's timescale.
The next record's <spanx style="verb">pts</spanx> equals <spanx style="verb">pts + duration</spanx> unless content time itself jumped; a consumer <bcp14>SHOULD</bcp14> treat such a jump as a discontinuity.</t>

<t>The <spanx style="verb">tracks</spanx> field maps each participating track name to the group ranges it contributes.
Each range covers groups <spanx style="verb">start</spanx> through <spanx style="verb">end</spanx> inclusive, as used by moq-lite FETCH and SUBSCRIBE.
More than one range means the group sequence is discontinuous inside the segment: the skipped groups never existed.
A track absent from the map has no content for the span (a gap; HLS <spanx style="verb">EXT-X-GAP</spanx>).</t>

<t>Participating tracks need not be audio or video.
A catalog, or an application's own metadata track such as a chat log, is listed exactly like a media track, which is what lets a recording (<xref target="recording"/>) address all of them the same way.
A consumer that only wants renditions therefore <bcp14>MUST</bcp14> select tracks by consulting the catalog rather than by assuming every name in the map is media.
A record <bcp14>MUST</bcp14> tolerate and <bcp14>SHOULD</bcp14> preserve unknown fields, like the catalog.</t>

<t>The <spanx style="verb">keyframe</spanx> field states whether the range's first group starts with a keyframe, i.e. whether a player can join or switch renditions there.
If absent, it defaults to true; a publisher sets <spanx style="verb">false</spanx> when a source resumes without one, so an exporter knows not to advertise the segment as independently decodable.</t>

</section>
<section anchor="timeline-segmentation"><name>Segmentation</name>
<t>A segment is a span of content time shared by every media track.
A track contributes every group whose start falls inside the span, so a segment boundary <bcp14>SHOULD</bcp14> land on a group start: every group already begins with a keyframe (<xref target="container"/>), so a boundary at a group start lets each track contribute whole groups and remain independently decodable.
A segment <bcp14>MAY</bcp14> span multiple groups of a track (short groups packed into a longer segment).</t>

<t>How boundaries are chosen is publisher policy: following a source's existing segmentation (an imported HLS playlist, CMAF segments on disk), or pacing by a minimum duration.
A publisher pacing itself <bcp14>SHOULD</bcp14> end a segment at the earliest point that is a group start on every enrolled track and at least the minimum past the segment's start, which makes the track with the coarsest groups pace the broadcast and leaves no track's group split across a boundary.
A minimum is always satisfiable, whereas a maximum is not: a single group longer than it cannot be divided.
Where no such point exists because two tracks have different coarse cadences, a publisher <bcp14>MUST</bcp14> choose one of them rather than a point interior to any track's group.</t>

<t>Whatever the policy, a publisher <bcp14>MUST NOT</bcp14> emit a record until the segment is complete: every <em>pacing</em> track's groups for the span are known.
Records are therefore self-contained and immediately servable, and the newest record is the live edge.
A pacing track that has produced nothing for the span holds the record back; a publisher that knows a track has stopped for good closes it, and the record then simply omits it (a gap).</t>

<t>A pacing track is one whose groups arrive continuously, which is what makes them usable as boundaries.
A track that publishes on its own schedule cannot pace: a catalog emits a group only when the renditions change, so a timeline waiting for it would stall the moment it went quiet.
Such a track is <em>non-pacing</em>: its groups are listed in whichever segment is open when they arrive, but it never determines a boundary and never holds a record back.
A publisher <bcp14>SHOULD</bcp14> record its catalog this way, so a recording can resolve the renditions in effect at any segment.</t>

<t>Placement of a non-pacing track's groups is therefore by arrival rather than by content time: nothing waits for them, so a group that arrives after its segment has already been published is listed in the next one.
When a segment closes, every non-pacing group that arrived while it was open belongs to that segment regardless of the timestamp basis carried by the non-pacing track.
The frames still carry their own timestamps, so no timing information is lost.
A non-pacing track's timestamps do not extend the final segment's duration.
A non-pacing track whose group never closes (an append-log such as a <spanx style="verb">moq-json</spanx> stream) is listed once, in the segment its group opened in.
A publisher that needs such content addressable per segment <bcp14>SHOULD</bcp14> roll the group at segment boundaries, which costs the shared compression window but makes each segment self-contained.</t>

<t>A group that starts before the first boundary belongs to the first segment.
The final segment of an ended broadcast has no closing boundary; its <spanx style="verb">duration</spanx> runs to the newest known content.
A publisher <bcp14>SHOULD</bcp14> carry the end of the last group's content into that value, since a publisher that knows only where each group <em>started</em> would report a duration one group short, and zero for a final segment that is a single group.</t>

</section>
</section>
<section anchor="mpegts-si"><name>MPEG-TS Service Information</name>
<t>A broadcast imported from an MPEG-TS multiplex can carry the multiplex's standalone service-information tables (ISO/IEC 13818-1 program-specific information and ETSI EN 300 468 DVB SI: SDT, NIT, BAT, EIT, and any table the publisher does not recognize) so an exporter can re-emit them byte-for-byte.
The sections are opaque: nothing in this mechanism parses a table, so an unrecognized long-form table round-trips exactly like a known one.
Short-form tables, recognized or not, are carried with latest-value semantics instead (see below): the short-form tables broadcast systems define are clocks and stuffing, and a hypothetical multi-section static one would collapse to its most recent section.</t>

<t>The tables are state, not events: a transport stream retransmits them continuously only because a TS receiver can tune in at any moment, so the repetition rate is a property of the unreliable transport, not of the data.
Here each table rides a dedicated snapshot track, delivered once at join and republished on change, per the root catalog's guidance that dynamic content is delegated to other tracks.
Consumers that are not TS exporters never pay for it.</t>

<section anchor="mpegts-si-catalog"><name>Catalog Section</name>
<t>The catalog's <spanx style="verb">mpegts</spanx> section maps each carried table to its track under an <spanx style="verb">si</spanx> field, keyed by the PID the sections ride on and then by <spanx style="verb">table_id</spanx>:</t>

<figure><artwork><![CDATA[
type Mpegts = {
  // ... other MPEG-TS carriage fields ...
  "si": { [pid: string]: { [tableId: string]: SiEntry } } | undefined,
}

type SiEntry = {
  "track": string,
  "interval": number | undefined,
}
]]></artwork></figure>

<t>Both keys are written in decimal, since JSON object keys are strings.
<spanx style="verb">table_id</spanx> is byte 0 of generic section syntax, so the key is no less generic than the PID; which table_id ranges mean what is a DVB convention that appears nowhere in the schema.</t>

<t><list style="symbols">
  <t><spanx style="verb">track</spanx>: the name of the snapshot track carrying this table's sections, on the same broadcast as the catalog.</t>
  <t><spanx style="verb">interval</spanx>: how often an exporter <bcp14>MUST</bcp14> re-emit the sections at most, in milliseconds. A hint carrying the table's own repetition requirement (for DVB, the ETSI TS 101 211 maxima). When absent, an exporter <bcp14>SHOULD</bcp14> fall back to a fast cadence of its own choosing, so an unknown table degrades to a safe rate rather than being dropped.</t>
</list></t>

<t>Entries are added when a table is first observed, which is acquisition-time traffic; steady-state table revisions touch only the named track, never the catalog.</t>

</section>
<section anchor="mpegts-si-track"><name>Track Format</name>
<t>An SI track is binary, without the media container framing (<xref target="container"/>).</t>

<t>Each frame is one sub-table: its complete current sections, concatenated verbatim in <spanx style="verb">section_number</spanx> order, each including its header and CRC.
Sections are self-delimiting via <spanx style="verb">section_length</spanx>, so the frame needs no framing of its own.
A sub-table's identity is its generic section header (<spanx style="verb">table_id</spanx>, <spanx style="verb">table_id_extension</spanx>) extended by the documented disambiguators for two DVB table families: <spanx style="verb">original_network_id</spanx> (bytes 8..10) for SDT other (<spanx style="verb">table_id</spanx> 0x46), and <spanx style="verb">transport_stream_id</spanx> plus <spanx style="verb">original_network_id</spanx> (bytes 8..12) for EIT (0x4E..0x6F), whose generic identities are only unique within one network or transport stream.</t>

<t>Each group is a snapshot: reading its frames in order yields the table's complete current state, where a later frame replaces an earlier one with the same sub-table identity.
A joiner reads only the newest group and is current; older groups never need to be fetched.
A writer <bcp14>MAY</bcp14> append a frame to an open group to revise one sub-table incrementally; a writer that only ever cuts complete groups is trivially conformant.</t>

<t>A publisher <bcp14>MUST NOT</bcp14> mix versions within a sub-table's frame: sections of one version are buffered until the generation is judged complete and committed atomically.
Completeness is contiguity (all of <spanx style="verb">0..=last_section_number</spanx> present) or one observed full transmission cycle, whichever comes first: some tables number their sections sparsely (DVB EIT schedule skips unused numbers per segment), so a repeated section within the pending generation proves the cycle wrapped and the set is complete as transmitted.
A section lost before the cycle wraps is indistinguishable from a legitimately skipped number, so a committed set can transiently omit it until the next cycle re-supplies it; no section-counting receiver can do better.
A publisher <bcp14>SHOULD</bcp14> carry only sections whose <spanx style="verb">current_next_indicator</spanx> is set.</t>

<t>A section without a long-form header (short-form syntax: TDT/TOT and similar) has no extension, version, or numbering, so its table is a single latest-value slot: each arrival replaces the last, and a byte-identical repetition is not a change.
This is what makes a time table proxyable: each tick republishes a small snapshot, a joiner reads the newest, and staleness is bounded by the source's own repetition interval plus path latency, the same bound a receiver of the original multiplex has.
Carrying the source's time rather than synthesizing one keeps the clock consistent with the EPG (event times are expressed on the source's clock) and preserves TOT's local-time-offset descriptors, which are operator policy a re-multiplexer cannot invent.</t>

</section>
</section>
<section anchor="recording"><name>Recording</name>
<t>A live broadcast is bounded history: moq-lite <xref target="moql"/> serves the present with SUBSCRIBE and the recent past with FETCH, both ending at the publisher's cache.
A <em>recording</em> is the persistent tier, writing a broadcast to a filesystem or object store so it can be served back long after the live session ended.</t>

<t>A recording is addressed by segment.
The timeline (<xref target="timeline"/>) names every segment and the groups that carry it.
Each track's object is addressed by its smallest and largest stored group IDs; the timeline supplies those bounds without reading media.
A reader that wants segment N of a track issues one whole-object GET, with no range header and no second request, which is what both an HLS or DASH origin and a player seeking a VOD recording need.</t>

<t>A recording covers the tracks the timeline describes, plus the catalog and the timeline itself.
A broadcast with no timeline has no segments and cannot be recorded this way.</t>

<section anchor="recording-layout"><name>Layout</name>
<t>A recording is a set of objects under a common prefix:</t>

<figure><artwork><![CDATA[
<prefix>/<encoded-track>/.info
<prefix>/<encoded-track>/groups/<largest>.<smallest>
<prefix>/<encoded-timeline-track>/segments/<segment>
]]></artwork></figure>

<t>The common prefix is application-defined and is not interpreted by this format.</t>

<t><spanx style="verb">&lt;encoded-track&gt;</spanx> is the track's UTF-8 name with every byte outside <spanx style="verb">A-Z a-z 0-9 _ -</spanx> percent-encoded as <spanx style="verb">%</spanx> followed by two uppercase hexadecimal digits.
For example, <spanx style="verb">catalog.json</spanx> becomes <spanx style="verb">catalog%2Ejson</spanx>.
An encoded name never contains <spanx style="verb">/</spanx> or begins with <spanx style="verb">.</spanx>, so a track cannot address anything outside the prefix.
<spanx style="verb">.info</spanx>, <spanx style="verb">groups</spanx>, and <spanx style="verb">segments</spanx> are reserved within a track directory.</t>

<t><spanx style="verb">&lt;smallest&gt;</spanx> and <spanx style="verb">&lt;largest&gt;</spanx> are the inclusive first and last group sequence numbers in the object.
Recorded group and segment IDs <bcp14>MUST</bcp14> be integers in the range 0 through 9007199254740991 (2^53 - 1), so timeline JSON preserves them exactly.
Each filename field is written as exactly 19 decimal digits, padded with leading zeros, so lexical and numeric order agree.
Writers and readers <bcp14>MUST</bcp14> reject IDs outside this range, including reconstructed group IDs in the binary table.
A range-named object <bcp14>MUST</bcp14> contain at least one group, and its table's first and last sequences <bcp14>MUST</bcp14> match the filename.
For each track, object ranges <bcp14>MUST</bcp14> be nonoverlapping and strictly increasing in timeline segment order; gaps are allowed both within and between objects.
A track with no stored groups for a segment has no object or range in that record.
There are no empty index objects or duplicate copies addressed by segment number.</t>

<t>This layout applies to every recorded track, including the catalog, except the recording-owned timeline track identified by the catalog's <spanx style="verb">archive</spanx> field (<xref target="archive-catalog"/>).
The timeline uses <spanx style="verb">segments/&lt;segment&gt;</spanx> with the same binary envelope and at least one complete Window group per object.
<spanx style="verb">&lt;segment&gt;</spanx> is the committed timeline segment ID, encoded as 19 zero-padded decimal digits within the recording ID range.
After its first segment, the recording <bcp14>MUST</bcp14> commit consecutive segment IDs, including all-gap segments.
A writer <bcp14>MUST</bcp14> stop before allocating an ID beyond the limit; IDs never wrap.
Each track has its own objects so a reader can fetch one rendition without downloading the others.</t>

</section>
<section anchor="recording-track"><name>Track Objects</name>
<t><spanx style="verb">&lt;encoded-track&gt;/.info</spanx> is a UTF-8 JSON object containing the immutable properties needed to interpret and replay the track:</t>

<figure><artwork><![CDATA[
{
  "version": 1,
  "priority": 0,
  "timescale": 1000000
}
]]></artwork></figure>

<t>All three fields are required integers.
<spanx style="verb">version</spanx> identifies this recording format and <bcp14>MUST</bcp14> be 1.
<spanx style="verb">priority</spanx> and <spanx style="verb">timescale</spanx> have the meanings of moq-lite <spanx style="verb">TRACK_INFO</spanx> <xref target="moql"/>: <spanx style="verb">priority</spanx> is in the range 0 through 255, and <spanx style="verb">timescale</spanx> is in the range 1 through 9007199254740991, so JSON consumers can preserve it exactly.
A reader <bcp14>MUST</bcp14> preserve integer values exactly.
<spanx style="verb">Publisher Max Age</spanx> is not stored; a reader supplies its own serving policy.</t>

<t>The track object <bcp14>MUST</bcp14> be durable before its first segment object is stored, including for the timeline track.
It is immutable for the lifetime of the recording.
A reader <bcp14>MUST</bcp14> refuse an unknown version or invalid track properties.
On an existing <spanx style="verb">.info</spanx>, a writer <bcp14>MUST</bcp14> validate and compare the parsed <spanx style="verb">version</spanx>, <spanx style="verb">priority</spanx>, and <spanx style="verb">timescale</spanx> values; JSON whitespace and member order do not affect equality.
Different property values <bcp14>MUST</bcp14> fail enrollment, and the existing object <bcp14>MUST NOT</bcp14> be rewritten.</t>

</section>
<section anchor="recording-segments"><name>Segment Objects</name>
<t>A segment object holds one track's complete groups for one segment:</t>

<figure><artwork><![CDATA[
Segment Object {
  Version (i) = 1
  Group Count (i)
  Group Table {
    Sequence Delta (i)
    Frame Count (i)
    Frame Table {
      Timestamp (i)
      Payload Offset (i)
      Payload Length (i)
    } ...
  } ...
  Payload Bytes (..)
}
]]></artwork></figure>

<t>Fields annotated <spanx style="verb">(i)</spanx> are variable-length integers using the QUIC encoding (<xref target="RFC9000"/>, Section 16).
<spanx style="verb">Group Count</spanx> gives the number of group entries; each <spanx style="verb">Frame Count</spanx> gives the number of frame entries in that group.
The first <spanx style="verb">Sequence Delta</spanx> is the absolute group sequence number.
Each subsequent value is the group sequence number minus the previous sequence number minus one; zero therefore means the next consecutive group.
Groups <bcp14>MUST</bcp14> have strictly ascending sequence numbers; reconstruction <bcp14>MUST</bcp14> reject values exceeding the recording ID limit (<xref target="recording-layout"/>).
For range-named objects, the sequences <bcp14>MUST</bcp14> match the ranges in the timeline.
Frame entries appear in their original order within each group.
<spanx style="verb">Timestamp</spanx> is the frame's absolute timestamp in the track's <spanx style="verb">timescale</spanx> units, not a delta.
It <bcp14>MUST</bcp14> be in the range 0 through 9007199254740991 (2^53 - 1), so browser replay preserves it exactly; writers and readers <bcp14>MUST</bcp14> reject larger values.</t>

<t><spanx style="verb">Payload Offset</spanx> is relative to the start of <spanx style="verb">Payload Bytes</spanx>, immediately after the last table entry; <spanx style="verb">Payload Length</spanx> is the frame's payload size in bytes.
Payloads are concatenated in table order, without gaps, overlap, or trailing bytes.
They are the original frame payloads, including any group-scoped compression, without moq-lite FRAME headers.
A reader can locate a group or a frame index directly from the table without parsing earlier payloads.</t>

<t>A decoder <bcp14>MUST</bcp14> validate the complete table before accessing any payload.
Counts and entries <bcp14>MUST</bcp14> fit in the retrieved object, and every offset and length <bcp14>MUST</bcp14> describe a range within its payload bytes, with overflow checked before arithmetic.
An unknown version or malformed table is a missing segment, not an invalid recording.</t>

<t>A segment object <bcp14>MUST</bcp14> contain whole groups.
Segmentation forbids a boundary inside a track's group (<xref target="timeline-segmentation"/>), so a reader never has to stitch a group across objects.
Segment objects are immutable once written and are parseable without the timeline.</t>

<t>The timeline uses the same envelope and stores only complete Window groups (<xref target="timeline-framing"/>) closed while committing that segment.
Its own groups are discovered by listing, not included in the record's <spanx style="verb">tracks</spanx>, avoiding a record that must index itself.
A reader replays their checkpoints and operations in group order, preserving group boundaries and their independent DEFLATE windows.
Neither timeline nor media objects are appended to or rewritten.
One writer owns a recording prefix. An existing segment object key <bcp14>MAY</bcp14> be reused only for identical object bytes; a conflicting create <bcp14>MUST</bcp14> fail.</t>

</section>
<section anchor="recording-writer"><name>Writer Behavior</name>
<t>A writer subscribes to the broadcast and buffers the in-progress segment independently of the publisher or relay cache.
It writes a track's segment object once that track's groups for the span are known.
Per-track objects are written independently: a track whose content is complete does not wait for a slower one.
The recording contract <bcp14>MUST NOT</bcp14> depend on a relay retaining those groups while storage catches up.</t>

<t>A writer <bcp14>MUST</bcp14> make each track's <spanx style="verb">.info</spanx> and segment object durable before publishing the timeline record that references them.
The recording owns its timeline encoder so it can publish the ranges actually stored.</t>

<t>If a track's object cannot be made durable, the writer <bcp14>MUST</bcp14> omit only that track from the record's <spanx style="verb">tracks</spanx>; successfully stored tracks retain their ranges.
The segment number and timing are unchanged, including when every track is omitted.
The writer pushes the resulting record and every subsequent record through its own Window encoder.
It <bcp14>MUST NOT</bcp14> copy source frames whose Window position or group-local DEFLATE dictionary depends on a record it changed.</t>

<t>A writer <bcp14>MUST</bcp14> accept new groups for each track in strictly increasing sequence order and <bcp14>MUST</bcp14> refuse a duplicate or decreasing sequence; it does not reorder arrivals.
Groups already accepted <bcp14>MAY</bcp14> complete in any order; the writer buffers them and writes their table in sequence order.
An incomplete group omitted by an application-forced segment cut <bcp14>MUST NOT</bcp14> be inserted into a later object if that would overlap or precede an earlier object's range.
The application <bcp14>MAY</bcp14> force a cut or remove a stalled track; storage does not impose a timeout.
A writer <bcp14>MUST NOT</bcp14> insert objects for earlier segments after committing a later segment.</t>

<t>For segment N, the writer publishes the stored ranges, applies any retention pops, closes the timeline's current Window group, and stores the complete groups under the timeline track's <spanx style="verb">segments/N</spanx> key, with N encoded as specified in <xref target="recording-layout"/>.
It <bcp14>MUST</bcp14> make that object durable before committing the next segment or deleting expired objects.
If the timeline object cannot be made durable, the recording stops at the preceding durable timeline object.</t>

<t>On a clean end, the writer <bcp14>MUST</bcp14> flush the final partial segment, finish the timeline track, and make its final complete groups durable.
There is no completion marker; object listing alone does not distinguish a clean end from an interruption.</t>

</section>
<section anchor="recording-retention"><name>Retention</name>
<t>A recording has one of two retention modes:</t>

<t><list style="symbols">
  <t>An <em>archive</em> is unbounded and retains every complete segment until explicitly deleted.</t>
  <t>A <em>DVR</em> retains a configured duration of complete segments and expires the oldest whole segments as newer ones become durable.</t>
</list></t>

<t>An application offering DVR without an explicit retention value <bcp14>SHOULD</bcp14> default to at least 30 seconds.
The writer removes the oldest segment only when the remaining complete segments still cover the configured duration.
Retention is measured from timeline records, not from wall-clock arrival or relay cache state.</t>

<t>Trimming occurs only as part of committing a new segment, before that segment's timeline object is finalized (<xref target="recording-writer"/>).
A recording <bcp14>MUST NOT</bcp14> trim after its final segment is committed.
Expiration first pops expired records from the timeline window and makes the resulting complete timeline groups durable, then deletes the expired segments' objects.
The writer <bcp14>MUST</bcp14> retain the latest timeline object, even for an all-gap segment, and enough earlier timeline groups to recover the retained window from a checkpoint.
The index therefore never advertises media the retention process has already deleted, although media objects <bcp14>MAY</bcp14> temporarily outlive the index.
Relay cache eviction does not change the recording timeline.</t>

<t>Before accepting new groups, a restarting DVR writer <bcp14>MUST</bcp14> recover the complete retained timeline and list every recorded track's <spanx style="verb">groups/</spanx> prefix under exclusive ownership of the recording prefix.
After waiting the configured deletion grace period from successful recovery, it <bcp14>MUST</bcp14> delete group objects whose keys are absent from the recovered retained records, including expired objects and uncommitted uploads left by a crash.
It <bcp14>MUST NOT</bcp14> perform this cleanup if timeline recovery or listing fails or is incomplete, or while another writer can create or commit objects.
This completes previously committed expiration; it does not pop additional records after a final segment.
Timeline objects needed for checkpoint recovery and <spanx style="verb">.info</spanx> objects are not candidates for this cleanup.</t>

</section>
<section anchor="recording-recovery"><name>Bootstrap and Recovery</name>
<t>A reader or restarting writer lists the timeline track's <spanx style="verb">segments/</spanx> prefix and replays its objects in numeric segment order, including retention operations, from a retained checkpoint.
The catalog supplies the timeline track's name (<xref target="archive-catalog"/>).
The recovered records determine the committed track object keys; a missing or malformed referenced object <bcp14>MUST NOT</bcp14> be served.
Objects not referenced by the recovered timeline do not advertise content on their own.
Listing is not an atomic snapshot across tracks; absence from an earlier listing <bcp14>MUST NOT</bcp14> override a successful GET of an object referenced by a later durable timeline record.</t>

<t>After replaying segment N below the recording ID limit, a reader follows an active recording by GET of <spanx style="verb">segments/N+1</spanx>, without refreshing media listings.
At the limit there is no next key; this does not establish a clean recording end.
Not Found does not distinguish a pending commit, an expired DVR segment, or an interrupted recording.
A reader that has fallen behind retention <bcp14>MUST</bcp14> bootstrap again from a retained checkpoint.
Alternatively, a reader <bcp14>MAY</bcp14> list timeline keys after its last replayed key, consume all pages, sort the results, and replay them in order.
A continuation token is used only within that enumeration; the next refresh starts from the last replayed key.
A reader <bcp14>MUST NOT</bcp14> advance its replay cursor past a missing segment without recovering from a retained checkpoint.
Retention operations evict expired ranges from the reader's cached index; incremental listing alone does not report deletions.</t>

</section>
<section anchor="recording-reader"><name>Reader Behavior</name>
<t>Reading segment N of track T is: take the minimum and maximum group IDs from T's ranges in record N, GET <spanx style="verb">groups/&lt;largest&gt;.&lt;smallest&gt;</spanx>, and parse the groups.
The table <bcp14>MUST</bcp14> contain exactly the group sequences advertised for that track in the record, including its gaps.
Nothing on that path reads media the consumer did not ask for, and nothing requires a second request.</t>

<t>A reader <bcp14>MAY</bcp14> serve moq-lite FETCH from a recording.
Given a group, a reader locates the candidate object from a cached filename range index or the timeline's track ranges, then uses the table for the group and any requested <spanx style="verb">frame_start</spanx> <xref target="moql"/>.
A filename listing requires no media GETs.
On a backend guaranteeing lexical listing order and exclusive offsets, listing after <spanx style="verb">groups/&lt;requested-group&gt;</spanx> (19 padded digits, without the dot) selects the first candidate with an upper bound at least the requested group.
A reader <bcp14>MUST</bcp14> check the lower bound and committed timeline membership before serving it; an internal gap is resolved by the candidate's table.
An unordered listing <bcp14>MUST</bcp14> be collected and sorted before selecting a candidate; taking its first result is insufficient.
The reader reconstructs moq-lite FRAME headers from the stored timestamps and lengths, preserving the original payload bytes.
A group absent from the recording is a normal FETCH failure.
Recording catalog groups does not establish which catalog update applies to a media group; this format does not define that correlation.</t>

<t>A reader deriving a presentation-ordered format renders it from the timeline and transmuxes segment objects on demand.
Nothing derived needs to be stored: the playlist or manifest is a function of the timeline, and a media segment is a function of one recorded object.
An HLS segment URI can carry the track and both group bounds, allowing the handler to resolve the exact object without listing or a segment-ID index.
HLS sequence numbers remain timeline metadata and need not occur in object names.</t>

</section>
</section>
<section anchor="rooms"><name>Rooms</name>

<t>A room is a broadcast path prefix. A participant publishes camera and microphone
at <spanx style="verb">{identity}/camera.hang</spanx> and a screen share at <spanx style="verb">{identity}/screen.hang</spanx>, relative
to that prefix. Identity <bcp14>MUST</bcp14> contain at least one nonempty path segment.
Consumers <bcp14>MAY</bcp14> also recognize the unsuffixed <spanx style="verb">camera</spanx> and <spanx style="verb">screen</spanx> forms.</t>

<t>A participant <bcp14>MAY</bcp14> publish a <spanx style="verb">chat</spanx> track containing a JSON window of messages
from the last ten seconds. Each edit opens a new group containing one
uncompressed UTF-8 JSON header of the form <spanx style="verb">{"offset": N, "records": ["text", ...]}</spanx>.
The records are the complete retained window, oldest first. The offset is the
absolute index of its first record and advances as records expire. Offsets <bcp14>MUST</bcp14>
be nonnegative safe JSON integers (at most 2^53 - 1).</t>

<t>Publishers <bcp14>MUST</bcp14> retire records after ten seconds, including while idle. Consumers
start at the latest group and report records entering or leaving the window;
missing index ranges indicate messages that expired before being received.
Consumers <bcp14>MUST</bcp14> report malformed JSON, non-string records, and transport failures
as errors, distinct from the clean end of the track. Sender identity comes from
the broadcast path, not the payload. This track is distinct from an application's
<spanx style="verb">hang/chat.json</spanx> snapshot extension.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>
<t>A rendition's <spanx style="verb">broadcast</spanx> reference (<xref target="field-broadcast"/>) resolves against the consumer's root, which is the subtree it is authorized for.
Clamping a reference that escapes above that root would silently redirect the subscription to an unrelated broadcast, so a consumer rejects the catalog instead.</t>

<t>TODO Security</t>

<t>A consumer parsing a recording (<xref target="recording"/>) is parsing data at rest that it did not necessarily write.
It <bcp14>MUST</bcp14> validate the group/frame table against the bytes actually retrieved before allocating from its counts or accessing payloads (<xref target="recording-segments"/>), and treat a malformed object as a missing segment rather than letting it invalidate the recording.
It <bcp14>MUST</bcp14> reject a track object with a zero <spanx style="verb">timescale</spanx>.
Varint fields are subject to the same limits as moq-lite <xref target="moql"/>.
A recording inherits the confidentiality and integrity properties of the storage holding it; encryption at rest is transparent to the format and out of scope.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">




<reference anchor="moql">
   <front>
      <title>Media over QUIC - Lite</title>
      <author fullname="Luke Curley" initials="L." surname="Curley">
         </author>
      <date day="30" month="June" year="2026"/>
      <abstract>
	 <t>   moq-lite is designed to fanout live content 1-&gt;N across the internet.
   It leverages QUIC to prioritize important content, avoiding head-of-
   line blocking while respecting encoding dependencies.  While
   primarily designed for media, the transport is payload agnostic and
   can be proxied by relays/CDNs without knowledge of codecs,
   containers, or encryption keys.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-lcurley-moq-lite-05"/>
   
</reference>

<reference anchor="moqflate" target="https://datatracker.ietf.org/doc/draft-lcurley-moq-flate/">
  <front>
    <title>DEFLATE Compressed Tracks for MoQ</title>
    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization></organization>
    </author>
    <date />
  </front>
</reference>
<reference anchor="webcodecs" target="https://www.w3.org/TR/webcodecs/">
  <front>
    <title>WebCodecs</title>
    <author >
      <organization>W3C</organization>
    </author>
    <date />
  </front>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>
<reference anchor="RFC5646">
  <front>
    <title>Tags for Identifying Languages</title>
    <author fullname="A. Phillips" initials="A." role="editor" surname="Phillips"/>
    <author fullname="M. Davis" initials="M." role="editor" surname="Davis"/>
    <date month="September" year="2009"/>
    <abstract>
      <t>This document describes the structure, content, construction, and semantics of language tags for use in cases where it is desirable to indicate the language used in an information object. It also describes how to register values for use in language tags and the creation of user-defined extensions for private interchange. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="47"/>
  <seriesInfo name="RFC" value="5646"/>
  <seriesInfo name="DOI" value="10.17487/RFC5646"/>
</reference>
<reference anchor="RFC6838">
  <front>
    <title>Media Type Specifications and Registration Procedures</title>
    <author fullname="N. Freed" initials="N." surname="Freed"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <date month="January" year="2013"/>
    <abstract>
      <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="13"/>
  <seriesInfo name="RFC" value="6838"/>
  <seriesInfo name="DOI" value="10.17487/RFC6838"/>
</reference>
<reference anchor="RFC7396">
  <front>
    <title>JSON Merge Patch</title>
    <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
    <author fullname="J. Snell" initials="J." surname="Snell"/>
    <date month="October" year="2014"/>
    <abstract>
      <t>This specification defines the JSON merge patch format and processing rules. The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7396"/>
  <seriesInfo name="DOI" value="10.17487/RFC7396"/>
</reference>
<reference anchor="RFC4648">
  <front>
    <title>The Base16, Base32, and Base64 Data Encodings</title>
    <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
    <date month="October" year="2006"/>
    <abstract>
      <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4648"/>
  <seriesInfo name="DOI" value="10.17487/RFC4648"/>
</reference>
<reference anchor="RFC3986">
  <front>
    <title>Uniform Resource Identifier (URI): Generic Syntax</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="L. Masinter" initials="L." surname="Masinter"/>
    <date month="January" year="2005"/>
    <abstract>
      <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="66"/>
  <seriesInfo name="RFC" value="3986"/>
  <seriesInfo name="DOI" value="10.17487/RFC3986"/>
</reference>

<reference anchor="I-D.ietf-moq-loc">
   <front>
      <title>Low Overhead Media Container</title>
      <author fullname="Mo Zanaty" initials="M." surname="Zanaty">
         <organization>Cisco</organization>
      </author>
      <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
         <organization>Cisco</organization>
      </author>
      <author fullname="Peter Thatcher" initials="P." surname="Thatcher">
         <organization>Microsoft</organization>
      </author>
      <date day="20" month="July" year="2026"/>
      <abstract>
	 <t>   This specification describes a Low Overhead Media Container (LOC)
   format for encoded and encrypted audio and video media data to be
   used primarily for interactive Media over QUIC Transport (MOQT).  It
   may be used in the MOQT Streaming Format (MSF) specification, which
   defines a catalog format for publishers to declare and describe their
   LOC tracks and for subscribers to consume them.  Examples are also
   provided for building media applications using LOC and MOQT.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-moq-loc-04"/>
   
</reference>
<reference anchor="RFC1951">
  <front>
    <title>DEFLATE Compressed Data Format Specification version 1.3</title>
    <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
    <date month="May" year="1996"/>
    <abstract>
      <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1951"/>
  <seriesInfo name="DOI" value="10.17487/RFC1951"/>
</reference>
<reference anchor="RFC9000">
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
    <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
    <date month="May" year="2021"/>
    <abstract>
      <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9000"/>
  <seriesInfo name="DOI" value="10.17487/RFC9000"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC7692">
  <front>
    <title>Compression Extensions for WebSocket</title>
    <author fullname="T. Yoshino" initials="T." surname="Yoshino"/>
    <date month="December" year="2015"/>
    <abstract>
      <t>This document defines a framework for creating WebSocket extensions that add compression functionality to the WebSocket Protocol. An extension based on this framework compresses the payload data portion of WebSocket data messages on a per-message basis using parameters negotiated during the opening handshake. This framework provides a general method for applying a compression algorithm to the contents of WebSocket messages. Each compression algorithm has to be defined in a document defining the extension by specifying the parameter negotiation and the payload transformation algorithm in detail. This document also specifies one specific compression extension using the DEFLATE algorithm.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7692"/>
  <seriesInfo name="DOI" value="10.17487/RFC7692"/>
</reference>



    </references>

</references>


<?line 1073?>

<section numbered="false" anchor="appendix-a-changelog"><name>Appendix A: Changelog</name>

<section numbered="false" anchor="moq-hang-03"><name>moq-hang-03</name>

<t><list style="symbols">
  <t>Clarified that CMAF audio samples are sync samples independently of publisher group boundaries.</t>
  <t>Clarified that container importers can estimate jitter from batch media spans without measuring input wait time.</t>
  <t>Specified the <spanx style="verb">jitter</spanx> field's computation: the publisher's own structure rather than the network, rounded up to whole milliseconds, never <spanx style="verb">0</spanx> (a consumer treats <spanx style="verb">0</spanx> as absent), and never lowered once advertised. The 30 fps and 44.1 kHz AAC examples became 34 and 24.</t>
  <t>For video, an empty codec payload is the exclusive end of the frame before it. A video publisher <bcp14>SHOULD</bcp14> end each group with one when the exclusive end is known. Audio retains its terminal-trimming marker before codec drain packets.
A publisher <bcp14>MAY</bcp14> estimate an unknown final duration from the frame cadence, but <bcp14>MUST NOT</bcp14> use batching or reorder delay as that duration. A consumer skips it and does not submit it to a decoder. Audio terminal-packet trimming is unchanged.</t>
  <t>Specified version 1 recording objects: JSON track properties and binary group/frame tables with ascending, delta-encoded group sequences.</t>
  <t>Addressed track objects by inclusive group bounds and timeline objects by consecutive segment IDs, with incremental discovery and per-track omission on storage failure.</t>
  <t>Restricted retention updates to segment commits and removed completion markers.</t>
  <t>Limited recorded group and segment IDs and frame timestamps to JSON-safe integers, including delta reconstruction.</t>
  <t>Compared existing track properties by parsed values rather than JSON serialization.</t>
  <t>Required exclusive DVR restart recovery to remove unreferenced group objects left by interrupted expiration.</t>
  <t>Replaced the catalog root <spanx style="verb">timeline</spanx> field with <spanx style="verb">archive</spanx>, carrying the timeline track plus optional <spanx style="verb">replay</spanx>, <spanx style="verb">store</spanx>, and recording <spanx style="verb">version</spanx>.</t>
  <t>A marker group of one empty frame declares a discontinuity. Empty groups mean nothing. Timestamps only move forward; a group below the live edge is malformed. A delivered sequence hole is a playhead event unless contiguous within 1 ms.</t>
  <t>A publisher that stops producing and may resume on the same track <bcp14>SHOULD</bcp14> publish a discontinuity marker when it stops.</t>
  <t>An audio endpoint bounds only the terminal packets that follow it in its own group.</t>
  <t>Replaced the archive timeline <spanx style="verb">wall</spanx> field with a root <spanx style="verb">clock</spanx> section (<spanx style="verb">wall</spanx> plus <spanx style="verb">timescale</spanx>): one fixed broadcast mapping every track and the archive index convert into, independent of any archive. Zero timescales and walls past the JSON-safe integer range are refused.</t>
</list></t>

</section>
</section>
<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>TODO acknowledge.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA82963YbV5Iu+B9PkUOvsyyqAYiUaJVMVbkPJdE2z1iXFmlX
n/aqMZJAgkwLyERlJkjBOuxnmWeZJ5uILy577wQou7qnzxqvKpEE8rIvcY8v
Yo9Go0FXdoviONt7XczKPKtviib7lx/PXmaj7Pu8utob5JeXTXFDF1zjz2ne
FVd1sznOympeDwazelrlS3rArMnn3WgxXTeLYjNa1n8f8Q2jgyeDdn25LNu2
rKtus6Irz04vvs2yL7J80db03LKaFauC/qm6vWG2R8Po6qbMF/zH2ckL+lE3
9Nv7i2/3BtV6eVk0x4MZjeJ4QKN6MsibIj/ObstucFs3H66aer06zuj1g0G+
7q5rujgbDTL6b75eLGSoP6w/FNlLDBTfFMu8XBxnH8qPxYIePPvvV/zBeFov
B4OqbpZ5V97Q6zJ+LF13Nno1jue5KLtCvpwvMC5+pi3rq9Nvfzi5OM1e1stV
U7RtMcsumnz6oc3mNK3X9b/syeV5c1V0x9l1163a40ePaIJ5x9cVzbgsuvm4
bq4e0Vo/2l5mvPQRnuIzxn8j/ZnRVrU063E8Z/5v92pgbbM57Q7P6ra4nNaz
Ytqm0/prcfkSH+8e/u3t7fj2CQZ98f6RP2PnKGl7r46zvz55ufX2AZOYL/9g
NBpl+WXLy9INBkydWdlmeUYEsBh15bLIpnU1L5qimpb03aqpu3paL7LLdbno
srrKunqV1fPM9mw8OMmaul7ybW3Zdi2+XC+6crUoslXedOW0XOUVfXF7XWer
9eWibK+zJRgFm9PSIxaLbL3iUdNQmiJb0FiHWbueXmc5D27KXFDQDqQPpL1P
n4PZVXVX/PKG/+nqX94X+axo2sHg4pqmSXu/XhKLZLf02KuiKhqm1Oxyk+VV
dnJGk5oVi2ze0HS6a3rfkubA19Pi0czzLvv5quyu15dM1Y94BWbFDf/82wPb
s93f79PzZ7zOxBL0tLKil+aLurpqyxm9phsPzpm9Ox7Gz8Tl6+L3nvgIV7X7
vAY/v3v/u5eviG/p6nJOE6NxtKtiyutLHMQj29RrWhJal67O5uVH+mxDl1VX
uqLLcjZbECV9QQxY3dB60GrIja+KeVmV+JtWuMg+FJuMJMisJVH44/kFSx/+
mb15i9/fn5JUfH/6in8///7khx/8l4Fecf792x9/eBV+C3e+fPv69embV3Iz
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

-->

</rfc>

