1
0
mirror of https://github.com/moparisthebest/xeps synced 2024-11-28 20:22:24 -05:00
git-svn-id: file:///home/ksmith/gitmigration/svn/xmpp/trunk@130 4b5297f7-1745-476d-ba37-a9c6900126ab
This commit is contained in:
Peter Saint-Andre 2006-10-30 20:00:41 +00:00
parent e79ae7d265
commit 4939059506

View File

@ -10,7 +10,7 @@
<abstract>This document defines a content description format for Jingle audio sessions.</abstract> <abstract>This document defines a content description format for Jingle audio sessions.</abstract>
&LEGALNOTICE; &LEGALNOTICE;
<number>0167</number> <number>0167</number>
<status>Proposed</status> <status>Experimental</status>
<type>Standards Track</type> <type>Standards Track</type>
<jig>Standards JIG</jig> <jig>Standards JIG</jig>
<approver>Council</approver> <approver>Council</approver>
@ -24,6 +24,12 @@
&scottlu; &scottlu;
&stpeter; &stpeter;
&seanegan; &seanegan;
<revision>
<version>0.6</version>
<date>2006-10-30</date>
<initials>psa</initials>
<remark><p>Revised schema to allow child elements of the payload-type element; added Speex examples.</p></remark>
</revision>
<revision> <revision>
<version>0.5</version> <version>0.5</version>
<date>2006-08-23</date> <date>2006-08-23</date>
@ -74,7 +80,7 @@
</revision> </revision>
</header> </header>
<section1 topic='Introduction' anchor='intro'> <section1 topic='Introduction' anchor='intro'>
<p>&xep0166; can be used to initiate and negotiate a wide range of peer-to-peer sessions. The first session type of interest is audio chat. This document specifies a format for describing Jingle audio sessions.</p> <p>&xep0166; can be used to initiate and negotiate a wide range of peer-to-peer sessions. One session type of interest is audio (voice) chat. This document specifies a format for describing Jingle audio sessions.</p>
</section1> </section1>
<section1 topic='Requirements' anchor='reqs'> <section1 topic='Requirements' anchor='reqs'>
<p>The Jingle content description format defined herein is designed to meet the following requirements:</p> <p>The Jingle content description format defined herein is designed to meet the following requirements:</p>
@ -85,28 +91,30 @@
</ol> </ol>
</section1> </section1>
<section1 topic='Content Description Format' anchor='format'> <section1 topic='Content Description Format' anchor='format'>
<p>A Jingle audio session is described by one or more encodings contained within a wrapper &lt;description/&gt; element. In the language of <cite>RFC 4566</cite> these encodings are payload-types; therefore, each &lt;payload-type/&gt; element specifies an encoding that can be used for the audio stream. In Jingle Audio, these encodings are used in the context of RTP. The most common encodings for the Audio/Video Profile (AVP) of RTP are listed in &rfc3551; (these "static" types are reserved from payload ID 0 through payload ID 96), although other encodings are allowed (these "dynamic" types use payload IDs 97 to 127) in accordance with the dynamic assignment rules described in Section 3 of <cite>RFC 3551</cite>. The 'id' attribute is REQUIRED. The 'name' attribute is RECOMMENDED for static payload types, and REQUIRED for dynamic payload types. The 'clockrate' attribute is RECOMMENDED and should specify the sampling frequency in hertz. The 'channels' attribute is RECOMMENDED and should specify the number of channels; if omitted, it MUST be assumed to contain one channel.</p> <p>A Jingle audio session is described by one or more encodings contained within a wrapper &lt;description/&gt; element. In the language of <cite>RFC 4566</cite> these encodings are payload-types; therefore, each &lt;payload-type/&gt; element specifies an encoding that can be used for the audio stream. In Jingle Audio, these encodings are used in the context of RTP. The most common encodings for the Audio/Video Profile (AVP) of RTP are listed in &rfc3551; (these "static" types are reserved from payload ID 0 through payload ID 95), although other encodings are allowed (these "dynamic" types use payload IDs 96 to 127) in accordance with the dynamic assignment rules described in Section 3 of <cite>RFC 3551</cite>. The 'id' attribute is REQUIRED. The 'name' attribute is RECOMMENDED for static payload types, and REQUIRED for dynamic payload types. The 'clockrate' attribute is RECOMMENDED and should specify the sampling frequency in hertz. The 'channels' attribute is RECOMMENDED and should specify the number of channels; if omitted, it MUST be assumed to contain one channel.</p>
<p>The encodings SHOULD be provided in order of preference.</p> <p>The encodings SHOULD be provided in order of preference.</p>
<example caption="Audio Description Format"><![CDATA[ <example caption="Audio Description Format"><![CDATA[
<description xmlns='http://jabber.org/protocol/jingle/description/audio'> <description xmlns='http://jabber.org/protocol/jingle/description/audio'>
<payload-type id='96' name='SPEEX' clockrate='16000'/>
<payload-type id='97' name='SPEEX' clockrate='8000'/>
<payload-type id='18' name='G729'/> <payload-type id='18' name='G729'/>
<payload-type id="97" name="IPCMWB"/> <payload-type id='99' name='IPCMWB'/>
<payload-type id='98' name='L16' clockrate='16000' channels='2'/> <payload-type id='103' name='L16' clockrate='16000' channels='2'/>
<payload-type id="96" name="ISAC" clockrate="8000"/> <payload-type id='98' name='ISAC' clockrate='8000'/>
<payload-type id="102" name="iLBC"/> <payload-type id='102' name='iLBC'/>
<payload-type id="4" name="G723"/> <payload-type id='4' name='G723'/>
<payload-type id="100" name="EG711U"/> <payload-type id='100' name='EG711U'/>
<payload-type id="101" name="EG711A"/> <payload-type id='101' name='EG711A'/>
<payload-type id="0" name="PCMU" clockrate="16000"/> <payload-type id='0' name='PCMU' clockrate='16000'/>
<payload-type id="8" name="PCMA"/> <payload-type id='8' name='PCMA'/>
<payload-type id="13" name="CN"/> <payload-type id='13' name='CN'/>
</description> </description>
]]></example> ]]></example>
<p>The &lt;description/&gt; element is intended to be a child of a &JINGLE; element as specified in <cite>XEP-0166</cite>.</p> <p>The &lt;description/&gt; element is intended to be a child of a &JINGLE; element as specified in <cite>XEP-0166</cite>.</p>
<p>When the session is provisionally accepted, as indicated by the target entity sending an empty IQ result in response to an 'initiate' message, both receiving and sending entities SHOULD start listening for audio as defined by the negotiated transport method. For interoperability with telephony systems, each entity SHOULD play any audio received at this time, before the target sends an 'accept' message.</p> <p>Each &lt;payload-type/&gt; element MAY contain a child element that specifies more detailed information. For example, as described in <cite>draft-ietf-avt-rtp-speex</cite>, the "ptime", "sr", "ebw", "vbr", "eng", and "mode" parameters may be specified in relation to usage of the Speex <note>See &lt;<link url='http://www.speex.org/'>http://www.speex.org/</link>&gt;.</note> codec. XML representation of such parameters shall be provided in separate specifications or in a registry to be maintained by the XMPP Registrar.</p>
</section1> </section1>
<section1 topic='Mapping to Session Description Protocol' anchor='sdp'> <section1 topic='Mapping to Session Description Protocol' anchor='sdp'>
<p>If the payload type is static (payload-type IDs 0 through 96 inclusive), it MUST be mapped to a media field defined in <cite>RFC 4566: Session Description Protocol</cite> (SDP). The generic format for the media field is as follows:</p> <p>If the payload type is static (payload-type IDs 0 through 95 inclusive), it MUST be mapped to a media field defined in <cite>RFC 4566: Session Description Protocol</cite> (SDP). The generic format for the media field is as follows:</p>
<code><![CDATA[ <code><![CDATA[
m=<media> <port> <transport> <fmt list> m=<media> <port> <transport> <fmt list>
]]></code> ]]></code>
@ -118,14 +126,14 @@ m=<media> <port> <transport> <fmt list>
<example caption="SDP Mapping of Static Payload-Type"><![CDATA[ <example caption="SDP Mapping of Static Payload-Type"><![CDATA[
m=audio 9999 RTP/AVP 13 m=audio 9999 RTP/AVP 13
]]></example> ]]></example>
<p>If the payload type is dynamic (payload-type IDs 97 through 127 inclusive), it SHOULD be mapped to an SDP media field plus an SDP attribute field named "rtpmap".</p> <p>If the payload type is dynamic (payload-type IDs 96 through 127 inclusive), it SHOULD be mapped to an SDP media field plus an SDP attribute field named "rtpmap".</p>
<p>For example, consider a payload of 16-bit linear-encoded stereo audio sampled at 16KHz associated with dynamic payload-type 98:</p> <p>For example, consider a payload of 16-bit linear-encoded stereo audio sampled at 16KHz associated with dynamic payload-type 98:</p>
<example caption="Jingle Format for Dynamic Payload-Type"><![CDATA[ <example caption="Jingle Format for Dynamic Payload-Type"><![CDATA[
<payload-type id='98' name='L16' clockrate='16000' channels='2'/> <payload-type id='96' name='SPEEX' clockrate='16000'/>
]]></example> ]]></example>
<example caption="SDP Mapping of Dynamic Payload-Type"><![CDATA[ <example caption="SDP Mapping of Dynamic Payload-Type"><![CDATA[
m=audio 9999 RTP/AVP 98 m=audio 9999 RTP/AVP 96
a=rtpmap:98 L16/16000/2 a=rtpmap:96 SPEEX/16000
]]></example> ]]></example>
</section1> </section1>
<section1 topic='Service Discovery' anchor='disco'> <section1 topic='Service Discovery' anchor='disco'>
@ -154,7 +162,7 @@ a=rtpmap:98 L16/16000/2
</section1> </section1>
<section1 topic='Informational Messages' anchor='info'> <section1 topic='Informational Messages' anchor='info'>
<section2 topic='Format' anchor='info-format'> <section2 topic='Format' anchor='info-format'>
<p>Informational messages may be sent by either party within the context of Jingle to communicate the status of a Jingle audio session, device, or principal. The informational message MUST be an IQ-set containing a &JINGLE; element of type "content-info", where the informational message is a payload element qualified by the 'http://jabber.org/protocol/jingle/info/audio' namespace; the following payload elements are defined: <note>A &lt;trying/&gt; element (equivalent to the SIP 100 Trying response code) is not necessary, since each session-level action is acknowledged via XMPP IQ semantics.</note></p> <p>Informational messages may be sent by either party within the context of Jingle to communicate the status of a Jingle audio session, device, or principal. The informational message MUST be an IQ-set containing a &JINGLE; element of type "description-info", where the informational message is a payload element qualified by the 'http://jabber.org/protocol/jingle/info/audio' namespace; the following payload elements are defined: <note>A &lt;trying/&gt; element (equivalent to the SIP 100 Trying response code) is not necessary, since each session-level action is acknowledged via XMPP IQ semantics.</note></p>
<table caption='Information Payload Elements'> <table caption='Information Payload Elements'>
<tr> <tr>
<th>Element</th> <th>Element</th>
@ -184,65 +192,65 @@ a=rtpmap:98 L16/16000/2
<p>Note: Because the informational message is sent in an IQ-set, the receiving party MUST return either an IQ-result or an IQ-error (normally only an IQ-result to acknowledge receipt; no error flows are defined or envisioned at this time).</p> <p>Note: Because the informational message is sent in an IQ-set, the receiving party MUST return either an IQ-result or an IQ-error (normally only an IQ-result to acknowledge receipt; no error flows are defined or envisioned at this time).</p>
</section2> </section2>
<section2 topic='Examples' anchor='info-examples'> <section2 topic='Examples' anchor='info-examples'>
<example caption="Target Entity Sends Busy Message"><![CDATA[ <example caption="Receiver Sends Busy Message"><![CDATA[
<iq from='juliet@capulet.com/balcony' <iq from='juliet@capulet.com/balcony'
to='romeo@montague.net/orchard' to='romeo@montague.net/orchard'
id='busy1' id='busy1'
type='set'> type='set'>
<jingle xmlns='http://jabber.org/protocol/jingle' <jingle xmlns='http://jabber.org/protocol/jingle'
action='content-info' action='description-info'
initiator='romeo@montague.net/orchard' initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'> sid='a73sjjvkla37jfea'>
<busy xmlns='http://jabber.org/protocol/jingle/info/audio'/> <busy xmlns='http://jabber.org/protocol/jingle/info/audio'/>
</jingle> </jingle>
</iq> </iq>
]]></example> ]]></example>
<example caption="Target Entity Sends Hold Message"><![CDATA[ <example caption="Receiver Sends Hold Message"><![CDATA[
<iq from='juliet@capulet.com/balcony' <iq from='juliet@capulet.com/balcony'
to='romeo@montague.net/orchard' to='romeo@montague.net/orchard'
id='hold1' id='hold1'
type='set'> type='set'>
<jingle xmlns='http://jabber.org/protocol/jingle' <jingle xmlns='http://jabber.org/protocol/jingle'
action='content-info' action='description-info'
initiator='romeo@montague.net/orchard' initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'> sid='a73sjjvkla37jfea'>
<hold xmlns='http://jabber.org/protocol/jingle/info/audio'/> <hold xmlns='http://jabber.org/protocol/jingle/info/audio'/>
</jingle> </jingle>
</iq> </iq>
]]></example> ]]></example>
<example caption="Target Entity Sends Mute Message"><![CDATA[ <example caption="Receiver Sends Mute Message"><![CDATA[
<iq from='juliet@capulet.com/balcony' <iq from='juliet@capulet.com/balcony'
to='romeo@montague.net/orchard' to='romeo@montague.net/orchard'
id='mute1' id='mute1'
type='set'> type='set'>
<jingle xmlns='http://jabber.org/protocol/jingle' <jingle xmlns='http://jabber.org/protocol/jingle'
action='content-info' action='description-info'
initiator='romeo@montague.net/orchard' initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'> sid='a73sjjvkla37jfea'>
<mute xmlns='http://jabber.org/protocol/jingle/info/audio'/> <mute xmlns='http://jabber.org/protocol/jingle/info/audio'/>
</jingle> </jingle>
</iq> </iq>
]]></example> ]]></example>
<example caption="Target Entity Sends Queued Message"><![CDATA[ <example caption="Receiver Sends Queued Message"><![CDATA[
<iq from='juliet@capulet.com/balcony' <iq from='juliet@capulet.com/balcony'
to='romeo@montague.net/orchard' to='romeo@montague.net/orchard'
id='queued1' id='queued1'
type='set'> type='set'>
<jingle xmlns='http://jabber.org/protocol/jingle' <jingle xmlns='http://jabber.org/protocol/jingle'
action='content-info' action='description-info'
initiator='romeo@montague.net/orchard' initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'> sid='a73sjjvkla37jfea'>
<queued xmlns='http://jabber.org/protocol/jingle/info/audio'/> <queued xmlns='http://jabber.org/protocol/jingle/info/audio'/>
</jingle> </jingle>
</iq> </iq>
]]></example> ]]></example>
<example caption="Target Entity Sends Ringing Message"><![CDATA[ <example caption="Receiver Sends Ringing Message"><![CDATA[
<iq from='juliet@capulet.com/balcony' <iq from='juliet@capulet.com/balcony'
to='romeo@montague.net/orchard' to='romeo@montague.net/orchard'
id='ringing1' id='ringing1'
type='set'> type='set'>
<jingle xmlns='http://jabber.org/protocol/jingle' <jingle xmlns='http://jabber.org/protocol/jingle'
action='content-info' action='description-info'
initiator='romeo@montague.net/orchard' initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'> sid='a73sjjvkla37jfea'>
<ringing xmlns='http://jabber.org/protocol/jingle/info/audio'/> <ringing xmlns='http://jabber.org/protocol/jingle/info/audio'/>
@ -251,20 +259,27 @@ a=rtpmap:98 L16/16000/2
]]></example> ]]></example>
</section2> </section2>
</section1> </section1>
<section1 topic='Implementation Notes' anchor='impl'> <section1 topic='Implementation Notes' anchor='impl'>
<section2 topic='Codecs' anchor='impl-codecs'> <section2 topic='Codecs' anchor='impl-codecs'>
<p>Support for the Speex codec <note>See &lt;<link url='http://www.speex.org/'>http://www.speex.org/</link>&gt;.</note> is RECOMMENDED.</p> <p>Support for the Speex codec is RECOMMENDED.</p>
</section2> </section2>
<section2 topic='DTMF' anchor='impl-dtmf'> <section2 topic='DTMF' anchor='impl-dtmf'>
<p>Support for Dual Tone Multi-Frequency (DTMF) MUST use the protocol described in &xep0181;.</p> <p>If it is necessary to send Dual Tone Multi-Frequency (DTMF) tones, it is REQUIRED to use the XML format specified &xep0181;.</p>
</section2>
<section2 topic='When to Listen' anchor='impl-listen'>
<p>When the session is provisionally accepted, as indicated by the receiver sending an empty IQ result in response to an 'initiate' message, both receiving and sending entities SHOULD start listening for audio as defined by the negotiated transport method. For interoperability with telephony systems, each entity SHOULD play any audio received at this time, before the target sends an 'accept' message.</p>
</section2> </section2>
</section1> </section1>
<section1 topic='Security Considerations' anchor='security'> <section1 topic='Security Considerations' anchor='security'>
<p>The description of a format for audio sessions introduces no known security vulnerabilities.</p> <p>The description of a format for audio sessions introduces no known security vulnerabilities.</p>
</section1> </section1>
<section1 topic='IANA Considerations' anchor='iana'> <section1 topic='IANA Considerations' anchor='iana'>
<p>This document requires no interaction with &IANA;.</p> <p>This document requires no interaction with &IANA;.</p>
</section1> </section1>
<section1 topic='XMPP Registrar Considerations' anchor='registrar'> <section1 topic='XMPP Registrar Considerations' anchor='registrar'>
<section2 topic='Protocol Namespaces' anchor='registrar-ns'> <section2 topic='Protocol Namespaces' anchor='registrar-ns'>
<p>The &REGISTRAR; shall include 'http://jabber.org/protocol/jingle/description/audio' and 'http://jabber.org/protocol/jingle/info/audio' in its registry of protocol namespaces.</p> <p>The &REGISTRAR; shall include 'http://jabber.org/protocol/jingle/description/audio' and 'http://jabber.org/protocol/jingle/info/audio' in its registry of protocol namespaces.</p>
@ -301,23 +316,16 @@ a=rtpmap:98 L16/16000/2
<xs:element name='payload-type'> <xs:element name='payload-type'>
<xs:complexType> <xs:complexType>
<xs:simpleContent> <xs:sequence minOccurs='0' maxOccurs='1'>
<xs:extension base='empty'> <xs:any namespace='##other'/>
</xs:choice>
<xs:attribute name='channels' type='xs:byte' use='optional' default='1'/> <xs:attribute name='channels' type='xs:byte' use='optional' default='1'/>
<xs:attribute name='clockrate' type='xs:short' use='optional'/> <xs:attribute name='clockrate' type='xs:short' use='optional'/>
<xs:attribute name='id' type='xs:unsignedByte' use='required'/> <xs:attribute name='id' type='xs:unsignedByte' use='required'/>
<xs:attribute name='name' type='xs:string' use='optional'/> <xs:attribute name='name' type='xs:string' use='optional'/>
</xs:extension>
</xs:simpleContent>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
<xs:simpleType name='empty'>
<xs:restriction base='xs:string'>
<xs:enumeration value=''/>
</xs:restriction>
</xs:simpleType>
</xs:schema> </xs:schema>
]]></code> ]]></code>
</section2> </section2>