One document matched: draft-ietf-rtcweb-fec-02.xml


<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY rfc2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY rfc2198 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2198.xml">
<!ENTITY rfc5109 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5109.xml">
<!ENTITY rfc5956 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5956.xml">
<!ENTITY rfc6716 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6716.xml">
<!ENTITY fecpayload SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-payload-flexible-fec-scheme.xml">
<!ENTITY opuspayload SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-payload-rtp-opus.xml">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<?rfc toc="yes" ?>
<?rfc symrefs="yes" ?>
<?rfc iprnotified="no" ?>
<?rfc strict="yes" ?>
<?rfc compact="yes" ?>
<?rfc sortrefs="yes" ?>
<?rfc colonspace="yes" ?>
<?rfc rfcedstyle="no" ?>
<?rfc tocdepth="4"?>

<rfc category="std" docName="draft-ietf-rtcweb-fec-02" ipr="trust200902">
  <front>
    <title abbrev="WebRTC FEC">WebRTC Forward Error Correction Requirements</title>

    <author fullname="Justin Uberti" initials="J." surname="Uberti">
      <organization>Google</organization>

      <address>
        <postal>
          <street>747 6th Ave S</street>

          <city>Kirkland</city>

          <region>WA</region>

          <code>98033</code>

          <country>USA</country>
        </postal>

        <email>justin@uberti.name</email>
      </address>
    </author>

    <date day="18" month="October" year="2015" />

    <area>RAI</area>

    <abstract>
      <t>This document provides information and requirements for how
      Forward Error Correction (FEC) should be used by WebRTC applications.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
      <t>In situations where packet loss is high, or perfect media quality is essential,
      Forward Error Correction (FEC) can be used to proactively recover from packet losses.
      This specification provides guidance on which FEC mechanisms to use, and
      how to use them, for WebRTC client implementations.</t>
    </section>

    <section title="Terminology">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in <xref
      target="RFC2119"></xref>.</t>
    </section>

    <section title="Types of FEC">
      <t>By its name, FEC describes the sending of redundant information in
         an outgoing packet stream so that information can still be recovered
         even in the face of packet loss. There are multiple ways in which this
         can be accomplished; this section enumerates the various mechanisms
         and describes their tradeoffs.</t>
      <section title="Separate FEC Stream">
          <t>This approach, as described in <xref target="RFC5956"/>, Section 4.3,
            sends FEC packets as an
            independent SSRC-multiplexed stream, with its own SSRC and payload type.
            While by far the most flexible, each FEC packet will have its own
            IP+UDP+RTP+FEC header, leading to additional overhead of the FEC stream.
          </t>
      </section>
      <section title="Redundant Encoding">
          <t>This approach, as descibed in <xref target="RFC2198"/>, allows for redundant data
            to be piggybacked on an existing primary encoding, all in a single packet.
            This redundant data may be an exact copy of a previous packet, or
            for codecs that support variable-bitrate encodings, possibly a smaller,
            lower-quality representation. In certain cases, the redundant data
            could include multiple prior packets.</t>
          <t>Since there is only a single set of
            packet headers, this approach allows for a very efficient representation of
            primary + redundant data. However, this savings is only realized when
            the data all fits into a single packet (i.e. the size is less than a MTU).
            As a result, this approach is generally not useful for video content.
          </t>
      </section>
       <section title="Codec-Specific In-band FEC">
          <t>Some audio codecs, notably Opus <xref target="RFC6716"/>, support their own in-band FEC
            mechanism, where FEC data is included in the codec payload. In the
            case of Opus specifically, packets deemed as important are re-encoded
            at a lower bitrate and added to the subsequent packet, allowing partial
            recovery of a lost packet. See <xref target="RFC6716"/>, Section 2.1.7 for details.
          </t>
      </section>
    </section>

    <section title="FEC for Audio Content">
      <t>The following section provides guidance on how to best use FEC for transmitting
      audio data. As indicated in <xref target="adaptive-fec"/> below, FEC should only
      be activated if network conditions warrant it, or upon explicit application request.
      </t>
      <section title="Recommended Mechanism">
        <t>When using the Opus codec in its default (hybrid) mode, use of
          the built-in Opus FEC mechanism is RECOMMENDED. This provides reasonable
          protection of the audio stream against typical losses, with minimal
          overhead. [TODO: add stats]
        </t>
        <t>When using variable-bitrate codecs without an internal FEC, use of
        <xref target="RFC2198"/> redundant encoding with a lower-fidelity version
        of previous packet(s) is RECOMMENDED.
        This provides reasonable protection of the payload with moderate overhead.
        </t>
        <t>When using constant-bitrate codecs, e.g. PCMU, use of
        <xref target="RFC2198"/> redundant encoding MAY be used, but note that
        this will result in a potentially significant bitrate increase, and
        that suddenly increasing bitrate to deal with losses from congestion may
        actually make things worse.
        </t>
        <t>Because of the lower packet rate of audio encodings, usually a single
        packet per frame, use of a separate FEC stream comes with a higher overhead
        than other mechanisms, and therefore is NOT RECOMMENDED.
        </t>
      </section>

      <section title="Negotiating Support">
        <t>Support for redundant encoding can be indicated by offering "red" as a
        supported payload type in the offer. Answerers can reject the use of
        redundant encoding by not including "red" as a supported payload type in
        the answer.</t>
        <t>Support for codec-specific FEC mechanisms are typically indicated via
        "a=fmtp" parameters. For Opus specifically, this is controlled by the
        "useinbandfec=1" parameter, as specified in <xref target="I-D.ietf-payload-rtp-opus"/>.
        These parameters are declarative and can
        be negotiated separately for either media direction.</t>
      </section>
    </section>

    <section title="FEC for Video Content">
      <t>The following section provides guidance on how to best use FEC for transmitting
      video data. As indicated in <xref target="adaptive-fec"/> below, FEC should only
      be activated if network conditions warrant it, or upon explicit application request.
      </t>
      <section title="Recommended Mechanism">
        <t>For video content, use of a separate FEC stream with the RTP payload format
        described in <xref target="I-D.ietf-payload-flexible-fec-scheme"/> is RECOMMENDED.
        The receiver can demultiplex the incoming FEC stream by SSRC and correlate it
        with the primary stream via the ssrc-group mechanism.
        </t>
        <t>Support for protecting multiple primary streams with a single FEC stream is
        complicated by WebRTC's 1-m-line-per-stream policy,
        which does not allow for a m-line dedicated specifically to FEC.</t>
      </section>
      <section title="Negotiating Support">
        <t>To offer support for a separate SSRC-multiplexed FEC stream, the
        offerer MUST offer one of the formats described in
        <xref target="I-D.ietf-payload-flexible-fec-scheme"/>, Section 5.1,
        as well as a ssrc-group with "FEC-FR" semantics as described in
        <xref target="RFC5956"/>, Section 4.3.</t>
        <t>Use of FEC-only m-lines, and grouping using the SDP group mechanism,
          is not currently defined for WebRTC, and SHOULD NOT be offered.</t>
        <t>Answerers can reject the use of SSRC-multiplexed FEC, by not
          including FEC payload types in the answer.</t>
        <t>Answerers SHOULD reject any FEC-only m-lines, unless they
        specifically know how to handle such a thing in a WebRTC context (perhaps
        defined by a future version of the WebRTC specifications). This ensures
        that implementations will not malfunction when said future version of WebRTC
        enables offers of FEC-only m-lines.</t>
      </section>
    </section>

    <section title="FEC for Application Content">
      <t>WebRTC also supports the ability to send generic application data, and
      provides transport-level retransmission mechanisms that the application
      can use to ensure that its data is delivered reliably. </t>
      <t>
      Because the application can control exactly what data to send, it has the
      ability to monitor packet statistics and perform its own application-level
      FEC, if necessary.</t>
      <t>As a result, this document makes no recommendations regarding FEC for
      the underlying data transport.</t>
    </section>

    <section title="Implementation Requirements">
        <t>To support the functionality recommended above, implementations MUST support
        the redundant encoding mechanism described in <xref target="RFC2198"/> and the FEC
        mechanism described in <xref target="RFC5956"/> and
        <xref target="I-D.ietf-payload-flexible-fec-scheme"/>.</t>
        <t>Implementations MAY support additional FEC mechanisms if desired,
        e.g. <xref target="RFC5109"/>.</t>
    </section>

    <section anchor="adaptive-fec" title="Adaptive Use of FEC">
      <t>Since use of FEC causes redundant data to be transmitted, this will
        lead to less bandwidth available for the primary encoding, when in a
        bandwidth-constrained environment. Given this, WebRTC implementations
        SHOULD only transmit FEC data when network conditions indicate that
        this is advisable (e.g. by monitoring transmit packet loss data from
        RTCP Receiver Reports), or the application indicates it is willing to
        pay a quality penalty to proactively avoid losses.
      </t>
    </section>

    <section title="Security Considerations">
      <t>This document makes recommendations regarding the use of FEC.
      Generally, it should be noted that although applying redundancy is often useful
      in protecting a stream against packet loss, if the loss is caused by network
      congestion, the additional bandwidth used by the redundant data may actually
      make the situation worse, and can lead to significant degradation of the
      network.
      </t>
      <t>Additional security considerations for each individual FEC mechanism
      are enumerated in their respective documents.
      </t>

    </section>

    <section title="IANA Considerations">
      <t>This document requires no actions from IANA.</t>
    </section>

    <section title="Acknowledgements">
      <t>Several people provided significant input into this document, including
      Jonathan Lennox, Giri Mandyam, Varun Singh, Tim Terriberry, and Mo Zanaty.</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      &rfc2119;
      &rfc2198;
      &rfc5956;
      &fecpayload;
    </references>

    <references title="Informative References">
      &rfc5109;
      &rfc6716;
      &opuspayload;
    </references>

    <section title="Change log">
      <t>Changes in draft -02: <list style="symbols">
        <t>Expanded discussion of FEC-only m-lines, and how they should be
        handled in offers and answers.</t>
      </list></t>
      <t>Changes in draft -01: <list style="symbols">
        <t>Tweaked abstract/intro text that was ambiguously normative.</t>
        <t>Removed text on FEC for Opus in CELT mode.</t>
        <t>Changed RFC 2198 recommendation for PCMU to be MAY instead of
           NOT RECOMMENDED, based on list feedback.</t>
        <t>Explicitly called out application data as something not addressed
           in this document.</t>
        <t>Updated flexible-fec reference.</t>
      </list></t>
      <t>Changes in draft -00: <list style="symbols">
        <t>Initial version, from sidebar conversation at IETF 90.</t>
      </list></t>
    </section>
  </back>
</rfc>

PAFTECH AB 2003-20262026-04-24 01:20:00