My favorites | English | Sign in

Faster apps faster - GWT 2.0 with Speed Tracer New!

Google Talk for Developers (Labs)

Google Talk Call Signaling

Table of Contents

  1. Introduction
  2. Status of this Document
  3. Sequence of Events
  4. Messages
    1. Initiate
    2. Candidates
    3. Accept
    4. Reject
    5. Terminate
  5. Supported Media Types
    1. Audio
      1. Packetization
      2. Rate Control
      3. VAD/Comfort Noise
    2. Video
      1. Packetization
      2. Rate Control
  6. Detecting Support and Call Routing
    1. Capabilities
    2. Call Routing
  7. Examples
    1. Initiating and Terminating an Audio Call
    2. Initiating and Terminating a Video Call
  8. Related Documentation
  9. Document History

Introduction

This document describes the XMPP signaling and other related protocols used at the time of writing by Google Talk (and the libjingle library on which it is based) to conduct voice and video calls. It is intended for use by third-party IM client developers who would like to achieve interoperability with Google Talk/Gmail voice and video chat. For more Google Talk developer information, please refer to the Google Talk Developer Documentation page.

The relevant XMPP extension standard, XEP-0167: Jingle RTP Sessions, has recently been advanced to Draft status by the XMPP Standards Foundation. Future versions of Google Talk with comply with this standard; in the meantime, the protocol described in this document is our current working version.

Status of this Document

This document describes the current signaling protocol as used by Google Talk and Gmail video chat.

Note that when using this document, you may encounter undocumented issues for your client -- if this happens, or if anything in the document is unclear, please let us know. You can send feedback on this document to xmpp+jingle@google.com.

Sequence Of Events

This section describes the general process for negotiating a Google Talk call.  During the negotiation, XMPP Info/Query ("IQ") messages of type "set" are exchanged between the call parties. These IQ messages are sent as specified in RFC 3920; each message is acknowledged with an IQ result (if the message is processed successfully) or error (if an error occurs when processing the message). Details of the specific types of IQ messages used during the process can be found in the Messages section below.

  1. Initiator sends an initiate message. Responder acknowledges with a result or sends an error response.
  2. Both parties send candidates for RTP ports. Multiple messages may be sent as candidates become available. Receiver acknowledges each message with a result or sends an error response.
  3. Call parties probe the proposed RTP ports using STUN to check whether they can send media between a given pair of ports.
  4. Responder sends an accept when it is clear that communication is possible and desirable. Initiator acknowledges with a result or sends an error response.
  5. Responder sends a reject if communication is not desired, i.e. the call is declined. Initiator acknowledges with a result or sends an error response, and the call ends.
  6. Call proceeds over RTP. New candidates may be sent at any time, e.g. if the original candidates become invalid.
  7. Anyone hanging up sends a terminate. Receiver acknowledges with a result or sends an error response. Call ends.

The following diagram shows the basic process for a successful call:

INITIATOR                            RESPONDER
    |                                    |
    | initiate (1)                       |
    |----------------------------------->|
    |                            ack (1) |
    |<-----------------------------------|
    | candidates (2)                     |
    |----------------------------------->|
    |                            ack (2) |
    |<-----------------------------------|
    |                     candidates (2) |
    |<-----------------------------------|
    | ack (2)                            |
    |----------------------------------->|
    | STUN Binding Request (3)           |
    |===================================>|
    |            STUN Binding Result (3) |
    |<===================================|
    |           STUN Binding Request (3) |
    |<===================================|
    | STUN Binding Result (3)            |
    |===================================>|
    |                         accept (4) |
    |<-----------------------------------|
    | ack (4)                            |
    |----------------------------------->|
    |<=======AUDIO/VIDEO RTP (5)========>|
    |----------------------------------->|
    | terminate (6)                      |
    |----------------------------------->|
    |                            ack (6) |
    |<-----------------------------------|
    |                                    |

Messages

Messages are described by example, with additional notes in comments.  Each <iq> message contains a <session> element with xmlns="http://www.google.com/session". This <session> element contains the following attributes:

  • type: specifies the type of the message, either "initiate", "candidates", "accept", "reject", or "terminate".
  • initiator: specifies the full JID of the user who started the session.
  • id: specifies a unique id for this session; this id is distinct from the id used in the <iq> element.

Initiate

An initiate message initiates a Google Talk call, specifying the initiator and all the payload types the initiator can send/receive. For an initiate message, the <session> element contains the following elements:

  • description: specifies the type of session and the application formats supported by the sender, arranged in priority order. For audio calls, the XML namespace is "http://www.google.com/session/phone". For video calls, the XML namespace is "http://www.google.com/session/video". Within the <description> element, multiple <payload-type> elements are specified to indicate the media formats that the initiator can receive. For a video call, both audio and video payload types are contained within the description element; XML namespaces are used to distinguish between the two. Within the <payload-type> element, the following attributes are specified, depending on whether the payload is for audio or video:
    • id: Specifies the RTP payload id.
    • name: Specifies the payload name.
    • clockrate: Specifies the sampling rate of the codec.
    • bitrate: Specifies the bitrate of the codec; absent for dynamic-bitrate codecs.
    • width: Specifies the maximum video width that the message sender can decode.
    • height: Specifies the maximum video height that the message sender can decode.
    • framerate: Specifies the maximum video framerate than the message sender can decode.

The Google Talk (version 1.0.0.x) client will also include a <transport> element within the <session> element of its initiate stanza, to explicitly indicate what transport it wants to use. Clients following this specification should assume the use of the ICE transport, ignore any <transport> element, and not include one in their own initiate stanza. Presence of the <transport> element will cause the Google Talk client to use a slightly different format when negotiating transport candidates, which has since been deprecated.

<iq from="tobe@localhost/11234"
    to="tobetest@gmail.com/gmail.B4FC4A6D"
    id="BE54746B"
    type="set">

  <session type="initiate"
           initiator="tobe@localhost/11234"
           id="11234"
           xmlns="http://www.google.com/session">

    <description xmlns="http://www.google.com/session/video">

      <payload-type xmlns="http://www.google.com/session/phone"
                    id="103"
                    name="ISAC"
                    clockrate="16000"/>
      <!-- alternative audio payload-types may be specified -->

      <payload-type xmlns="http://www.google.com/session/video"
                    id="96"
                    name="H264-SVC"
                    width="320"
                    height="200"
                    framerate="30"/>
      <!-- alternative video payload-types may be specified -->

    </description>
  </session>
</iq>

Candidates

candidates message describes a candidate transport for the channel. As described in the Sequence Of Events section above, once an initiate is acknowledged, both call parties send candidates and probe those they receive (using ICE) until a candidate pair is successful and the responder accepts. This process is described further in the ICE Transport section below. For a candidates message, the <session> element contains the following elements:

  • candidate: specifies a candidate address to be used in ICE negotiation. This element may be repeated. Within the <candidate> element, the following attributes are specified:
    • name: Specifies the type of channel this candidate is for: "rtp", "rtcp", "video_rtp", or "video_rtcp".
    • address: Specifies a destination IP address to try.
    • port: Specifies a destination port to try.
    • preference: Specifies which candidate to prefer if there are multiple usable candidates. Higher values are better.
    • type: Specifies whether this candidate is a local address, a STUN-derived address, or a relay address.
    • protocol: Specifies the protocol to use to contact this candidate.
    • network: Specifies which network adapter this candidate corresponds to.
    • username: Specifies the STUN username to use when doing connectivity checks.
    • password: Specifies the STUN password to use when doing connectivity checks.
    • generation: Specifies which ICE generation this candidate is part of.
<iq from="tobe@localhost/11234"
    to="tobetest@gmail.com/gmail.B4FC4A6D"
    id="BE54746C"
    type="set">

  <session type="candidates"
           id="11234"
           initiator="tobe@localhost/11234"
           xmlns="http://www.google.com/session">

    <candidate name="rtp"    
               address="127.0.0.1"
               port="60802"
               preference="1" <!-- ranges from 0.0-1.0 -->
               type="stun"    <!-- can be local, stun, or relay -->
               protocol="udp" <!-- can be udp, tcp or ssltcp -->
               network="0"    <!-- 0-based index of network adapters -->
               username="EiuU8u5pNNMXsVJ/" <!-- for ice -->
               password="GoVuJl7O2vQTyNln" <!-- for ice -->
               generation="0"/>
    <!-- more candidate elements may appear in the same session element
         and/or several messages with candidates may be sent -->

  </session>
</iq>

Accept

An accept message is sent by the call responder once the call can go ahead, specifying the payload types chosen/accepted. For an accept message, the <session> element contains the following elements:

  • description: specifies the type of session and the application formats supported by both the sender and the recipient. The XML namespace for the description must match what was specified in the initiate. The recipient will intersect its list of supported formats with the list it receives in the initiate message, and put the result into this element. If there are no common formats, the recipient should send back a terminate instead, with an <unsupported-applications/> reason code.
<iq to="tobe@localhost/11234"
    type="set"
    id="7CE1B8A66E9C01DB"
    from="tobetest@gmail.com/gmail.B4FC4A6D">

  <session type="accept"
           initiator="tobe@localhost/11234"
           id="11234"
           xmlns="http://www.google.com/session">

    <description xmlns="http://www.google.com/session/video">

      <payload-type xmlns="http://www.google.com/session/phone"
                    id="103"
                    name="ISAC"
                    clockrate="16000"/>
      <!-- alternative audio payload-types may be specified -->

      <payload-type xmlns="http://www.google.com/session/video"
                    id="96"
                    name="H264-SVC"
                    width="320"
                    height="200"
                    framerate="30"/>
      <!-- alternative video payload-types may be specified -->

    </description>
  </session>
</iq>

Reject

reject message is used instead of an accept when the call is explicitly declined by the recipient. The <session> element does not contain any child elements.

<iq to="tobe@localhost/11234"
    type="set"
    id="2E6296FD07416697"
    from="tobetest@gmail.com/gmail.B4FC4A6D">

  <session type="reject"
           initiator="tobe@localhost/11234"
           id="11234"
           xmlns="http://www.google.com/session"/>
</iq>

Terminate

terminate message is used to terminate a call. A reason code may be optionally specified as a child of the <session> element.

<iq to="tobe@localhost/11234"
    type="set"
    id="E502DCEBAFC5C521"
    from="tobetest@gmail.com/gmail.B4FC4A6D">

  <session type="terminate"
           initiator="tobe@localhost/11234"
           id="11234"
           xmlns="http://www.google.com/session"> 
    <busy/> 
  </session>
</iq> 

Reason codes

The list of supported reason codes will be added to a future version of this document.

ICE Transport

As mentioned above, audio and video media is transmitted over RTP streams using the ICE transport. For audio calls, only a single "rtp" channel is used; RTCP is not currently used for these calls. Video calls establish RTP and RTCP channels for both audio and video media, resulting in four channels named "rtp", "rtcp", "video_rtp" and "video_rtcp".

The establishment of and maintenance of RTP and RTCP channels is done by performing connectivity checks against all received candidates using STUN binding requests and responses. For a given candidate to be considered usable, it must respond to a STUN binding request with an appropriate STUN binding response. In addition to the initial connectivity checks, STUN is used after the channel is established to ensure it is still alive.

During the call, if multiple usable candidates are available, the client may switch from the one it is currently using to another one, if that one seems to be working better.

Note that the client verifies that received packets are coming from a valid candidate port on the remote machine.

Supported Media Types

Audio

The Google Talk client and Gmail voice and video chat support many common voice codecs, including G.711, Speex, iLBC, and ISAC. The voice codecs offered by the Gmail client, as they would appear in the session description, are listed below:

<payload-type id="103" name="ISAC" clockrate="16000"/>
<payload-type id="97" name="IPCMWB" bitrate="80000" clockrate="16000"/>
<payload-type id="99" name="speex" bitrate="22000" clockrate="16000"/>
<payload-type id="102" name="iLBC" bitrate="13300" clockrate="8000"/>
<payload-type id="98" name="speex" bitrate="11000" clockrate="8000"/>
<payload-type id="100" name="EG711U" bitrate="64000" clockrate="8000"/>
<payload-type id="101" name="EG711A" bitrate="64000" clockrate="8000"/>
<payload-type id="0" name="PCMU" bitrate="64000" clockrate="8000"/>
<payload-type id="8" name="PCMA" bitrate="64000" clockrate="8000"/>
<payload-type id="106" name="telephone-event" clockrate="8000"/>

The payload IDs listed here are shown for example purposes only; different Google clients may use different values for the dynamic payload types (those above 95). Note also that separate payload types are used for the same codec with different clockrates. This is so that the decoder will be able to unambiguously decode a payload with a given id.

Packetization

Where standards exist (iLBC, Speex, and PCMU/PCMA), RTP packetization is as specified in the respective RFCs.

Rate Control

Most of the supported audio codecs specify a fixed bitrate, which is indicated during session negotiation. ISAC is dynamic bitrate from 18-48 Kbps; this bitrate is negotiated in-band by a proprietary mechanism.

VAD/Comfort Noise

By default Google Talk does not request the use of VAD. However, it will support it if the other side advertises it in its initiate/accept message. This is done by specifying a payload-type with name="CN", similar to how this is indicated in RFC 3389.

Video

Currently, only Gmail voice and video chat supports sending and receiving video. At this time, the H.264/SVC and H.264/AVC codecs are supported. Other codecs may be supported in future versions. The video codecs supported by the Gmail client are listed below:

<payload-type id="96" name="H264-SVC" width="320" height="200" framerate="30"/>
<payload-type id="97" name="H264" width="320" height="200" framerate="30"/>

Note that the width, height, and framerate parameters are 'hints' to the sender that specify what the receiver prefers to decode; these values should be chosen based on the capabilities of the receiving client. When interpreting these values, the sender may send the specified resolution, a lower resolution, or a similar resolution with a different aspect ratio. For example, to a client that prefers 320x200, the sender may choose to send 320x200, 160x100, or 320x240, depending on what is best for the sender. The sender should not send a resolution/framerate that markedly exceeds that specified by the sender. For example, to a client that prefers 320x200, the sender should not choose to send 640x400, as the receiver may not be capable of decoding it.

Packetization

The RTP packetization for H.264/SVC has not been finalized; we intend to comply with the standard when it is finalized. RTP packetization for H.264/AVC is as specified in RFC 3984.

Rate Control

H.264 is capable of scaling its bitrate dynamically. We use a mechanism based on TCP Friendly Rate Control (TFRC) to determine the available bandwidth and adjust the rate accordingly. There are two components to this mechanism, a TFRC value written into a RTP extension header in each outgoing RTP packet, and a RTCP feedback message indicating the available bandwidth, which will be used by the receiving client to adjust its send bitrate. 

The format for the RTP extension header is based on this draft: http://tools.ietf.org/html/draft-ietf-avt-tfrc-profile-10.

The format for the RTCP feedback message will be added to a future version of this document.

Detecting Support and Call Routing

Capabilities

The Google Talk client uses capabilities to determine whether users support the Google Talk voice and video functionality. There are three capabilities currently defined, which are specified in the ext attribute of a XEP-0115 capabilities element:

  • voice-v1: indicates the user is capable of sending and receiving voice media.
  • video-v1: indicates the user is capable of receiving video media.
  • camera-v1: indicates the user is capable of sending video media.
<c xmlns="http://jabber.org/protocol/caps"
   node="http://mail.google.com/xmpp/client/caps"
   ver="1.0" 
   ext="voice-v1 video-v1 camera-v1"/>

Call Routing

When there are multiple possible endpoints (i.e. XMPP resources) to receive a call, the initiating Google client will select what it considers to be the "best" endpoint to receive the call. Currently, forking of calls is not supported, although it is expected to be implemented in a future version.

For voice calls, the following algorithm is used:

  • If any endpoint is active (i.e., its status is not "idle") and supports "voice-v1", use that endpoint.
  • Otherwise, select the first endpoint that supports "voice-v1".

For video calls, the following algorithm is used:

  • If any endpoint is active and supports "video-v1" and "camera-v1", use that endpoint.
  • Otherwise, if any endpoint is active and supports "video-v1", use that endpoint.
  • Otherwise, if any endpoint supports "video-v1" and "camera-v1", use that endpoint.
  • Otherwise, select the first endpoint that supports "video-v1".

Note that Gmail will combine all of its endpoints (i.e. multiple Gmail logins) into a single XMPP resource, which will aggregate the capabilities of the individual endpoints. When receiving a call, the Gmail server will use its own knowledge about endpoint capabilities and activity to determine the best endpoint to send the call on to.

Examples

The following examples show all the IQ messages sent over the course of various audio and video calls.  Messages with a red border are from the call initiator, while those with a blue border are from the responder. As you can see, each message is acknowledged with a result, specifying the id of the corresponding received message.

Initiating and Terminating an Audio Call

Note the use of multiple candidates for the "rtp" channel by each party.

<iq from="romeo@montague.lit/orchard"
    id="s1"
    to="juliet@capulet.lit/balcony"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="initiate"
           id="c1451315399" 
           initiator="romeo@montague.lit/orchard">
    <description xmlns="http://www.google.com/session/phone">
      <payload-type id="103" name="ISAC" clockrate="16000"/>
      <payload-type id="97" name="IPCMWB" bitrate="80000" clockrate="16000"/>
      <payload-type id="99" name="speex" bitrate="22000" clockrate="16000"/>
      <payload-type id="102" name="iLBC" bitrate="13300" clockrate="8000"/>
      <payload-type id="98" name="speex" bitrate="11000" clockrate="8000"/>
      <payload-type id="100" name="EG711U" bitrate="64000" clockrate="8000"/>
      <payload-type id="101" name="EG711A" bitrate="64000" clockrate="8000"/>
      <payload-type id="0" name="PCMU" bitrate="64000" clockrate="8000"/>
      <payload-type id="8" name="PCMA" bitrate="64000" clockrate="8000"/>
      <payload-type id="106" name="telephone-event" clockrate="8000"/>
    </description>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="s1"
    to="romeo@montague.lit/orchard"
    type="result"/>
<iq from="romeo@montague.lit/orchard"
    id="s2"
    to="juliet@capulet.lit/balcony"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates"
           id="c1451315399"
           initiator="romeo@montague.lit/orchard">
    <candidate name="rtp"
               address="192.168.0.2"
               port="52979"
               username="on5H+jOtbbtyl0+v"
               password="gyByxv1RnT4+7Avc"
               preference="1"
               protocol="udp"
               generation="0"
               network="0"
               type="local"/>
  </session>
</iq>
<iq from="romeo@montague.lit/orchard"
    id="s3"
    to="juliet@capulet.lit/balcony"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates"
           id="c1451315399"
           initiator="romeo@montague.lit/orchard">
    <candidate name="rtp" 
               address="1.2.3.4"
               port="37107"
               username="XNoSW2+dLS9qEFHk"
               password="Q22L+DDGo0n6wuAb"
               preference="0.9"
               protocol="udp"
               generation="0"
               network="0"
               type="stun"/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="r1"
    to="romeo@montague.lit/orchard"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates" 
           id="c1451315399" 
           initiator="romeo@montague.lit/orchard">
    <candidate name="rtp" 
               address="10.0.0.2"
               port="4252" 
               preference="1"
               username="5YLxyCK76448axGr"
               protocol="udp"
               generation="0"
               password="8+La8XwWBatOOR04"
               type="local"
               network="0"/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="r2"
    to="romeo@montague.lit/orchard"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates" 
           id="c1451315399" 
           initiator="romeo@montague.lit/orchard">
    <candidate name="rtp" 
               address="5.6.7.8"
               port="4253"
               preference="0.9"
               username="U0rxLvgkAk5sx0p9"
               protocol="udp"
               generation="0"
               password="X6qADZn9s44+IKUx"
               type="stun"
               network="0"/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="s2"
    to="romeo@montague.lit/orchard"
    type="result"/>
<iq from="juliet@capulet.lit/balcony"
    id="s3"
    to="romeo@montague.lit/orchard"
    type="result"/>
<iq to="romeo@montague.lit/orchard"
    id="r1"
    from="juliet@capulet.lit/balcony"
    type="result"/>
<iq to="romeo@montague.lit/orchard"
    id="r1"
    from="juliet@capulet.lit/balcony"
    type="result"/>
<iq from="romeo@montague.lit/orchard"
    id="r3"
    to="juliet@capulet.lit/balcony"
    type="set"/>
  <session xmlns="http://www.google.com/session"
           type="accept" 
           id="c1451315399" 
           initiator="romeo@montague.lit/orchard">
    <description xmlns="http://www.google.com/session/phone">
      <payload-type id="103" name="ISAC" clockrate="16000"/>
      <payload-type id="97" name="IPCMWB" clockrate="16000" bitrate="80000"/>
      <payload-type id="99" name="speex" clockrate="16000" bitrate="22000"/>
      <payload-type id="102" name="iLBC" clockrate="8000" bitrate="13300"/>
      <payload-type id="98" name="speex" clockrate="8000" bitrate="11000"/>
      <payload-type id="100" name="EG711U" clockrate="8000" bitrate="64000"/>
      <payload-type id="101" name="EG711A" clockrate="8000" bitrate="64000"/>
      <payload-type id="0" name="PCMU" clockrate="8000" bitrate="64000"/>
      <payload-type id="8" name="PCMA" clockrate="8000" bitrate="64000"/>
      <payload-type id="106" name="telephone-event" clockrate="8000"/>
    </description>
  </session>
</iq>
<iq to="juliet@capulet.lit/balcony"
    id="r3"
    from="romeo@montague.lit/orchard"
    type="result"/>
<iq to="juliet@capulet.lit/balcony"
    id="s4"
    from="romeo@montague.lit/orchard"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="terminate"
           id="c1451315399"
           initiator="romeo@montague.lit/orchard">
    <success/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="s4"
    to="romeo@montague.lit/orchard"
    type="result"/>

Initiating and Terminating a Video Call

<iq from="romeo@montague.lit/orchard"
    id="s1"
    to="juliet@capulet.lit/balcony"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="initiate"
           id="c1282339416" 
           initiator="romeo@montague.lit/orchard">
    <description xmlns="http://www.google.com/session/video">
      <payload-type id="96" name="H264-SVC" width="320" height="200" framerate="30"/>
      <payload-type id="103" name="ISAC" clockrate="16000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="97" name="IPCMWB" bitrate="80000" clockrate="16000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="99" name="speex" bitrate="22000" clockrate="16000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="102" name="iLBC" bitrate="13300" clockrate="8000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="98" name="speex" bitrate="11000" clockrate="8000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="100" name="EG711U" bitrate="64000" clockrate="8000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="101" name="EG711A" bitrate="64000" clockrate="8000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="0" name="PCMU" bitrate="64000" clockrate="8000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="8" name="PCMA" bitrate="64000" clockrate="8000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="106" name="telephone-event" clockrate="8000" xmlns="http://www.google.com/session/phone"/>
    </description>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="s1"
    to="romeo@montague.lit/orchard"
    type="result"/>
<iq from="romeo@montague.lit/orchard"
    id="s2"
    to="juliet@capulet.lit/balcony"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates"
           id="c1282339416"
           initiator="romeo@montague.lit/orchard">
    <candidate name="rtp"
               address="192.168.0.2"
               port="52979"
               username="KcVNlN3GilL593k/"
               password="7N5A2keU13yo/Abk"
               preference="1"
               protocol="udp"
               generation="0"
               network="0"
               type="local"/>
  </session>
</iq>
<iq from="romeo@montague.lit/orchard"
    id="s3"
    to="juliet@capulet.lit/balcony"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates"
           id="c1282339416"
           initiator="romeo@montague.lit/orchard">
    <candidate name="rtcp"
               address="192.168.0.2"
               port="52980"
               username="pxFyhd6lUm+6rZ5N"
               password="nHIVwJyMqAeQIhDK"
               preference="1"
               protocol="udp"
               generation="0"
               network="0"
               type="local"/>
  </session>
</iq>
<iq from="romeo@montague.lit/orchard"
    id="s4"
    to="juliet@capulet.lit/balcony"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates"
           id="c1282339416"
           initiator="romeo@montague.lit/orchard">
    <candidate name="video_rtp"
               address="192.168.0.2"
               port="52981"
               username="ITdrwHBGOhVg6pWW"
               password="y4FwqAgIjMSv/JnM"
               preference="1"
               protocol="udp"
               generation="0"
               network="0"
               type="local"/>
  </session>
</iq>
<iq from="romeo@montague.lit/orchard"
    id="s5"
    to="juliet@capulet.lit/balcony"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates"
           id="c1282339416"
           initiator="romeo@montague.lit/orchard">
    <candidate name="video_rtcp"
               address="192.168.0.2"
               port="52982"
               username="5Q4txm1vACIArjC/"
               password="ssKFEmRNSHIYl1QP"
               preference="1"
               protocol="udp"
               generation="0"
               network="0"
               type="local"/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="r1"
    to="romeo@montague.lit/orchard"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates" 
           id="c1282339416" 
           initiator="romeo@montague.lit/orchard">
    <candidate name="rtp" 
               address="192.168.0.3"
               port="4252"
               preference="1"
               username="LhCkgya5HMil6OHs"
               protocol="udp"
               generation="0"
               password="EErusOJinbn98oeA"
               type="local"
               network="0"/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="r2"
    to="romeo@montague.lit/orchard"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates" 
           id="c1282339416" 
           initiator="romeo@montague.lit/orchard">
    <candidate name="rtcp" 
               address="192.168.0.3"
               port="4253"
               preference="1"
               username="+2xHg478LZxRoyXK"
               protocol="udp"
               generation="0"
               password="3RUE2M3kFV3NJP/W"
               type="local"
               network="0"/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="r3"
    to="romeo@montague.lit/orchard"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates" 
           id="c1282339416" 
           initiator="romeo@montague.lit/orchard">
    <candidate name="video_rtp" 
               address="192.168.0.3"
               port="4254"
               preference="1"
               username="j8A7m8iqXwzyPewt"
               protocol="udp"
               generation="0"
               password="OQHblqhXT6gJuRle"
               type="local"
               network="0"/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="r4"
    to="romeo@montague.lit/orchard"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="candidates" 
           id="c1282339416" 
           initiator="romeo@montague.lit/orchard">
    <candidate name="video_rtcp" 
               address="192.168.0.3"
               port="4255"
               preference="1"
               username="GaWnVaNbqGKmOSB1"
               protocol="udp"
               generation="0"
               password="9+NYAZMvHo3iIUkH"
               type="local"
               network="0"/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="s2"
    to="romeo@montague.lit/orchard"
    type="result"/>
<iq from="juliet@capulet.lit/balcony"
    id="s3"
    to="romeo@montague.lit/orchard"
    type="result"/>
<iq from="juliet@capulet.lit/balcony"
    id="s4"
    to="romeo@montague.lit/orchard"
    type="result"/>
<iq from="juliet@capulet.lit/balcony"
    id="s5"
    to="romeo@montague.lit/orchard"
    type="result"/>
<iq to="romeo@montague.lit/orchard"
    id="r1"
    from="juliet@capulet.lit/balcony"
    type="result"/>
<iq to="romeo@montague.lit/orchard"
    id="r2"
    from="juliet@capulet.lit/balcony"
    type="result"/>
<iq to="romeo@montague.lit/orchard"
    id="r3"
    from="juliet@capulet.lit/balcony"
    type="result"/>
<iq to="romeo@montague.lit/orchard"
    id="r4"
    from="juliet@capulet.lit/balcony"
    type="result"/>
<iq from="romeo@montague.lit/orchard"
    id="r5"
    to="juliet@capulet.lit/balcony"
    type="set"/>

  <session xmlns="http://www.google.com/session" type="accept" 
           id="c1282339416" 
           initiator="romeo@montague.lit/orchard">
    <description xmlns="http://www.google.com/session/video">
      <payload-type id="96" name="H264-SVC" width="320" height="200" framerate="30"/>
      <payload-type id="103" name="ISAC" clockrate="16000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="97" name="IPCMWB" clockrate="16000" bitrate="80000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="99" name="speex" clockrate="16000" bitrate="22000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="102" name="iLBC" clockrate="8000" bitrate="13300" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="98" name="speex" clockrate="8000" bitrate="11000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="100" name="EG711U" clockrate="8000" bitrate="64000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="101" name="EG711A" clockrate="8000" bitrate="64000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="0" name="PCMU" clockrate="8000" bitrate="64000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="8" name="PCMA" clockrate="8000" bitrate="64000" xmlns="http://www.google.com/session/phone"/>
      <payload-type id="106" name="telephone-event" clockrate="8000" xmlns="http://www.google.com/session/phone"/>
    </description>
  </session>
</iq>
<iq to="juliet@capulet.lit/balcony"
    id="r5"
    from="romeo@montague.lit/orchard"
    type="result"/>
<iq to="juliet@capulet.lit/balcony"
    id="s6"
    from="romeo@montague.lit/orchard"
    type="set">
  <session xmlns="http://www.google.com/session"
           type="terminate"
           id="c1282339416"
           initiator="romeo@montague.lit/orchard">
    <success/>
  </session>
</iq>
<iq from="juliet@capulet.lit/balcony"
    id="s6"
    to="romeo@montague.lit/orchard"
    type="result"/>

Document History

Version 1.2

  • Documented proper handling of the <transport> element in an initiate message.
  • Specified how comfort noise is signaled.
  • Added more information about video rate control.
  • Added more information about how call routing works with Gmail.

Version 1.1

  • Added description of how width and height fields are used.

Version 1.0

  • Initial version.