<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [

<!ENTITY RFC2119    PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml'>
<!ENTITY RFC3264    PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.3264.xml'>
<!ENTITY RFC6120    PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.6120.xml'>
<!ENTITY JSEP       PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-rtcweb-jsep.xml'>
<!ENTITY ROAP       PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml3/reference.I-D.jennings-rtcweb-signaling.xml'>
]>

<?rfc toc="yes" ?>
<?rfc symrefs="yes" ?>
<?rfc sortrefs="yes"?>
<?rfc iprnotified="no" ?>
<?rfc strict="yes" ?>
<?rfc compact="yes" ?>

<rfc
  category="std"
  ipr="trust200902"
  docName="draft-li-rtcweb-jsep-xmpp-mapping-02">

  <front>
    <title abbrev="RTCWeb-JSEP-XMPP-Mapping">
    RTCWeb JSEP XMPP/Jingle Mapping
    </title>

    <author initials="K." surname="Li" fullname="Kepeng Li">
      <organization abbrev="Huawei Technologies">Huawei Technologies</organization>
      <address>
        <postal>
          <street>Huawei Base, Bantian, Longgang, Shenzhen</street>
          <country>P. R. China</country>
        </postal>
        <phone>+86-755-28971807</phone>
        <email>likepeng@huawei.com</email>
      </address>
    </author>   
    
    <date year="2013" />

    <area>RAI</area>
    <workgroup>rtcweb</workgroup>

    <abstract>
      <t>
   This document proposes mapping message representations between RTCWeb
    Javascript Session Establishment Protocol(JSEP) scheme and 
    XMPP/Jingle [XEP-0166] messaging scheme. Such a signaling
   mapping is intended to enable Javascript to use XMPP/Jingle to establish
   a session between two RTCWeb enabled browsers.
      </t>
    </abstract>

  </front>

  <middle>
    <section anchor="intro" title="Introduction">
    
      <t>
   In draft <xref target="I-D.ietf-rtcweb-jsep" />, it is mentioned that 
   there are several options for the signalling mechanisms: ROAP
   (see <xref target='I-D.jennings-rtcweb-signaling' />), SIP 
   or XMPP/Jingle. 
      </t>
      
      <t>
   This document focuses on XMPP/Jingle and tries to explain how to use
   JSEP and XMPP/Jingle to exchange session descriptions.
      </t>    

      <section anchor="terms" title="Terminology">
        <t>
          The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
          "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in
          this document are to be interpreted as described in 
          <xref target='RFC2119' />.
        </t>
      </section>   
         
    </section>

    <section anchor="arch" title="Architecture Overview">
      <section anchor="figure_arch_model" title="Architecture Model">      
        <t>
     In <xref target="figure_mapping_arch" />, it shows the overall architecture.
     In the figure, "Browser" is synonymous with "User Agent", and "Web
     Application" is synonymous with "JavaScript".
      </t>   
         
      <t>
        <figure align="center" anchor="figure_mapping_arch" title="JSEP-XMPP/Jingle Mapping Architecture">
         <artwork>           
                 +----------------------+                      
                 |         Web          |         
                 |                      |
                 |       Server         |              
                 +----------------------+         
                   /                 \
                 /                     \      
     Jingle    /                         \   Jingle
             /                             \
           /                                 \
         /                                     \
 +-------------+                        +--------------+
 |     Web     |                        |      Web     |
 | Application |                        |  Application |
 + ----------- +                        + ------------ +
        ^                                       ^
        |  SDP                                  |  SDP
        |                                       |
        V (JSEP)                                V (JSEP)
 +-------------+                        +--------------+
 |   Offerer   |                        |    Answerer  |
 |             | &lt;====== Media =======> |              |
 |   Browser   |                        |    Browser   |
 +-------------+                        +--------------+
            </artwork>
         </figure>   
        </t>
       </section>
       
       <section anchor="arch_session_flow" title="Basic Session Flow">      
        <t>
     In <xref target="figure_session_flow" />, it shows the basic Jingle
     session flow.
      </t>   
         
      <t>
        <figure align="center" anchor="figure_session_flow" title="Jingle Session Flow">
         <artwork> <![CDATA[          
 Offerer                       Answerer
    |                             |  
    |   session-initiate          |  
    |---------------------------->|  
    |   ack                       |  
    |<----------------------------|  
    |   session-accept            |  
    |<----------------------------|  
    |   ack                       |  
    |---------------------------->|  
    |   RTCWeb Media Session      |  
    |<===========================>|  
    |   session-terminate         |  
    |<----------------------------|  
    |   ack                       |  
    |---------------------------->|  
    |                             |
             ]]> 
            </artwork>
         </figure>   
        </t>
       </section>
       
       <section anchor="arch_session_mgmt" title="Overall Session Management">      
        <t>
     In <xref target="figure_session_mgmt" />, it shows the overall Jingle
     session management.
      </t>   
         
      <t>
        <figure align="center" anchor="figure_session_mgmt" title="Jingle Overall Session Management">
         <artwork> <![CDATA[          
             o         
             |         
             | session-initiate         
             |         
             | +---------->--------------+         
             |/                          |
    PENDING  o-----------------------+   |         
             |   | content-accept,   |   |         
             |   | content-add,      |   |         
             |   | content-modify,   |   |         
             |   | content-reject,   |   |         
             |   | content-remove,   |   |         
             |   | description-info, |   |        
            \|/  | session-info,     |   |         
             |   | transport-accept, |   |         
             |   | transport-info,   |   |         
             |   | transport-reject, |   |         
             |   | transport-replace |   |         
             |   +-------------------+   |         
             |                           |         
             | session-accept           \|/         
             |                           | 
     ACTIVE  o-----------------------+   |         
             |   | content-accept,   |   |         
             |   | content-add,      |   |         
             |   | content-modify,   |   |         
             |   | content-reject,   |   |         
             |   | content-remove,   |   |         
             |   | description-info, |   |        
            \|/  | session-info,     |   |         
             |   | transport-accept, |   |         
             |   | transport-info,   |   |         
             |   | transport-reject, |   |         
             |   | transport-replace |   |         
             |   +-------------------+   |         
             |                           |         
             +------------>--------------+                          
             |                           | session-terminate                                   
                                         |                                     
                                         o ENDED
             ]]> 
            </artwork>
         </figure>   
        </t>
        <t>
        In <xref target="media_setup" />, it introduces how JS clients
         could use the Jingle actions to manage a session. The 
         detailed descriptions of the Jingle actions are defined in
         <xref target="XEP-0166" />.   
        </t>
       </section>
       
    </section>
      
    <section anchor="media_setup" title="Media Setup">  
    
      <section anchor="session_mgmt" title="Session Management">  
      
        <section anchor="Initiating_Session" title="Initiate the Session">  
            <t>
      To initiate a session, the initiator can create an offer, and send 
      the offer to the 
      recipient by using Jingle "session-initiate" action.
           </t>
           <t>
      The JSEP APIs are defined in <xref target="webrtc-api" /> and
      <xref target="I-D.ietf-rtcweb-jsep" />.      
           </t>
           <t>
      JSEP API: 
           </t>
           <t>   
      OffererJS->OffererUA:   pc = new PeerConnection();
          </t>
          <t>
      OffererJS->OffererUA:   pc.addStream(localStream, null);
          </t>
          <t>
      OffererJS->OffererUA:   offer = pc.createOffer(null);
           </t>        
           <t>
      Jingle message: 
          </t>
          <t>
      OffererJS->AnswererJS: 
        <![CDATA[
 <jingle action="session-initiate"/> ]]>.
           </t>
           <t>
      After receiving the Jingle "session-initiate" action, the recipient
      can parse the session information, and apply the supplied offer
      as the remote description.     
           </t>
           <t>
      JSEP API: 
           </t> 
           <t>     
      AnswererJS->AnswererUA: pc.setRemoteDescription("offer",offer);
           </t>
        </section>
        
        <section anchor="Accept_Session" title="Accept the Session">    
          <t>
      If the recipient accepts a session, it can create an answer and send 
      back the answer by using Jingle "session-accept" action.
          </t>  
          <t>
       JSEP API:     
           </t>
           <t>
     AnswererJS->AnswererUA: peer.addStream(localStream, null);
          </t>
          <t>
     AnswererJS->AnswererUA: answer = peer.createAnswer(offer, null);
           </t>
           <t>
       Jingle message:     
           </t>      
          <t>
        AnswererJS->OffererJS: <![CDATA[
         <jingle action="session-accept"/>]]>.
          </t>
          <t>
        After receiving the Jingle "session-accept" action, the initiator
        can parse the received answer and apply the supplied answer to
        the remote description.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       OffererJS->OffererUA: pc.setRemoteDescription("answer", answer); 
           </t> 
       </section>
       
       <section anchor="Terminate_Session" title="Terminate the Session">     
            <t>
      To terminate a session, the initiator can close the peer connection with
      the recipient by using Jingle "session-terminate" action.
           </t> 
           <t>
       JSEP API:     
           </t>
           <t>
     OffererJS->OffererUA: pc.close();
          </t>
           <t>
       Jingle message:     
           </t>             
           <t>
        OffererJS->AnswererJS: <![CDATA[
         <jingle action="session-terminate"/>]]>.
           </t>
           <t>
        After receiving the Jingle "session-terminate" action, the recipient
        can close the peer connection.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       AnswererJS->AnswererUA: peer.close();
           </t>            
       </section>
       
     </section>  
       
     <section anchor="media_mgmt" title="Media Management">   
        <section anchor="Add_Media" title="Add Media">   
           <t>
      To add media (e.g.video) to an existing session, the initiator can 
      use Jingle "content-add" action.
           </t>
           <t>
      JSEP API:     
           </t>
           <t>
       OffererJS->OffererUA:   pc.addStream(videoStream);
           </t>
           <t>
       OffererJS->OffererUA:   offer = pc.createOffer(null);
           </t>
           <t>
      Jingle message:
           </t>        
           <t>
        OffererJS->AnswererJS:  <![CDATA[
          <jingle action="content-add"/>]]>.
           </t>
           <t>
        After receiving the Jingle "content-add" action, the recipient
        can parse the received offer and set the remote description.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       AnswererJS->AnswererUA: peer.setRemoteDescription("offer", offer);
           </t>            
         </section>
         
         <section anchor="Modify_Media" title="Modify Media">   
           <t>
      To modify media (e.g.change audio to video) to an existing session, 
      the initiator can either use Jingle "content-modify" action, or use
      combined Jingle "content-remove" action and "content-add" action.
           </t>  
           <t>
      JSEP API:     
           </t>
           <t>
       OffererJS->OffererUA:   pc.removeStream(audioStream);
           </t>
           <t>
        OffererJS->OffererUA:   pc.addStream(videoStream);   
           </t>
           <t>
      Jingle message:
           </t>        
           <t>
        OffererJS->AnswererJS:  <![CDATA[
          <jingle action="content-modify"/>]]>.
           </t>
           <t>
        After receiving the Jingle "content-modify" action, the recipient
        can parse the received offer and set the remote description.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       AnswererJS->AnswererUA: peer.setRemoteDescription("offer", offer);
           </t>  
         </section>
         
         <section anchor="Remove_Media" title="Remove Media">   
           <t>
      To remove media (e.g.video) to an existing session, the initiator can 
      use Jingle "content-remove" action.
           </t>  
           <t>
      JSEP API:     
           </t>
           <t>
       OffererJS->OffererUA:   pc.removeStream(audioStream);
           </t>
           <t>
      Jingle message:
           </t>             
           <t>
        OffererJS->AnswererJS:  <![CDATA[
          <jingle action="content-remove"/>]]>.
           </t>
           <t>
        After receiving the Jingle "content-remove" action, the recipient
        can parse the received offer and set the remote description.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       AnswererJS->AnswererUA: peer.setRemoteDescription("offer", offer);
           </t>  
         </section>
         
         <section anchor="Accept_Media" title="Accept Media">   
           <t>
      If the recipient accepts the "content-add" action to an existing session 
      from the initiator, recipient can create an answer and send back the 
      answer by using Jingle "content-accept" action.
           </t> 
           <t>
      JSEP API:     
           </t>
           <t>
       AnswererJS:   offer = parseContentAdd(xmpp);
           </t>
           <t>
       AnswererJS->AnswererUA:   peer.createAnswer(offer,null);
           </t>
           <t>
      Jingle message:
           </t>         
           <t>
        AnswererJS->OffererJS: <![CDATA[
         <jingle action="content-accept"/>]]>.
           </t>
           <t>
        After receiving the Jingle "content-accept" action, the initiator
        can parse the received answer and apply the received answer to
         the remote description.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       OffererJS->OffererUA: peer.setRemoteDescription("answer", answer);
           </t>    
         </section>
         
         <section anchor="Reject_Media" title="Reject Media">   
           <t>
      If the recipient rejects the "content-add" action to an existing session 
      from the initiator, recipient can send back answer by using
       Jingle "content-reject" action.
           </t>   
           <t>
      JSEP API:     
           </t>
           <t>
       AnswererJS:   offer = parseContentAdd(xmpp);
           </t>
           <t>
       AnswererJS->AnswererUA:   peer.createAnswer(offer,null);
           </t>
           <t>
      Jingle message:
           </t>       
           <t>
        AnswererJS->OffererJS: <![CDATA[
         <jingle action="content-reject"/>]]>.
           </t>
           <t>
        After receiving the Jingle "content-reject" action, the initiator
        can parse the received answer and apply the received answer to
         the remote description.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       OffererJS->OffererUA: peer.setRemoteDescription("answer", answer);
           </t> 
         </section>
     
     </section>
     
     <section anchor="Information_Exchange" title="Information Exchange">
         
        <section anchor="Exchange_ICE" title="Exchange the ICE">  
            <t>
      To perform the ICE process, the initiator can start gathering or update
       ICE address, and exchange the ICE candidates  
      with the recipient by using Jingle "transport-info" action.
           </t> 
           <t>
       JSEP API:     
           </t>
           <t>
       OffererJS->OffererUA:   pc.startIce();   
           </t>
           <t>
       OffererJS->OffererUA:   pc.updateIce();   
           </t>
           <t>
        Jingle message:    
           </t>       
           <t>
        OffererJS->AnswererJS: <![CDATA[
         <jingle action="transport-info"/>]]>.
           </t>
           <t>
        AnswererJS->OffererJS: <![CDATA[
         <jingle action="transport-info"/>]]>.
           </t>
           <t>
        After receiving the Jingle "transport-info" action, the recipient
        can parse the received ICE candidates and add remote candidate to
        the ICE Agent.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       AnswererJS->AnswererUA: pc.addIceCandidate(candidate);
           </t>         
        </section>  
               
          <section anchor="Desc_Info" title="Description Information">   
           <t>
      To send informational hints about parameters related to an existing session, 
      for example, add new video sources to a call that already has video, the 
      initiator can indicate that by using Jingle "description-info" action.
           </t>
           <t>
      JSEP API:     
           </t>
           <t>
       OffererJS->OffererUA:   pc.addStream(offererVideoStream2);
           </t>
           <t>
       OffererJS->OffererUA:   offer = pc.createOffer(null);
           </t>
           <t>
      Jingle message:
           </t>            
           <t>
        OffererJS->AnswererJS: <![CDATA[
         <jingle action="description-info"/>]]>.
           </t>
          <t> 
        After receiving the Jingle "description-info" action, the recipient
        parses the description information and sends back the acknowledgement
        by using IQ stanza of "result" type. There is no mapped JSEP API for
        Jingle "description-info" action.
          </t>    
         </section>   
         
                
         <section anchor="Result" title="Result">   
           <t>
      To acknowledge the description information to an existing session from 
      the initiator, recipient can send back answer by using
       IQ stanza of "result" type. See <xref target='RFC6120' />.
           </t>  
           <t>
           Jingle message:
           </t>      
           <t>
        AnswererJS->OffererJS: <![CDATA[
         <iq type="result"/>]]>.
           </t>
           <t>
        After receiving the Jingle IQ stanza of "result" type, the recipient
        can use the remote offer as an answer in the remote description.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       AnswererJS->AnswererUA: peer.setRemoteDescription("answer", offer);
           </t> 
         </section> 
         
         <section anchor="Error" title="Error">   
           <t>
      If there are errors occurred during an existing session, 
      the recipient can send back answer by using
       IQ stanza of "error" type. See <xref target='RFC6120' />.
           </t>
           <t>
      JSEP API:     
           </t>
           <t>
       AnswererJS->AnswererUA:  peer.RTCPeerConnectionErrorCallback;
           </t>
           <t>
      Jingle message:
           </t>           
           <t>
        AnswererJS->OffererJS: <![CDATA[
         <iq type="error"/>]]>.
           </t>         
         <t>
        After receiving the Jingle IQ stanza of "error" type, the initiate
        can choose to close the peer connection due to the errors.   
           </t>
           <t>
       JSEP API:     
           </t>
           <t>
       OffererJS->OffererUA: pc.close();
           </t>
        </section>
      
      </section> 
      
      <section anchor="Others" title="Other Actions">
       <t>
       TBD 1: do we have usage for the following actions: "security-info", 
       "session-info"?
       </t>
       <t>
       TBD 2: do we need to redefine a transport method? If yes, we can use
       "transport-replace", "transport-accept", "transport-reject". 
       </t>       
      </section> 
        
    </section> 
    
    <section anchor="jingle_jsep" title="Mapping between Jingle Message and JSEP API"> 
      <section anchor="jsep_mapping" title="Map JSEP API to Jingle Message">
          <t>
          When Offerer Javascript uses JSEP API to interact with Offerer User Agent, 
          it needs
          to map the JSEP API to Jingle message, to send it Answerer JavaScript.
           In <xref target='JSEP_API' />, it shows the mapping table from JSEP
           APIs to Jingle messages.
          </t>
          <t>
            <figure align="center" anchor="JSEP_API" title="Map JSEP API to Jingle Message"> 
             <artwork> 
  +--------------------------------+---------------------+      
  |         JSEP API               |   Jingle Message    |
  +--------------------------------+---------------------+
  | createOffer()                  | session-initiate    |
  +--------------------------------+---------------------+
  | startIce()                     | transport-info      |
  +--------------------------------+---------------------+
  | updateIce()                    | transport-info      |
  +--------------------------------+---------------------+
  | createAnswer()                 | session-accept      |
  +--------------------------------+---------------------+
  | close()                        | session-terminate   |
  +--------------------------------+---------------------+
  | addStream()                    | content-add         |
  +--------------------------------+---------------------+
  | removeStream(), addStream()    | content-modify      |
  +--------------------------------+---------------------+
  | removeStream()                 | content-remove      |
  +--------------------------------+---------------------+
  | createAnswer()                 | content-accept      |
  +--------------------------------+---------------------+
  | createOffer()                  | description-info    |
  +--------------------------------+---------------------+
  | RTCPeerConnectionErrorCallback | iq "error"          |
  +--------------------------------+---------------------+             
             </artwork>  
            </figure>               
         </t> 
        </section> 
        
        <section anchor="jingle_mapping" title="Map Jingle Message to JSEP API">
          <t>
          When Answerer Javascript receives Jingle message, it needs to map it
          to JSEP API, and interacts with ANswerer User Agent.
           In <xref target='Jingle_Message' />, it shows the mapping table from JSEP
           APIs to Jingle messages.
          </t>
          <t>
            <figure align="center" anchor="Jingle_Message" title="Map Jingle Message to JSEP API"> 
             <artwork> 
  +---------------------+--------------------------+      
  |   Jingle Message    |        JSEP API          |
  +---------------------+--------------------------+
  | session-initiate    | setRemoteDescription()   |
  +---------------------+--------------------------+
  | transport-info      | addIceCandidate()        |
  +---------------------+--------------------------+
  | session-accept      | setRemoteDescription()   |
  +---------------------+--------------------------+
  | session-terminate   | close()                  |
  +---------------------+--------------------------+
  | content-add         | setRemoteDescription()   |
  +---------------------+--------------------------+
  | content-modify      | setRemoteDescription()   |
  +---------------------+--------------------------+
  | content-remove      | setRemoteDescription()   |
  +---------------------+--------------------------+
  | content-accept      | setRemoteDescription()   |
  +---------------------+--------------------------+
  | description-info    | setRemoteDescription()   |
  +---------------------+--------------------------+
  | iq "error"          | close()                  |
  +---------------------+--------------------------+             
             </artwork>  
            </figure>               
         </t> 
        </section>  
       
    </section>
    
    <section anchor="sdp_mapping" title="Mapping to SDP"> 
      <t>     
      In order to perform the media negotiation, PeerConnection SDP Messages
      need to be converted into Jingle message and vice-versa.
      </t>   
      <t>
      The session description information included in Jingle message can be 
      mapped to SDP as defined in section 6 of <xref target='XEP-0167' />.
      </t>
      <t>
      For example, consider a payload of 16-bit linear-encoded stereo 
      audio sampled at 16KHz associated with dynamic payload-type 96:
      </t>
      <t> <![CDATA[        
    <description xmlns='urn:xmpp:jingle:apps:rtp:1' media='audio'>  
      <payload-type id='96' name='speex' clockrate='16000'/>
    </description>  
      ]]>
    </t>
     <t>
     That Jingle-formatted information would be mapped to SDP
      as follows:
     </t>  
     <t>
     m=audio 9999 RTP/AVP 96a=rtpmap:96 speex/16000
     </t>
    </section>
    
      
    <section anchor="Examples" title="Example Message Flows"> 
       <section anchor="Example_Candidates" title="Exchange Candidates">
         <t>
   In <xref target="msc_exchange_candidates" />, 
   OffererJS uses Jingle "session-initiate" action to
   initiate a session with AnswererJS, and uses Jingle "transport-info" to 
   exchange ICE candidates with AnswererJS. Then AnswererJS accepts the session
   using Jingle "session-accept" action. After the media session, OffererJS 
   uses "session-terminate" action to terminate the session, and AnswererJS
   acknowledges with IQ stanza of "result" type.
         </t>
         <t>
            <figure align="center" anchor="msc_exchange_candidates" title="Exchange Candidates"> 
             <artwork> <![CDATA[             
  Offerer JS                              Answerer JS
     |                                       |                       
     |  <jingle action="session-initiate"/>  |                        
     |-------------------------------------->|       
     |                                       |
     |  <jingle action="transport-info"/>    |     
     |-------------------------------------->|
     |                                       |
     |  <jingle action="transport-info"/>    |     
     |<--------------------------------------|
     |                                       |
     |  <jingle action="session-accept"/>    |     
     |<--------------------------------------|               
     |                                       |
     |           Media Session               |     
     |<=====================================>|   
     |                                       |                       
     |  <jingle action="session-terminate"/> |                        
     |-------------------------------------->|           
     |                                       |                       
     |        <iq type="result"/>            |                        
     |<--------------------------------------| 
     |                                       |
           ]]>   </artwork>  
            </figure>               
         </t>
        <t>
        Message details go here...
         </t>
      </section>    
        
      <section anchor="Example_Add_Contents" title="Add Contents">
         <t>
   In <xref target="msc_content_add" />, 
   OffererJS uses Jingle "content-add" action to
   add video media to an existing session. AnswererJS accepts that by using
   Jingle "content-accept" action. For simplicity, candidate exchange
   is not shown.
         </t>
         <t>
            <figure align="center" anchor="msc_content_add" title="Add Contents">
             <artwork> <![CDATA[             
  Offerer JS                              Answerer JS
     |                                       |                       
     |  <jingle action="content-add"/>       |                        
     |-------------------------------------->|   
     |                                       |
     |  <jingle action="content-accept"/>    |     
     |<--------------------------------------|
     |                                       |
     |           Media Session               |     
     |<=====================================>|   
     |                                       |
         ]]>   </artwork>  
            </figure>               
         </t>
        <t>
        Message details go here...
         </t>
      </section>   
        
      <section anchor="Example_Video_Stream" title="Exchange Description Information">
         <t>
   In <xref target="msc_exchange_desc" />, OffererJS uses Jingle "description-info" action to
   add new video sources at the same time to a call that already has video. 
   AnswererJS also uses Jingle "description-info" action to indicate the new
   sources to the remote side. After that, they uses IQ stanza of "result"
   type to acknowledge each other.
         </t>
         <t>
            <figure align="center" anchor="msc_exchange_desc" title="Exchange Description Information">
             <artwork> <![CDATA[
             
    Offerer JS                              Answerer JS
       |                                       |                       
       |  <jingle action="description-info"/>  |                        
       |-------------------------------------->|   
       |                                       |                       
       |  <jingle action="description-info"/>  |                        
       |<--------------------------------------| 
       |                                       |
       |          <iq type="result"/>          |     
       |-------------------------------------->|
       |                                       |
       |          <iq type="result"/>          |     
       |<--------------------------------------|
       |                                       |
       |           Media Session               |     
       |<=====================================>|   
       |                                       |
           ]]>   </artwork>  
            </figure>               
         </t>
        <t>
        Message details go here...
         </t>
        </section>        
      
      </section>
   
      <section anchor="security" title="Security Considerations">
        <t>
           TBD. 
        </t>
      </section>


    <section anchor="iana" title="IANA Considerations">
      <t>
        This document requires no actions from IANA.
      </t>
    </section> 
    
    <section anchor="acknowledgement" title="Acknowledgements">
      <t>
        The author would like to thank Kiran Kumar, Bert
        greevenbosch, Justin Uberti 
        for the reviews and feedbacks.
      </t>
    </section>

  </middle>

  <back>
    <references title="Normative References">
      &RFC2119;
      &RFC3264;
      &RFC6120;
      &ROAP;
      &JSEP;
      <reference anchor="XEP-0166">
        <front>
          <title>Jingle</title>
          <author>
            <organization>XMPP Standards Foundation</organization>
          </author>
          <date month="Dec" year="2009"/>
        </front>
      </reference>  
      <reference anchor="XEP-0167">
        <front>
          <title>Jingle RTP Sessions</title>
          <author>
            <organization>XMPP Standards Foundation</organization>
          </author>
          <date month="Dec" year="2009"/>
        </front>
      </reference>  
      <reference anchor="webrtc-api">
        <front>
          <title>WebRTC 1.0: Real-time Communication Between Browsers</title>
          <author>
            <organization>W3C</organization>
          </author>
          <date month="Jul" year="2012"/>
        </front>
      </reference>  
    </references>
  </back>
</rfc>
    