<?xml version="1.0"?>


<!-- To-do:

- Iron out terminology, including what is an "RTP session"?
- 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.
- Use character entities?

-->


<!DOCTYPE rfc SYSTEM "rfcXXXX.dtd">
<?rfc strict="yes" ?>
<?rfc toc="yes" ?>
<rfc ipr="trust200902" category="std" docName="draft-worley-sdp-bundle-01">

<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="8" month="February" 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 "fusion" 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 fusion MD.  RTP packets received from the
  transport association for the fusion 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>
- "transport association" and "5-tuple"
</t>

<t>
A 5-tuple is the description of a particular transport association,
such as a TCP connection.  The components of the 5-tuple are the
identity of the protocol being used and the addresses and transport
ports of the two endpoints.
</t>

<t>
- "media"
</t>

<t>
We use this term for (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 bytes
used to encode and transmit the abstract media content.
</t>

<t>
- "multimedia session"
</t>

<t>
We use this term for the totality of the media that is
transmitted/received as described by a particular session description
(i.e., SDP instance).  This is taken from RFC 4566 section 2.
</t>

<t>
- "RTP session"
</t>

<t>
We use this term for the totality of the media that is
transmitted/received as described by a particular media description
(i.e., m= line) in a particular session description.  Since each media
description specifies one 5-tuple, RTP sessions correspond to
transport associations.  This is taken from RFC 3550 section 2.2.  (In
SIP usage (RFC 3264), this is called a "media stream", which term is
used in RTP usage to refer to the RTP with a single SSRC.)
</t>

<t>
It is understood that the RTP session can be dissected into "media
streams" that have separate SSRCs, but that is not relevant in this
analysis.  E.g., in SIP telephony, various activities of the far
endpoint can cause the ultimate source of the audio (and hence the
SSRC) to change dynamically, but each new source stands in for the
previous one seamlessly in the user interface.
</t>

<t>
(However, there is a way (RFC 4566 section 5.14) for an m= line to
specify a set of ports and thus a set of related RTP sessions.  We do
not address that.)
</t>

<t>
In general, further agreed terminology is needed to describe the
aggregate of media possessing a particular SSRC, etc., but that is not
needed for this discussion.
</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>
    DES F1:  For each bundle, there is a group of media descriptions which
    describe the application-level RTP sessions.
</t>

<t>
    DES F2:  For each bundle, there is a media description that describes
    the transport-level RTP session.
</t>

<t>
F1 and 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>
  DES F3: There must be a uniform way to deal with new SDP parameters,
  so that new SDP parameters do not require a specific updating of the
  bundling procedures.
</t>

<t>
  (This desideratum is taken from slides-interim-2013-rtcweb-1-10.pdf.)
</t>

<t>
    DES F4:  Bundles may contain other bundles as constituents.
</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>
    DES F5:  A bundle may contain zero constituents.
</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>
    DES F6:  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>

<t>
Presumably answer (3) is like 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>
    DES F7:  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>

<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 this desideratum appears to be straightforward to
satisfy.
</t>

<t>
    DES F8:  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>

<t>
In the terminology of RFC 3550, the constituent media descriptions are now
part of one RTP session.
</t>

<t>
  DES F9:  When bundling is used, the number of TURN relays needed is
  reduced.
  
  When an offer is constructed, the offerer must not need to
  pre-allocate 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>

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

<t>
  DES F10:  It must be possible to add and remove one way video flows
  within the bundle without requiring an additional offer/answer cycle.
</t>

<t>
  (This desideratum is taken from slides-interim-2013-rtcweb-1-10.pdf.)
  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.
</t>

</section>

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

<t>
  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.
  Interworking must continue when endpoints are replaced with
  other endpoints during a sequence of offer/answer exchanges (such as
  happens in 3PCC or call transfers "behind an SBC").
</t>

<t>
  DES C2:  Avoid using media types in m= lines other than audio and video, as some
  SBCs reject SDP that uses other media types.
</t>

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

<t>
  DES C3:  Any additional m= lines prescribed by the bundle mechanism
  should be physically after the
  constituent m= lines.
</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>
  non-DES C4:  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>

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

<t>
  DES C5:  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>

<t>
  (This desideratum was suggested by Hadriel Kaplan.)
  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.
</t>

<t>
  DES C6:  In a session description, no endpoint of a transport
  association (i.e., address/port) may be used multiple times.
</t>

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

<t>
  DES C7:  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>

</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=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:0 2 UDP 2113601791 10.0.1.1 10001 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
        a=candidate:1 2 UDP 1694194431 198.51.100.32 51001 typ srflx \
            raddr 10.0.1.1 rport 10001

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=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10002 typ host
        a=candidate:0 2 UDP 2113601791 10.0.1.1 10003 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx \
            raddr 10.0.1.1 rport 10002
        a=candidate:1 2 UDP 1694194431 198.51.100.32 51003 typ srflx \
            raddr 10.0.1.1 rport 10003
</artwork>
</figure>

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

</section>

<section title="Offer with Bundling">

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

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

Declare which MDs are included in the multiplexed MD:  mid:con1 and
mid:con2 are the constituent MDs whose MDees (from the application
point of view) will be carried by the MDee of the first-designed MD,
mid:fuse, which is the fusion MD.

        a=group:KUMQUAT fuse con1 con2

This MD provides the application-level description of the audio MDee.
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 non-supporting processor, the
transport information specifies that the MDee exists but is currently
"on hold":  the association address is null, and the association port
is 9, the discard port.

        m=audio 9 RTP/AVP 0 8 97
	c=IN IP4 0.0.0.0
        a=mid:con1
        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 MDee.
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
address is null, and the association port is 9.

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

This MD provides the transport information for the fusion MDee,
including any attributes which apply to the transport.  In this case,
ICE candidates are provided for both the RTP and RTCP streams.  The MD
is artificially given the media type "audio" (which is ugly, but
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 MDees.

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

<t>
  If this SDP bundle is accepted,
  RTP provided by the application for the audio MDee 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 MDee
  and the payload type of the original audio RTP.
  RTP provided by the application for the video MDee 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 MDee
  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 fusion MD.
The answerer understands that MDs mid:con1 and mid:con2 are
incorporated into MD mid:fuse, 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 fuse con1 con2

        m=audio 9 RTP/AVP 0 8 97
	c=IN IP4 0.0.0.0
        a=mid:con1
        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=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000

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

</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 9 RTP/AVP 0 8 97
	c=IN IP4 0.0.0.0
        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=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000

        m=audio 10000 RTP/AVP 127
	a=rtpmap:127 kumquat
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:0 2 UDP 2113601791 10.0.1.1 10001 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
        a=candidate:1 2 UDP 1694194431 198.51.100.32 51001 typ srflx \
            raddr 10.0.1.1 rport 10001
</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.

        m=audio 20000 RTP/AVP 0 8 97
	c=IN IP4 10.0.2.1
        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:0 2 UDP 2113601791 10.0.2.1 20001 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.35 51090 typ srflx \
            raddr 10.0.2.1 rport 20000
        a=candidate:1 2 UDP 1694194431 198.51.100.35 51091 typ srflx \
            raddr 10.0.2.1 rport 20001

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

        m=audio 20002 RTP/AVP 31 32
	c=IN IP4 10.0.2.1
        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:0 2 UDP 2113601791 10.0.2.1 20003 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.35 51092 typ srflx \
            raddr 10.0.2.1 rport 20002
        a=candidate:1 2 UDP 1694194431 198.51.100.35 51093 typ srflx \
            raddr 10.0.2.1 rport 20003

The fusion 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 MDee and one video MDee,
  and formally, that has been done.
  But the offerer has not set up its transport for separate audio and
  video MDees and has not signaled its transport information for those
  MDees to the answerer.
</t>

<t>
  In order to enable media flow, the offerer sends an updated offer
  containing transport information 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 far-end entity has changed in the meantime.

Provide transport attributes for the audio MD.  (We can reuse the ICE
candidates offered for the fusion MD.)

        m=audio 10000 RTP/AVP 0 8 97
	c=IN IP4 10.0.1.1
        a=mid:con1
        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:0 2 UDP 2113601791 10.0.1.1 10001 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
        a=candidate:1 2 UDP 1694194431 198.51.100.32 51001 typ srflx \
            raddr 10.0.1.1 rport 10001

New ICE candidates are needed for the video MD.

        m=video 10002 RTP/AVP 31 32
	c=IN IP4 10.0.1.1
        a=mid:con2
        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:0 2 UDP 2113601791 10.0.1.1 10003 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx \
            raddr 10.0.1.1 rport 10002
        a=candidate:1 2 UDP 1694194431 198.51.100.32 51003 typ srflx \
            raddr 10.0.1.1 rport 10003

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

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

<t>
  The answerer then provides the same answer as it did previously.
  The transport associations are established, and RTP flows.
</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 MDee 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 f c1 c2 c3 c4

        m=audio 9 RTP/AVP 0 8 97
	c=IN IP4 0.0.0.0
        a=mid:c1
        a=label:speaker-audio
        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 9 RTP/AVP 0 8 97
	c=IN IP4 0.0.0.0
        a=mid:c2
        a=label:floor-mic
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 G722

        m=video 9 RTP/AVP 103 104
	c=IN IP4 0.0.0.0
        a=mid:c3
        a=label:speaker-video
        a=rtpmap:103 H261/90000
        a=rtpmap:104 MPV/90000

        m=video 9 RTP/AVP 103 104
	c=IN IP4 0.0.0.0
        a=mid:c4
        a=label:slides
        a=rtpmap:103 H261/90000
        a=rtpmap:104 MPV/90000

        m=multipart 10000 RTP/AVP 127
        a=mid:c0
	a=rtpmap:127 kumquat
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:0 2 UDP 2113601791 10.0.1.1 10001 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
        a=candidate:1 2 UDP 1694194431 198.51.100.32 51001 typ srflx \
            raddr 10.0.1.1 rport 10001
</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.  [RFC 4796] 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 MDee (for students' faces) contains a large and
  variable set of video
  captures.  These can be handled by a single MDee 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 MDee (the teacher's face) is a
  separate MDee 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 MDee.  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 MDee is demultiplexed based on the ordinal
  index in the kumquat encapsulation, deencapsulated RTP packets
  destined for the fourth MDee (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 f c1 c2 c3 c4

The audio channel is send/receive.

        m=audio 9 RTP/AVP 0 8 97
	c=IN IP4 0.0.0.0
        a=mid:c1
	a=label:speaker-audio
	a=content:speaker
        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 9 RTP/AVP 103 104
	c=IN IP4 0.0.0.0
        a=mid:c2
        a=label:speaker-video
	a=content:speaker
        a=sendonly
        a=rtpmap:103 H261/90000
        a=rtpmap:104 MPV/90000

        m=video 9 RTP/AVP 105 106
	c=IN IP4 0.0.0.0
        a=mid:c3
        a=label:presentation
	a=content:slides
        a=sendonly
        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 9 RTP/AVP 105 106
	c=IN IP4 0.0.0.0
        a=mid:c4
        a=label:student-thumbnails
        a=recvonly
        a=max-recv-ssrc:* 24
        a=rtpmap:105 H261/90000
        a=rtpmap:106 MPV/90000

        m=multipart 10000 RTP/AVP
        a=mid:f
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:0 2 UDP 2113601791 10.0.1.1 10001 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx \
            raddr 10.0.1.1 rport 10000
        a=candidate:1 2 UDP 1694194431 198.51.100.32 51001 typ srflx \
            raddr 10.0.1.1 rport 10001

</artwork>
</figure>

</section>

</section>

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

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

<section title="Constructing a Session Description" 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 MDees into RTP packets of one MDee.
  Each constituent MDee 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 fusion MD.
</t>

<t>
  When a kumquat payload arrives on the transport association of the
  fusion 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       |     0         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            contributing source (CSRC) identifiers             |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           extension                           |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           encapsulated payload                |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
</figure>

<t>
  V:  This field contains the value 2.
</t>

<t>
  0 (bit 2):  This field contains the value 0.
</t>

<t>
  X:  If this field is 1, the extension field is present.
</t>

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

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

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

<t>
  index:  This field contains the index value identifying the
  constituent MDee 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>
  0 (bits 24 to 31):  This field is reserved for further
  standardization.  It MUST be set to 0 when the payload is
  created and MUST be ignored when the payload is interpreted.
</t>

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

<t>
  There is no defined meaning for the RTP marker bit in association with a
  kumquat payload.  (Note that this is the marker bit in 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>
<t>
  V:  The V field is 2.
</t>

<t>
  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>
  X, CC, M, PT:  These fields are taken from the corresponding fields
  of the kumquat payload data.
</t>

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

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

<t>
  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 MDee and an RTP
  packet of the fusion MDee:
</t>

<figure>
<artwork>
  RTP packet in the context of the fusion 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>

<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="Comparison with Predecessor Proposals" anchor="pred">

<t>
  TBD
</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
  (draft-alvestrand-one-rtp ("TOGETHER"),
  draft-holmberg-mmusic-sdp-mmt-negotiation ("MMT"),
  and draft-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="Changes from draft-worley-sdp-bundle-01 to draft-worley-sdp-bundle-01" anchor="change-00-01">

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

</section>

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

<t>
  Initial version.
</t>

</section>

</section>

</middle>

<back>

<references title="Normative References">

<reference anchor="rfc2119">
<!-- RFC 2119 -->
    <front>
        <title>Key words for use in RFCs to Indicate Requirement Levels</title>
        <author initials="S." surname="Bradner"><organization/></author>
        <date month="March" year="1997"/>
    </front>
    <seriesInfo name="RFC" value="2119" />
    <format type="TXT"
            target="ftp://ftp.isi.edu/in-notes/rfc2119.txt" />
</reference>

<reference anchor='sdp'>
<!-- RFC 4566 -->
    <front>
	<title>SDP: Session Description Protocol</title>
        <author initials='M.' surname='Handley'><organization/></author>
        <author initials='V.' surname='Jacobson'><organization/></author>
        <author initials='C.' surname='Perkins'><organization/></author>
	<date month='July' year='2006'/>
    </front>
    <seriesInfo name='RFC' value='4566' />
    <format type='TXT'
            target='ftp://ftp.isi.edu/in-notes/rfc4566.txt' />
</reference>

<reference anchor='offer-answer'>
<!-- RFC 3264 -->
    <front>
	<title>An Offer/Answer Model with the Session Description Protocol (SDP)</title>
        <author initials='J.' surname='Rosenberg'><organization/></author>
        <author initials='H.' surname='Schulzrinne'><organization/></author>
	<date month='June' year='2002'/>
    </front>
    <seriesInfo name='RFC' value='3264' />
    <format type='TXT'
            target='ftp://ftp.isi.edu/in-notes/rfc3264.txt' />
</reference>

</references>

<references title="Informative References">

<!-- Dummy, remove when obsoleted. -->
<reference anchor="service-examples">
<!-- RFC 5359 -->
    <front>
        <title>Session Initiation Protocol Service Examples</title>
        <author initials="A." surname="Johnston"><organization/></author>
        <author initials="R." surname="Sparks"><organization/></author>
        <author initials="C." surname="Cunningham"><organization/></author>
        <author initials="S." surname="Donovan"><organization/></author>
        <author initials="K." surname="Summers"><organization/></author>
        <date month="October" year="2008"/>
    </front>
    <seriesInfo name="RFC" value="5359" />
    <format type="TXT"
            target="ftp://ftp.isi.edu/in-notes/rfc5359.txt" />
</reference>

</references>

</back>

</rfc>
