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

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-lcurley-warp-00" category="info">

  <front>
    <title abbrev="WARP">Warp - Segmented Live Video Transport</title>

    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization>Twitch</organization>
      <address>
        <email>lcurley@twitch.tv</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 segmented live video transport protocol.
Warp maps live media to QUIC streams based on the underlying media encoding.
Media is prioritized to minimize latency during congestion.</t>



    </abstract>


  </front>

  <middle>


<section anchor="overview" title="Overview">
<t>Warp is a live video transport protocol that utilizes the <xref target="QUIC"/> network protocol.</t>

<t>The live stream is split into segments (<xref target="segments"/>) at I-frame boundaries. These are fragmented MP4 files as defined in <xref target="ISOBMFF"/>. Initialization segments contain track metadata while media segments contain either video or audio samples.</t>

<t>QUIC streams (<xref target="streams"/>) are used to transfer messages and segments between endpoints. These streams are prioritized based on the contents, such that the most important media is delivered during congestion.</t>

<t>Messages (<xref target="messages"/>) are sent over streams alongside segments. These are used to carry necessary metadata and control messages.</t>

<section anchor="terms-and-definitions" title="Terms and Definitions">

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" 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>

<t><list style="hanging">
  <t hangText="Frame:">
  An image to be rendered at a specific point in time.</t>
  <t hangText="I-frame:">
  A frame that does not depend on the contents of other frames.</t>
  <t hangText="Group of pictures (GOP):">
  A I-frame followed by a sequential series of dependent frames.</t>
  <t hangText="Group of samples:">
  A sequential series of audio samples starting at a given timestamp.</t>
  <t hangText="Segment:">
  A sequence of video frames and/or audio samples serialized into a container.</t>
  <t hangText="Presentation Timestamp (PTS):">
  A point in time when video/audio should be presented to the viewer.</t>
  <t hangText="Media producer:">
  An endpoint sending media over the network.</t>
  <t hangText="Media consumer:">
  An endpoint receiving media over the network.</t>
  <t hangText="Congestion:">
  Packet loss and queuing caused by degraded or overloaded networks.</t>
</list></t>

</section>
</section>
<section anchor="segments" title="Segments">
<t>The live stream is split into segments before being transferred over the network. Segments are fragmented MP4 files as defined by <xref target="ISOBMFF"/>.</t>

<t>There are two types of segments: initialization and media.</t>

<section anchor="initialization" title="Initialization">
<t>Initialization segments contain track metadata but no sample data.</t>

<t>Initialization segments MUST consist of a File Type Box ('ftyp') followed by a Movie Box ('moov'). This Movie Box consists of Movie Header Boxes ('mvhd'), Track Header Boxes ('tkhd'), Track Boxes ('trak'), followed by a final Movie Extends Box ('mvex'). These boxes MUST NOT contain any samples and MUST have a duration of zero.</t>

<t>Note that a Common Media Application Format Header <xref target="CMAF"/> meets all these requirements.</t>

</section>
<section anchor="media" title="Media">
<t>Media segments contain media samples for a single track.</t>

<t>Media segments MUST consist of a Segment Type Box ('styp') followed by at least one media fragment. Each media fragment consists of a Movie Fragment Box ('moof') followed by a Media Data Box ('mdat'). The Media Fragment Box MUST contain a Movie Fragment Header Box ('mfhd') and Track Box ('trak') with a Track ID ('track_ID') matching a Track Box in the initialization segment.</t>

<t>Note that a Common Media Application Format Segment <xref target="CMAF"/> meets all these requirements.</t>

<section anchor="video" title="Video">
<t>Media segments containing video data MUST start with an I-frame. Media fragments MAY contain a single frame, minimizing latency at the cost of a small increase in segment size. Video frames MUST be in decode order.</t>

</section>
<section anchor="audio" title="Audio">
<t>Media fragments MAY contain a single group of audio samples, minimizing latency at the cost of a small increase in segment size.</t>

</section>
</section>
</section>
<section anchor="streams" title="Streams">
<t>Warp uses unidirectional QUIC streams to transfer messages and segments over the network. The establishment of the QUIC connection is outside the scope of this document.</t>

<t>An endpoints MAY both send media (producer) and receive media (consumer). This is accomplished by sending messages and segments over unidirectional streams. Streams contain any number of messages and segments concatenated together.</t>

<section anchor="streams-messages" title="Messages">
<t>Messages are used to control playback or carry metadata about upcoming segments.</t>

<t>A Warp Box ('warp') is a top-level MP4 box as defined in <xref target="ISOBMFF"/>. The contents of this box is a warp message. See the messages section (<xref target="messages"/>) for the encoding and types available.</t>

</section>
<section anchor="segments-1" title="Segments">
<t>Segments are transferred over streams alongside messages. Each segment MUST be preceded by an <spanx style="verb">init</spanx> (<xref target="message-init"/>) or <spanx style="verb">media</spanx> (<xref target="message-media"/>) message, indicating the type of segment and providing additional metadata.</t>

<t>The media producer SHOULD send each segment as a unique stream to avoid head-of-line blocking. The media producer MAY send multiple segments over a single stream, for simplicity, when head-of-line blocking is desired.</t>

<t>A segment is the smallest unit of delivery, as the tail of a segment can be safely delayed/dropped without decode errors. A future version of Warp will support layered coding (additional QUIC streams) to enable dropping or downscalling frames in the middle of a segment.</t>

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

<t>The media producer assigns a numeric presidence to each stream. This is a strict prioritzation scheme, such that any available bandwidth is allocated to streams in descending order. QUIC supports stream prioritization but does not standardize any mechanisms; see Section 2.3 in <xref target="QUIC"/>. The media producer MUST support sending priorized streams. The media producer MAY choose to delay retransmitting lower priority streams when possible within QUIC flow control limits.</t>

<t>The media consumer determines how long to wait for a given segment (buffer size) before skipping ahead. The media consumer MAY cancel a skipped segment to save bandwidth, or leave it downloading in the background (ex. to support rewind).</t>

<t>Prioritization allows a single media producer to support multiple media consumers with different latency targets. For example, one consumer could have a 1s buffer to minimize latency, while another conssumer could have a 5s buffer to improve quality, while a yet another consumer could have a 30s buffer to receive all media (ex. VOD recorder).</t>

<section anchor="live-content" title="Live Content">
<t>Live content is encoded and delivered in real-time. Media delivery is blocked on the encoder throughput, except during congestion causing limited network throughput. To best deliver live content:</t>

<t><list style="symbols">
  <t>Audio streams SHOULD be prioritized over video streams. This allows the media consumer to skip video while audio continues uninterupted during congestion.</t>
  <t>Newer video streams SHOULD be prioritized over older video streams. This allows the media consumer to skip older video content during congestion.</t>
</list></t>

<t>For example, this formula will prioritze audio segments, but only up to 3s in the future:</t>

<figure><artwork><![CDATA[
  if is_audio:
    precedence = timestamp + 3s
  else:
    precedence = timestamp
]]></artwork></figure>

</section>
<section anchor="recorded-content" title="Recorded Content">
<t>Recorded content has already been encoded. Media delivery is blocked exclusively on network throughput.</t>

<t>Warp is primarily designed for live content, but can switch to head-of-line blocking by changing stream prioritization. This is also useful for content that should not be skipped over, such as advertisements. To enable head-of-line blocking:</t>

<t><list style="symbols">
  <t>Older streams SHOULD be prioritized over newer streams.</t>
</list></t>

<t>For example, this formula will prioritize older segments:</t>

<figure><artwork><![CDATA[
  precedence = -timestamp
]]></artwork></figure>

</section>
</section>
<section anchor="cancellation" title="Cancellation">
<t>During congestion, prioritization intentionally cause stream starvation for the lowest priority streams. Some form of starvation will last until the network fully recovers, which may be indefinite.</t>

<t>The media consumer SHOULD cancel a stream (via a QUIC <spanx style="verb">STOP_SENDING</spanx> frame) after it has been skipped to save bandwidth. The media producer SHOULD reset the lowest priority stream (via QUIC <spanx style="verb">RESET_STREAM</spanx> frame) when nearing resource limits. Both of these actions will effectively drop the tail of the segment.</t>

</section>
<section anchor="middleware" title="Middleware">
<t>Media may go through multiple hops and processing steps on the path from the broadcaster to player. The full effectiveness of warp as an end-to-end protocol depends on middleware support.</t>

<t><list style="symbols">
  <t>Middleware MUST maintain stream idependence to avoid introducing head-of-line blocking.</t>
  <t>Middleware SHOULD maintain stream prioritization when traversing networks susceptible to congestion.</t>
  <t>Middleware MUST forward the <spanx style="verb">priority</spanx> message (<xref target="message-priority"/>) for downstream servers.</t>
</list></t>

</section>
</section>
<section anchor="messages" title="Messages">
<t>Warp endpoints communicate via messages contained in the top-level Warp Box (warp).</t>

<t>A warp message is JSON object, where the key defines the message type and the value depends on the message type. Unknown messages MUST be ignored.</t>

<t>An endpoint MUST send messages sequentially over a single stream when ordering is required. Messages MAY be combined into a single JSON object when ordering is not required.</t>

<section anchor="message-init" title="init">
<t>The <spanx style="verb">init</spanx> message indicates that the remainder of the stream contains an initialization segment.</t>

<figure><artwork><![CDATA[
{
  init: {
    id: int
  }
}
]]></artwork></figure>

<t><list style="hanging">
  <t hangText="id:">
  Incremented by 1 for each initialization segment.</t>
</list></t>

</section>
<section anchor="message-media" title="media">
<t>The <spanx style="verb">media</spanx> message contains metadata about the next media segment in the stream.</t>

<figure><artwork><![CDATA[
{
  segment: {
    init: int,
    timestamp: int,
  }
}
]]></artwork></figure>

<t><list style="hanging">
  <t hangText="init:">
  The id of the cooresponding initialization segment. A decoder MUST block until the coorespending <spanx style="verb">init</spanx> message to arrive.</t>
  <t hangText="timestamp:">
  The presentation timestamp in milliseconds for the first frame/sample in the next segment. This timestamp MUST be used when it does not match the timestamp in the media container.</t>
</list></t>

</section>
<section anchor="message-priority" title="priority">
<t>The <spanx style="verb">priority</spanx> message informs middleware about the intended priority of the current stream. Any middleware MAY ignore this value but SHOULD forward it.</t>

<figure><artwork><![CDATA[
{
  priority: {
    precedence: int,
  }
}
]]></artwork></figure>

<t><list style="hanging">
  <t hangText="precedence:">
  An integer value, indicating that any available bandwidth SHOULD be allocated to streams in descending order.</t>
</list></t>

</section>
<section anchor="extensions" title="Extensions">
<t>Custom messages MUST start with <spanx style="verb">x-</spanx>. Unicode LATIN SMALL LETTER X (U+0078) followed by HYPHEN-MINUS (U+002D).</t>

<t>Custom messages SHOULD use a unique prefix to reduce collisions. For example: <spanx style="verb">x-twitch-load</spanx> would contain identification required to start playback of a Twitch stream.</t>

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

<t>TODO</t>

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

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

</section>


  </middle>

  <back>

    <references title='Normative References'>

<reference anchor="QUIC" >
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
      <organization>Fastly</organization>
    </author>
    <author initials="M." surname="Thomson" fullname="Martin Thomson" role="editor">
      <organization>Mozilla</organization>
    </author>
    <date year="2021" month="May"/>
  </front>
  <seriesInfo name="RFC" value="9000"/>
  <seriesInfo name="DOI" value="10.17487/RFC9000"/>
</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>




    </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>


    </references>


<section numbered="false" anchor="contributors" title="Contributors">

<t><list style="symbols">
  <t>Michael Thornburgh</t>
</list></t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAB6OBGIAA61aa3IbSXL+36coUz9E7hIUqZmJmYFjI0yRlMQJgqRFaNYT
DodY6C4AtezuwnQ1SEEMTvgQPoDP4qP4JP4ys6ofAERrHdYPEf2orHx8+awe
DAZJbevcDNXOX3W1UAN1Y2aFKWuTqQt7b9SvNjNOjStd+oWr6p1ETyaVuR+q
vx5/uE4yl5a6wOqs0tN6kKfLKjerwQNIDQ4Pk0zXePZ4ejw+e0pSXMxctRoq
W05dkthFNVR1tfT168PDnw9fJ7oyeqjemdJUOk8eXHU3q9xyMVTnZWYWBv+V
tbpZTgrrvXVlcmdWeCmj57WpSlMPTomLJPG1LrNPOncldl8Zn/hCV/Wn35eu
Nn6oSpcs7FD9a+3SfeUhVGWmHr9WhfyAUIVeLGw5+7ck0ct67qphogaJwj9b
gsDFgTphQfmWKOBieWe6d10106X9omtwOlTjB1unc35gCm3zoQqq+qeanxzU
90lSuqrA+/cGu6l//nh+MuQF0T58Rx2rj6fXgzfaw0CjZV7bRW4+4zckhulA
1HSNRevFCK8PXx8NDn/gO95U1niyguyg1Ie3IP3zIUwm16dX50N1dHhw9OP3
P/34Ck+bZ40++N8g/A2K+eVAna9MOdNVc1+084su9cYjqGio3mpf56vmXuVI
VpPZ2lXb9xgdqPHcFR4A6O8xgo1tufGQdxm5LzbP9fZtcPf85urN6O3bvsLP
oSC2iCtVbdJ56XI3W6n//vf/UCcuAzyUm0IfmXWDe+uXOldu8jeT1p5fuQY7
6uj1kGgrspcaYT+t3trcqLdMuG+fox8GR6/hFnFXwcGbNx/oz4lbaP47Ov42
LgcDgUfBmwLOuU3lJXld7Y6uz94NjvfoTeH15yG2KQq88vVFtP8eXQFEMU7w
22tYOxwcfpckA9DWE19XOoVbjufWk3MtaZ3KzNSWxqt6blTqANuJmet7C8pE
nYLRvtKdXXKKRvccjeoIcLWoHLzY5QcJRy+4rZcXRYLasR8pcGB04dWE3YYU
hU2XCChVviI7ytumTNmsB4lYCtwuKjBka/sFy0CssKUtcKFyyFmmK5UtK1qf
unJmPCnqQIQubJblJkleqKt7U91b8yAMgqR+XhKwBj0va5tjH9HO4yMJ8fSk
EOIoKnakhk6N0BMRaQMPq9XwFfAbtOfV7uNj/P30tKeww/lgWsFt1MRBD5ri
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
J/8DQWWWmWUtAAA=

-->

</rfc>

