mirror of https://github.com/moparisthebest/xeps
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
281 lines
10 KiB
281 lines
10 KiB
<?xml version='1.0' encoding='UTF-8'?> |
|
<!DOCTYPE xep SYSTEM 'xep.dtd' [ |
|
<!ENTITY % ents SYSTEM 'xep.ent'> |
|
%ents; |
|
]> |
|
<?xml-stylesheet type='text/xsl' href='xep.xsl'?> |
|
<xep> |
|
<header> |
|
<title>Multiparty Jingle (Muji)</title> |
|
<abstract> |
|
This specification defines an XMPP protocol extension for initiating and |
|
managing multiparty voice and video conferences within an XMPP MUC |
|
</abstract> |
|
&LEGALNOTICE; |
|
<number>0272</number> |
|
<status>Deferred</status> |
|
<type>Standards Track</type> |
|
<sig>Standards</sig> |
|
<approver>Council</approver> |
|
<dependencies> |
|
<spec>XMPP Core</spec> |
|
<spec>XEP-0045</spec> |
|
<spec>XEP-0166</spec> |
|
</dependencies> |
|
<supersedes/> |
|
<supersededby/> |
|
<shortname>muji</shortname> |
|
<author> |
|
<firstname>Sjoerd</firstname> |
|
<surname>Simons</surname> |
|
<email>sjoerd.simons@collabora.co.uk</email> |
|
<jid>sjoerd.simons@collabora.co.uk</jid> |
|
</author> |
|
<author> |
|
<firstname>Dafydd</firstname> |
|
<surname>Harries</surname> |
|
<email>dafydd.harries@collabora.co.uk</email> |
|
<jid>dafydd.harries@collabora.co.uk</jid> |
|
</author> |
|
<revision> |
|
<version>0.1.1</version> |
|
<date>2018-11-03</date> |
|
<initials>pep</initials> |
|
<remark>Fix a bunch of typos, batch-style.</remark> |
|
</revision> |
|
<revision> |
|
<version>0.1</version> |
|
<date>2009-09-11</date> |
|
<initials>psa</initials> |
|
<remark><p>Initial published version as accepted for publication by the XMPP Council.</p></remark> |
|
</revision> |
|
<revision> |
|
<version>0.0.0.2</version> |
|
<date>2009-06-09</date> |
|
<initials>sjoerd</initials> |
|
<remark><p>Second rough draft.</p></remark> |
|
</revision> |
|
</header> |
|
|
|
<section1 topic='Introduction' anchor='intro'> |
|
<p> |
|
&xep0166; is used to negotiate peer to peer media sessions. |
|
Muji (short for Multiparty Jingle) is a way to coordinate Jingle sessions |
|
between a group of people. |
|
Muji conferences are held in &xep0045; rooms. |
|
</p> |
|
</section1> |
|
|
|
<section1 topic="How it Works" anchor="howitworks"> |
|
|
|
<p> |
|
A Muji conference has a number of contents, each of which has unique name, |
|
content type, and an encoding. |
|
Each participant may provide a stream for each content, and communicates |
|
which contents they are willing to provide streams for, along with encoding |
|
information, in their MUC presence. |
|
This serves two purposes. Firstly, so that each participant knows which |
|
contents every other participant provides. |
|
Secondly, so that there is a global payload type (PT) mapping for the |
|
various contents, so that clients only need to encode and payload each |
|
content that they provide once. |
|
</p> |
|
|
|
<p> |
|
Participants are not required to participate all the contents that are |
|
available. |
|
For example, a Muji client might choose to only request audio streams. |
|
</p> |
|
|
|
</section1> |
|
|
|
<section1 topic='Joining a Conference' anchor='joining'> |
|
<p> |
|
Joining a conference is done in two stages. The first step is to |
|
declare that preparations are being done to either join or start a muji |
|
session inside the MUC. This is indicated by the client sending a presence |
|
stanza to the MUC with a preparing element in muji section. |
|
</p> |
|
|
|
<code><![CDATA[ |
|
<presence from='wiccarocks@shakespeare.lit/laptop' |
|
to='darkcave@chat.shakespeare.lit/oldhag'> |
|
<c xmlns="http://jabber.org/protocol/caps" |
|
node="http://telepathy.freedesktop.org/wiki/Muji" |
|
ver="48QdBuXRCJFb8qIzgy1FOHSGO0U=" |
|
hash="sha-1" /> |
|
<muji xmlns='http://telepathy.freedesktop.org/muji'> |
|
<preparing /> |
|
</muji> |
|
</presence> |
|
]]></code> |
|
|
|
<p> |
|
The client MUST then wait until the MUC rebroadcasts its presence message, |
|
after which it MUST wait for all other participants that had a preparing |
|
element in their presence to finish preparation. Afterwards it should finish |
|
its own preparation by updating its presence with the contents it wants to |
|
take part in. |
|
</p> |
|
<code><![CDATA[ |
|
<presence from='wiccarocks@shakespeare.lit/laptop' |
|
to='darkcave@chat.shakespeare.lit/oldhag'> |
|
<c xmlns="http://jabber.org/protocol/caps" |
|
node="http://telepathy.freedesktop.org/wiki/Muji" |
|
ver="48QdBuXRCJFb8qIzgy1FOHSGO0U=" |
|
hash="sha-1" /> |
|
<muji xmlns='http://telepathy.freedesktop.org/muji'> |
|
<content name='video'> |
|
<description xmlns='urn:xmpp:jingle:apps:rtp:0' media='video'> |
|
<payload-type id='97' name='theora' clockrate='90000'/> |
|
</description> |
|
</content> |
|
<content creator='initiator' name='voice'> |
|
<description xmlns='urn:xmpp:jingle:apps:rtp:0' media='audio'> |
|
<payload-type id='97' name='speex' clockrate='8000'/> |
|
<payload-type id='18' name='G729'/> |
|
</description> |
|
</content> |
|
</muji> |
|
</presence> |
|
]]></code> |
|
|
|
<p> |
|
When a client adds a payload ID to a content description, it MUST have the |
|
same codec name and receiving parameters as the corresponding entries in |
|
other participants' payload maps for that content. For instance, if Alice |
|
defines a payload type with ID 98, codec Speex and a a clock rate of 8000 |
|
for a content called “voice0”, then Bob must define payload type 98 |
|
identically or not at all for that content. |
|
</p> |
|
|
|
<p> |
|
Furthermore, each content description MUST include at least one payload type |
|
that every other participant supports. In other words, the intersection of |
|
payload type mappings in descriptions for a content must not be the empty |
|
set. This avoids clients having to encode the same stream multiple times, |
|
which can be very costly, and also allows sending the encoded data only once |
|
where the transport makes this possible (e.g. IP multicast). |
|
</p> |
|
|
|
<p> |
|
Once a client has constructed content descriptions and advertised them in |
|
its MUC presence, it MUST initiate a Jingle session with every other |
|
participant. The requirement that it is the joining participant that |
|
initiates sessions avoids race conditions. |
|
</p> |
|
|
|
<p> |
|
|
|
Jingle sessions are initiated between the MUC JIDs of participants. That is, |
|
the Jingle session-initiate stanza is sent from one MUC JID to another. This |
|
allows participants to easily identify sessions as belonging to a Muji |
|
conference. Content names inside Muji-related Jingle sessions always refer |
|
to the content with the same name inside the Muji conference. |
|
</p> |
|
</section1> |
|
|
|
<section1 topic='Leaving a Conference' anchor='leaving'> |
|
<p> |
|
To leave a conference the Muji information MUST first be removed from the |
|
participant's presence; subsequently it SHOULD terminate all Jingle sessions |
|
related to that conference. Updating the presence first reduces the |
|
likelihood of situations where new participants initiate sessions with |
|
participants who are leaving the conference. |
|
</p> |
|
</section1> |
|
|
|
<section1 topic='Adding a Content Type' anchor='addcontent'> |
|
<p> |
|
Adding a stream follows a process similar to the joining a conference. As a |
|
first step an updated presence stanza MUST be send which contains a |
|
preparing element as part of the Muji section. |
|
</p> |
|
|
|
<code><![CDATA[ |
|
<presence from='wiccarocks@shakespeare.lit/laptop' |
|
to='darkcave@chat.shakespeare.lit/oldhag'> |
|
<c xmlns="http://jabber.org/protocol/caps" |
|
node="http://telepathy.freedesktop.org/wiki/Muji" |
|
ver="48QdBuXRCJFb8qIzgy1FOHSGO0U=" |
|
hash="sha-1" /> |
|
<muji xmlns='http://telepathy.freedesktop.org/muji'> |
|
<content creator='initiator' name='voice'> |
|
<description xmlns='urn:xmpp:jingle:apps:rtp:0' media='audio'> |
|
<payload-type id='97' name='speex' clockrate='8000'/> |
|
<payload-type id='18' name='G729'/> |
|
</description> |
|
</content> |
|
<preparing/> |
|
</muji> |
|
</presence> |
|
]]></code> |
|
|
|
<p> |
|
The client MUST then wait until the MUC rebroadcasts its presence message, |
|
after which it MUST wait for all other participants that had a preparing |
|
element in their presence to finish their changes. |
|
</p> |
|
|
|
<p> |
|
Afterwards the client should add the new content to the muji section of its |
|
presence and add the content to all the Jingle sessions it had with |
|
participants it shared the content with. |
|
</p> |
|
|
|
<code><![CDATA[ |
|
<presence from='wiccarocks@shakespeare.lit/laptop' |
|
to='darkcave@chat.shakespeare.lit/oldhag'> |
|
<c xmlns="http://jabber.org/protocol/caps" |
|
node="http://telepathy.freedesktop.org/wiki/Muji" |
|
ver="48QdBuXRCJFb8qIzgy1FOHSGO0U=" |
|
hash="sha-1" /> |
|
<muji xmlns='http://telepathy.freedesktop.org/muji'> |
|
<content name='video'> |
|
<description xmlns='urn:xmpp:jingle:apps:rtp:0' media='video'> |
|
<payload-type id='97' name='theora' clockrate='90000'/> |
|
</description> |
|
</content> |
|
<content creator='initiator' name='voice'> |
|
<description xmlns='urn:xmpp:jingle:apps:rtp:0' media='audio'> |
|
<payload-type id='97' name='speex' clockrate='8000'/> |
|
<payload-type id='18' name='G729'/> |
|
</description> |
|
</content> |
|
</muji> |
|
</presence> |
|
]]></code> |
|
</section1> |
|
|
|
<section1 topic='Removing a Content Type' anchor='removecontent'> |
|
<p> |
|
To remove a content type the participant SHOULD first sent an updated presence |
|
without the content in its muji section. Afterwards it MUST the content from |
|
all the Jingle sessions it has open. |
|
</p> |
|
</section1> |
|
|
|
<section1 topic='Relays and Mixers' anchor='relaysmixer'> |
|
|
|
<p> |
|
When scaling to conferences with a big number of participants |
|
it's no longer viable for all participants to have direct |
|
connections. |
|
|
|
On connections where upstream bandwidth is the limiting factor, an RTP |
|
relay which is able to relay the stream to multiple participants on |
|
the behalf of the clients and which forwards the streams of other |
|
participants back to the client can be used. |
|
|
|
If the limiting factor is either CPU or downstream bandwidth then a mixer |
|
can be used, which receives the media streams from other participants and |
|
mixes them on behalf of the client, so that the client only has to deal |
|
with receiving and decoding a single stream for each media type. On the |
|
sending side a mixer acts like a relay and relays the clients stream to all |
|
other participants. |
|
|
|
Both these services can either be provided by dedicated services or by |
|
other clients. |
|
</p> |
|
</section1> |
|
</xep>
|
|
|