<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY rfc2119 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY rfc2327 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2327.xml">
<!ENTITY rfc3264 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3264.xml">
<!ENTITY rfc3550 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3550.xml">
<!ENTITY rfc3725 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3725.xml">
<!ENTITY rfc4566 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4566.xml">
<!ENTITY rfc4796 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4796.xml">
<!ENTITY rfc4960 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4960.xml">
<!ENTITY rfc5245 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5245.xml">
<!ENTITY rfc5761 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5761.xml">
<!ENTITY rfc5764 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5764.xml">
<!ENTITY rfc5888 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5888.xml">
<!ENTITY draft-alvestrand-mmusic-msid PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.alvestrand-mmusic-msid.xml">
<!ENTITY draft-alvestrand-one-rtp PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.alvestrand-one-rtp.xml">
<!ENTITY draft-ejzak-mmusic-bundle-alternatives PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ejzak-mmusic-bundle-alternatives.xml">
<!ENTITY draft-holmberg-mmusic-sdp-mmt-negotiation PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.holmberg-mmusic-sdp-mmt-negotiation.xml">
<!ENTITY draft-ietf-avtcore-multi-media-rtp-session PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-avtcore-multi-media-rtp-session.xml">
<!ENTITY draft-ietf-mmusic-sdp-bundle-negotiation PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-mmusic-sdp-bundle-negotiation.xml">
<!ENTITY draft-jennings-mmusic-media-req PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.jennings-mmusic-media-req.xml">
<!ENTITY draft-roach-mmusic-mlines PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.roach-mmusic-mlines.xml">
<!ENTITY draft-westerlund-avtcore-transport-multiplexing PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.westerlund-avtcore-transport-multiplexing.xml">
<!ENTITY draft-worley-service-example PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.worley-service-example.xml">

]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<?rfc strict="yes" ?>
<?rfc toc="yes" ?>
<rfc ipr="trust200902" category="std" docName="draft-worley-sdp-bundle-05">

<!-- To-do:

- Need IPv6 example.

- Can Trickle ICE be used to supply addresses to a line which has a null address?
  How about a zero port?
  Is Trickle ICE already using null addresses for something?

- Check out what null addresses are allowed and where they are in the SDPspec. 
- E-mail Cullen about ports in first SDP. 
- What is CLUE doing? 
- What about capneg? 
- How do I spec application media? 
- How to include application/data streams?
- Learn enough about ICE to write the examples correctly.
- Beware of multiple addresses/ports specified by m= or c= lines.
- Add references for any referenced protocols.

-->

<front>
  <title abbrev="Kumquat SDP Bundling">
    Kumquat:
    A Generic Bundle Mechanism for the Session Description Protocol (SDP)
  </title>
  <author initials="D. R." surname="Worley" fullname="Dale R. Worley">
    <organization abbrev="Ariadne">
      Ariadne Internet Services, Inc.
    </organization>
    <address>
      <postal>
        <street>738 Main St.</street>
        <city>Waltham</city>
        <region>MA</region>
        <code>02451</code>
        <country>US</country>
      </postal>
      <phone>+1 781 647 9199</phone>
      <email>worley@ariadne.com</email>
    </address>
  </author>
  <date day="11" month="March" year="2013" />
  <area>RAI</area>
  <workgroup>rtcweb</workgroup>
  <keyword>WebRTC</keyword>
  <keyword>SDP</keyword>
  <keyword>SDP bundling</keyword>
  <abstract>
    <t>
      This document defines a generic bundle mechanism for the Session
      Description Protocol (SDP) by which the media described by a number of
      media descriptions ("m= lines") are multiplexed and transmitted over a single
      transport association.
      The transport association is described by an additional media
      description, allowing SDP attributes to be applied to the aggregate,
      independently of attributes applied to the constituents.  In
      offer/answer usage, the bundle mechanism is
      backward compatible with SDP
      processors that do not understand the mechanism.
      The mechanism is designed to be compatible with the limitations of
      the existing Internet infrastructure.
    </t>
  </abstract>
</front>

<middle>

<section title="Introduction" anchor="intro">

<t>
The central idea of bundling is to multiplex the media that would be
several RTP sessions into one RTP session, with particular emphasis on
allowing one transport association to carry media that are presented
to the higher, application layer, as multiple RTP sessions.
</t>

<t>
At the interface between the SDP-configured layer and the lower,
transport layer, the media are organized into a single RTP session.
The transport-related properties of the RTP session (e.g., transport
5-tuple, encryption, ICE) are described by the transport-related
attributes of a single media description.
</t>

<t>
At the interface between the SDP-configured layer and the higher,
application layer, the media are organized into several
RTP sessions.  The application-related properties of the RTP session
(e.g., media type and label) are described by the
application-related attributes of separate media descriptions.
</t>

<t>
(There are some attributes (e.g., bandwidth limitation) that can apply
separately to both the bundled RTP session and the constituent RTP
sessions.)
</t>

<t>
However, we do not include the payload type numbers as information
available to the application; only the encoding name and its
parameters are accessible to the application.  This gives the bundle
mechanism freedom to place constraints on the use of payload types.
</t>

<t>
  The bundle is signaled in the session description by a "group"
  attribute with semantics "KUMQUAT".  The first media description
  listed in the group is the "bundle" media description (MD), whose
  transport information
  describes the transport association via which the RTP packets will be
  sent.  The remaining (zero or more) media descriptions listed in the
  group are the "constituent" MDs.  RTP packets received from the
  applications for these MDs are encapsulated and sent on the transport
  association for the bundle MD.  RTP packets received from the
  transport association for the bundle MD are deencapsulated and sent
  to the applications for the constituent MDs.
</t>

<t>
  A new payload type (codec) named "kumquat" is defined to be used for
  this encapsulation. <xref target="format"/>
</t>

<t>
  In offer/answer usage, we must arrange that the bundle mechanism is
  backward compatible with entities that do not understand the bundle
  mechanism.  This requirement drives many features of this solution.
  <xref target="compat-oa"/>
</t>

<t>
  In addition, many devices in current usage (especially SBCs) apply
  more restrictions on the usage of SDP than one would expect from
  abstract consideration of their roles in the network.  Some features
  of this solution are constructed to avoid these restrictions.
  <xref target="compat-devices"/>
</t>

</section>

<section title="Terminology" anchor="term">

<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"/>.
</t>

<t>
The important RFCs in this area use inconsistent terminology.  Here,
we use:
</t>

<t>
  <list style="hanging">

    <t hangText="media">
      Media is (1) media content, considered in an abstract way,
      that is, without consideration of its particular encoding or the
      framing information around it, and (2) the particular bits and octets
      used to encode and transmit the abstract media content.
    </t>

    <t hangText="media stream">
      (Taken from <xref target="RFC3550"/>.)
      A media stream is a set of RTP packets that are generated by and
      interpreted by one codec.  The RTP packets of a media stream
      are identified by a unique SSRC.
    </t>

    <t hangText="capture">
      (Taken from CLUE's work.)
      A capture is a set of media streams that originate from 
      one (physical or virtual) media source and should be composed to
      provide rendering of that source.
      For example, media streams from one origin including layered encodings,
      forward error correction streams, recovery streams, and
      simulcasted media streams of varying bit rates compose one capture.
    </t>

    <t hangText="transport association">
      (Taken from <xref target="I-D.alvestrand-mmusic-msid"/>.)
      A transport association is a single data path between two hosts,
      such as a TCP connection, or a pair of UDP ports that send packets
      to each other.  A transport association is identified by the
      identity of the protocol being used, the relevant host addresses,
      and the relevant port numbers.
      In the case of unicast communications, these form a "5-tuple",
      namely, the protocol, the host addresses of the two hosts, and the
      port numbers used on the two hosts.
      In the case of multicast sessions, these form a "3-tuple", namely,
      the protocol, the multicast address, and the port number.
      In SDP, a transport association is specified by the address and
      port of a media description (and possibly the same information
      from the matching offer/answer SDP).
      If a media description specifies multiple addresses or ports,
      each address or port specifies one transport association.
    </t>

    <t hangText="transport flow">
      (Taken from <xref target="I-D.ietf-avtcore-multi-media-rtp-session"/>.)
      (This is called an "RTP session" by <xref target="RFC3264"/>.)
      A transport flow is the data that flows across a transport
      association.
    </t>

    <t hangText="media description">
      (Taken from <xref target="RFC4566"/>.)
      A media description is one group of lines in a session
      description demarcated by an m= line.
      By synecdoche, a media description is often referred to as "an
      m= line".
    </t>

    <t hangText="transport association group">
      A transport association group is the set of transport
      associations denoted by one media description.
      Usually the m= line specifies only one port and the c= line
      specifies only one address, and so the media description's
      transport association group contains only one transport association.
    </t>

    <t hangText="transport flow group">
      A transport flow group is the set of transport flows of the
      transport associations of a transport association group.
    </t>

    <t hangText="session description">
      (Taken from <xref target="RFC4566"/> section 2.)
      A session description is an SDP instance.
    </t>

    <t hangText="multimedia session">
      (Taken from <xref target="RFC4566"/> section 2.)
      A multimedia session is the totality of the media that is
      transmitted/received as described by a particular session description.
    </t>

    <t hangText="RTP session">
      (Taken from <xref target="RFC3550"/>.)
      An RTP session is a group of media streams which must not have
      duplicated SSRC values because the endpoints share RTCP
      reporting information.
      Note that an RTP session may encompass more than one multimedia
      session.  RTP sessions are not fully described by session descriptions.
    </t>

    </list>
  </t>

</section>

<section title="Desiderata" anchor="desiderata">

<t>
This section lists desiderata for the bundle mechanism in SDP.
(I use the term "desiderata" -- "things that are desired" -- rather
than "requirements", because we may discover that we can't optimally
satisfy all of these criteria at the same time.)
The first section lists desiderata that are arise from considering the
ways applications may wish to bundling.
The second section lists desiderata that arise from compatibility with
existing Internet infrastructure.
</t>

<section title="Feature Desiderata" anchor="abs-des">

  <t>
    These desiderata describe features that we would like the bundling
    mechanism to provide.
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES F1">
        For each bundle, there is a group of media descriptions which
        describe the application-level RTP sessions.
        This specification must allow the same granularity of
        description as when the media flows were not multiplexed.
        This description includes identifiers which connect the media
        flows with the application and with each other.
      </t>
    </list>
  </t>

  <t>
    This requirement is taken from <xref target="I-D.jennings-mmusic-media-req"/>.
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES F2">
        For each bundle, there is a media description that describes
        the transport-level RTP session.
      </t>
    </list>
  </t>

  <t>
    DES F1 and DES F2 do not specify whether the transport-level media
    description may or may not also be one of the application-level media
    descriptions.
  </t>
  
  <t>
    <list style="hanging">
      <t hangText="DES F3">
        There must be a uniform way to deal with new SDP parameters,
        so that newly defined SDP parameters do not require a specific
        updating of the bundling procedures.
      </t>
    </list>
  </t>

  <t>
    This desideratum is taken from slides-interim-2013-rtcweb-1-10.pdf.
  </t>
  
  <t>
    <list style="hanging">
      <t hangText="DES F4">
        Multiple separate bundles within one SDP must be supported.
      </t>
    </list>
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES F5">
        Bundles may contain other bundles as constituents.
      </t>
    </list>
  </t>

  <t>
    Of course, no bundle may directly or indirectly contain itself.
    (I don't expect any current implementation to implement bundles within
    bundles, but we should design the mechanism to allow this, as some day
    we will likely need it.)
  </t>
  
  <t>
    <list style="hanging">
      <t hangText="DES F6">
        A bundle may contain zero constituents.
      </t>
    </list>
  </t>

  <t>
    A bundle with no constituents serves no purpose for the transport of
    media, but we are likely to someday need to describe such a bundle.
    (Compare that an SDP m= line is syntactically constrained to specify
    at least one payload type.  When SDP was used only to specify
    multicast sessions, this constraint was common sense.  But once SDP
    offer/answer was invented, when a media description was rejected, the
    natural representation would be an m= line with a zero port and no
    payload types.  But a payload type was syntactically required, so we
    now have to provide at least one token payload type in rejected m=
    lines.)
  </t>
  
  <t>
    <list style="hanging">
      <t hangText="DES F7">
        If an answerer that does understand the bundle mechanism
        processes an offer that contains a bundle, it must be able to (1)
        accept the bundle and selectively accept or reject each constituent
        RTP session within it, (2) reject the bundle as a whole, or (3)
        reject the bundling and selectively accept or reject each constituent
        RTP session as separate RTP sessions.
      </t>
    </list>
  </t>

  <t>
    Presumably answer (3) resembles that which would be produced by an
    answerer that does not understand the bundle mechanism.
    It is a lower priority that the answerer can distinguish between
    accepting the bundle while rejecting all of its constituents, and
    rejecting the bundle as a whole.  But those two conditions differ
    conceptually regarding whether any "framing" actions of the bundle are
    performed.
  </t>
  
  <t>
    <list style="hanging">
      <t hangText="DES F8">
        There must be a reliable way to demultiplex incoming RTP
        into the separate application-level RTP sessions.  Similarly,
        there must be a reliable way to demultiplex the associated RTCP
        information.
      </t>
    </list>
  </t>

  <t>
    The RTCP information for each media stream is
    tagged with the SSRC about which it reports, and the SSRC is used to
    correlate the RTCP reports with the RTP sessions containing media with
    the same SSRC.  So regarding RTCP, this desideratum appears to be
    straightforward to
    satisfy.
  </t>
  
  <t>
    <list style="hanging">
      <t hangText="DES F9">
        The specification must specify any needed additional
        procedures for handling SSRC collisions between media sources
        within different application-level RTP sessions, as those can now
        collide.
      </t>
    </list>
  </t>

  <t>
    In the terminology of <xref target="RFC3550"/>, the constituent media descriptions are now
    part of one RTP session.
  </t>
  
  <t>
    <list style="hanging">
      <t hangText="DES F10">
        When an offer is constructed, the offerer must not need to
        preallocate TURN relays for constituent media descriptions.
        When both endpoints support bundling, the mechanism must
        not require the offerer to allocate
        TURN relays for constituent media descriptions.
      </t>
    </list>
  </t>

  <t>
    This desideratum was suggested by Andrew Hutton.
  </t>
  
  <t>
    <list style="hanging">
      <t hangText="DES F11">
        It must be possible to add and remove one way video flows
        within the bundle without requiring an additional offer/answer cycle.
      </t>
    </list>
  </t>

  <t>
    Presumably this can be accomplished as it is now, with a single media
    description carrying multiple video flows that are distinguished
    only by their SSRCs.
    This desideratum is taken from slides-interim-2013-rtcweb-1-10.pdf.
  </t>
  
  <t>
    <list style="hanging">
      <t hangText="DES F12">
        Bundling must not interfere with ICE usage, and in
        particular, ICE's ability to negotiate both IPv4 and IPv6 addresses
        simultaneously.
      </t>
    </list>
  </t>

  <t>
    This desideratum was suggested by Andrew Hutton.
  </t>

</section>

<section title="Compatibility Desiderata" anchor="compat-des">

  <t>
    These desiderata describe compatibility of the bundling mechanism
    with with non-supporting endpoints or with existing entities in
    the Internet infrastructure.
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES C1">
        In offer/answer usage, an endpoint using the bundle
        mechanism must interwork correctly with an endpoint that does not
        understand the bundle mechanism.
      </t>
  </list>
</t>

  <t>
    <list style="hanging">
      <t hangText="DES C2">
        Interworking must continue when SDP endpoints are replaced with
        other endpoints during a sequence of offer/answer exchanges (such as
        happens in 3PCC or call transfers "behind an SBC"), including
        when a supporting endpoint is replaced by a non-supporting
        endpoint or vice-versa.
      </t>
    </list>
  </t>

  <t>
    SDP features (e.g., the codec set and ICE) are generally designed
    so that an offerer always offers every facility it is willing to
    support in the current situation, regardless of whether it was
    agreed to by the answerer in a preceding exchange.  Thus, if the
    current answerer is a different endpoint than the previous
    answerer, the new answerer will negotiate a compatible set of
    facilities without needing knowledge of its predecessor's SDP.
    The offerer will smoothly transition to the new facilities.  This
    property is required to support 3PCC situations (e.g., <xref
    target="RFC3725"/> and <xref target="I-D.worley-service-example"/>).  This
    desideratum was suggested by Richard Ejzak.
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES C3">
        Avoid using media types in m= lines other than audio and video
        unless required for user media, as some
        SBCs reject SDP that uses other media types.
      </t>
    </list>
  </t>

  <t>
    This desideratum was suggested by Hadriel Kaplan.
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES C4">
        Any additional m= lines prescribed by the bundle mechanism
        should be ordered after the constituent m= lines.
      </t>
    </list>
  </t>

  <t>
    Many devices that have only one audio
    or video channel accept the first m= line with that media type and
    reject any further ones
  </t>

  <t>
    <list style="hanging">
      <t hangText="non-DES C5">
        SBCs generally pass through attributes that they do not
        understand.  SBCs generally pass through codec specifications that
        they do not understand, even if they are configured to transcode
        certain specific codecs.
      </t>
    </list>
  </t>

  <t>
    This non-desideratum was suggested by Hadriel Kaplan.
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES C6">
        After offer/answer processing is finished, if the exchanged SDP
        is examined by a non-supporting SBC, the
        set of transport associations that it sees being specified for media
        exchange should be the set that are actually used for media transfer.
      </t>
    </list>
  </t>

  <t>
    This is needed because SBCs monitor the packet traffic on the
    transport associations and if
    no media is seen on one of the associations for a significant period of
    time, the SBC will tear down the call.
    This desideratum was suggested by Hadriel Kaplan.
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES C7">
        In a session description, no endpoint of a transport
        association may be used multiple times.
      </t>
    </list>
  </t>

  <t>
    Such duplication is not defined by <xref target="RFC4566"/>.
    Some SBCs do not support such duplication (ultimately, because it was
    not supported by <xref target="RFC2327"/>), and they reject SDP specifying
    duplicated transport association endpoints.
    This desideratum was suggested by Cullen Jennings.
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES C8">
        Offer/answer processing between supporting processors must
        be completed in one exchange.  When interworking between
        supporting and non-supporting processors, it is less desirable but
        admissible that a second offer/answer
        exchange may be needed to complete configuring the multimedia session.
      </t>
    </list>
  </t>

  <t>
    <list style="hanging">
      <t hangText="DES C9">
        If an intermediate entity provides transcoding between codecs,
        and if the offer/answer does not specify encryption of a
        media stream, the media stream should be able to take
        advantage of the transcoding facility.
      </t>
    </list>
  </t>

  <t>
    The non-encrypted case is not expected to be very common.
    Encrypted media can't be transcoded by an intermediate entity.
  </t>

</section>

</section>

<section title="Tutorial Examples" anchor="intro-pictures">

<t>
  This section is non-normative.
  (This section was suggested by Charles Eckel.)
</t>

<t>
  This is an introduction to SDP bundling via a
  series of examples of offer/answer processing.  Some mandatory SDP
  lines have been omitted from the examples for brevity.
  Long SDP lines have been folded by using trailing backslashes.
  Blank lines have been inserted for clarity.
</t>

<section title="One Audio Stream and One Video Stream">

<section title="Offer without Bundling">

<t>
Here is a typical, non-bundled SDP example with both audio and video media:
</t>

<figure>
<artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 10.0.1.1

This SDP media description (MD) provides the transport information
about the audio and also identifies the role of the audio from the
application's point of view.  In this case, the fact that it is the
first audio m= line suffices to tell the application how to treat it.
In more complex cases, label or content attributes might be used to
communicate the proper handling to the application.

        m=audio 10000 RTP/AVP 0 8 97
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000

This MD provides the transport information about the video and also
identifies the role of the video from the application's point of view.

        m=video 10002 RTP/AVP 31 32
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx \
            raddr 10.0.1.1 rport 10002
</artwork>
</figure>

<t>
We call the RTP that is described by each media description (MD) a
transport flow (TF).  The audio and video are carried in separate
TFs, which each have a separate transport association (address/port).
</t>

</section>

<section title="Offer with Bundling">

<t>
With SDP bundling, we add an additional MD to describe a single "bundle"
TF to carry both the audio and video information, and a group
attribute to show the association of the bundle MD with the
constituent MDs:
</t>

<figure>
<artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 10.0.1.1

The following group attribute declares which MDs are included in the
multiplexed MD:  mid:con1 and mid:con2 are the constituent MDs whose
TFs (from the application point of view) will be carried by the TF of
the first-designed MD, mid:bundle, which is the bundle MD.

        a=group:KUMQUAT bundle con1 con2

This MD provides the application-level description of the audio TF.
As in the previous example, it is the first audio m= line.  It
includes any attributes which apply to the audio media from the
application point of view, including the payload type definitions.
When interpreted by a supporting processor, the transport information
is ignored.  When interpreted by a processor that does not support
bundling, the transport information sets up the transport association
for the audio TF.

        m=audio 10002 RTP/AVP 0 8 97
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

This MD provides the application-level description of the video TF.
As in the previous example, it is the first video m= line.  It
includes any attributes which apply to the video media from the
application point of view.  As in the audio MD, the association
information is used only by a processor that does not support
bundling.

        m=video 10004 RTP/AVP 31 32
        a=mid:con2
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000

This MD provides the transport information for the bundle TF,
including any attributes which apply to the transport.  We use RTCP
multiplexing [RFC5761], so only one set of ICE candidates (and only
one TURN relay) is needed for each MD.  The MD is artificially given
the media type "audio" (which is ugly, but it avoids rejection by
SBCs) and it is placed after all of the constituent MDs so as to not
affect their positions as "first audio MD", etc.  The MD lists a
single payload type for the "kumquat" payload format, which is used to
encapsulate the RTP of the constituent TFs.

        m=audio 10000 RTP/AVP 127
        a=mid:bundle
        a=rtcp-mux
        a=rtpmap:127 kumquat
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
</artwork>
</figure>

<t>
  If this SDP bundle is accepted,
  RTP provided by the application for the audio TF will
  be encapsulated into a kumquat payload and then be sent from port 10000.
  The encapsulation also contains the ordinal index (i.e., 0) of the audio TF
  and the payload type of the original audio RTP.
  RTP provided by the application for the video TF will
  be encapsulated into a kumquat payload and then be sent from port 10000.
  The encapsulation also contains the ordinal index (i.e., 1) of the video TF
  and the payload type of the original video RTP.
</t>

<t>
  RTP that is received on port 10000 is interpreted according to the
  kumquat payload format:
  The constituent MD ordinal index is extracted.  The encapsulated
  RTP and its payload type are then interpreted according to the
  constituent MD.
</t>

</section>

<section title="Answer from an Answerer that Supports Bundling">

<t>
If the answerer supports SDP bundling, and desires to accept the offered
bundle and its constituent MDs,
the answerer signals that it accepts the SDP bundling by providing a
matching group:KUMQUAT attribute in the answer.
As always in offer/answer, the MDs in the answer correspond to the MDs
in the offer by ordinal position.
</t>

<t>
The answerer provides the necessary transport information for the bundle MD.
The answerer understands that MDs mid:con1 and mid:con2 are
incorporated into MD mid:bundle, and ignores their transport
information.
It accepts each constituent MD by providing an answer MD for each of
them that specifies a null address and port 9 (the discard port).
</t>

<figure>
<artwork>
        o=- 2890844526 2890844526 IN IP4 answer.example.com
        c=IN IP4 10.0.2.1

        a=group:KUMQUAT bundle con1 con2

        m=audio 9 RTP/AVP 0 8 97
        c=IN IP4 0.0.0.0
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

        m=video 9 RTP/AVP 31 32
        c=IN IP4 0.0.0.0
        a=mid:con2
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000

        m=audio 20000 RTP/AVP 127
        a=mid:bundle
        a=rtcp-mux
        a=rtpmap:127 kumquat
        a=candidate:0 1 UDP 2113601791 10.0.2.1 20000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.35 51090 typ srflx \
            raddr 10.0.2.1 rport 20000
</artwork>
</figure>

<t>
  Because the offer contained real addresses and ports for the
  constituent MDs and the answer accepted them, intermediate
  entities may expect the offerer to
  send at least RTCP on the transport association.
  To prevent such an intermediate entity from timing-out the
  multimedia session (because such RTCP will not be sent), the offerer
  needs to update its offer to withdraw the real address and ports for
  the constituent MDs, replacing them with a null address and port 9.
</t>

<figure>
<artwork>
        o=- 2890844526 2890844527 IN IP4 host.example.com
        c=IN IP4 10.0.1.1

        a=group:KUMQUAT bundle con1 con2

        m=audio 9 RTP/AVP 0 8 97
        c=IN IP4 0.0.0.0
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

        m=video 9 RTP/AVP 31 32
        c=IN IP4 0.0.0.0
        a=mid:con2
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000

        m=audio 10000 RTP/AVP 127
        a=mid:bundle
        a=rtcp-mux
        a=rtpmap:127 kumquat
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
</artwork>
</figure>

<t>
  The answerer responds with the same answer as before.
</t>

</section>

<section title="Answer from an Answerer that Does Not Support Bundling">

<t>
  SDP bundling allows for backward compatibility in case the
  answerer does not understand bundling.  
  If the answerer does not understand bundling, it
  ignores the group attribute, and effectively sees the offer as:
</t>

<figure>
<artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 10.0.1.1

        m=audio 10002 RTP/AVP 0 8 97
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

        m=video 10004 RTP/AVP 31 32
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000

        m=audio 10000 RTP/AVP 127
        a=rtcp-mux
        a=rtpmap:127 kumquat
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
</artwork>
</figure>

<t>
  If the answerer wishes to accept the first audio and video streams, it
  assembles this answer:
</t>

<figure>
<artwork>
        o=- 2890844526 2890844526 IN IP4 answer.example.com
        c=IN IP4 10.0.2.1

The absence of the group attribute informs the offerer that bundling
was rejected.

The audio MD is accepted.  Transport information is provided, but it
does not include ICE candidates, because the offer did not provide ICE
candidates for the first and second MDs.

        m=audio 20000 RTP/AVP 0 8 97
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

The video MD is accepted.  Transport information (using a different
port) is provided.

        m=audio 20002 RTP/AVP 31 32
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000

The bundle MD is rejected by the answerer because the only offered
codec was kumquat, and the answerer does not implement it.

        m=audio 0 RTP/AVP 127
</artwork>
</figure>

<t>
  Because the group attribute is not present in the response, the
  offerer knows that the answerer does not support bundling (or does
  not want to consider the offered bundle).  The offerer knows that
  the answerer wants to establish one audio TF and one video TF,
  and formally, that has been done.
  But if transport requires ICE candidates describing TURN relays,
  the offerer must send an updated offer
  containing those ICE candidates for the constituent MDs:
</t>

<figure>
<artwork>
        o=- 2890844526 2890844527 IN IP4 host.example.com
        c=IN IP4 10.0.1.1

No group attribute is included, to ensure that this update only sets
transport attributes, and does not trigger bundle-supporting behavior
if the answering entity has changed in the meantime.

Provide ICE candidates for the audio MD.  (We can reuse the ICE
candidates (and TURN relay) previously offered for the bundle MD.)

        m=audio 10000 RTP/AVP 0 8 97
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000

Provide ICE candidates (and a separate TURN relay) for the video MD.

        m=video 10002 RTP/AVP 31 32
        a=mid:con2
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx \
            raddr 10.0.1.1 rport 10002

The bundle MD must still be listed, but it is disabled.

        m=audio 0 RTP/AVP 127
        a=mid:bundle
</artwork>
</figure>

<t>
  The answerer then provides an answer that contains ICE candidates:
</t>

<figure>
<artwork>
        o=- 2890844526 2890844527 IN IP4 answer.example.com
        c=IN IP4 10.0.2.1

        m=audio 20000 RTP/AVP 0 8 97
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.2.1 20000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.35 51090 typ srflx \
            raddr 10.0.2.1 rport 20000

        m=audio 20002 RTP/AVP 31 32
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.2.1 20002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.35 51092 typ srflx \
            raddr 10.0.2.1 rport 20002

        m=audio 0 RTP/AVP 127
</artwork>
</figure>

<t>
  The ICE negotiations proceed, the transport associations are
  established, and RTP flows.
</t>

</section>

<section title="Fast-Start Offer">

<t>
  The baseline procedure requires the offerer to update its offer when it
  discovers that the answerer does not support SDP bundling if TURN
  relays are needed to support the constituent MDs.  The
  offerer can avoid this delay by providing transport information for
  the constituent MDs as well as for the bundle MD.  The penalty is
  that the offerer must preallocate TURN relays for both the
  constituent MDs as well as the bundle MD.
</t>

<figure>
<artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 10.0.1.1

        a=group:KUMQUAT bundle con1 con2

        m=audio 10000 RTP/AVP 0 8 97
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000

        m=video 10002 RTP/AVP 31 32
        a=mid:con2
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx \
            raddr 10.0.1.1 rport 10002

        m=audio 10004 RTP/AVP 127
        a=mid:bundle
        a=rtcp-mux
        a=rtpmap:127 kumquat
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10004 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51004 typ srflx \
            raddr 10.0.1.1 rport 10004
</artwork>
</figure>

<t>
  If the answerer understands bundling and accepts the bundle, it
  accepts the constituent MDs (with a null address and port 9) and
  accepts the bundle MD.  If the
  answerer does not understand bundling, it accepts the constituent
  MDs and rejects the bundle MD.
</t>

</section>

</section>

<section title="Two Audio Streams and Two Video Streams">

<t>
In this example, a presentation involves four media roles:  the
speaker's audio, the floor microphone, the video of the speaker, and
the video of the speaker's slides.
We use separate MDs for each media stream because each TF has a different
role; the application will handle each of them in distinctly different ways.
</t>

<figure>
<artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 10.0.1.1

        a=group:KUMQUAT b c1 c2 c3 c4

        m=audio 10002 RTP/AVP 0 8 97
        a=mid:c1
        a=label:speaker-audio
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

Note that different constituent MDs can use the same payload types
(for the same or different codecs), because the kumquat encapsulation
captures the constituent MD ordinal index separately from the payload
type.

        m=audio 10004 RTP/AVP 0 8 97
        a=mid:c2
        a=label:floor-mic
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 G722

        m=video 10006 RTP/AVP 103 104
        a=mid:c3
        a=label:speaker-video
        a=rtcp-mux
        a=rtpmap:103 H261/90000
        a=rtpmap:104 MPV/90000

        m=video 10008 RTP/AVP 103 104
        a=mid:c4
        a=label:slides
        a=rtcp-mux
        a=rtpmap:103 H261/90000
        a=rtpmap:104 MPV/90000

        m=multipart 10000 RTP/AVP 127
        a=mid:b
        a=rtcp-mux
        a=rtpmap:127 kumquat
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
</artwork>
</figure>

</section>

<section title="Virtual Classroom with One Audio Stream, Two Video
                Streams, and a Group of Video Streams">

<t>
This example is the teacher's connection to a virtual classroom
server.  The media descriptions are tagged using the "content"
attribute. <xref target="RFC4796"/>  The media comprises:
</t>

<t>
  1. one audio channel, for sending the teacher's voice and receiving the
  voice of a selected student
</t>

<t>
  2. one video channel, for sending the teacher's presentation
</t>

<t>
  3. one video channel, for sending the teacher's face
</t>

<t>
  4. one video channel, for receiving a dynamically varying set of
  students' faces
</t>

<t>
  The fourth TF (for students' faces) contains a large and
  dynamically varying set of video
  captures.  These can be handled by a single TF because they all have
  essentially similar roles -- the application will process them as a
  set.  As Adam Roach would say, "no control surfaces are necessary to
  talk about and/or manipulate the individual streams".  In particular,
  this allows a large number of captures to be handled without
  mentioning them in the SDP, at the expense of not allowing the SDP to
  describe any of them individually.  Similarly, the number of captures
  can vary without having to renegotiate the SDP.
</t>

<t>
  (In contrast, the third TF (the teacher's face) is a
  separate TF because it is processed in a different role than that
  of the students' faces.)
</t>

<t>
  In unbundled usage, there would be one transport association for the
  fourth TF.  Incoming RTP from that association would be demultiplexed by the
  application based on the
  SSRC values, which would be unique for each student.  With bundling,
  once the single transport TF is demultiplexed based on the ordinal
  index in the kumquat encapsulation, deencapsulated RTP packets
  destined for the fourth TF (index = 3) would be further
  demultiplexed by their SSRC values.
</t>

<t>
The offered SDP is:
</t>

<figure>
<artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 10.0.1.1
        a=group:KUMQUAT b c1 c2 c3 c4

The audio channel is send/receive.

        m=audio 10002 RTP/AVP 0 8 97
        a=mid:c1
        a=label:speaker-audio
        a=content:speaker
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

The teacher's face and presentation are send-only.

        m=video 10004 RTP/AVP 103 104
        a=mid:c2
        a=label:speaker-video
        a=content:speaker
        a=sendonly
        a=rtcp-mux
        a=rtpmap:103 H261/90000
        a=rtpmap:104 MPV/90000

        m=video 10006 RTP/AVP 105 106
        a=mid:c3
        a=label:presentation
        a=content:slides
        a=sendonly
        a=rtcp-mux
        a=rtpmap:105 H261/90000
        a=rtpmap:106 MPV/90000

The student video input is receive-only and is limited to 24
simultaneous SSRCs.

        m=video 10008 RTP/AVP 105 106
        a=mid:c4
        a=label:student-thumbnails
        a=recvonly
        a=max-recv-ssrc:* 24
        a=rtcp-mux
        a=rtpmap:105 H261/90000
        a=rtpmap:106 MPV/90000

        m=multipart 10000 RTP/AVP
        a=mid:b
        a=rtcp-mux
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000

</artwork>
</figure>

</section>

<section title="One Audio Stream and Two SCTP Streams"
	 anchor="sctp-example">
  
  <t>
    This example contains one audio MD and two SCTP MDs, which are
    used for Webrtc datachannels.
  </t>

<figure>
<artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 10.0.1.1

The following group attribute declares which MDs are included in the
multiplexed MD:  mid:con1 and mid:con2 are the constituent MDs whose
TFs (from the application point of view) will be carried by the TF of
the first-designed MD, mid:bundle, which is the bundle MD.

        a=group:KUMQUAT bundle con1 con2

This MD provides the application-level description of the audio TF.
As in the previous example, it is the first audio m= line.  It
includes any attributes which apply to the audio media from the
application point of view, including the payload type definitions.
When interpreted by a supporting processor, the transport information
is ignored.  When interpreted by a processor that does not support
bundling, the transport information sets up the transport association
for the audio TF.

        m=audio 10002 RTP/AVP 0 8 97
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

These MDs provides the the SCTP TFs.  Using the Kumquat encapsulation,
the two SCTP TFs can use the same (nominal) SCTP port, since the
encapsulation carries the ordinal number of the constituent MD for
each packet.  However, in this example, the two TFs use different port
numbers.

	m=application 10004 DTLS/SCTP 5000
	a=sctpmap:5000 webrtc-datachannel 16

	m=application 10006 DTLS/SCTP 5001
	a=sctpmap:5001 webrtc-datachannel 16

        m=audio 10000 RTP/AVP 127
        a=mid:bundle
        a=rtcp-mux
        a=rtpmap:127 kumquat
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
</artwork>
</figure>

</section>

</section>

<section title="Syntax and Semantics" anchor="syntax">

<t>
  TBD (Here lies the real description.)
</t>

<section title="Constructing an Offer" anchor="offering">

<t>
  TBD
</t>

</section>

<section title="Constructing an Answer" anchor="answering">

<t>
  TBD
</t>

</section>

<section title="Offer/Answer Considerations" anchor="oa">

<t>
  TBD
</t>

</section>

<section title="Multiplexing and Demultiplexing Media Streams" anchor="muxing">

<t>
  SDP bundling uses a payload type named "kumquat" to encapsulate the RTP
  packets of several constituent TFs into RTP packets of one TF.
  Each constituent TF has a distinct index value in the range 0 to
  254 (inclusive).  When kumquat is used within SDP bundling, the
  index value is the ordinal index of the MD within the session
  description.  (The indexes start with 0 for the first MD.)
</t>

<t>
  When the application delivers a payload (and associated descriptive
  information such as SSRC) in the context of a constituent MD
  to be transmitted, it is encapsulated into
  a kumquat payload and the kumquat payload is transmitted using the
  transport association of the bundle MD.
</t>

<t>
  When a kumquat payload arrives on the transport association of the
  bundle MD, the kumquat payload is interpreted to construct a payload
  (and associated descriptive information).  That payload is delivered
  to the application in the context of the constituent MD identified
  by the index value.
</t>

<section title='The "kumquat" Payload Format' anchor="format">

<t>
  The format of a kumquat protocol payload contains a four-octet fixed
  part followed by zero or more CSRC identifiers, header extension,
  and the encapsulated payload.  Note that this diagram is of the
  kumquat payload only, and does not include the RTP header before the
  payload.
</t>

<figure>
<artwork>
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|0|X|  CC   |M|     PT      |   index       |transport flow |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            contributing source (CSRC) identifiers             |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           extension                           |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           encapsulated payload                |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>

<t>
  <list style="hanging">

    <t hangText="V">
      This field contains the value 2.
    </t>

    <t hangText="0 (bit 2)">
      This field contains the value 0.
    </t>

    <t hangText="X">
      If this field is 1, the extension field is present.
    </t>

    <t hangText="CC">
      This field contains the count of the number of CSRC identifiers
      that follow the fixed part.
    </t>

    <t hangText="M">
      This field contains the "marker" bit associated with the
      encapsulated payload.
    </t>

    <t hangText="PT">
      This field contains the payload type number associated with the
      encapsulated payload.  The meaning of PT is defined by the TF
      identified by the index field.
    </t>

    <t hangText="index">
      This field contains the index value identifying the
      constituent media description that the encapsulated payload is
      associated with.
      The range of index values is 0 to 254 (inclusive).
      The value 255 is reserved for further standardization and MUST NOT
      be used.
    </t>

    <t hangText="transport flow">
      This field contains the index of the transport flow
      within the transport flow group of the constituent media
      description.
      That is, it identifies one of the series of ports or addresses
      specified by the media description, if the media description
      specified multiple ports or addresses.
      The range of index values is 0 to 255.
      (If the media description does not specify a range of ports or
      addresses, the transport flow index is 0.)
    </t>

    <t hangText="contributing source (CSRC) identifiers">
      This variable-length field
      contains the
      four-octet CSRC identifiers associated with the encapsulated payload.
      The number of CSRC identifiers is given by the CC field.
    </t>

    <t hangText="extension">
      This variable-length field is present only if the X field is 1.
      If it is present, its format is the same as the extension field of
      the RTP header.  In particular, its length is always a multiple of
      four octets.
    </t>

    <t hangText="encapsulated payload">
      This variable-length field contains the payload of the
      payload type specified by the PT field (interpreted in the context
      of the constituent MD identified by the index field).
    </t>

  </list>
</t>

<t>
  There is no defined meaning for the RTP marker bit in association with a
  kumquat payload.  (Note that this is the M field of the RTP
  header that precedes the kumquat payload, not the M field of the
  kumquat payload itself.)
  Its value MUST be 0.
</t>

<t>
  The kumquat payload represents an RTP packet containing the
  following data:
  <list style="hanging">
    <t hangText="V">
      The V field is 2.
    </t>

    <t hangText="P">
      The pad field is unspecified, because the need for padding is
      determined only when the RTP packet is considered in the context
      of the transport protocol.
    </t>

    <t hangText="X, CC, M, PT">
      These fields are taken from the corresponding fields
      of the kumquat payload data.
    </t>

    <t hangText="sequence number, timestamp, SSRC identifier">
      These fields are taken
      from the corresponding fields of RTP header before the kumquat payload.
    </t>

    <t hangText="extension, CSRC identifiers">
      These fields are taken
      from the corresponding fields of the kumquat payload data.
    </t>

    <t hangText="payload">
      This field is taken from the encapsulated payload field of
      the kumquat payload data.
    </t>
  </list>
</t>

<t>
  Graphically, the kumquat encoding sets up the following
  equivalence between an RTP packet of the constituent TF and an RTP
  packet of the bundle TF:
</t>

<figure>
<artwork>
  RTP packet in the context of the bundle media description (with PT1
  specifying kumquat encoding):

      0                   1                   2                   3
      0 1 2 3  4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  RTP header:
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |V=2|P|X1|  0    |0|     PT1     |       sequence number         |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                            timestamp                           |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |            synchronization source (SSRC) identifier            |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                            extension (per X1 bit)              |
     |                              ....                              |
     +=+=+=+==+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
  Payload of kumquat payload type:
     +=+=+=+==+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
     |V=2|0|X2|  CC   |M|     PT2     |   index       |     0         |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                            extension (per X2 bit)              |
     |                              ....                              |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |             contributing source (CSRC) identifiers (per CC)    |
     |                              ....                              |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                            encapsulated payload                |
     |                              ....                              |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


  RTP packet in the context of the constituent media description
  identified by index:

      0                   1                   2                   3
      0 1 2 3  4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  RTP header:
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |V=2|P|X2|  CC   |M|     PT2     |       sequence number         |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                            timestamp                           |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |            synchronization source (SSRC) identifier            |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                            extension (per X2 bit)              |
     |                              ....                              |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |             contributing source (CSRC) identifiers (per CC)    |
     |                              ....                              |
     +=+=+=+==+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
  Payload of PT2 payload type:
     +=+=+=+==+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
     |                            encapsulated payload                |
     |                              ....                              |
     +-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>

<t>
  The kumquat encapsulation usually adds four octets to the length
  of the encapsulated RTP packet.
  The encapsulation overhead can be larger if there is a need for a
  separate RTP header extension for the kumquat RTP packet.
</t>

</section>

</section>

<section title="RTCP, SSRC, and RTP Sessions" anchor="rtcp">

<t>
  TBD
</t>

</section>

<section title="ICE considerations" anchor="ice">

<t>
  TBD
</t>

</section>

<section title="Encryption considerations" anchor="encryption">

<t>
  TBD
  Need to discuss here how the encryption associations are set up.
  For SRTP/SRTCP, it would be possible to have either one association
  for all multiplexed streams, or one for each constituent MD, because
  SRTP preserves the PTs.  (Have to verify that and check whether
  SRTCP preserves SSRCs.)  But SCTP-over-DTLS can't be demultiplexed before it's
  decrypted, so there can be only one DTLS crypto association.
</t>

</section>

</section>

<section title="Compatibility Considerations" anchor="compat">

<section title="Backward Compatibility during Offer/Answer"
         anchor="compat-oa">

<t>
  TBD
</t>

</section>

<section title="Backward Compatibility with Existing Devices"
         anchor="compat-devices">

<t>
  TBD
</t>

</section>

</section>

<section title="Design Features and Comparison" anchor="comparison">

  <t>
    <figure>
      <artwork>
Key:

      x = feature present in proposal
      - = feature not present in proposal
      . = feature not discussed in proposal
    N/A = feature is not relevant because of another feature choice

                worley-sdp-bundle-05 (KUMQUAT)
                |   ietf-mmusic-sdp-bundle-negotiation-03 (BUNDLE)
                |   |   holmberg-mmusic-sdp-mmt-negotiation-00 (MMT)
                |   |   |   alvestrand-one-rtp-02 (TOGETHER)
                |   |   |   |   ejzak-mmusic-bundle-alternatives-01
                |   |   |   |   |   Roach alternative 1a
                |   |   |   |   |   |(roach-mmusic-mlines-00)
                |   |   |   |   |   |   Roach alternative 1b
                |   |   |   |   |   |   |   Roach alternative 2
                |   |   |   |   |   |   |   |   westerlund-avtcore-
                |   |   |   |   |   |   |   |   |transport-multiplexing-05
                |   |   |   |   |   |   |   |   |(SHIM)
                V   V   V   V   V   V   V   V   V
MD grouping:
    one         -   -   -   -   -   -   x   -   -
    per type    -   -   -   -   -   x   -   -   -
    none        x   x   x   x   x   -   -   x   x

Separate bundle MD:
    no          -   x   -   x   x   x   x   x   x
    m=anymedia  -   -   x   -   -   -   -   -   -
    m=audio     x   -   -   -   -   -   -   -   -
    m=multipart -   -   -   -   -   -   -   -   -
                                         
Immediate update:                        
    none        -   -   x   x   x   x   x   x   x
    for support x   x   -   -   -   -   -   -   -
    for compat. x   -   -   -   -   -   -   -   -
    
Constituent MD ports after establishment:
    N/A         -   -   -   -   -   x   x   -   -
    same        -   x   -   x   -   -   -   x   x
    different   -   -   -   -   -   -   -   -   -
    null        x   -   -   -   -   -   -   -   -
    rejected    -   -   x   -   x   -   -   -   -
                                         
Bundle MD payload types:                 
    N/A         -   -   -   -   -   x   x   -   -
    one MD      -   x   -   x   .   -   -   x   x
    all MDs     -   -   x   -   .   -   -   -   -
    encap.      x   -   -   -   .   -   -   -   -
                                         
Constituent MD payload types:            
    N/A         -   -   -   -   -   x   x   -   -
    overlapping x   -   -   -   .   -   -   x   x
    distinct    -   x   x   x   .   -   -   -   -

Demultiplexing based on:
    N/A         -   -   -   -   -   x   x   -   -
    PT          -   x   x   x   .   -   -   x   -
    encap.      x   -   -   -   .   -   -   -   x

Rejection of bundle MD based on:
    N/A         -   x   -   x   x   x   x   x   x
    media type  -   -   x   -   -   -   -   -   -
    proto       -   -   -   -   -   -   -   -   -
    codec       x   -   -   -   -   -   -   -   -

Addresses/ports in constituent MDs in offer:               
    N/A         -   -   -   -   -   x   x   -   -
    NA,ZP       -   -   -   -   -   -   -   -   -
    NA,NZP      -   -   -   -   x   -   -   -   -
    RA,ZP       -   -   -   -   -   -   -   -   -
    RA,NZP,U    x   x   x   -   x   -   -   -   -
    RA,NZP,S    -   x   -   x   -   -   -   x   x
NA = null address, RA = real address
ZP = zero port, NZP = non-zero port
U = unique ports, S = shared port
      </artwork>
    </figure>
  </t>

  <section title="Aggregation of Constituent Media Descriptions">

    <t>
      Are the constituent media descriptions combined into grouped media
      descriptions?
      <list style="symbols">
        <t>
          All media are combined into one media description.
        </t>
        <t>
          All media of each media type are combined into one media
          description (which has that type).
        </t>
        <t>
          Each constituent media description is separate in the session
          description.
        </t>
      </list>
    </t>

    <t>
      This proposal does not aggregate constituent MDs so that
      attributes can be provided directly for each constituent MD.
    </t>

  </section>

  <section title="Presence of a Bundle Media Description and Its Media Type">

    <t>
      Is there a separate bundle media description, and if so, what
      media type does it have?
      <list style="symbols">
        <t>
          There is no separate bundle media description.
        </t>
        <t>
          There is a separate bundle media description of type "anymedia".
        </t>
        <t>
          There is a separate bundle media description of type "audio".
        </t>
        <t>
          There is a separate bundle media description of type "multipart".
        </t>
      </list>
    </t>

    <t>
      This proposal has a separate bundle MD so that attributes can be
      provided for the bundle MD independently of any constituent MD.
    </t>

  </section>

  <section title="Immediate Update">

    <t>
      Is an immediate updated offer/answer used during session establishment?
      <list style="symbols">
        <t>
          No.
        </t>
        <t>
          Yes, when establishing a session using bundling.
        </t>
        <t>
          Yes, when establishing a session not using bundling.
        </t>
      </list>
    </t>

    <t>
      This proposal requires updates for bundled answers (to tell
      intermediate entities to not expect media for constituent
      transport associations) and for non-bundled answers (to provide
      TURN ICE candidates, if needed).
    </t>

  </section>

  <section title="Effective Media Description Ports after Session Establishment">

    <t>
      What are the effective port numbers in MDs after the session is
      established?
      <list style="symbols">
        <t>
          There are not multiple media descriptions because constituent MDs
          are combined.
        </t>
        <t>
          Port numbers in the MDs are the same.
        </t>
        <t>
          Port numbers in the MDs are different.
        </t>
        <t>
          All but one MD have null addresses.
        </t>
        <t>
          All but one MD have a zero port number (and thus are
          formally rejected).
        </t>
      </list>
    </t>

    <t>
      This proposal signals null connection addresses for constituent MDs
      to prevent intermediate entities from expecting to see media for
      the constituent transport associations.
    </t>

  </section>

  <section title="Payload Types in the Bundled Media Description">

    <t>
      What payload types are listed for the bundled MD?
      <list style="symbols">
        <t>
          There is no MD describing the bundle as a whole.
        </t>
        <t>
          The bundle MD lists the payload types of one constituent MD.
        </t>
        <t>
          The bundle MD lists the payload types of all constituent MDs.
        </t>
        <t>
          The bundle MD lists one payload type for an encapsulation codec.
        </t>
      </list>
    </t>

    <t>
      This proposal uses one payload type in the bundled media
      description because (1) only the encapsulated PT is sent on that
      transport association, and (2) to ensure that answerers that do
      not implement bundling reject this MD.
    </t>

  </section>

  <section title="Relationship of Payload Types of Constituent Media
                  Descriptions">

    <t>
      What is the relationship between the payload types of the constituent MDs?
      <list style="symbols">
        <t>
          There are not multiple media descriptions because constituent MDs
          are combined.
        </t>
        <t>
          Different constituent MDs may have overlapping payload type numbers.
        </t>
        <t>
          Different constituent MDs may not have overlapping payload
          type numbers.
        </t>
      </list>
    </t>

    <t>
      This proposal allows constituent MDs to use overlapping payload
      types because it relies on an encapsulation to demultiplex the
      constituent MDs.
    </t>

  </section>

  <section title="Basis of Demultiplexing">

    <t>
      What is the basis for the demultiplexing of RTP?
      <list style="symbols">
        <t>
          Demultiplexing is not done because incoming RTP is not
          attributed to specific constituent MDs (possibly because
          constituent MDs are combined).
        </t>
        <t>
          Demultiplexing is done based on payload type numbers.
        </t>
        <t>
          Demultiplexing is done based on data carried in an encapsulation.
        </t>
      </list>
    </t>

    <t>
      This proposal does demultiplexing based on information in the
      encapsulated payload format.
    </t>

  </section>

  <section title="Basis of Rejection of the Bundle MD">

    <t>
      We must ensure that the bundle MD is rejected by non-supporting
      endpoints.  What method is used to ensure rejection?
      <list style="symbols">
        <t>
          There is no bundle MD.
        </t>
        <t>
          The bundle MD uses a special media type value.
        </t>
        <t>
          The bundle MD uses a special proto value.
        </t>
        <t>
          The bundle MD uses (only) a special codec name.
        </t>
      </list>
    </t>

    <t>
      This proposal uses one encapsulated payload type in the bundled media
      description to ensure that answerers that do
      not implement bundling reject this MD.
    </t>

  </section>

  <section title="How Constituent MDs Are Offered" anchor="offer-details">

    <t>
      There are a number of alternative ways that the offerer can
      configure the constituent media descriptions.
    </t>

    <texttable>
      <ttcol align="left">Method</ttcol>
      <ttcol align="left">1</ttcol>
      <ttcol align="left">2</ttcol>
      <ttcol align="left">3</ttcol>
      <ttcol align="left">4</ttcol>
      <ttcol align="left">5</ttcol>
      <ttcol align="left">6</ttcol>
      <c>Coded in chart as</c><c>NA,ZP</c><c>NA,NZP</c><c>RA,ZP</c><c>RA,NZP,U</c><c>RA,NZP,U</c><c>RA,NZP,S</c>
      <c>Offered address</c><c>null</c><c>null</c><c>real</c><c>real</c><c>real</c><c>real</c>
      <c>Offered port</c><c>zero</c><c>non-zero</c><c>zero</c><c>non-zero, unique</c><c>non-zero, unique</c><c>non-zero, shared</c>
      <c>TURN candidates?</c><c>no</c><c>no</c><c>no</c><c>no</c><c>yes</c><c>yes</c>
      <c>Supporting answerer accepts?</c><c>yes</c><c>yes</c><c>yes</c><c>yes</c><c>yes</c><c>yes</c>
      <c>Update needed for supporting answerer?</c><c>no</c><c>no</c><c>possibly</c><c>yes</c><c>yes</c><c>no</c>
      <c>Non-supporting answerer accepts?</c><c>no</c><c>probably</c><c>no</c><c>yes</c><c>yes</c><c>yes</c>
      <c>Update needed for non-supporting answerer?</c><c>yes</c><c>yes</c><c>yes</c><c>yes</c><c>no</c><c>no</c>
      <c>Disadvantages</c><c>ACE</c><c>CD</c><c>ABCE</c><c>BC</c><c>BG</c><c>BFG</c>
    </texttable>

    <t>
      <list style="hanging">
	<t hangText="Offered address">
	  This is the address offered for the MD.  There are two
	  choices, a null address (0.0.0.0 for IPv4 or "invalid." for
	  IPv6 or mixed IPv4/IPv6) or a real address of
	  the offerer.
	</t>
	<t hangText="Offered port">
	  This is the port that is offered.  It can be either non-zero
	  or zero (which indicates a stream that is not being offered).
	  If the offered port is non-zero and the offered address is
	  real, the port can be either unique, or shared with the other
	  media descriptions in the bundle.
	</t>
	<t hangText="TURN candidates?">
	  If the offered address is real, are TURN candidates for the
	  address provided (if they are needed)?
	</t>
	<t hangText="Supporting answerer accepts?">
	  If the answerer supports bundling, does it accept this media
	  description?  We assume the answer is Yes, so that 
	  acceptance of the constituent media descriptions can be
	  signaled to the offerer.
	</t>
	<t hangText="Update needed for supporting answerer?">
	  Is an SDP update needed to complete session setup if the
	  answerer supports bundling?  If an update is needed, it is
	  needed to inform intermediaries that there will be no media
	  sent based on the connection information in this media
	  description; the update is not needed to establish
	  communications and does not delay the application.
	</t>
	<t hangText="Non-supporting answerer accepts?">
	  If the answerer does not support bundling, does it accept this media
	  description (without a further update)?
	</t>
	<t hangText="Update needed for non-supporting answerer?">
	  Is an SDP update needed to complete session setup if the
	  answerer does not support bundling?  If an update is needed,
	  in all cases, it is needed to establish communication.
	</t>
	<t hangText="Flaws">
	  The disadvantages of each alternative:
	  <list style="hanging">
	    <t hangText="A">
	      Media descriptions that are rejected (have zero ports) are
	      not allowed to be members of a group (in the
	      offer).<xref target="RFC5888"/>
	    </t>
	    <t hangText="B">
	      An SDP update is needed for a supporting answerer to prevent
	      intermediaries from timing out the multimedia session.
	    </t>
	    <t hangText="C">
	      An SDP update is needed for a non-supporting answerer to 
	      establish communications.
	    </t>
	    <t hangText="D">
	      Although a media description with a non-zero port but a
	      null address is formally offered (although shown as
	      on-hold via the old method), it is possible that the
	      answerer will not consider it to be offered and many not
	      accept it even if it otherwise wood.
	    </t>
	    <t hangText="E">
	      If the offered port is zero, the media description is not
	      formally offered and the answerer should not accept it.
	    </t>
	    <t hangText="F">
	      SDP offers with multiple media descriptions that use the
	      same port number (for the same real address) may be
	      rejected by intermediaries.
	    </t>
	    <t hangText="G">
	      A TURN relay must be allocated for the constituent media
	      description before the offer is sent.
	    </t>
	  </list>
	</t>
      </list>
    </t>

    <t>
      In my estimation, the worst disadvantages are A (zero port in
      offer), E (acceptance of offer with zero port), and F (duplicate
      port numbers), because they involve violations of <xref
      target="RFC4566"/> or are known to trigger limitations of large
      numbers of intermediate devices.  Disadvantage D (offering a MD
      with a null address) is nearly as severe, as we expect it to
      cause undesired behavior in many non-supporting answerers.
      Disadvantages C (update
      needed to communicate with non-supporting answerer) and G (TURN
      relay must be preallocated) are moderate, and disadvantage B
      (updated needed to prevent intermediaries from timing out) is the
      least severe (because it never delays the establishment of
      communication).
    </t>

    <t>
      Applying these priorities to the possible solutions, methods 4 and
      5 (offer real address, non-zero unique port, with/without TURN
      candidates) are tied for the best choices, with the choice made
      based on the relative importance of minimizing preallocation of
      TURN relays compared to quickly establishing communication with
      non-supporting answerers.
    </t>

  </section>

</section>

<section title="Demultiplexing Considerations" anchor="demux">

  <t>
    This section discusses the constraints regarding demultiplexing
    datagrams from multiple protocols that are presented on one
    transport flow.  This is an expansion of the analysis in <xref
    target="RFC5764"/> section 5.1.2.
  </t>

  <t>
    The first octets of datagrams generated by particular protocols
    are:
  </t>

  <texttable>
    <ttcol align="left">Protocol</ttcol>
    <ttcol align="left">First octet</ttcol>
    <ttcol align="left">Second octet</ttcol>
    <ttcol align="left">Third octet</ttcol>
    <ttcol align="left">Fourth octet</ttcol>
    <c>STUN</c><c>0x00, 0x01</c><c>0x00, 0x01</c><c></c><c></c>
    <c>RTP</c><c>0x80 to 0xBF</c><c>0x00 to 0xC7, 0xCD to 0xFF</c><c></c><c></c>
    <c>RTCP</c><c>0x80 to 0xBF</c><c>0xC8 to 0xCC</c><c></c><c></c>
    <c>RTP/RTCPv3</c><c>0xC0 to 0xFF</c><c></c><c></c><c></c>
    <c>DTLS</c><c>0x14 to 0x17</c><c>0x03</c><c>0x03</c><c></c>
    <c>SCTP</c><c>source port high</c><c>source port
    low</c><c>dest. port high</c><c>dest. port low</c>
  </texttable>

  <t>
    TBD RFC 5764 specifies that the first octet of a DTLS packet is in
    the range 0x14 to 0x3F.  RFC 5246 and RFC 6374 together specify
    the first octet is a "ContentType", with the range 0x14 to 0x17.
    Are additional octet values reserved for expansion?  What is the
    range that should be reserved in practice?
  </t>

  <t>
    The most generalized stack of protocols we consider is this:
  </t>

  <figure>
    <artwork>
Layer 6:  ... application interfaces ...
           |||      |||     |||     |||
            V        V       V       V
            |        |       |       |
            |        |       |       |
Layer 5:    |        |       |      SCTP
            |        |       |       |
            |        |       |       |
           RTP     SRTP      |       |
Layer 4:   RTCP    SRTCP    SCTP    DTLS   [ STUN ]
             \       |       |       |        /
              --------------- ----------------
                             V
                             |
                             |
Layer 3:              [ encapsulation      STUN ]  
                      [      \              /   ]
                      [       ---- ---------    ]
                      [           V             ]
                                  |
                                  |
Layer 2:                       [ DTLS               STUN ]  
                               [   \                 /   ]
                               [    ------- ---------    ]
                               [           V             ]
                                           |
                                           |
Layer 1:                                [ TURN ]
                                           |
                                           |
Layer 0:                                  UDP
    </artwork>
  </figure>

  <t>
    <list style="hanging">
      <t hangText="Layer 0:  UDP">
        This is the base layer of this analysis, where
        packets are carried by UDP.
      </t>
      <t hangText="Layer 1:  TURN (optional)">
        If a packet arrives from a TURN relay for which we
        are a client, the TURN encapsulation must be removed before
        further processing.  This need can be detected because the packet
        arrives from the client-facing address/port of a TURN server of
        which this entity is a client.
      </t>
      <t hangText="Layer 2:  DTLS applied to the bundle transport flow
                   (optional)">
        If DTLS is applied to the bundle transport flow as a whole,
        that use of DTLS will have been negotiated.  However, before
        deciphering, STUN packets need to be separated.  STUN packets
        can be distinguished from DTLS packets by their first or
        second octets.
      </t>
      <t hangText="Layer 3:  Decapsulation (depending on the bundling method">
	If the bundling method uses encapsulation, decapsulation is
	done at this point in the protocol stack.  However, before
	decapsulating, STUN packets need to be separated.  The
	encapsulation method must allow encapsulated packets to be
	distinguished from STUN packets, if STUN packets have not been
	demultiplexed at layer 2 (due to DTLS encryption of
	the entire transport stream).
        <vspace blankLines="1"/>
	All proposed encapsulation techniques ensure the first octet
	of the encapsulation is in the range allowed for the first
	octet of RTP, 0x80 to 0xBF, and thus is distinguishable from STUN.
      </t>
      <t hangText="Layer 4:  Core demultiplexing">
        At this layer, most of the protocols are demultiplexed.
        RTP/SRTP, SRTP/SRTCP, DTLS, and STUN are distinguished by the
        values of the first two octets of the packet.
        SRTP/SRTCP is distinguished from RTP/RTCP by negotiation with
        the other endpoint -- SRTP/SRTCP is never multiplexed with
        RTP/RTCP.
        <vspace blankLines="1"/>
        SCTP can be distinguished from the other protocols if the
        other endpoint agrees to use only SCTP port numbers in the
	range 0x4000 to 0x7FFF.
        This restriction can be specified here, because this
        limitation is only needed when bundling is implemented, which
	happens only when when both endpoints support bundling.
	(This particular range is chosen to avoid collision with a
	future RTP/RTCP version 3.  The range of SCTP ports can be
	chosen arbitrarily because the SCTP ports are not used to
	route packets to this entity, as they are encapsulated in UDP.)
      </t>
      <t hangText="Layer 5:  SCTP over DTLS">
        If the layer 4 protocol is DTLS, the protocol above it will
        always be SCTP.
      </t>
      <t hangText="Layer 6:  Application interface demultiplexing">
        The method used to demultiplex the various application
        interface streams varies depending whether encapsulation is
        used and if not, on the layer 4/5 protocol.
        If the layer 4 protocol is encapsulated, the encapsulation
        determines which constituent media description is to be assigned
        to this packet, and then application demultiplexing is done as
        normal for for that particular media description.
        Otherwise, the constituent media description must be
        determined by a method that is specific to the layer 4/5 protocol:
        <list style="hanging">
          <t hangText="RTP/SRTP">
            An RTP/SRTP packet is assigned to the constituent media
            description which specifies its payload type number.
            (If encapsulation is not used, the constituent media
            descriptions must specify distinct payload type numbers.)
          </t>
          <t hangText="RTCP/SRTCP">
            An RTCP/SRTCP sub-packet is dispatched to the application
            which receives the RTP media stream containing the SSRC that is
            carried in the RTCP sub-packet.
          </t>
          <t hangText="SCTP">
            An SCTP packet is assigned to the constituent media
            description which specifies its destination port number.
            (If encapsulation is not used, the constituent media
            descriptions must specify distinct SCTP port numbers.)
          </t>
        </list>
      </t>
    </list>
  </t>

</section>

<section title="Security Considerations" anchor="security">

<t>
  If an SBC wishes to prevent positively the transport of certain
  media types or codecs, and enforces that by examining the content of
  RTP packets, the use of kumquat encoding may defeat the examination.
</t>

<t>
  TBD
</t>

</section>

<section title="IANA Considerations" anchor="IANA">

<t>
  TBD
</t>

</section>

<section title="Acknowledgments" anchor="ack">

<t>
  Many people have provided input for this proposal regarding
  both the
  technical aspects and the organization of the presentation.
  Chief among them are the authors of the predecessor proposals
  (<xref target="I-D.alvestrand-one-rtp"/> (TOGETHER),
  <xref target="I-D.holmberg-mmusic-sdp-mmt-negotiation"/> (MMT),
  and <xref target="I-D.ietf-mmusic-sdp-bundle-negotiation"/> (BUNDLE)):
  Harald Alvestrand, Jonathan Lennox, and Christer Holmberg.
  In addition, input was provided by 
  Charles Eckel,
  Andrew Hutton,
  Cullen Jennings,
  Hadriel Kaplan,
  Paul Kyzivat,
  Adam Roach, and
  Robert Sparks.
</t>

<t>
</t>

</section>

<section title="Revision History" anchor="revision">

  <t>
    Note to RFC Editor:  Please remove this section before publication.
  </t>

  <section title="draft-worley-sdp-bundle-00" anchor="change-00">

    <t>
      Initial version.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-00 to draft-worley-sdp-bundle-01" anchor="change-00-01">

    <t>
      Thoroughly revise the text and structure of the document.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-01 to draft-worley-sdp-bundle-02" anchor="change-01-02">

    <t>
      Heavily revise Terminology regarding media flows.
    </t>

    <t>
      Revise Desiderata, including adding that multiple separate bundles
      must be possible, and noninterference with ICE negotiation.
    </t>

    <t>
      Add section on ICE considerations.
    </t>

    <t>
      Change "fusion" to "bundle".
    </t>

    <t>
      Use a=rtcp-mux in examples to be more realistic (and to shorten
      the examples).
    </t>

    <t>
      Correct the use of ICE in answers; ICE candidates are not
      provided if an offered MD does not contain ICE candidates.
    </t>

    <t>
      Add an example of a fast-start offer.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-02 to draft-worley-sdp-bundle-03" anchor="change-02-03">
    
    <t>
      Add design comparison <xref target="comparison"/>.
    </t>

    <t>
      Use bibxml references.
    </t>

    <t>
      Add DES C9, regarding continued usage of transcoding facilities
      offered by intermediate entities.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-03 to draft-worley-sdp-bundle-04" anchor="change-03-04">
    
    <t>
      Add demultiplexing considerations <xref target="demux"/>.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-04 to draft-worley-sdp-bundle-05" anchor="change-04-05">
    
    <t>
      Change recommendation for SCTP port numbers from 0xC000-0xFFFF
      to 0x4000-0x7FFF to avoid collision with a future RTP/RTCP version 3.
    </t>

    <t>
      Add the transport flow index to the KUMQUAT encapsulation.
    </t>

    <t>
      Add section on choices for offering constituent MDs
      <xref target="offer-details"/>.
      Revise the examples to show offering "real address, non-zero port, no
      ICE candidates".
    </t>

    <t>
      Add note to DES C9 (support intermediate transcoding facilities)
      saying that intermediate transcoding facilities are not expected
      to be very useful, given that encryption will be the normal use
      case.
    </t>

    <t>
      Add an example<xref target="sctp-example"/> with SCTP MDs.
    </t>

    <t>
      Add a section for encryption considerations.<xref target="encryption"/>
    </t>

    <t>
      Revise generalized demultiplexing diagram to make explicit the
      optional RTP encapsulation layer.
    </t>

    <t>
      Update comparison chart<xref target="comparison"/> for
      draft-ejzak-mmusic-bundle-alternatives-01<xref
      target="I-D.ejzak-mmusic-bundle-alternatives"/> and
      draft-westerlund-avtcore-transport-multiplexing-05<xref
      target="I-D.westerlund-avtcore-transport-multiplexing"/>.
    </t>

    <t>
      Update comparison chart<xref target="comparison"/> to discuss
      alternative address/port/candidate policies for offering
      constituent MDs.
    </t>

  </section>

</section>

</middle>

<back>

<references title="Normative References">

  &rfc2119;
  &rfc3264;
  &rfc3550;
  &rfc4566;
  &rfc5245;
  &rfc5888;

</references>

<references title="Informative References">

  &rfc2327;
  &rfc3725;
  &rfc4796;
  &rfc4960;
  &rfc5761;
  &rfc5764;
  &draft-alvestrand-mmusic-msid;
  &draft-alvestrand-one-rtp;
  &draft-ejzak-mmusic-bundle-alternatives;
  &draft-holmberg-mmusic-sdp-mmt-negotiation;
  &draft-ietf-avtcore-multi-media-rtp-session;
  &draft-ietf-mmusic-sdp-bundle-negotiation;
  &draft-jennings-mmusic-media-req;
  &draft-roach-mmusic-mlines;
  &draft-westerlund-avtcore-transport-multiplexing;
  &draft-worley-service-example;

</references>

</back>

</rfc>
