<?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.6.17 (Ruby 2.6.10) -->


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

]>

<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-lcurley-warp-04" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="WARP">Warp - Live Media Transport over QUIC</title>

    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization>Twitch</organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <author initials="K." surname="Pugin" fullname="Kirill Pugin">
      <organization>Meta</organization>
      <address>
        <email>ikir@meta.com</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="V." surname="Vasiliev" fullname="Victor Vasiliev">
      <organization>Google</organization>
      <address>
        <email>vasilvv@google.com</email>
      </address>
    </author>

    <date />

    <area>General</area>
    <workgroup>Independent Submission</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document defines the core behavior for Warp, a live media transport protocol over QUIC.
Media is split into objects based on the underlying media encoding and transmitted independently over QUIC streams.
QUIC streams are prioritized based on the delivery order, allowing less important objects to be starved or dropped during congestion.</t>



    </abstract>



  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>
<t>Warp is a live media transport protocol that utilizes the QUIC network protocol <xref target="QUIC"/>.</t>

<t><list style="symbols">
  <t><xref target="motivation"/> covers the background and rationale behind Warp.</t>
  <t><xref target="objects"/> covers how media is fragmented into objects.</t>
  <t><xref target="quic"/> covers how QUIC is used to transfer media.</t>
  <t><xref target="messages"/> covers how messages are encoded on the wire.</t>
  <t><xref target="containers"/> covers how media tracks are packaged.</t>
</list></t>

<section anchor="terms-and-definitions"><name>Terms 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>

<t>Commonly used terms in this document are described below.</t>

<dl>
  <dt>Bitstream:</dt>
  <dd>
    <t>A continunous series of bytes.</t>
  </dd>
  <dt>Client:</dt>
  <dd>
    <t>The party initiating a Warp session.</t>
  </dd>
  <dt>Codec:</dt>
  <dd>
    <t>A compression algorithm for audio or video.</t>
  </dd>
  <dt>Congestion:</dt>
  <dd>
    <t>Packet loss and queuing caused by degraded or overloaded networks.</t>
  </dd>
  <dt>Consumer:</dt>
  <dd>
    <t>A QUIC endpoint receiving media over the network. This could be the media player or middleware.</t>
  </dd>
  <dt>Container:</dt>
  <dd>
    <t>A file format containing timestamps and the codec bitstream</t>
  </dd>
  <dt>Decoder:</dt>
  <dd>
    <t>A endpoint responsible for a deflating a compressed media stream into raw frames.</t>
  </dd>
  <dt>Decode Timestamp (DTS):</dt>
  <dd>
    <t>A timestamp indicating the order that frames/samples should be fed to the decoder.</t>
  </dd>
  <dt>Encoder:</dt>
  <dd>
    <t>A component responsible for creating a compressed media stream out of raw frames.</t>
  </dd>
  <dt>Frame:</dt>
  <dd>
    <t>An video image or group of audio samples to be rendered at a specific point in time.</t>
  </dd>
  <dt>I-frame:</dt>
  <dd>
    <t>A frame that does not depend on the contents of other frames; effectively an image.</t>
  </dd>
  <dt>Group of pictures (GoP):</dt>
  <dd>
    <t>A I-frame followed by a sequential series of dependent frames.</t>
  </dd>
  <dt>Group of samples:</dt>
  <dd>
    <t>A sequential series of audio samples starting at a given timestamp.</t>
  </dd>
  <dt>Player:</dt>
  <dd>
    <t>A component responsible for presenting frames to a viewer based on the presentation timestamp.</t>
  </dd>
  <dt>Presentation Timestamp (PTS):</dt>
  <dd>
    <t>A timestamp indicating when a frames/samples should be presented to the viewer.</t>
  </dd>
  <dt>Producer:</dt>
  <dd>
    <t>A QUIC endpoint sending media over the network. This could be the media encoder or middleware.</t>
  </dd>
  <dt>Server:</dt>
  <dd>
    <t>The party accepting an incoming Warp session.</t>
  </dd>
  <dt>Slice:</dt>
  <dd>
    <t>A section of a video frame. There may be multiple slices per frame.</t>
  </dd>
  <dt>Track:</dt>
  <dd>
    <t>An encoded bitstream, representing a single media component (ex. audio, video, subtitles) that makes up the larger broadcast.</t>
  </dd>
  <dt>Variant:</dt>
  <dd>
    <t>A track with the same content but different encoding as another track. For example, a different bitrate, codec, language, etc.</t>
  </dd>
</dl>

</section>
<section anchor="notational-conventions"><name>Notational Conventions</name>

<t>This document uses the conventions detailed in Section 1.3 of <xref target="RFC9000"/> when describing the binary encoding.</t>

<t>This document also defines an additional field type for binary data:</t>

<dl>
  <dt>x (b):</dt>
  <dd>
    <t>Indicates that x consists of a variable length integer, followed by that many bytes of binary data.</t>
  </dd>
</dl>

</section>
</section>
<section anchor="model"><name>Model</name>

<section anchor="objects"><name>Objects</name>

<t>The basic element of Warp is an <em>object</em>. An object is a single addressable
cacheable unit whose payload is a sequence of bytes.  An object <bcp14>MAY</bcp14> depend on other 
objects to be decoded. An object <bcp14>MUST</bcp14> belong to a group <xref target="groups"/>. Objects carry 
associated metadata such as priority, TTL or other information usable by a relay, 
but relays <bcp14>MUST</bcp14> treat object payloads as opaque.</t>

<t>DISCUSS: Can an object be partially decodable by an endpoint?</t>

<t>Authors agree that an object is always partially <em>forwardable</em> by a relay but
disagree on whether a partial object can be used by a receiving endpoint.</t>

<t>Option 1: A receiver <bcp14>MAY</bcp14> start decoding an object before it has been completely received</t>

<t>Example: sending an entire GOP as a single object.  A receiver can decode the
GOP from the beginning without having the entire object present, and the object's
tail could be dropped.  Sending a GOP as a group of not-partially-decodable
objects might incur additional overhead on the wire and/or additional processing of 
video segments at a sender to find object boundaries.</t>

<t>Partial decodability could be another property of an object.</t>

<t>Option 2: A receiver <bcp14>MUST NOT</bcp14> start decoding an object before it has completely arrived</t>

<t>Objects could be end-to-end encrypted and the receiver might not be able to
decrypt or authenticate an object until it is fully present.  Allowing Objects
to span more than one useable unit may create more than one viable application
mapping from media to wire format, which could be confusing for protocol users.</t>

</section>
<section anchor="groups"><name>Groups</name>

<t>An object group is a sequence of media objects. Beginning of an object group can be used as a point at which the receiver can start consuming a track without having any other object groups available. Object groups have an ID that identifies them uniquely within a track.</t>

<t>DISCUSS: We need to determine what are the exact requirements we need to impose on how the media objects depend on each other. Such requirements would need to address the use case (a join point), while being flexible enough to accomodate scenarios like B-frames and temporal scaling.</t>

</section>
<section anchor="track"><name>Track</name>

<t>A media track in Warp is a combination of <em>an init object</em> and a sequence of media object groups. An init object is a format-specific self-contained description of the track that is required to decode any media object contained within the track, but can also be used as the metadata for track selection. If two media tracks carry semantically equivalent but differently encoded media, they are referred to as <em>variants</em> of each other.</t>

</section>
<section anchor="track-bundle"><name>Track Bundle</name>
<t>A track bundle is a collection of tracks intended to be delivered together.
Objects within a track bundle may be prioritized relative to each other via the delivery order property.
This allows objects to be prioritized within a track (ex. newer &gt; older) and between tracks (ex. audio &gt; video).
The track bundle contains a catalog indicating the available tracks.</t>

</section>
<section anchor="session"><name>Session</name>
<t>A WebTransport session is established for each track bundle.
The client issues a CONNECT request with a URL which the server uses for identification and authentication.
All control messages and prioritization occur within the context of a single WebTransport session, which means a single track bundle.
Multiple WebTransport sessions may be pooled over a single QUIC connection for efficiency.</t>

</section>
<section anchor="example"><name>Example</name>
<t>As an example, consider a scenario where <spanx style="verb">example.org</spanx> hosts a simple live stream that anyone can subscribe to.
That live stream would be a single track bundle, accessible via the WebTransport URL: <spanx style="verb">https://example.org/livestream</spanx>.
In a simple scenario, the track bundle would contain only two media tracks, one with audio and one with video.
In a more complicated scenario, the track bundle could multiple tracks with different formats, encodings, bitrates, and quality levels, possibly for the same content.
The receiver learns about each available track within the bundle via the catalog, and can choose to subscribe to a subset.</t>

</section>
</section>
<section anchor="motivation"><name>Motivation</name>

<section anchor="latency"><name>Latency</name>
<t>In a perfect world, we could deliver live media at the same rate it is produced.
The end-to-end latency of a broadcast would be fixed and only subject to encoding and transmission delays.
Unfortunately, networks have variable throughput, primarily due to congestion.</t>

<t>Attempting to deliver media encoded at a higher bitrate than the network can support causes queuing.
This queuing can occur anywhere in the path between the encoder and decoder.
For example: the application, the OS socket, a wifi router, within an ISP, or generally anywhere in transit.</t>

<t>If nothing is done, new frames will be appended to the end of a growing queue and will take longer to arrive than their predecessors, increasing latency.
Our job is to minimize the growth of this queue, and if necessary, bypass the queue entirely by dropping content.</t>

<t>The speed at which a media protocol can detect and respond to queuing determines the latency.
We can generally classify existing media protocols into two categories based on the underlying network protocol:</t>

<t><list style="symbols">
  <t>TCP-based media protocols (ex. RTMP, HLS, DASH) are popular due to their simplicity.
Media is served/consumed in decode order while any networking is handled by the TCP layer.
However, these protocols primarily see usage at higher latency targets due to their relatively slow detection and response to queuing.</t>
  <t>UDP-based media protocols (ex. RTP, WebRTC, SRT) can side-step the issues with TCP and provide lower latency with better queue management.
However the media protocol is now responsible for fragmentation, congestion control, retransmissions, receiver feedback, reassembly, and more.
This added complexity significantly raises the implementation difficulty and hurts interoperability.</t>
</list></t>

<t>A goal of this draft is to get the best of both worlds: a simple protocol that can still rapidly detect and respond to congestion.
This is possible with the emergence of QUIC, designed to fix the shortcomings of TCP.</t>

</section>
<section anchor="universal"><name>Universal</name>
<t>The media protocol ecosystem is fragmented; each protocol has it's own niche.
Specialization is often a good thing, but we believe there's enough overlap to warrant consolidation.</t>

<t>For example, a service might simultaneously ingest via WebRTC, SRT, RTMP, and/or a custom UDP protocol depending on the broadcaster.
The same service might then simultaneously distribute via WebRTC, LL-HLS, HLS, (or the DASH variants) and/or a custom UDP protocol depending on the viewer.</t>

<t>These media protocols are often radically different and not interoperable; requiring transcoding or transmuxing.
This cost is further increased by the need to maintain separate stacks with different expertise requirements.</t>

<t>A goal of this draft is to cover a large spectrum of use-cases. Specifically:</t>

<t><list style="symbols">
  <t>Consolidated contribution and distribution.
The primary difference between the two is the ability to fanout.
How does a CDN know how to forward media to N consumers and how does it reduce the encoded bitrate during congestion?
A single protocol can cover both use-cases provided relays are informed on how to forward and drop media.</t>
  <t>A configurable latency versus quality trade-off.
The producer (broadcaster) chooses how to encode and transmit media based on the desired user experience.
Each consumer (viewer) chooses how long to wait for media based on their desired user experience and network.
We want an experience that can vary from real-time and lossy for one viewer, to delayed and loss-less for another viewer, without separate encodings or protocols.</t>
</list></t>

<t>A related goal is to not reinvent how media is encoded.
The same codec bitstream and container should be usable between different protocols.</t>

</section>
<section anchor="relays"><name>Relays</name>
<t>The prevailing belief is that UDP-based protocols are more expensive and don't "scale".
While it's true that UDP is more difficult to optimize than TCP, QUIC itself is proof that it is possible to reach performance parity.
In fact even some TCP-based protocols (ex. RTMP) don't "scale" either and are exclusively used for contribution as a result.</t>

<t>The ability to scale a media protocol actually depends on relay support: proxies, caches, CDNs, SFUs, etc.
The success of HTTP-based media protocols is due to the ability to leverage traditional HTTP CDNs.</t>

<t>It's difficult to build a CDN for media protocols that were not designed with relays in mind.
For example, an relay has to parse the underlying codec to determine which RTP packets should be dropped first, and the decision is not deterministic or consistent for each hop.
This is the fatal flaw of many UDP-based protocols.</t>

<t>A goal of this draft is to treat relays as first class citizens.
Any identification, reliability, ordering, prioritization, caching, etc is written to the wire in a header that is easy to parse.
This ensures that relays can easily route/fanout media to the final destination.
This also ensures that congestion response is consistent at every hop based on the preferences of the media producer.</t>

</section>
</section>
<section anchor="objects-1"><name>Objects</name>
<t>Warp works by splitting media into objects that can be transferred over QUIC streams.</t>

<t><list style="symbols">
  <t>The encoder determines how to fragment the encoded bitstream into objects (<xref target="media"/>).</t>
  <t>Objects are assigned an intended delivery order that should be obeyed during congestion (<xref target="delivery-order"/>)</t>
  <t>The decoder receives each objects and skips any objects that do not arrive in time (<xref target="decoder"/>).</t>
</list></t>

<section anchor="media"><name>Media</name>
<t>An encoder produces one or more codec bitstreams for each track.
The decoder processes the codec bitstreams in the same order they were produced, with some possible exceptions based on the encoding.
See the appendix for an overview of media encoding (<xref target="appendix.encoding"/>).</t>

<t>Warp works by fragmenting the bitstream into objects that can be transmitted somewhat independently.
Depending on how the objects are fragmented, the decoder has the ability to safely drop media during congestion.
See the appendix for fragmentation examples (<xref target="appendix.examples"/>)</t>

<t>A media object:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> contain a single track.</t>
  <t><bcp14>MUST</bcp14> be in decode order. This means an increasing DTS.</t>
  <t><bcp14>MAY</bcp14> contain any number of frames/samples.</t>
  <t><bcp14>MAY</bcp14> have gaps between frames/samples.</t>
  <t><bcp14>MAY</bcp14> overlap with other objects. This means timestamps may be interleaved between objects.</t>
</list></t>

<t>Media objects are encoded using a specified container (<xref target="containers"/>).</t>

</section>
<section anchor="delivery-order"><name>Delivery Order</name>
<t>Media is produced with an intended order, both in terms of when media should be presented (PTS) and when media should be decoded (DTS).
As stated in motivation (<xref target="latency"/>), the network is unable to maintain this ordering during congestion without increasing latency.</t>

<t>The encoder determines how to behave during congestion by assigning each object a numeric delivery order.
The delivery order <bcp14>SHOULD</bcp14> be followed when possible to ensure that the most important media is delivered when throughput is limited.
Note that the contents within each object are still delivered in order; this delivery order only applies to the ordering between objects.</t>

<t>A sender <bcp14>MUST</bcp14> send each object over a dedicated QUIC stream.
The QUIC library should support prioritization (<xref target="prioritization"/>) such that streams are transmitted in delivery order.</t>

<t>A receiver <bcp14>MUST NOT</bcp14> assume that objects will be received in delivery order for a number of reasons:</t>

<t><list style="symbols">
  <t>Newly encoded objects <bcp14>MAY</bcp14> have a smaller delivery order than outstanding objects.</t>
  <t>Packet loss or flow control <bcp14>MAY</bcp14> delay the delivery of individual streams.</t>
  <t>The sender might not support QUIC stream prioritization.</t>
</list></t>

</section>
<section anchor="decoder"><name>Decoder</name>
<t>The decoder will receive multiple objects in parallel and out of order.</t>

<t>Objects arrive in delivery order, but media usually needs to be processed in decode order.
The decoder <bcp14>SHOULD</bcp14> use a buffer to reassmble objects into decode order and it <bcp14>SHOULD</bcp14> skip objects after a configurable duration.
The amount of time the decoder is willing to wait for an object (buffer duration) is what ultimately determines the end-to-end latency.</t>

<t>Objects <bcp14>MUST</bcp14> synchronize frames within and between tracks using presentation timestamps within the container.
Objects are NOT <bcp14>REQUIRED</bcp14> to be aligned and the decoder <bcp14>MUST</bcp14> be prepared to skip over any gaps.</t>

</section>
</section>
<section anchor="quic"><name>QUIC</name>

<section anchor="establishment"><name>Establishment</name>
<t>A connection is established using WebTransport <xref target="WebTransport"/>.</t>

<t>To summarize:
The client issues a HTTP CONNECT request to a URL.
The server returns an "200 OK" response to establish the WebTransport session, or an error status code otherwise.</t>

<t>A WebTransport session exposes the basic QUIC service abstractions.
Specifically, either endpoint may create independent streams which are reliably delivered in order until canceled.</t>

<t>WebTransport can currently operate via HTTP/3 and HTTP/2, using QUIC or TCP under the hood respectively.
As mentioned in the motivation (<xref target="motivation"/>) section, TCP introduces head-of-line blocking and will result in a worse experience.
It is <bcp14>RECOMMENDED</bcp14> to use WebTransport over HTTP/3.</t>

<section anchor="connect"><name>CONNECT</name>
<t>The server uses the HTTP CONNECT request for identification and authorization of a track bundle.
The specific mechanism is left up to the application.
For example, an identifier and authentication token could be included in the path.</t>

<t>The server <bcp14>MAY</bcp14> return an error status code for any reason, for example a 403 when the client is forbidden.
Otherwise the server <bcp14>MUST</bcp14> respond with a "200 OK" to establish the WebTransport session.</t>

</section>
</section>
<section anchor="streams"><name>Streams</name>
<t>Warp endpoints communicate over QUIC streams. Every stream is a sequence of messages, framed as described in <xref target="messages"/>.</t>

<t>The first stream opened is a client-initiated bidirectional stream where the peers exchange SETUP messages (<xref target="message-setup"/>). The subsequent streams <bcp14>MAY</bcp14> be either unidirectional and bidirectional. For exchanging media, an application would typically send a unidirectional stream containing a single OBJECT message (<xref target="message-object"/>).</t>

<t>Messages <bcp14>SHOULD</bcp14> be sent over the same stream if ordering is desired.</t>

</section>
<section anchor="prioritization"><name>Prioritization</name>
<t>Warp utilizes stream prioritization to deliver the most important content during congestion.</t>

<t>The producer may assign a numeric delivery order to each object (<xref target="delivery-order"/>)
This is a strict prioritization scheme, such that any available bandwidth is allocated to streams in ascending priority order.
The sender <bcp14>SHOULD</bcp14> prioritize streams based on the delivery order.
If two streams have the same delivery order, they <bcp14>SHOULD</bcp14> receive equal bandwidth (round-robin).</t>

<t>QUIC supports stream prioritization but does not standardize any mechanisms; see Section 2.3 in <xref target="QUIC"/>.
In order to support prioritization, a QUIC library <bcp14>MUST</bcp14> expose a API to set the priority of each stream.
This is relatively easy to implement; the next QUIC packet should contain a STREAM frame for the next pending stream in priority order.</t>

<t>The sender <bcp14>MUST</bcp14> respect flow control even if means delivering streams out of delivery order.
It is <bcp14>OPTIONAL</bcp14> to prioritize retransmissions.</t>

</section>
<section anchor="cancellation"><name>Cancellation</name>
<t>A QUIC stream <bcp14>MAY</bcp14> be canceled at any point with an error code.
The producer does this via a <spanx style="verb">RESET_STREAM</spanx> frame while the consumer requests cancellation with a <spanx style="verb">STOP_SENDING</spanx> frame.</t>

<t>When using <spanx style="verb">order</spanx>, lower priority streams will be starved during congestion, perhaps indefinitely.
These streams will consume resources and flow control until they are canceled.
When nearing resource limits, an endpoint <bcp14>SHOULD</bcp14> cancel the lowest priority stream with error code 0.</t>

<t>The sender <bcp14>MAY</bcp14> cancel streams in response to congestion.
This can be useful when the sender does not support stream prioritization.</t>

</section>
<section anchor="relays-1"><name>Relays</name>
<t>Warp encodes the delivery information for a stream via OBJECT headers (<xref target="message-object"/>).</t>

<t>A relay <bcp14>SHOULD</bcp14> prioritize streams (<xref target="prioritization"/>) based on the delivery order.
A relay <bcp14>MAY</bcp14> change the delivery order, in which case it <bcp14>SHOULD</bcp14> update the value on the wire for future hops.</t>

<t>A relay that reads from a stream and writes to stream in order will introduce head-of-line blocking.
Packet loss will cause stream data to be buffered in the QUIC library, awaiting in order delivery, which will increase latency over additional hops.
To mitigate this, a relay <bcp14>SHOULD</bcp14> read and write QUIC stream data out of order subject to flow control limits.
See section 2.2 in <xref target="QUIC"/>.</t>

</section>
<section anchor="congestion-control"><name>Congestion Control</name>
<t>As covered in the motivation section (<xref target="motivation"/>), the ability to prioritize or cancel streams is a form of congestion response.
It's equally important to detect congestion via congestion control, which is handled in the QUIC layer <xref target="QUIC-RECOVERY"/>.</t>

<t>Bufferbloat is caused by routers queueing packets for an indefinite amount of time rather than drop them.
This latency significantly reduces the ability for the application to prioritize or drop media in response to congestion.
Senders <bcp14>SHOULD</bcp14> use a congestion control algorithm that reduces this bufferbloat (ex. <xref target="BBR"/>).
It is <bcp14>NOT RECOMMENDED</bcp14> to use a loss-based algorithm (ex. <xref target="NewReno"/>) unless the network fully supports ECN.</t>

<t>Live media is application-limited, which means that the encoder determines the max bitrate rather than the network.
Most TCP congestion control algorithms will only increase the congestion window if it is full, limiting the upwards mobility when application-limited.
Senders <bcp14>SHOULD</bcp14> use a congestion control algorithm that is designed for application-limited flows (ex. GCC).
Senders <bcp14>MAY</bcp14> periodically pad the connection with QUIC PING frames to fill the congestion window.</t>

</section>
<section anchor="termination"><name>Termination</name>
<t>The WebTransport session can be terminated at any point with CLOSE_WEBTRANSPORT_SESSION capsule, consisting of an integer code and string message.</t>

<t>The application <bcp14>MAY</bcp14> use any error message and <bcp14>SHOULD</bcp14> use a relevant code, as defined below:</t>

<texttable>
      <ttcol align='right'>Code</ttcol>
      <ttcol align='left'>Reason</ttcol>
      <c>0x0</c>
      <c>Session Terminated</c>
      <c>0x1</c>
      <c>Generic Error</c>
      <c>0x2</c>
      <c>Unauthorized</c>
      <c>0x10</c>
      <c>GOAWAY</c>
</texttable>

<t><list style="symbols">
  <t>Session Terminated
No error occured, however the endpoint no longer desires to send or receive media.</t>
  <t>Generic Error
An unclassified error occured.</t>
  <t>Unauthorized:
The endpoint breached an agreement, which <bcp14>MAY</bcp14> have been pre-negotiated by the application.</t>
  <t>GOAWAY:
The endpoint successfully drained the session after a GOAWAY was initiated (<xref target="message-goaway"/>).</t>
</list></t>

</section>
</section>
<section anchor="messages"><name>Messages</name>
<t>Both unidirectional and bidirectional Warp streams are sequences of length-deliminated messages.</t>

<figure title="Warp Message" anchor="warp-message-format"><artwork><![CDATA[
Warp Message {
  Message Type (i),
  Message Length (i),
  Message Payload (..),
}
]]></artwork></figure>

<t>The Message Length field contains the length of the Message Payload field in bytes.
A length of 0 indicates the message is unbounded and continues until the end of the stream.</t>

<texttable>
      <ttcol align='right'>ID</ttcol>
      <ttcol align='left'>Messages</ttcol>
      <c>0x0</c>
      <c>OBJECT (<xref target="message-object"/>)</c>
      <c>0x1</c>
      <c>SETUP (<xref target="message-setup"/>)</c>
      <c>0x2</c>
      <c>CATALOG (<xref target="message-catalog"/>)</c>
      <c>0x3</c>
      <c>SUBSCRIBE (<xref target="message-subscribe"/>)</c>
      <c>0x10</c>
      <c>GOAWAY (<xref target="message-goaway"/>)</c>
</texttable>

<section anchor="message-setup"><name>SETUP</name>

<t>The <spanx style="verb">SETUP</spanx> message is the first message that is exchanged by the client and the server; it allows the peers to establish the mutually supported version and agree on the initial configuration. It is a sequence of key-value pairs called <em>SETUP parameters</em>; the semantics and the format of individual parameter values <bcp14>MAY</bcp14> depend on what party is sending it.</t>

<t>The wire format of the SETUP message is as follows:</t>

<figure title="Warp SETUP Message" anchor="warp-setup-format"><artwork><![CDATA[
SETUP Parameter {
  Parameter Key (i),
  Parameter Value Length (i),
  Parameter Value (..),
}

Client SETUP Message Payload {
  Number of Supported Versions (i),
  Supported Version (i) ...,
  SETUP Parameters (..) ...,
}

Server SETUP Message Payload {
  Selected Version (i),
  SETUP Parameters (..) ...,
}
]]></artwork></figure>

<t>The Parameter Value Length field indicates the length of the Parameter Value.</t>

<t>The client offers the list of the protocol versions it supports; the server <bcp14>MUST</bcp14> reply with one of the versions offered by the client. If the server does not support any of the versions offered by the client, or the client receives a server version that it did not offer, the corresponding peer <bcp14>MUST</bcp14> close the connection.</t>

<t>The SETUP parameters are described in the <xref target="setup-parameters"/> section.</t>

</section>
<section anchor="message-object"><name>OBJECT</name>
<t>A OBJECT message contains a single media object associated with a specified track, as well as associated metadata required to deliver, cache, and forward it.</t>

<t>The format of the OBJECT message is as follows:</t>

<figure title="Warp OBJECT Message" anchor="warp-object-format"><artwork><![CDATA[
OBJECT Message {
  Track ID (i),
  Group Sequence (i),
  Object Sequence (i),
  Object Delivery Order (i),
  Object Payload (b),
}
]]></artwork></figure>

<t><list style="symbols">
  <t>Track ID:
The track identifier as declared in CATALOG (<xref target="message-catalog"/>).</t>
  <t>Group Sequence :
An integer always starts at 0 and increases sequentially at the original media publisher.
Group sequences are scoped under a Track.</t>
  <t>Object Sequence:
An integer always starts at 0 with in a Group and increases sequentially.
Object Sequences are scoped to a Group.</t>
  <t>Object Delivery Order:
An integer indicating the object delivery order (<xref target="delivery-order"/>).</t>
  <t>Object Payload:
The format depends on the track container (<xref target="containers"/>).
This is a media bitstream intended for the decoder and <bcp14>SHOULD NOT</bcp14> be processed by a relay.</t>
</list></t>

</section>
<section anchor="message-catalog"><name>CATALOG</name>
<t>The sender advertises tracks via the CATALOG message.
The receiver can then SUBSCRIBE to the indiciated tracks by ID.</t>

<t>The format of the CATALOG message is as follows:</t>

<figure title="Warp CATALOG Message" anchor="warp-catalog-format"><artwork><![CDATA[
CATALOG Message {
  Track Count (i),
  Track Descriptors (..)
}
]]></artwork></figure>

<t><list style="symbols">
  <t>Track Count:
The number of tracks within the catalog.</t>
</list></t>

<t>For each track, there is a track descriptor with the format:</t>

<figure title="Warp Track Descriptor" anchor="warp-track-descriptor"><artwork><![CDATA[
Track Descriptor {
  Track ID (i),
  Container Format (i),
  Container Init Payload (b)
}
]]></artwork></figure>

<t><list style="symbols">
  <t>Track ID:
A unique identifier for the track within the track bundle.</t>
  <t>Container Format:
The container format as defined in <xref target="containers"/>.</t>
  <t>Container Init Payload:
A container-specific payload as defined in <xref target="containers"/>.
This contains base information required to decode OBJECT messages, such as codec parameters.</t>
</list></t>

<t>An endpoint <bcp14>MUST NOT</bcp14> send multiple CATALOG messages.
A future draft will add the ability to add/remove/update tracks.</t>

</section>
<section anchor="message-subscribe"><name>SUBSCRIBE</name>
<t>After receiving a CATALOG message (<xref target="message-catalog"/>, the receiver sends a SUBSCRIBE message to indicate that it wishes to receive the indicated tracks.</t>

<t>The format of SUBSCRIBE is as follows:</t>

<figure title="Warp SUBSCRIBE Message" anchor="warp-subscribe-format"><artwork><![CDATA[
SUBSCRIBE Message {
  Track Count (i),
  Track IDs (..),
}
]]></artwork></figure>

<t><list style="symbols">
  <t>Track Count:
The number of track IDs that follow.
This <bcp14>MAY</bcp14> be zero to unsubscribe to all tracks.</t>
  <t>Track IDs:
A list of varint track IDs.</t>
</list></t>

<t>Only the most recent SUBSCRIBE message is active.
SUBSCRIBE messages <bcp14>MUST</bcp14> be sent on the same QUIC stream to preserve ordering.</t>

</section>
<section anchor="message-goaway"><name>GOAWAY</name>
<t>The <spanx style="verb">GOAWAY</spanx> message is sent by the server to force the client to reconnect.
This is useful for server maintenance or reassignments without severing the QUIC connection.
The server <bcp14>MAY</bcp14> be a producer or consumer.</t>

<t>The server:</t>

<t><list style="symbols">
  <t><bcp14>MAY</bcp14> initiate a graceful shutdown by sending a GOAWAY message.</t>
  <t><bcp14>MUST</bcp14> close the QUIC connection after a timeout with the GOAWAY error code (<xref target="termination"/>).</t>
  <t><bcp14>MAY</bcp14> close the QUIC connection with a different error code if there is a fatal error before shutdown.</t>
  <t><bcp14>SHOULD</bcp14> wait until the <spanx style="verb">GOAWAY</spanx> message and any pending streams have been fully acknowledged, plus an extra delay to ensure they have been processed.</t>
</list></t>

<t>The client:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> establish a new WebTransport session to the provided URL upon receipt of a <spanx style="verb">GOAWAY</spanx> message.</t>
  <t><bcp14>SHOULD</bcp14> establish the connection in parallel which <bcp14>MUST</bcp14> use different QUIC connection.</t>
  <t><bcp14>SHOULD</bcp14> remain connected for two servers for a short period, processing objects from both in parallel.</t>
</list></t>

</section>
</section>
<section anchor="setup-parameters"><name>SETUP Parameters</name>

<t>The SETUP message (<xref target="message-setup"/>) allows the peers to exchange arbitrary parameters before any media is exchanged. It is the main extensibility mechanism of Warp. The peers <bcp14>MUST</bcp14> ignore unknown parameters. TODO: describe GREASE for those.</t>

<t>Every parameter <bcp14>MUST</bcp14> appear at most once within the SETUP message. The peers <bcp14>SHOULD</bcp14> verify that and close the connection if a parameter appears more than once.</t>

<t>The ROLE parameter is mandatory for the client. All of the other parameters are optional.</t>

<section anchor="role"><name>ROLE parameter</name>

<t>The ROLE parameter (key 0x00) allows the client to specify what roles it expects the parties to have in the Warp connection. It has three possible values:</t>

<dl>
  <dt>0x01:</dt>
  <dd>
    <t>Only the client is expected to send media on the connection. This is commonly referred to as <em>the ingestion case</em>.</t>
  </dd>
  <dt>0x02:</dt>
  <dd>
    <t>Only the server is expected to send media on the connection. This is commonly referred to as <em>the delivery case</em>.</t>
  </dd>
  <dt>0x03:</dt>
  <dd>
    <t>Both the client and the server are expected to send media.</t>
  </dd>
</dl>

<t>The client <bcp14>MUST</bcp14> send a ROLE parameter with one of the three values specified above. The server <bcp14>MUST</bcp14> close the connection if the ROLE parameter is missing, is not one of the three above-specified values, or it is different from what the server expects based on the application in question.</t>

</section>
</section>
<section anchor="containers"><name>Containers</name>
<t>The container format describes how the underlying codec bitstream is encoded.
This includes timestamps, metadata, and generally anything required to decode and display the media.</t>

<t>This draft currently specifies only a single container format.
Future drafts and extensions may specifiy additional formats.</t>

<texttable>
      <ttcol align='right'>ID</ttcol>
      <ttcol align='left'>Container Format</ttcol>
      <c>0x0</c>
      <c>fMP4 (<xref target="fmp4"/>)</c>
</texttable>

<section anchor="fmp4"><name>fMP4</name>
<t>A fragmented MP4 container  <xref target="ISOBMFF"/>.</t>

<t>The "Container Init Payload" in a CATALOG message (<xref target="message-catalog"/>) <bcp14>MUST</bcp14> consist of a File Type Box (ftyp) followed by a Movie Box (moov).
This Movie Box (moov) consists of Movie Header Boxes (mvhd), Track Header Boxes (tkhd), Track Boxes (trak), followed by a final Movie Extends Box (mvex).
These boxes <bcp14>MUST NOT</bcp14> contain any samples and <bcp14>MUST</bcp14> have a duration of zero.
A Common Media Application Format Header <xref target="CMAF"/> meets all these requirements.</t>

<t>The "Object Payload" in an OBJECT message (<xref target="message-object"/>) <bcp14>MUST</bcp14> consist of a Segment Type Box (styp) followed by any number of media fragments.
Each media fragment consists of a Movie Fragment Box (moof) followed by a Media Data Box (mdat).
The Media Fragment Box (moof) <bcp14>MUST</bcp14> contain a Movie Fragment Header Box (mfhd) and Track Box (trak) with a Track ID (<spanx style="verb">track_ID</spanx>) matching a Track Box in the initialization fragment.
A Common Media Application Format Segment <xref target="CMAF"/> meets all these requirements.</t>

<t>Media fragments can be packaged at any frequency, causing a trade-off between overhead and latency.
It is <bcp14>RECOMMENDED</bcp14> that a media fragment consists of a single frame to minimize latency.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="resource-exhaustion"><name>Resource Exhaustion</name>
<t>Live media requires significant bandwidth and resources.
Failure to set limits will quickly cause resource exhaustion.</t>

<t>Warp uses QUIC flow control to impose resource limits at the network layer.
Endpoints <bcp14>SHOULD</bcp14> set flow control limits based on the anticipated media bitrate.</t>

<t>The media producer prioritizes and transmits streams out of order.
Streams might be starved indefinitely during congestion.
The producer and consumer <bcp14>MUST</bcp14> cancel a stream, preferably the lowest priority, after reaching a resource limit.</t>

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

<t>TODO: fill out currently missing registries:
* Warp version numbers
* SETUP parameters
* Track format numbers
* Message types
* Object headers</t>

</section>
<section anchor="appendix.encoding"><name>Appendix A. Video Encoding</name>
<t>In order to transport media, we first need to know how media is encoded.
This section is an overview of media encoding.</t>

<section anchor="tracks"><name>Tracks</name>
<t>A broadcast consists of one or more tracks.
Each track has a type (audio, video, caption, etc) and uses a corresponding codec.
There may be multiple tracks, including of the same type for a number of reasons.</t>

<t>For example:</t>

<t><list style="symbols">
  <t>A track for each codec.</t>
  <t>A track for each resolution and bitrate.</t>
  <t>A track for each language.</t>
  <t>A track for each camera feed.</t>
</list></t>

<t>Tracks can be muxed together into a single container or stream.
The goal of Warp is to independently deliver tracks, and even parts of a track, so this is not allowed.
Each Warp object <bcp14>MUST</bcp14> contain a single track.</t>

</section>
<section anchor="appendix.init"><name>Init</name>
<t>Media codecs have a wide array of configuration options.
For example, the resolution, the color space, the features enabled, etc.</t>

<t>Before playback can begin, the decoder needs to know the configuration.
This is done via a short payload at the very start of the media file.
The initialization payload <bcp14>MAY</bcp14> be cached and reused between objects with the same configuration.</t>

</section>
<section anchor="appendix.video"><name>Video</name>
<t>Video is a sequence of pictures (frames) with a presentation timestamp (PTS).</t>

<t>An I-frame is a frame with no dependencies and is effectively an image file.
These frames are usually inserted at a frequent interval to support seeking or joining a live stream.
However they can also improve compression when used at scene boundaries.</t>

<t>A P-frame is a frame that references on one or more earlier frames.
These frames are delta-encoded, such that they only encode the changes (motion).
This result in a massive file size reduction for most content outside of few notorious cases (ex. confetti).</t>

<t>A common encoding structure is to only reference the previous frame, as it is simple and minimizes latency:</t>

<figure><artwork><![CDATA[
 I <- P <- P <- P   I <- P <- P <- P   I <- P ...
]]></artwork></figure>

<t>There is no such thing as an optimal encoding structure.
Encoders tuned for the best quality will produce a tangled spaghetti of references.
Encoders tuned for the lowest latency can avoid reference frames to allow more to be dropped.</t>

<section anchor="appendix.b-frame"><name>B-Frames</name>
<t>The goal of video codecs is to maximize compression.
One of the improvements is to allow a frame to reference later frames.</t>

<t>A B-frame is a frame that can reference one or more frames in the future, and any number of frames in the past.
These frames are more difficult to encode/decode as they require buffering and reordering.</t>

<t>A common encoding structure is to use B-frames in a fixed pattern.
Such a fixed pattern is not optimal, but it's simpler for hardware encoding:</t>

<figure><artwork><![CDATA[
    B     B         B     B         B
   / \   / \       / \   / \       / \
  v   v v   v     v   v v   v     v   v
 I <-- P <-- P   I <-- P <-- P   I <-- P ...
]]></artwork></figure>

</section>
<section anchor="timestamps"><name>Timestamps</name>
<t>Each frame is assigned a presentation timestamp (PTS), indicating when it should be shown relative to other frames.</t>

<t>The encoder outputs the bitstream in decode order, which means that each frame is output after its references.
This makes it easier for the decoder as all references are earlier in the bitstream and can be decoded immediately.</t>

<t>However, this causes problems with B-frames because they depend on a future frame, and some reordering has to occur.
In order to keep track of this, frames have a decode timestamp (DTS) in addition to a presentation timestamp (PTS).
A B-frame will have higher DTS value that its dependencies, while PTS and DTS will be the same for other frame types.</t>

<t>For the example above, this would look like:</t>

<figure><artwork><![CDATA[
     0 1 2 3 4 5 6 7 8 9 10
PTS: I B P B P I B P B P B
DTS: I   PB  PBI   PB  PB
]]></artwork></figure>

<t>B-frames add latency because of this reordering so they are usually not used for conversational latency.</t>

</section>
<section anchor="appendix.gop"><name>Group of Pictures</name>
<t>A group of pictures (GoP) is an I-frame followed by any number of frames until the next I-frame.
All frames <bcp14>MUST</bcp14> reference, either directly or indirectly, only the most recent I-frame.</t>

<figure><artwork><![CDATA[
        GoP               GoP            GoP
+-----------------+-----------------+---------------
|     B     B     |     B     B     |     B
|    / \   / \    |    / \   / \    |    / \
|   v   v v   v   |   v   v v   v   |   v   v
|  I <-- P <-- P  |  I <-- P <-- P  |  I <-- P ...
+-----------------+-----------------+--------------
]]></artwork></figure>

<t>This is a useful abstraction because GoPs can always be decoded independently.</t>

</section>
<section anchor="appendix.svc"><name>Scalable Video Coding</name>
<t>Some codecs support scalable video coding (SVC), in which the encoder produces multiple bitstreams in a hierarchy.
This layered coding means that dropping the top layer degrades the user experience in a configured way.
Examples include reducing the resolution, picture quality, and/or frame rate.</t>

<t>Here is an example SVC encoding with 3 resolutions:</t>

<figure><artwork><![CDATA[
      +-------------------------+------------------
   4k |  P <- P <- P <- P <- P  |  P <- P <- P ...
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+------------------
1080p |  P <- P <- P <- P <- P  |  P <- P <- P ...
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+------------------
 360p |  I <- P <- P <- P <- P  |  I <- P <- P ...
      +-------------------------+------------------
]]></artwork></figure>

</section>
</section>
<section anchor="appendix.audio"><name>Audio</name>
<t>Audio is dramatically simpler than video as it is not typically delta encoded.
Audio samples are grouped together (group of samples) at a configured rate, also called a "frame".</t>

<t>The encoder spits out a continuous stream of samples (S):</t>

<figure><artwork><![CDATA[
S S S S S S S S S S S S S ...
]]></artwork></figure>

</section>
</section>
<section anchor="appendix.examples"><name>Appendix B. Object Examples</name>
<t>Warp offers a large degree of flexibility on how objects are fragmented and prioritized.
There is no best solution; it depends on the desired complexity and user experience.</t>

<t>This section provides a summary of some options available.</t>

<section anchor="video"><name>Video</name>

<section anchor="group-of-pictures"><name>Group of Pictures</name>
<t>A group of pictures (GoP) is consists of an I-frame and all frames that directly or indirectly reference it (<xref target="appendix.gop"/>).
The tail of a GoP can be dropped without causing decode errors, even if the encoding is otherwise unknown, making this the safest option.</t>

<t>It is <bcp14>RECOMMENDED</bcp14> that each object consist of a single GoP.
For example:</t>

<figure><artwork><![CDATA[
     object 1        object 2     object 3
+---------------+---------------+---------
| I  P  B  P  B | I  P  B  P  B | I  P  B
+---------------+---------------+---------
]]></artwork></figure>

<t>Depending on the video encoding, this approach may introduce unnecessary ordering and dependencies.
A better option may be available below.</t>

</section>
<section anchor="scalable-video-coding"><name>Scalable Video Coding</name>
<t>Some codecs support scalable video coding (SVC), in which the encoder produces multiple bitstreams in a hierarchy (<xref target="appendix.svc"/>).</t>

<t>When SVC is used, it is <bcp14>RECOMMENDED</bcp14> that each object consist of a single layer and GoP.
For example:</t>

<figure><artwork><![CDATA[
                object 3              object 6
      +-------------------------+---------------
   4k |  P <- P <- P <- P <- P  |  P <- P <- P
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+--------------

                object 2              object 5
      +-------------------------+---------------
1080p |  P <- P <- P <- P <- P  |  P <- P <- P
      |  |    |    |    |    |  |  |    |    |
      |  v    v    v    v    v  |  v    v    v
      +-------------------------+--------------

                object 1              object 4
      +-------------------------+---------------
 360p |  I <- P <- P <- P <- P  |  I <- P <- P
      +-------------------------+---------------
]]></artwork></figure>

</section>
<section anchor="frames"><name>Frames</name>
<t>With full knowledge of the encoding, the encoder <bcp14>MAY</bcp14> can split a GoP into multiple objects based on the frame.
However, this is highly dependent on the encoding, and the additional complexity might not improve the user experience.</t>

<t>For example, we could split our example B-frame structure (<xref target="appendix.b-frame"/>) into 13 objects:</t>

<figure><artwork><![CDATA[
      2     4           7     9           12
+--------+--------+--------+--------+-----------+
|     B  |  B     |     B  |  B     |     B     |
|-----+--+--+-----+-----+--+--+-----+-----+-----+
|  I  |  P  |  P  |  I  |  P  |  P  |  I  |  P  |
+-----+-----+-----+-----+-----+-----+-----+-----+
   1     3     5     6     8     10    11    13
]]></artwork></figure>

<t>Objects can be merged with their dependency to reduce the total number of objects.
QUIC streams will deliver each object in order so the QUIC library performs the reordering.</t>

<t>The same GoP structure can be represented using eight objects:</t>

<figure><artwork><![CDATA[
      2     3           5     6           8
+--------+--------+-----------------+------------
|     B  |  B     |     B  |  B     |     B     |
+--------+--------+--------+--------+-----------+
|  I     P     P  |  I     P     P  |  I     P
+-----------------+-----------------+------------
         1                 4              7
]]></artwork></figure>

<t>We can further reduce the number of objects by combining frames that don't depend on each other.
The only restriction is that frames can only reference frames earlier in the object.
For example, non-reference frames can have their own object so they can be prioritized or dropped separate from reference frames.</t>

<t>The same GoP structure can also be represented using six objects, although we've removed the ability to drop individual B-frames:</t>

<figure><artwork><![CDATA[
    object 2      object 4    object 6
+-------------+-------------+---------
|    B   B    |    B   B    |    B
+-------------+-------------+---------
|  I   P   P  |  I   P   P  |  I   P
+-------------+-------------+---------
    object 1      object 3    object 5
]]></artwork></figure>

</section>
<section anchor="init"><name>Init</name>
<t>Initialization data (<xref target="appendix.init"/>) is required to initialize the decoder.
Each object <bcp14>MAY</bcp14> start with initialization data although this adds overhead.</t>

<t>Instead, it is <bcp14>RECOMMENDED</bcp14> to create a init object.
Each media object can then depend on the init object to avoid the redundant overhead.
For example:</t>

<figure><artwork><![CDATA[
     object 2        object 3     object 5
+---------------+---------------+---------
| I  P  B  P  B | I  P  B  P  B | I  P  B
+---------------+---------------+---------
|              init             |  init
+-------------------------------+---------
              object 1            object 4
]]></artwork></figure>

</section>
</section>
<section anchor="audio"><name>Audio</name>
<t>Audio (<xref target="appendix.audio"/>) is much simpler than video so there's fewer options.</t>

<t>The simplest configuration is to use a single object for each audio track.
This may seem inefficient given the ease of dropping audio samples.
However, the audio bitrate is low and gaps cause quite a poor user experience, when compared to video.</t>

<figure><artwork><![CDATA[
          object 1
+---------------------------
| S S S S S S S S S S S S S
+---------------------------
]]></artwork></figure>

<t>An improvement is to periodically split audio samples into separate objects.
This gives the consumer the ability to skip ahead during severe congestion or temporary connectivity loss.</t>

<figure><artwork><![CDATA[
     object 1        object 2     object 3
+---------------+---------------+---------
| S  S  S  S  S | S  S  S  S  S | S  S  S
+---------------+---------------+---------
]]></artwork></figure>

<t>This frequency of audio objects is configurable, at the cost of additional overhead.
It's <bcp14>NOT RECOMMENDED</bcp14> to create a object for each audio frame because of this overhead.</t>

<t>Since video can only recover from severe congestion with an I-frame, so there's not much point recovering audio at a separate interval.
It is <bcp14>RECOMMENDED</bcp14> to create a new audio object at each video I-frame.</t>

<figure><artwork><![CDATA[
     object 1        object 3     object 5
+---------------+---------------+---------
| S  S  S  S  S | S  S  S  S  S | S  S  S
+---------------+---------------+---------
| I  P  B  P  B | I  P  B  P  B | I  P  B
+---------------+---------------+---------
     object 2        object 4     object 6
]]></artwork></figure>

</section>
<section anchor="appendix.delivery-order"><name>Delivery Order</name>
<t>The delivery order (<xref target="delivery-order"/> depends on the desired user experience during congestion:</t>

<t><list style="symbols">
  <t>if media should be skipped: delivery order = PTS</t>
  <t>if media should not be skipped: delivery order = -PTS</t>
  <t>if video should be skipped before audio: audio delivery order &lt; video delivery order</t>
</list></t>

<t>The delivery order may be changed if the content changes.
For example, switching from a live stream (skippable) to an advertisement (unskippable).</t>

</section>
</section>
<section numbered="false" anchor="contributors"><name>Contributors</name>

<t><list style="symbols">
  <t>Alan Frindell</t>
  <t>Charles Krasic</t>
  <t>Cullen Jennings</t>
  <t>James Hurley</t>
  <t>Jordi Cenzano</t>
  <t>Mike English</t>
  <t>Will Law</t>
  <t>Ali Begen</t>
</list></t>

</section>


  </middle>

  <back>


    <references title='Normative References'>





<reference anchor='QUIC' target='https://www.rfc-editor.org/info/rfc9000'>
<front>
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
<author fullname='J. Iyengar' initials='J.' role='editor' surname='Iyengar'><organization/></author>
<author fullname='M. Thomson' initials='M.' role='editor' surname='Thomson'><organization/></author>
<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>



<reference anchor='QUIC-RECOVERY' target='https://www.rfc-editor.org/info/rfc9002'>
<front>
<title>QUIC Loss Detection and Congestion Control</title>
<author fullname='J. Iyengar' initials='J.' role='editor' surname='Iyengar'><organization/></author>
<author fullname='I. Swett' initials='I.' role='editor' surname='Swett'><organization/></author>
<date month='May' year='2021'/>
<abstract><t>This document describes loss detection and congestion control mechanisms for QUIC.</t></abstract>
</front>
<seriesInfo name='RFC' value='9002'/>
<seriesInfo name='DOI' value='10.17487/RFC9002'/>
</reference>


<reference anchor='WebTransport' target='https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3-05'>
   <front>
      <title>WebTransport over HTTP/3</title>
      <author fullname='Alan Frindell' initials='A.' surname='Frindell'>
         <organization>Facebook</organization>
      </author>
      <author fullname='Eric Kinnear' initials='E.' surname='Kinnear'>
         <organization>Apple Inc.</organization>
      </author>
      <author fullname='Victor Vasiliev' initials='V.' surname='Vasiliev'>
         <organization>Google</organization>
      </author>
      <date day='13' month='March' year='2023'/>
      <abstract>
	 <t>   WebTransport [OVERVIEW] is a protocol framework that enables clients
   constrained by the Web security model to communicate with a remote
   server using a secure multiplexed transport.  This document describes
   a WebTransport protocol that is based on HTTP/3 [HTTP3] and provides
   support for unidirectional streams, bidirectional streams and
   datagrams, all multiplexed within the same HTTP/3 connection.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-ietf-webtrans-http3-05'/>
   
</reference>



<reference anchor='URI' target='https://www.rfc-editor.org/info/rfc3986'>
<front>
<title>Uniform Resource Identifier (URI): Generic Syntax</title>
<author fullname='T. Berners-Lee' initials='T.' surname='Berners-Lee'><organization/></author>
<author fullname='R. Fielding' initials='R.' surname='Fielding'><organization/></author>
<author fullname='L. Masinter' initials='L.' surname='Masinter'><organization/></author>
<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="ISOBMFF" >
  <front>
    <title>Information technology — Coding of audio-visual objects — Part 12: ISO Base Media File Format</title>
    <author >
      <organization></organization>
    </author>
    <date year="2015" month="December"/>
  </front>
</reference>




<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author fullname='S. Bradner' initials='S.' surname='Bradner'><organization/></author>
<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' target='https://www.rfc-editor.org/info/rfc8174'>
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author fullname='B. Leiba' initials='B.' surname='Leiba'><organization/></author>
<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='RFC9000' target='https://www.rfc-editor.org/info/rfc9000'>
<front>
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
<author fullname='J. Iyengar' initials='J.' role='editor' surname='Iyengar'><organization/></author>
<author fullname='M. Thomson' initials='M.' role='editor' surname='Thomson'><organization/></author>
<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'>

<reference anchor="CMAF" >
  <front>
    <title>Information technology -- Multimedia application format (MPEG-A) -- Part 19: Common media application format (CMAF) for segmented media</title>
    <author >
      <organization></organization>
    </author>
    <date year="2020" month="March"/>
  </front>
</reference>




<reference anchor='NewReno' target='https://www.rfc-editor.org/info/rfc6582'>
<front>
<title>The NewReno Modification to TCP's Fast Recovery Algorithm</title>
<author fullname='T. Henderson' initials='T.' surname='Henderson'><organization/></author>
<author fullname='S. Floyd' initials='S.' surname='Floyd'><organization/></author>
<author fullname='A. Gurtov' initials='A.' surname='Gurtov'><organization/></author>
<author fullname='Y. Nishida' initials='Y.' surname='Nishida'><organization/></author>
<date month='April' year='2012'/>
<abstract><t>RFC 5681 documents the following four intertwined TCP congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery.  RFC 5681 explicitly allows certain modifications of these algorithms, including modifications that use the TCP Selective Acknowledgment (SACK) option (RFC 2883), and modifications that respond to &quot;partial acknowledgments&quot; (ACKs that cover new data, but not all the data outstanding when loss was detected) in the absence of SACK.  This document describes a specific algorithm for responding to partial acknowledgments, referred to as &quot;NewReno&quot;.  This response to partial acknowledgments was first proposed by Janey Hoe.  This document obsoletes RFC 3782.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6582'/>
<seriesInfo name='DOI' value='10.17487/RFC6582'/>
</reference>


<reference anchor='BBR' target='https://datatracker.ietf.org/doc/html/draft-cardwell-iccrg-bbr-congestion-control-02'>
   <front>
      <title>BBR Congestion Control</title>
      <author fullname='Neal Cardwell' initials='N.' surname='Cardwell'>
         <organization>Google</organization>
      </author>
      <author fullname='Yuchung Cheng' initials='Y.' surname='Cheng'>
         <organization>Google</organization>
      </author>
      <author fullname='Soheil Hassas Yeganeh' initials='S. H.' surname='Yeganeh'>
         <organization>Google</organization>
      </author>
      <author fullname='Ian Swett' initials='I.' surname='Swett'>
         <organization>Google</organization>
      </author>
      <author fullname='Van Jacobson' initials='V.' surname='Jacobson'>
         <organization>Google</organization>
      </author>
      <date day='7' month='March' year='2022'/>
      <abstract>
	 <t>   This document specifies the BBR congestion control algorithm.  BBR
   (&quot;Bottleneck Bandwidth and Round-trip propagation time&quot;) uses recent
   measurements of a transport connection&#39;s delivery rate, round-trip
   time, and packet loss rate to build an explicit model of the network
   path.  BBR then uses this model to control both how fast it sends
   data and the maximum volume of data it allows in flight in the
   network at any time.  Relative to loss-based congestion control
   algorithms such as Reno [RFC5681] or CUBIC [RFC8312], BBR offers
   substantially higher throughput for bottlenecks with shallow buffers
   or random losses, and substantially lower queueing delays for
   bottlenecks with deep buffers (avoiding &quot;bufferbloat&quot;).  BBR can be
   implemented in any transport protocol that supports packet-delivery
   acknowledgment.  Thus far, open source implementations are available
   for TCP [RFC793] and QUIC [RFC9000].  This document specifies version
   2 of the BBR algorithm, also sometimes referred to as BBRv2 or bbr2.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-cardwell-iccrg-bbr-congestion-control-02'/>
   
</reference>




    </references>



  </back>

<!-- ##markdown-source:
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
uVvBnz+i0f0yu6G5cnNkl7Yc/Cem74PUsrAAAA==

-->

</rfc>

