<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-marzot-moq-test-tracks-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="moq-test-tracks">MOQT Media Test Tracks</title>
    <seriesInfo name="Internet-Draft" value="draft-marzot-moq-test-tracks-00"/>
    <author fullname="Giovanni Marzot">
      <organization>Oracle</organization>
      <address>
        <email>gmarzot@marzresearch.net</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>moq</keyword>
    <keyword>moqt</keyword>
    <keyword>test</keyword>
    <keyword>media</keyword>
    <abstract>
      <?line 45?>

<t>This document specifies moq-test-tracks, a protocol for testing Media over
QUIC (MOQ) media implementations. Like moq-test, it carries its parameters
to the publisher in the Track Namespace. The parameters describe a set of
media tracks, including the catalog, packaging, codecs and delivery, so that
any publisher that implements the protocol can generate media of the
requested shape.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://gmarzot.github.io/draft-marzot-moq-test-tracks/draft-marzot-moq-test-tracks.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-marzot-moq-test-tracks/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/gmarzot/draft-marzot-moq-test-tracks"/>.</t>
    </note>
  </front>
  <middle>
    <?line 54?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>moq-test <xref target="MoQTest"/> provides a testing framework for MOQT <xref target="MOQT"/>,
using objects with synthetic payloads. moq-test-tracks extends the same
approach to media. It lets testers request a set of tracks with encoded
video and audio, a catalog, and a specific packaging. Catalog parsers,
packagers, players and relays can then be tested against media of a known
shape.</t>
      <t>In the Track Namespace, testers specify the content, packaging, codecs,
resolution, frame rate, catalog format, placement of initialization data,
group duration, audio delivery, duration and number of video tracks. Any
publisher that implements the protocol can produce the requested tracks
without out-of-band coordination. Each set of parameters has one shortest
Track Namespace, which publishers use to name it. Subscribers that request
the same media therefore share one set of tracks, and results from
different publishers can be compared.</t>
    </section>
    <section anchor="track-namespace-parameters">
      <name>Track Namespace Parameters</name>
      <t>The moq-test-tracks protocol uses the Track Namespace to convey the
parameters of a set of media tracks to the publisher. The Track Namespace
tuple fields are defined as follows. <xref target="examples"/> shows complete Track
Namespaces.</t>
      <ul spacing="normal">
        <li>
          <t>A Track Namespace can begin with a prefix: zero or more fields chosen by
the deployment, which this document does not interpret. The tuple fields
defined here follow the prefix and are numbered from 0.</t>
        </li>
        <li>
          <t>Tuple fields 0 through 7 are required. Tuple fields 8 through 13 are
optional: the Track Namespace can end after any tuple field from 7
onward, and each omitted tuple field takes the value given in its
section.</t>
        </li>
        <li>
          <t>MOQT does not permit empty Track Namespace fields <xref target="MOQT"/>, so every
tuple field that is present carries an explicit value.</t>
        </li>
        <li>
          <t>A field that does not apply to the set of tracks <bcp14>MUST</bcp14> be <tt>_</tt>. For example,
the audio fields are <tt>_</tt> when there is no audio. A field that does not
apply takes the value <tt>_</tt> when omitted.</t>
        </li>
        <li>
          <t>Tuple field values use only the characters a-z, 0-9 and <tt>_</tt>, which the MOQT
name representation renders verbatim (<xref section="8.8" sectionFormat="of" target="MOQT"/>). Numeric
fields are decimal integers without leading zeros.</t>
        </li>
      </ul>
      <t>Track Namespaces that differ only in trailing tuple fields, which one omits
and the other spells out with the values they take when omitted, describe
the same set of tracks. A publisher that names a set of tracks itself, for
example in PUBLISH_NAMESPACE or PUBLISH, <bcp14>MUST</bcp14> omit every trailing tuple
field whose value equals the value it takes when omitted.</t>
      <t>Future versions will use a different value for tuple field 0 and may define
a different set of parameters.</t>
      <section anchor="tuple-field-0-mtt00">
        <name>Tuple Field 0: "mtt_00"</name>
        <t>This field identifies the moq-test-tracks protocol and this version of its
parameters. Its value is <tt>mtt_00</tt>.</t>
      </section>
      <section anchor="content">
        <name>Tuple Field 1: Content</name>
        <t>This field specifies the picture and sound. The content determines how much
the media compresses, and so the size of the objects. The following values
are defined:</t>
        <ul spacing="normal">
          <li>
            <t>clock := A moving picture with a 440 Hz tone. The picture shows the
capture time of each frame and a frame counter, and <bcp14>SHOULD</bcp14> show the group
and object IDs. At each whole second of capture time, a 1 kHz beep plays
for 100 ms and the picture shows a marker for one frame, so that
audio/video sync can be checked.</t>
          </li>
          <li>
            <t>bars := Static color bars with a 1 kHz tone. The media compresses to near
the encoder's minimum.</t>
          </li>
          <li>
            <t>noise := Random noise in picture and sound. The encoder runs at the target
bitrate (<xref target="bitrates"/>).</t>
          </li>
          <li>
            <t>Any other value := A clip: content chosen by the deployment, such as a
film or a recorded broadcast, encoded to the parameters of the namespace.
The value is the clip's identifier. This document does not specify any
clip. Each deployment chooses the clips it serves and their identifiers,
and may add to them. A Track Namespace that asks for a track the clip
does not have, such as a view or audio, describes tracks the publisher
does not support (<xref target="publisher-behavior"/>). When a clip's license requires
attribution, the picture <bcp14>SHOULD</bcp14> show it.</t>
          </li>
        </ul>
        <t><tt>clock</tt>, <tt>bars</tt> and <tt>noise</tt> name classes of content by what they let a
subscriber measure, not specific media. The values <tt>black</tt>, <tt>motion</tt>,
<tt>zoneplate</tt>, <tt>ramp</tt>, <tt>sweep</tt>, <tt>silence</tt>, <tt>sync</tt>, <tt>scroll</tt>, <tt>clip</tt>, <tt>none</tt>,
<tt>any</tt>, <tt>all</tt>, <tt>default</tt>, <tt>test</tt>, <tt>live</tt> and <tt>random</tt> are reserved for later
revisions of this document. A clip identifier <bcp14>MUST NOT</bcp14> be a defined or
reserved value.</t>
      </section>
      <section anchor="tuple-field-2-packaging">
        <name>Tuple Field 2: Packaging</name>
        <t>This field specifies the packaging of the media tracks. The following values
are defined:</t>
        <ul spacing="normal">
          <li>
            <t>loc := LOC <xref target="LOC"/></t>
          </li>
          <li>
            <t>cmaf := CMAF, as specified by <xref target="CMSF"/></t>
          </li>
          <li>
            <t>locmaf := LOCMAF <xref target="LOCMAF"/></t>
          </li>
        </ul>
      </section>
      <section anchor="tuple-field-3-video-codec">
        <name>Tuple Field 3: Video Codec</name>
        <t>This field specifies the video codec. The following values are defined:</t>
        <ul spacing="normal">
          <li>
            <t>h264 := H.264 High</t>
          </li>
          <li>
            <t>h264cb := H.264 Constrained Baseline</t>
          </li>
          <li>
            <t>h265 := H.265 Main</t>
          </li>
          <li>
            <t>av1 := AV1 Main</t>
          </li>
          <li>
            <t>none := No video track</t>
          </li>
        </ul>
        <t>Video is encoded without B-frames, so decode order is presentation order. The
level is the lowest that fits the height, frame rate and bitrate. When the
value is <tt>none</tt>, tuple fields 4, 5, 10 and 13 <bcp14>MUST</bcp14> be <tt>_</tt>.</t>
      </section>
      <section anchor="tuple-field-4-video-height">
        <name>Tuple Field 4: Video Height</name>
        <t>This field specifies the video height in pixels. The following values are
defined: 180, 360, 480, 540, 720, 1080, 1440 and 2160.</t>
        <t>The width is the height multiplied by 16/9, rounded to the nearest even
number (854 for a height of 480).</t>
      </section>
      <section anchor="tuple-field-5-frame-rate">
        <name>Tuple Field 5: Frame Rate</name>
        <t>This field specifies the video frame rate in frames per second, as an integer
from 1 to 120. The values <tt>23_976</tt>, <tt>29_97</tt> and <tt>59_94</tt> specify 24000/1001,
30000/1001 and 60000/1001.</t>
      </section>
      <section anchor="tuple-field-6-audio-codec">
        <name>Tuple Field 6: Audio Codec</name>
        <t>This field specifies the audio codec. The following values are defined:</t>
        <ul spacing="normal">
          <li>
            <t>aac := AAC-LC</t>
          </li>
          <li>
            <t>opus := Opus with 20 ms frames</t>
          </li>
          <li>
            <t>none := No audio track</t>
          </li>
        </ul>
        <t>Audio is sampled at 48000 Hz. When the value is <tt>none</tt>, tuple fields 7 and 11
<bcp14>MUST</bcp14> be <tt>_</tt>.</t>
      </section>
      <section anchor="tuple-field-7-audio-channels">
        <name>Tuple Field 7: Audio Channels</name>
        <t>This field specifies the number of audio channels. The following values are
defined:</t>
        <ul spacing="normal">
          <li>
            <t>1 := Mono</t>
          </li>
          <li>
            <t>2 := Stereo</t>
          </li>
        </ul>
      </section>
      <section anchor="tuple-field-8-catalog">
        <name>Tuple Field 8: Catalog</name>
        <t>This field specifies the catalog format published on the "catalog" track.
The following values are defined:</t>
        <ul spacing="normal">
          <li>
            <t>msf := MSF catalog <xref target="MSF"/>, using the CMSF extensions <xref target="CMSF"/> for tracks
with <tt>cmaf</tt> or <tt>locmaf</tt> packaging</t>
          </li>
          <li>
            <t>none := No catalog track</t>
          </li>
        </ul>
        <t>When the value is <tt>none</tt>, tuple field 2 <bcp14>MUST</bcp14> be <tt>loc</tt>, and the subscriber
learns the media configuration from the Track Namespace and from the media
itself (<xref target="tracks"/>).</t>
        <t>When omitted, the value is <tt>msf</tt>.</t>
      </section>
      <section anchor="tuple-field-9-init-data">
        <name>Tuple Field 9: Init Data</name>
        <t>This field specifies where the decoder initialization data of the media
tracks is carried. Each value corresponds to an entry type in the catalog's
Initialization Data List <xref target="MSF"/>. The following values are defined:</t>
        <ul spacing="normal">
          <li>
            <t>catalog := In the catalog (type <tt>inline</tt>)</t>
          </li>
          <li>
            <t>track := In the VIDEO_CONFIG or AUDIO_CONFIG Track Property (type
<tt>track-property</tt>)</t>
          </li>
          <li>
            <t>object := In the VIDEO_CONFIG or AUDIO_CONFIG Object Property on the first
object of each group (type <tt>object-property</tt>)</t>
          </li>
        </ul>
        <t>With <tt>cmaf</tt> and <tt>locmaf</tt> packaging, the value <bcp14>MUST</bcp14> be <tt>catalog</tt>, as CMSF
requires for CMAF headers <xref target="CMSF"/>. When tuple field 8 is <tt>none</tt>, the
value <bcp14>MUST</bcp14> be <tt>_</tt>, and the initialization data is carried in the media
itself (<xref target="tracks"/>).</t>
        <t>When omitted, the value is <tt>catalog</tt>.</t>
      </section>
      <section anchor="tuple-field-10-group-duration">
        <name>Tuple Field 10: Group Duration</name>
        <t>This field specifies the interval between video key frames in milliseconds,
from 100 to 10000, and so the duration of each video group (<xref target="tracks"/>).
The interval <bcp14>MUST</bcp14> be a whole number of frames, for example 2000 at 30
frames per second. At <tt>23_976</tt>, <tt>29_97</tt> and <tt>59_94</tt>, this makes it a
multiple of 1001, for example 2002.</t>
        <t>When omitted, the value is 2000, or 2002 when tuple field 5 is <tt>23_976</tt>,
<tt>29_97</tt> or <tt>59_94</tt>.</t>
      </section>
      <section anchor="tuple-field-11-audio-delivery">
        <name>Tuple Field 11: Audio Delivery</name>
        <t>This field specifies how audio frames are grouped and delivered. The
following values are defined:</t>
        <ul spacing="normal">
          <li>
            <t>An integer from 1 to 100 := That many audio frames in each audio group,
with each group on one stream (<xref target="tracks"/>)</t>
          </li>
          <li>
            <t>dgram := Each audio frame is its own group and is sent in a datagram
<xref target="MOQT"/></t>
          </li>
        </ul>
        <t>With <tt>dgram</tt>, tuple field 2 <bcp14>MUST</bcp14> be <tt>loc</tt> or <tt>cmaf</tt>.</t>
        <t>When omitted, the value is 1.</t>
      </section>
      <section anchor="tuple-field-12-duration">
        <name>Tuple Field 12: Duration</name>
        <t>This field specifies the duration of the tracks in seconds, from 0 to 86400.
The value 0 means the tracks continue until unsubscribed.</t>
        <t>When omitted, the value is 0.</t>
      </section>
      <section anchor="video-tracks">
        <name>Tuple Field 13: Video Tracks</name>
        <t>This field specifies how many video tracks the set contains, and how they
relate. The following values are defined:</t>
        <ul spacing="normal">
          <li>
            <t>1 := One video track</t>
          </li>
          <li>
            <t>altN, where N is from 2 to 7 := A ladder of N renditions of the same
picture, for adaptive bitrate switching</t>
          </li>
          <li>
            <t>viewN, where N is from 2 to 16 := N views, each a different picture with
the height and frame rate of tuple fields 4 and 5</t>
          </li>
        </ul>
        <t>When omitted, the value is 1.</t>
        <t>In a ladder, the first rendition has the height of tuple field 4. Each
following rendition has the largest height defined for tuple field 4 that
is at most three quarters of the height of the rendition before it. N <bcp14>MUST
NOT</bcp14> exceed the number of renditions this yields from the height of tuple
field 4. For example, <tt>alt4</tt> at a height of 1080 yields 1080, 720, 540 and
360. The longest ladder, from a height of 2160, has seven renditions: 2160,
1440, 1080, 720, 540, 360 and 180. Every rendition has the frame rate of
tuple field 5 and the bitrate of its own height (<xref target="bitrates"/>).</t>
        <t>With <tt>clock</tt>, <tt>bars</tt> or <tt>noise</tt> content, the views are distinct pictures of
that content. With a clip, the views are the clip's synchronized views, if
it has them (<xref target="content"/>).</t>
        <t>With values other than 1, tuple field 8 <bcp14>MUST</bcp14> be <tt>msf</tt>.</t>
      </section>
    </section>
    <section anchor="tracks">
      <name>Tracks</name>
      <t>Under the Track Namespace, the publisher publishes tracks with the following
Track Names:</t>
      <ul spacing="normal">
        <li>
          <t>"catalog", unless tuple field 8 is <tt>none</tt>. This is the Track Name MSF
reserves for the catalog <xref target="MSF"/>.</t>
        </li>
        <li>
          <t>"video", unless tuple field 3 is <tt>none</tt>. With more than one video track
(<xref target="video-tracks"/>), the others are "video_1", "video_2" and so on, in
ladder or view order.</t>
        </li>
        <li>
          <t>"audio", unless tuple field 6 is <tt>none</tt>.</t>
        </li>
      </ul>
      <t>The "video", "video_N" and "audio" Track Names are defined by this
document.</t>
      <t>The catalog describes the video and audio tracks with the parameters of the
namespace. This includes the codec string <xref target="RFC6381"/> for the exact
profile and level, and the bitrate (<xref target="bitrates"/>).
Each track in the catalog is live (isLive true) and has a targetLatency of
250 milliseconds <xref target="MSF"/>. No tuple field changes the target latency.</t>
      <t>Each video group begins with a key frame and contains the frames up to the
next key frame. Each video frame is one object, and so is each audio frame.
With <tt>cmaf</tt> packaging, each object is one CMAF chunk (<xref target="CMSF"/>). Each group is
sent on one stream, as subgroup 0 <xref target="MSF"/>, except audio sent in
datagrams (tuple field 11).</t>
      <t>When tuple field 8 is <tt>none</tt>:</t>
      <ul spacing="normal">
        <li>
          <t>Video carries its decoder configuration in the payload (<xref target="LOC"/>): the
parameter sets with H.264 and H.265, the sequence header with AV1.</t>
        </li>
        <li>
          <t>With <tt>aac</tt>, the first object of each audio group carries the Audio Config
property (<xref target="LOC"/>).</t>
        </li>
        <li>
          <t>With <tt>opus</tt>, no decoder configuration is sent. The subscriber configures
its decoder for 48000 Hz and the channel count of tuple field 7.</t>
        </li>
      </ul>
      <section anchor="bitrates">
        <name>Bitrates</name>
        <t>The target bitrate of each video track follows from its height:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Height</th>
              <th align="right">Video kbps</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">180</td>
              <td align="right">200</td>
            </tr>
            <tr>
              <td align="right">360</td>
              <td align="right">600</td>
            </tr>
            <tr>
              <td align="right">480</td>
              <td align="right">1000</td>
            </tr>
            <tr>
              <td align="right">540</td>
              <td align="right">1500</td>
            </tr>
            <tr>
              <td align="right">720</td>
              <td align="right">2500</td>
            </tr>
            <tr>
              <td align="right">1080</td>
              <td align="right">4500</td>
            </tr>
            <tr>
              <td align="right">1440</td>
              <td align="right">9000</td>
            </tr>
            <tr>
              <td align="right">2160</td>
              <td align="right">16000</td>
            </tr>
          </tbody>
        </table>
        <t>At frame rates above 30, the video bitrate is 1.5 times the value in the
table.</t>
        <t>The target bitrate of the audio track follows from its codec and channels:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Codec</th>
              <th align="right">Mono kbps</th>
              <th align="right">Stereo kbps</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">aac</td>
              <td align="right">64</td>
              <td align="right">128</td>
            </tr>
            <tr>
              <td align="left">opus</td>
              <td align="right">32</td>
              <td align="right">64</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="video-sets">
        <name>Several Video Tracks</name>
        <t>When tuple field 13 specifies more than one video track:</t>
        <ul spacing="normal">
          <li>
            <t>All video tracks share the frame rate and group duration. Frames captured
at the same time have the same Group ID and Object ID in every video
track, so a subscriber can switch between the tracks at any group
boundary.</t>
          </li>
          <li>
            <t>The catalog gives every video track a label. In a ladder, the label is
the height followed by "p", for example "720p". The views are numbered
from 1 in Track Name order, and the label of a view is "view" followed by
a space and its number, for example "view 2".</t>
          </li>
          <li>
            <t>With <tt>clock</tt>, <tt>bars</tt> or <tt>noise</tt> content, the picture of every video
track shows its label, so that a switch between tracks is visible.</t>
          </li>
          <li>
            <t>In a ladder, the catalog gives all video tracks the same altGroup. Each
view has an altGroup of its own.</t>
          </li>
          <li>
            <t>The set has one audio track, which has no altGroup.</t>
          </li>
        </ul>
      </section>
      <section anchor="timing">
        <name>Timing</name>
        <t>The capture time of a media object is the wall-clock time at which its
frame is captured, before it is encoded. The publisher captures frames on a
fixed schedule anchored at the Unix epoch, so the capture time of each
object follows from its Group ID and Object ID alone. A publisher that
encodes ahead of time and sends recorded media uses each frame's scheduled
time as its capture time.</t>
        <t>Each media track carries the TIMESCALE and TIMESTAMP_MAPPING Track
Properties <xref target="MoQTimestamp"/>, without CLOCK_ID, so that timestamps are
wall-clock time:</t>
        <ul spacing="normal">
          <li>
            <t>For video, the timescale is 1000 times the frame rate, or 24000, 30000
and 60000 for <tt>23_976</tt>, <tt>29_97</tt> and <tt>59_94</tt>. The Object Multiplier is
1000, or 1001 for those three frame rates.</t>
          </li>
          <li>
            <t>For audio, the timescale is 48000. The Object Multiplier is the
number of samples per frame.</t>
          </li>
          <li>
            <t>The Group Multiplier is the number of objects per group multiplied by the
Object Multiplier.</t>
          </li>
          <li>
            <t>The Base Group and the Base Timestamp are 0. The Group ID of a group is
the capture time of its first object, in ticks of the timescale since the
Unix epoch, divided by the Group Multiplier.</t>
          </li>
        </ul>
        <t>The Track Properties therefore follow from the Track Namespace alone, so
every publisher of a track sends the same values, including after a
restart (<xref section="7" sectionFormat="of" target="MoQTimestamp"/>). A publisher starts each track at
its next group boundary.</t>
        <t>With <tt>cmaf</tt> and <tt>locmaf</tt> packaging, the media timescale of each track in its
CMAF header <xref target="CMSF"/> is the timescale above, so the media timestamps count
the same ticks as the mapping.</t>
        <t>Capture times are in whole ticks. An object whose capture time differs from
its mapped timestamp carries OBJECT_TIMESTAMP with the correction. A
publisher that keeps to the schedule sends no per-object timing.</t>
        <t>In addition:</t>
        <ul spacing="normal">
          <li>
            <t>With <tt>loc</tt> packaging, the Timestamp property (<xref target="LOC"/>) carries the capture
time in microseconds since the Unix epoch, rounded to the nearest
microsecond, and the LOC Timescale property is not sent.</t>
          </li>
          <li>
            <t>With <tt>cmaf</tt> and <tt>locmaf</tt> packaging, the first object of each group
contains a ProducerReferenceTimeBox (prft) with the capture time.</t>
          </li>
        </ul>
        <t>These times agree with the mapped timestamp to within one tick, as
microseconds and ticks do not divide evenly.</t>
        <t>Latency is the time at which an object is received minus its capture time.
It includes encoding only when the publisher encodes live, so a latency
result needs to state whether the publisher encoded the media live or ahead
of time. Measuring latency requires the subscriber's clock to agree with the
publisher's, for example by running the subscriber on the publisher's host,
or by synchronizing both to a common time source.</t>
      </section>
    </section>
    <section anchor="publisher-behavior">
      <name>Publisher Behavior</name>
      <t>If any namespace tuple field is not valid as defined in this document, or
describes tracks that the publisher does not support, the publisher <bcp14>MUST</bcp14>
respond with REQUEST_ERROR with error code DOES_NOT_EXIST. The reason phrase
<bcp14>SHOULD</bcp14> identify the tuple field. If producing the tracks would exceed the
publisher's limits, the publisher <bcp14>MUST</bcp14> respond with REQUEST_ERROR with error
code EXCESSIVE_LOAD.</t>
      <t>A publisher delivers a set of tracks in one of two ways:</t>
      <ul spacing="normal">
        <li>
          <t>It sends PUBLISH_NAMESPACE for the Track Namespace and then PUBLISH for
each track, so that relays receive the tracks before any subscriber asks
for them.</t>
        </li>
        <li>
          <t>It sends PUBLISH_NAMESPACE for the Track Namespace only, and relays
forward each SUBSCRIBE for a track in the namespace to it.</t>
        </li>
      </ul>
      <t>Upon receiving a valid SUBSCRIBE or FETCH for a moq-test-tracks track, the
publisher <bcp14>MUST</bcp14> publish objects according to the parameters of the namespace.</t>
      <t>Upon receiving a SUBSCRIBE_TRACKS whose Track Namespace Prefix is a
moq-test-tracks Track Namespace, the publisher <bcp14>MUST</bcp14> use PUBLISH to send each
track in the namespace. If a PUBLISH is rejected, the publisher <bcp14>MUST</bcp14> stop
sending objects for that track immediately. A Track Namespace Prefix that
ends before tuple field 7 names no set of tracks. For such a prefix, the
publisher sends PUBLISH only for the tracks of sets it is already producing
under the prefix, and starts no new set.</t>
      <t>A publisher <bcp14>MAY</bcp14> serve moq-test-tracks on demand. To do so, it sends
PUBLISH_NAMESPACE for a prefix that ends with <tt>mtt_00</tt>, or with <tt>mtt_00</tt>
and a value of tuple field 1 to serve only that content, such as one clip.
Relays route any SUBSCRIBE whose Track Namespace matches this prefix to the
publisher (<xref section="2.4.2" sectionFormat="of" target="MOQT"/>).</t>
      <ul spacing="normal">
        <li>
          <t>The prefix is the only Track Namespace the publisher announces for the
sets of tracks it can produce. The parameters allow far too many sets to
enumerate, and no set exists until a request names its Track Namespace.</t>
        </li>
        <li>
          <t>The publisher begins producing a set of tracks upon the first request for
its Track Namespace. While it produces the set, it <bcp14>MAY</bcp14> send
PUBLISH_NAMESPACE for the set's Track Namespace. If it does, it sends
PUBLISH_NAMESPACE_DONE when it stops producing the set.</t>
        </li>
        <li>
          <t>It serves later requests for the same Track Namespace from the same media.
It <bcp14>MAY</bcp14> also serve a Track Namespace that describes the same set of tracks
from the same media.</t>
        </li>
        <li>
          <t>It <bcp14>MAY</bcp14> stop producing the tracks when no subscriptions remain.</t>
        </li>
      </ul>
      <t>A subscriber discovers what a deployment serves by sending
SUBSCRIBE_NAMESPACE for the deployment's prefix followed by <tt>mtt_00</tt>
        <xref target="MOQT"/>. It receives the prefixes that on-demand publishers announce, and
the Track Namespaces of the sets that publishers announce while producing
them. An on-demand publisher that announces one prefix for each value of
tuple field 1 it serves thereby lists its content, including its clips. The
subscriber does not learn which other parameters a publisher supports. It
writes out the Track Namespace it wants, and a publisher that does not
support that set of tracks responds with DOES_NOT_EXIST.</t>
      <t>A Track Namespace that omits trailing tuple fields is a tuple prefix of the
Track Namespaces that spell them out. A relay that routes by Track Namespace
prefix can therefore forward a request for a longer Track Namespace to the
publisher of a shorter one, which returns DOES_NOT_EXIST unless it serves
the requested set of tracks. Likewise, a SUBSCRIBE_NAMESPACE for a
moq-test-tracks Track Namespace also matches the longer Track Namespaces
that extend it. Publishers that share a relay <bcp14>SHOULD</bcp14> have distinct
prefixes, for example by including a field that identifies the publisher.
Otherwise a relay can route a request to a publisher that does not serve
it, such as a request that an on-demand publisher would serve to a
publisher of fixed sets of tracks.</t>
      <t>Ending a set of tracks is not an error. When the duration in tuple field 12
elapses, or when the publisher ends the tracks earlier, for example at a
limit of its own, the publisher <bcp14>MUST</bcp14> end each track gracefully <xref target="MOQT"/>:</t>
      <ul spacing="normal">
        <li>
          <t>It marks the end of the track with the End of Track object status.</t>
        </li>
        <li>
          <t>It sends PUBLISH_DONE with status code TRACK_ENDED for each subscription
to the track.</t>
        </li>
        <li>
          <t>If it sent PUBLISH_NAMESPACE for the Track Namespace of the set, it then
sends PUBLISH_NAMESPACE_DONE.</t>
        </li>
      </ul>
      <t>The End of Track status takes the Location one past the last object of the
last group. It is sent on that group's stream before the stream ends. When
that stream has already ended, as is usual for the catalog track, the status
instead takes the first Location of the next group, on a new stream. With
<tt>dgram</tt> audio, the status is sent in a datagram and can be lost, so
subscribers rely on PUBLISH_DONE.</t>
      <t>The publisher <bcp14>MUST NOT</bcp14> use GOAWAY to end tracks; GOAWAY asks peers to move
to a new session.</t>
      <t>When audio is sent in datagrams, some combinations of codec and channels
produce objects larger than the maximum datagram size. If the publisher
detects this when handling the request, it <bcp14>MUST</bcp14> respond with REQUEST_ERROR
with error code DOES_NOT_EXIST. If it detects this when publishing an
object, it <bcp14>MUST</bcp14> send PUBLISH_DONE with status code INTERNAL_ERROR. The
publisher <bcp14>MUST NOT</bcp14> send such objects on a stream instead.</t>
      <t>Media encoders are not deterministic, so object payloads differ between
publishers for the same Track Namespace. A subscriber that validates
moq-test-tracks media checks the parameters of the namespace rather than
payload bytes. These parameters are the codec configuration, frame rate,
group duration, objects per group, audio delivery and the video tracks of
the set.</t>
    </section>
    <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="security-considerations">
      <name>Security Considerations</name>
      <t>A subscriber can make a publisher do far more work than the request
costs, and encoding media makes the imbalance larger than for moq-test.
Publishers <bcp14>SHOULD</bcp14> set limits on values such as height, frame rate,
duration, the number of video tracks and the number of concurrent sets of
tracks, to prevent resource exhaustion attacks. Publishers <bcp14>SHOULD</bcp14> serve all
subscriptions to one Track Namespace from a single set of tracks.</t>
      <t>A publisher serving on demand <bcp14>SHOULD</bcp14> do so only through relays that
authorize subscribers for its prefix, for example with Common Access Tokens
<xref target="C4M"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="MOQT">
          <front>
            <title>Media over QUIC Transport</title>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <date day="1" month="October" year="2026"/>
            <abstract>
              <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-22"/>
        </reference>
        <reference anchor="MSF">
          <front>
            <title>MOQT Streaming Format</title>
            <author fullname="Will Law" initials="W." surname="Law">
              <organization>Akamai</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <date day="2" month="June" year="2026"/>
            <abstract>
              <t>   This document specifies the MOQT Streaming Format, designed to
   operate on Media Over QUIC Transport.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-msf-01"/>
        </reference>
        <reference anchor="CMSF">
          <front>
            <title>CMSF- a CMAF compliant implementation of MOQT Streaming Format</title>
            <author fullname="Will Law" initials="W." surname="Law">
              <organization>Akamai</organization>
            </author>
            <date day="3" month="June" year="2026"/>
            <abstract>
              <t>   This document updates MOQT Streaming Format by defining optional
   syntax and semantics for carrying CMAF-packaged media.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-cmsf-01"/>
        </reference>
        <reference anchor="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="MoQTimestamp">
          <front>
            <title>Timestamp Properties for MOQT</title>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <date day="5" month="October" year="2026"/>
            <abstract>
              <t>   This document defines a set of MOQT Properties for carrying per-
   Object timestamps efficiently.  The encoded timestamp is intended for
   use in MOQT, but can be referenced for application specific purposes.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-frindell-moq-timestamp-00"/>
        </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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="MoQTest">
          <front>
            <title>MoQT Test</title>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <date day="7" month="July" year="2025"/>
            <abstract>
              <t>   This document specifies the moq-test protocol, a testing protocol for
   Media over QUIC (MOQ) implementations. moq-test utilizes the Track
   Namespace as parameters to the publisher, enabling flexible and
   customizable testing scenarios.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-afrind-moq-test-01"/>
        </reference>
        <reference anchor="LOCMAF">
          <front>
            <title>Low Overhead CMAF for Media over QUIC (LOCMAF)</title>
            <author fullname="Torbjörn Einarsson" initials="T." surname="Einarsson">
              <organization>Eyevinn Technology</organization>
            </author>
            <date day="5" month="July" year="2026"/>
            <abstract>
              <t>   This document specifies LOCMAF (Low Overhead CMAF for Media over
   QUIC), a compact packaging for low-latency CMAF media carried end-to-
   end as MoQ Transport (MOQT) Object payloads, with per-object overhead
   comparable to the Low Overhead Container (LOC).  LOCMAF carries the
   CMAF chunk head metadata from a single moof (movie fragment) as a
   small set of tagged fields, while leaving the sample data (mdat)
   untouched.  Boxes that may surround the moof in a CMAF chunk — styp
   (segment type), prft (producer reference time), and any number of
   emsg (event message) boxes — are carried verbatim, each through a
   generic box element (a genBox).  The first Object of each MOQT group
   carries a full reference; subsequent Objects in the same group carry
   only the differences.  The receiver reconstructs CMAF chunks that are
   decode-equivalent to the sender input, including the encryption
   metadata required by CMAF DRM (Common Encryption) pipelines, and a
   canonical byte-identical reconstruction — independent of the
   encoder's representation choices — is defined for conformance
   testing.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-einarsson-moq-locmaf-01"/>
        </reference>
        <reference anchor="C4M">
          <front>
            <title>Authorization scheme for MOQT using Common Access Tokens</title>
            <author fullname="Will Law" initials="W." surname="Law">
              <organization>Akamai</organization>
            </author>
            <author fullname="Chris Lemmons" initials="C." surname="Lemmons">
              <organization>Comcast</organization>
            </author>
            <author fullname="Gwendal Simon" initials="G." surname="Simon">
              <organization>Synamedia</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <date day="18" month="June" year="2026"/>
            <abstract>
              <t>   A token-based authorization scheme for use with Media Over QUIC
   Transport.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-c4m-01"/>
        </reference>
        <reference anchor="RFC6381">
          <front>
            <title>The 'Codecs' and 'Profiles' Parameters for "Bucket" Media Types</title>
            <author fullname="R. Gellens" initials="R." surname="Gellens"/>
            <author fullname="D. Singer" initials="D." surname="Singer"/>
            <author fullname="P. Frojdh" initials="P." surname="Frojdh"/>
            <date month="August" year="2011"/>
            <abstract>
              <t>Several MIME type/subtype combinations exist that can contain different media formats. A receiving agent thus needs to examine the details of such media content to determine if the specific elements can be rendered given an available set of codecs. Especially when the end system has limited resources, or the connection to the end system has limited bandwidth, it is helpful to know from the Content- Type alone if the content can be rendered.</t>
              <t>This document specifies two parameters, 'codecs' and 'profiles', that are used with various MIME types or type/subtype combinations to allow for unambiguous specification of the codecs employed by the media formats contained within, or the profile(s) of the overall container format. This document obsoletes RFC 4281; RFC 4281 defines the 'codecs' parameter, which this document retains in a backwards compatible manner with minor clarifications; the 'profiles' parameter is added by this document.</t>
              <t>By labeling content with the specific codecs indicated to render the contained media, receiving systems can determine if the codecs are supported by the end system, and if not, can take appropriate action (such as rejecting the content, sending notification of the situation, transcoding the content to a supported type, fetching and installing the required codecs, further inspection to determine if it will be sufficient to support a subset of the indicated codecs, etc.).</t>
              <t>Similarly, the profiles can provide an overall indication, to the receiver, of the specifications with which the content complies. This is an indication of the compatibility of the container format and its contents to some specification. The receiver may be able to work out the extent to which it can handle and render the content by examining to see which of the declared profiles it supports, and what they mean. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6381"/>
          <seriesInfo name="DOI" value="10.17487/RFC6381"/>
        </reference>
      </references>
    </references>
    <?line 567?>

<section anchor="examples">
      <name>Examples</name>
      <t>The examples write the Track Namespace with its tuple fields separated by
"/", and wrap it after tuple field 0. The prefix is "example".</t>
      <t>720p30 H.264 with stereo AAC, LOC packaging, MSF catalog with the
initialization data in it:</t>
      <artwork><![CDATA[
example/mtt_00/
  clock/loc/h264/720/30/aac/2
]]></artwork>
      <t>The same set of tracks with every optional tuple field spelled out. A
publisher names it with the shorter form above:</t>
      <artwork><![CDATA[
example/mtt_00/
  clock/loc/h264/720/30/aac/2/msf/catalog/2000/1/0/1
]]></artwork>
      <t>The "video" track of the first example, in the MOQT name representation
(<xref section="8.8" sectionFormat="of" target="MOQT"/>):</t>
      <artwork><![CDATA[
example-mtt_00-clock-loc-h264-720-30-aac-2--video
]]></artwork>
      <t>1080p60 AV1 with Opus audio on datagrams, initialization data in Track
Properties:</t>
      <artwork><![CDATA[
example/mtt_00/
  clock/loc/av1/1080/60/opus/2/msf/track/2000/dgram
]]></artwork>
      <t>360p30 H.264 Constrained Baseline, initialization data on the first object
of each group:</t>
      <artwork><![CDATA[
example/mtt_00/
  clock/loc/h264cb/360/30/aac/2/msf/object
]]></artwork>
      <t>720p at 29.97 frames per second, CMAF packaging, no audio, for 10 minutes:</t>
      <artwork><![CDATA[
example/mtt_00/
  clock/cmaf/h264/720/29_97/none/_/msf/catalog/2002/_/600
]]></artwork>
      <t>Opus mono audio only, 10 frames per group, no catalog:</t>
      <artwork><![CDATA[
example/mtt_00/
  clock/loc/none/_/_/opus/1/none/_/_/10
]]></artwork>
      <t>A clip that the deployment identifies as "clip_a", as 1080p30 H.264 with
CMAF packaging:</t>
      <artwork><![CDATA[
example/mtt_00/
  clip_a/cmaf/h264/1080/30/aac/2
]]></artwork>
      <t>A three-rendition ladder from 1080p30 H.264. The video tracks are "video"
(1080p, 4500 kbps), "video_1" (720p, 2500 kbps) and "video_2" (540p, 1500
kbps), all in one altGroup:</t>
      <artwork><![CDATA[
example/mtt_00/
  clock/loc/h264/1080/30/aac/2/msf/catalog/2000/1/0/alt3
]]></artwork>
      <t>Four views of 720p30 H.264, as the tracks "video" ("view 1") through
"video_3" ("view 4"), each in its own altGroup:</t>
      <artwork><![CDATA[
example/mtt_00/
  clock/loc/h264/720/30/aac/2/msf/catalog/2000/1/0/view4
]]></artwork>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document builds on moq-test <xref target="MoQTest"/> by Alan Frindell, who also
reviewed it. Thanks to the OpenMOQ team for implementations and test
deployments, and to members of the Media over QUIC working group for
discussion and review.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
KLuM/jUAoRPcXttmCwr2OAqQ5x9enR+8P3511NoNoLnLgKULaa7/sOQtc1gC
eyfK2M0oNMjro4uDNzpcd7eT4qTFDEJ0/emdziiOeUvzzTftyFgHzIN0efF+
/+Bv52r51/YOy+5U1EpNF9ivlKAYbOwtc7SvOcUsiDX9iGRhifwbrOqxXldR
7oxe1cUS6e5ZeHqAkBqKQaZYsDKuE7IxPds9dIEaGM48t7VSq7q5Ly+6uwAR
icgGEN3H26Vdix/FAjlWVCwiBkGCW6LqKCPlMrtvFIZZ+ZKfm4EjVXFdc2xD
usMAHdk+2f+HbIhZYzF0eCWLiHcdFTDFVTGQ7TMEqemXHLc6wSsvSVo8dYsd
R26tK0Y2kUkmtJOpnggnADjdqNrUYZv9NNBAvPvHvFfNQNGuaIFGnPqZdhHV
MZc+59KDz5AXHcoEkcLWaGe0Fe5kNRqiLT33c0URwK5vFwq5Mspz8gjjpvbJ
253rqrUjNDzCYO2AkEiipojeLgrpW+EBaiSzkhw7bDkU59MUhB+TT2lFT0iH
TeQPuBCehW/UPZTErc6DrWWwxkp1LcJqGTZD+ilEm/dNYX+Zo1hIi9WF+o4b
ZjZhzxwpxod1NT38fc/Ixwhw2c4HfNszzuXh2emR+Ht4jFRF1bHDLDZqNrhg
zbt/3Oqa+jUHV2v70V1g2xzrgJ1vx7K4KKscj0f9W8zaNd31LcYu+9qd4gc3
BVb0gGOBNYM5xFoupQGlxFlEOeuJwIzO0iou2Au4k3xosM1OsQLnUHSsaazG
OrmaF7/3Uhdmn71qcJ1vfDaL2vsq0HBu63eRD0VThQdeOAljCTA9Jr1pn2Kx
mUd13+uIKiQGUzVby3bAvG9WTRV72YZq8gsstYymms60NV2zL5EzI4SGjIVV
Sjuq8pp0Bl/GhkZpgQzp5Pxa7ml3G945DAm1R5jdEAeYt0WbuzJFGQsJwz43
iMC8i/K6cqfbdJbuzyZwOxX5altF+A5ztgMdtxlM1ysFvF2/f1c/m0O9otjW
dob+kwJ4lz/7glgmbD27dOpdwngwK3fPINGh9TAen7wSHzAKVR3iQvRSlX3n
o7SNi5yLwufI8C5ll7gvEwpSSRbb6HGtJZ5ZmK+DY5jaTgcOqbpLK95C/ZBA
ftVbEw3VWMrkgbVV0iYlJy1xz9u7RpoE71yHixTbGg1xQc11XRkn12uhapDI
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

-->

</rfc>
