<?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-frindell-moq-timestamp-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="moq-timestamp">Timestamp Properties for MOQT</title>
    <seriesInfo name="Internet-Draft" value="draft-frindell-moq-timestamp-00"/>
    <author initials="A." surname="Frindell" fullname="Alan Frindell">
      <organization>Meta</organization>
      <address>
        <email>afrind@meta.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett">
      <organization>Google</organization>
      <address>
        <email>ianswett@google.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="05"/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <keyword>timestamp</keyword>
    <abstract>
      <?line 45?>

<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>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://afrind.github.io/draft-frindell-moq-timestamp/draft-frindell-moq-timestamp.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-frindell-moq-timestamp/"/>.
      </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/afrind/draft-frindell-moq-timestamp"/>.</t>
    </note>
  </front>
  <middle>
    <?line 51?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Media over QUIC Transport (MOQT) <xref target="MOQT"/> delivers Tracks that contain a
sequence of Objects. Though the transport layer does not need to know
media-oriented or application level timestamps, timing information can
help it make optimal scheduling decisions.  Additionally, they provide
visibility into latency and offer a Property applications can extend.</t>
      <t>This document defines how a MOQT timestamp is encoded.
The design has three features:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Initial time</strong>: A Track declares its start time once, so Objects can delta
encode their timestamps from the Initial time.</t>
        </li>
        <li>
          <t><strong>Default Inter-Group/Object timing</strong>: A Track can define a mapping from Group ID
and Object ID to a timestamp, conveying timing with no per-Object bytes at all.</t>
        </li>
        <li>
          <t><strong>Compact encoding</strong>: Per-Object timestamps are integers, expressing
either a delta value from the initial time or a correction to the default value.</t>
        </li>
      </ul>
      <section anchor="related">
        <name>Relationship to Other Specifications</name>
        <t>Several specifications already carry timing for MOQT Objects.  The Low Overhead
Media Container <xref target="LOC"/> defines Timestamp and Timescale Properties for media
carried in LOC.  <xref target="TIMESTAMP-LCURLEY"/> specifies transport-level use of those
same LOC Properties so that Relays can make age-based decisions.  The MOQT
Streaming Format <xref target="MSF"/> relates media time, wall-clock time, and Location
through catalog fields and timeline tracks, including a template for regular
cadences, and numbers Groups by capture time in its log and metrics tracks.</t>
        <t>This document aims to provide a single, general representation that these and
other specifications can reference.</t>
      </section>
    </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?>

<t>This document uses the terms Track, Object, Group, and Subgroup as defined in
<xref target="MOQT"/>.  A "tick" is one unit of the Track's Timescale (see <xref target="timescale"/>).</t>
      <t>All Property values in this document are encoded as variable-length integers
(<xref target="MOQT"/>) unless otherwise noted.</t>
      <section anchor="zig-zag">
        <name>Signed Integer Zig-Zag Encoding</name>
        <t>Signed values, such as the timestamp correction (<xref target="object-timestamp"/>), are
carried in a variable-length integer using a zig-zag mapping that keeps
small-magnitude values short: non-negative and negative values are interleaved
so that the encoded value grows with the magnitude, in the order 0, -1, 1, -2,
2, ...</t>
        <t>To encode a signed value v as the variable-length integer u, and to decode it
back (both using an arithmetic, sign-extending right shift):</t>
        <artwork><![CDATA[
  u = (v << 1) ^ (v >> (WIDTH - 1))     ; encode
  v = (u >> 1) ^ -(u & 1)               ; decode
]]></artwork>
        <t>WIDTH is the bit width of the two's-complement representation of v (for example,
64).  Values outside the range -2^63 to 2^63-1 cannot be represented.</t>
      </section>
    </section>
    <section anchor="property-handling">
      <name>Property Handling and Encoding</name>
      <t>The Properties defined in this document are serialized as Key-Value-Pairs
<xref target="MOQT"/>.</t>
      <t>Each Property defined here <bcp14>MUST</bcp14> appear at most once on a given Track or Object,
counting both the mutable list and Immutable Properties (<xref target="MOQT"/>), and <bcp14>MUST</bcp14>
appear only in its defined scope: OBJECT_TIMESTAMP <bcp14>MUST NOT</bcp14> appear as a Track
Property, and the Track Properties (TIMESCALE, CLOCK_ID, TIMESTAMP_ORIGIN,
TIMESTAMP_MAPPING) <bcp14>MUST NOT</bcp14> appear as Object Properties.  A subscriber that
receives a Track or Object that violates these rules treats the track as
malformed, as specified in <xref target="MOQT"/>.</t>
      <t>These Properties are set by the Original Publisher.  Relays <bcp14>MUST NOT</bcp14> add,
modify, or remove them.  A publisher <bcp14>MAY</bcp14> carry them in Immutable Properties
(<xref target="MOQT"/>), for example to enable end-to-end authentication of timing.</t>
      <t>Because the Properties defined here are interdependent, an endpoint that
interprets any of them <bcp14>MUST</bcp14> implement all of them.</t>
    </section>
    <section anchor="track-properties">
      <name>Track Properties</name>
      <t>A Track that uses the timestamps defined in this document declares a Timescale
(<xref target="timescale"/>) and, optionally, a Clock ID (<xref target="clock-id"/>) and Timestamp Origin
(<xref target="timestamp-origin"/>) that place its timeline on a clock.  All Object
timestamps in the Track are interpreted against this clock.</t>
      <section anchor="timescale">
        <name>Timescale</name>
        <t>TIMESCALE is a Track Property giving the number of ticks per second used by all
timestamps in the Track.  Common values are 1000 for millisecond resolution and
1000000 for microsecond resolution, but any positive value <bcp14>MAY</bcp14> be used (for
example, a media Track might use its codec sample rate).</t>
        <t>There is no default Timescale, to avoid silent unit errors such as confusing
milliseconds with microseconds.  A subscriber that receives a Track
with other Properties defined in this document but no TIMESCALE, or a TIMESCALE
value of 0, treats the Track as malformed.</t>
      </section>
      <section anchor="clock-id">
        <name>Clock ID</name>
        <t>CLOCK_ID is a Track Property identifying the clock on which the Track's timeline
is placed:</t>
        <ul spacing="normal">
          <li>
            <t>If no CLOCK_ID Property is specified, but other Properties in this extension
are, the time is measured from POSIX time (in TIMESCALE ticks
since 1970-01-01T00:00:00Z, excluding leap seconds).</t>
          </li>
          <li>
            <t>A present CLOCK_ID identifies a clock with no defined relationship to
wall-clock time.  Tracks that carry the same non-zero CLOCK_ID share that
clock, so their timestamps can be compared -- for example, the audio and video
Tracks of an on-demand asset.</t>
          </li>
        </ul>
        <t>A non-zero CLOCK_ID identifies the same clock wherever it appears, so values
chosen independently by different publishers can collide.  A publisher <bcp14>SHOULD</bcp14>
choose values from a large space (at least 62 bits) in a way that makes
accidental collisions negligible without coordination.  A value can be random,
or derived deterministically -- for example, by hashing a stable identifier for
the content -- so that separate encoders, or a publisher that restarts, use the
same value for the same clock.</t>
      </section>
      <section anchor="timestamp-origin">
        <name>Timestamp Origin</name>
        <t>TIMESTAMP_ORIGIN is a Track Property giving the position, in ticks on the
Track's clock (<xref target="clock-id"/>), that corresponds to a timestamp of 0.  An Object's
time on that clock (in TIMESCALE ticks) is:</t>
        <artwork><![CDATA[
  clock_time = timestamp_origin + object_timestamp
]]></artwork>
        <t>Because each Track's origin and timestamps are counted in its own ticks, Tracks
with different Timescales are compared by converting clock_time to seconds.</t>
        <t>If TIMESTAMP_ORIGIN is absent, the default value is 0.  A Track that carries
TIMESTAMP_ORIGIN without CLOCK_ID is malformed.</t>
      </section>
      <section anchor="timestamp-mapping">
        <name>Timestamp Mapping</name>
        <t>TIMESTAMP_MAPPING is a Track Property that defines how to compute an Object's
timestamp from its Group ID and Object ID, with no per-Object Property.
Drift can be expressed with a property on any Object (<xref target="object-timestamp"/>).</t>
        <t>The property value is four variable-length integers: a Base Group ID,
a Base Timestamp, a Group Multiplier, and an Object Multiplier.
A value that does not parse as exactly four variable-length integers is
malformed.  An Object's mapped timestamp is a linear function of its Group ID
and Object ID:</t>
        <artwork><![CDATA[
  mapped_timestamp = base_timestamp
                   + (group_id - base_group) * group_multiplier
                   + object_id * object_multiplier
]]></artwork>
        <t>The computation uses signed arithmetic, so it applies to every Group, including
Groups before the Base Group.  A negative mapped_timestamp is valid only if a
correction brings the Object's timestamp to a non-negative value.</t>
        <t>The publisher chooses the values from the meaning it gives its Group and Object
identifiers:</t>
        <ul spacing="normal">
          <li>
            <t>The <strong>Group Multiplier</strong> converts a Group ID into the Group's start time.  Set
it to 1 when Group IDs are themselves timestamps in ticks, so each Group is
placed directly by its ID; or to the number of ticks per Group when Group IDs
are sequential indices and Groups have a fixed duration.</t>
          </li>
          <li>
            <t>The <strong>Object Multiplier</strong> converts an Object ID into an offset within its
Group, giving the per-Object cadence, or 0 when every Object in a Group shares
the Group's time.</t>
          </li>
          <li>
            <t>The <strong>Base Group</strong> and <strong>Base Timestamp</strong> anchor the mapping, so that a
publisher whose Group IDs do not start at 0 -- for example, one that begins
numbering at a wall-clock value and increments by one -- can still use a fixed
Group Multiplier.  Both are 0 when Group 0 starts at timestamp 0.</t>
          </li>
        </ul>
        <t>A publisher can thus rely on the mapping for the regular majority of Objects and
spend per-Object bytes only where an Object's timestamp differs from the
schedule.</t>
      </section>
    </section>
    <section anchor="object-timestamp">
      <name>Object Timestamp</name>
      <t>OBJECT_TIMESTAMP is an Object Property that conveys the Object's timestamp, in
ticks of the Track's Timescale.  How its value is interpreted depends on whether
the Track has a Timestamp Mapping (<xref target="timestamp-mapping"/>):</t>
      <ul spacing="normal">
        <li>
          <t>On a Track without a Timestamp Mapping, the value is the Object's timestamp,
encoded as an unsigned variable-length integer.  An Object that does not carry
OBJECT_TIMESTAMP has no timestamp.</t>
        </li>
        <li>
          <t>On a Track with a Timestamp Mapping, the value is a signed correction to the
Object's mapped timestamp, encoded using the zig-zag mapping in
<xref target="zig-zag"/>.  An Object that does not carry OBJECT_TIMESTAMP takes its mapped
timestamp:  </t>
          <artwork><![CDATA[
  object_timestamp = mapped_timestamp + correction
]]></artwork>
        </li>
      </ul>
      <t>Because a Track's Properties are known before any of its Objects, a receiver
always knows which rule applies.</t>
      <t>The timestamp of an Object is computed only from Track Properties and
properties on the Object itself, and not any other Object.  This allows for
correct computation even when Objects are filtered or arrive out of order.</t>
      <t>If a subscriber computes an Object's timestamp that is less than 0 or greater
than 2^64-1, it treats the Track as malformed.</t>
    </section>
    <section anchor="time-to-location">
      <name>Locating Objects by Time</name>
      <t>When a Track has a Timestamp Mapping with a non-zero Group Multiplier, a
receiver can estimate the Location of the Object with a given timestamp t
without receiving any Object:</t>
      <artwork><![CDATA[
  group_id  = base_group
            + floor((t - base_timestamp) / group_multiplier)
  object_id = floor((t - base_timestamp
                     - (group_id - base_group) * group_multiplier)
                    / object_multiplier)
]]></artwork>
      <t>If the Object Multiplier is 0, only the Group is estimated.  For a time c on the
Track's clock (<xref target="clock-id"/>), t is c - timestamp_origin.</t>
      <t>The result is an estimate: it does not indicate whether the Location exists, and
Objects that carry a correction might not be close to the estimate.</t>
    </section>
    <section anchor="restarts">
      <name>Publisher Restarts</name>
      <t>Because Track Properties cannot change, a publisher that restarts and resumes
publishing the same Track cannot revise its origin or re-anchor its mapping; it
<bcp14>MUST</bcp14> reuse already established Track Properties.  A publisher that might
restart <bcp14>SHOULD</bcp14> choose Properties that remain valid and compress well across a
restart.</t>
    </section>
    <section anchor="additional-timestamps">
      <name>Defining Additional Timestamps</name>
      <t>Some applications might require more than one timestamp per Object.  Such
applications can use the properties in this document to convey transport
relevant timestamps, and define additional timestamps properties as an offset.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document registers the following entries in the "MOQ Properties" registry
established by <xref target="MOQT"/>.  The code points below are provisional values for
interoperability testing; final values are to be assigned by IANA.  The Object
Property uses a short (two-byte) code point because it is sent per Object.</t>
      <section anchor="timescale-property">
        <name>TIMESCALE Property</name>
        <table>
          <thead>
            <tr>
              <th align="right">Type</th>
              <th align="left">Name</th>
              <th align="left">Scope</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x2C7A51E0</td>
              <td align="left">TIMESCALE</td>
              <td align="left">Track</td>
              <td align="left">This document, <xref target="timescale"/></td>
            </tr>
          </tbody>
        </table>
        <t>The value is a variable-length integer giving ticks per second.</t>
      </section>
      <section anchor="clockid-property">
        <name>CLOCK_ID Property</name>
        <table>
          <thead>
            <tr>
              <th align="right">Type</th>
              <th align="left">Name</th>
              <th align="left">Scope</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x3E8D2B70</td>
              <td align="left">CLOCK_ID</td>
              <td align="left">Track</td>
              <td align="left">This document, <xref target="clock-id"/></td>
            </tr>
          </tbody>
        </table>
        <t>The value is a variable-length integer identifying the Track's clock; 0
identifies wall-clock time, and other values identify shared clocks.</t>
      </section>
      <section anchor="timestamporigin-property">
        <name>TIMESTAMP_ORIGIN Property</name>
        <table>
          <thead>
            <tr>
              <th align="right">Type</th>
              <th align="left">Name</th>
              <th align="left">Scope</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x31B49A6E</td>
              <td align="left">TIMESTAMP_ORIGIN</td>
              <td align="left">Track</td>
              <td align="left">This document, <xref target="timestamp-origin"/></td>
            </tr>
          </tbody>
        </table>
        <t>The value is a variable-length integer giving the position, in ticks on the
Track's clock, that corresponds to a timestamp of 0.</t>
      </section>
      <section anchor="timestampmapping-property">
        <name>TIMESTAMP_MAPPING Property</name>
        <table>
          <thead>
            <tr>
              <th align="right">Type</th>
              <th align="left">Name</th>
              <th align="left">Scope</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x27F308C5</td>
              <td align="left">TIMESTAMP_MAPPING</td>
              <td align="left">Track</td>
              <td align="left">This document, <xref target="timestamp-mapping"/></td>
            </tr>
          </tbody>
        </table>
        <t>The value is four variable-length integers: a Base Group, and a Base Timestamp,
Group Multiplier, and Object Multiplier, each in ticks.</t>
      </section>
      <section anchor="objecttimestamp-property">
        <name>OBJECT_TIMESTAMP Property</name>
        <table>
          <thead>
            <tr>
              <th align="right">Type</th>
              <th align="left">Name</th>
              <th align="left">Scope</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x2D1A</td>
              <td align="left">OBJECT_TIMESTAMP</td>
              <td align="left">Object</td>
              <td align="left">This document, <xref target="object-timestamp"/></td>
            </tr>
          </tbody>
        </table>
        <t>The value is a variable-length integer giving the Object's timestamp in ticks
or, on a Track with a Timestamp Mapping, a zig-zag encoded correction to the
Object's mapped timestamp.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Timestamps are supplied by the publisher and are not authenticated by the
transport.  An endpoint that acts on timestamps (for buffering, ordering, or
expiry) <bcp14>SHOULD</bcp14> treat them as hints and apply its own sanity checks, since a
misbehaving publisher can send misleading values.</t>
      <t>Timestamps and the Timestamp Origin can reveal information about the publisher's
clock and the temporal structure of its content.  Where this is sensitive, a
publisher <bcp14>MAY</bcp14> omit CLOCK_ID (and hence the origin), use a coarser Timescale, or
omit these Properties.  An end-to-end encrypted payload can carry timing that is
hidden from Relays, but when a Timestamp Mapping is in use, Group IDs and Object
IDs reveal timing regardless.  See <xref target="MOQT"/> for general considerations on
logging untrusted Property values.</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="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="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="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="TIMESTAMP-LCURLEY">
          <front>
            <title>MoQ Object Timestamp Extension</title>
            <author fullname="Luke Curley" initials="L." surname="Curley">
         </author>
            <date day="3" month="August" year="2026"/>
            <abstract>
              <t>   This document specifies the transport-level use of the TIMESTAMP and
   TIMESCALE properties registered by [loc], independent of the LOC
   container itself.  A track-level Timescale property establishes the
   units, and an object-level Timestamp property carries the
   presentation time of each object.  Exposing media time to the
   transport lets relays make consistent age-based decisions (e.g.
   dropping stale objects) without parsing the media container, and it
   remains consistent across hops regardless of buffering or jitter.  No
   new code points are requested: an endpoint implementing this document
   is on the wire indistinguishable from a LOC endpoint that carries
   only these two properties.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-lcurley-moq-timestamp-01"/>
        </reference>
      </references>
    </references>
    <?line 383?>

<section anchor="examples">
      <name>Examples</name>
      <t>The following examples show how common timing arrangements, including those of
the specifications in <xref target="related"/>, are expressed with the Properties in this
document.</t>
      <section anchor="fixed-cadence">
        <name>Fixed Cadence</name>
        <t>A Track sends 30000/1001 Objects per second in Groups of 60 Objects, with
sequential Group IDs starting at 0, and the publisher knows the wall-clock time
W (in ticks since the Unix epoch) at which Group 0 starts:</t>
        <artwork><![CDATA[
  TIMESCALE         = 30000
  CLOCK_ID          = 0
  TIMESTAMP_ORIGIN  = W
  TIMESTAMP_MAPPING = (0, 0, 60060, 1001)
]]></artwork>
        <t>Objects on cadence carry no timestamp Property; an Object that deviates from the
cadence carries a small correction in OBJECT_TIMESTAMP.</t>
      </section>
      <section anchor="explicit-timestamps">
        <name>Explicit Timestamps</name>
        <t>A Track whose Objects each carry a wall-clock timestamp in microseconds, with
its origin at 2026-01-01T00:00:00Z:</t>
        <artwork><![CDATA[
  TIMESCALE         = 1000000
  CLOCK_ID          = 0
  TIMESTAMP_ORIGIN  = 1767225600000000
]]></artwork>
        <t>Each Object carries OBJECT_TIMESTAMP, counted in microseconds since the origin.
Omitting TIMESTAMP_ORIGIN instead gives microseconds since the Unix epoch, as
LOC does when no Timescale is present <xref target="LOC"/>, at the cost of larger values.</t>
      </section>
      <section anchor="group-ids-as-timestamps">
        <name>Group IDs as Timestamps</name>
        <t>A Track whose Group IDs are microseconds since the Unix epoch and whose Objects
share their Group's time, such as an MSF log track <xref target="MSF"/>:</t>
        <artwork><![CDATA[
  TIMESCALE         = 1000000
  CLOCK_ID          = 0
  TIMESTAMP_MAPPING = (0, 0, 1, 0)
]]></artwork>
        <t>Every Object's timestamp is its Group ID, with no per-Object bytes.</t>
      </section>
      <section anchor="timeline-template">
        <name>Timeline Template</name>
        <t>An MSF timeline template <xref target="MSF"/> with a start media time M, start Location (G,
0), Location delta (1, 0), and start wall-clock time W, in which the media time
and wall-clock deltas are both D, all in milliseconds, is expressed as:</t>
        <artwork><![CDATA[
  TIMESCALE         = 1000
  CLOCK_ID          = 0
  TIMESTAMP_ORIGIN  = W - M
  TIMESTAMP_MAPPING = (G, M, D, 0)
]]></artwork>
        <t>This requires a known wall-clock time with W at least M.  For on-demand content,
where MSF sets the wall-clock values to 0, the publisher omits CLOCK_ID and
TIMESTAMP_ORIGIN, or uses a shared Clock ID as in <xref target="shared-clock-example"/>.  The
template describes only Group start times; a publisher that also knows its
per-Object cadence sets the Object Multiplier accordingly.</t>
      </section>
      <section anchor="shared-clock-example">
        <name>Shared Clock Without Wall-Clock Time</name>
        <t>The audio and video Tracks of an on-demand asset have no meaningful wall-clock
time but need to be aligned.  The publisher derives a Clock ID for the asset,
for example from a hash of its identifier; both Tracks carry it and start at
time 0 on that clock:</t>
        <artwork><![CDATA[
  Video:  TIMESCALE = 90000, CLOCK_ID = 0x1A3F5C9E07B2D461
  Audio:  TIMESCALE = 48000, CLOCK_ID = 0x1A3F5C9E07B2D461
]]></artwork>
        <t>A receiver aligns an audio Object and a video Object by comparing their
timestamps in seconds.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors thank the authors of <xref target="LOC"/>, <xref target="MSF"/>, and <xref target="TIMESTAMP-LCURLEY"/>,
whose timestamp work (<xref target="related"/>) this document builds on, and the participants
in the MOQ working group discussions that shaped it.</t>
      <t>Portions of this document were drafted with the assistance of Claude (Claude
Code, Anthropic).</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
