2 changed files with 323 additions and 321 deletions
@ -1,318 +1,318 @@ |
|||
<?php |
|||
|
|||
class JingletoSDP { |
|||
private $sdp = ''; |
|||
private $jingle; |
|||
|
|||
private $action; |
|||
|
|||
// Only used for ICE Candidate (Jingle transport-info)
|
|||
public $media; |
|||
|
|||
private $values = array( |
|||
'session_id' => 1, |
|||
'session_version' => 0, |
|||
'nettype' => 'IN', |
|||
'addrtype' => 'IP4', |
|||
'unicast_address' => '0.0.0.0' |
|||
); |
|||
|
|||
function __construct($jingle) { |
|||
$this->jingle = $jingle; |
|||
|
|||
$this->action = (string)$this->jingle->attributes()->action; |
|||
} |
|||
|
|||
function getSessionId(){ |
|||
$s = Session::start('movim'); |
|||
if($sid = $s->get('jingleSid')){ |
|||
return $sid; |
|||
} |
|||
else{ |
|||
$sessid = $this->jingle->attributes()->sid; |
|||
return substr(base_convert($sessid, 30, 10), 0, 6); |
|||
} |
|||
} |
|||
|
|||
function generate() { |
|||
if($this->jingle->attributes()->initiator) { |
|||
$username = explode('@', (string)$this->jingle->attributes()->initiator); |
|||
$username = $username[0]; |
|||
} else |
|||
$username = '-'; |
|||
|
|||
$this->values['session_id'] = $this->getSessionId(); |
|||
|
|||
$sdp_version = |
|||
'v=0'; |
|||
|
|||
$sdp_origin = |
|||
'o='. |
|||
$username.' '. |
|||
$this->values['session_id'].' '. |
|||
$this->values['session_version'].' '. |
|||
$this->values['nettype'].' '. |
|||
$this->values['addrtype'].' '. |
|||
$this->values['unicast_address']; |
|||
|
|||
$sdp_session_name = |
|||
's=SIP Call'; // Use the sessid ?
|
|||
|
|||
$sdp_timing = |
|||
't=0 0'; |
|||
|
|||
$sdp_medias = ''; |
|||
|
|||
foreach($this->jingle->children() as $content) { |
|||
|
|||
if($content->getName() != 'content') |
|||
break; |
|||
|
|||
$media_header_ids = array(); |
|||
$media_header_first_port = null; |
|||
$media_header_last_ip = null; |
|||
|
|||
$sdp_media = ''; |
|||
|
|||
if(isset($content->transport->attributes()->ufrag)) |
|||
$sdp_media .= "\na=ice-ufrag:".$content->transport->attributes()->ufrag; |
|||
|
|||
if(isset($content->transport->attributes()->pwd)) |
|||
$sdp_media .= "\na=ice-pwd:".$content->transport->attributes()->pwd; |
|||
|
|||
if(isset($content->description)) { |
|||
foreach($content->description->children() as $payload) { |
|||
switch($payload->getName()) { |
|||
case 'rtp-hdrext': |
|||
$sdp_media .= |
|||
"\na=extmap:". |
|||
$payload->attributes()->id; |
|||
|
|||
if(isset($payload->attributes()->senders)) |
|||
$sdp_media .= ' '.$payload->attributes()->senders; |
|||
|
|||
$sdp_media .= ' '.$payload->attributes()->uri; |
|||
break; |
|||
|
|||
case 'rtcp-mux': |
|||
$sdp_media .= |
|||
"\na=rtcp-mux"; |
|||
|
|||
case 'encryption': |
|||
if(isset($payload->crypto)) { |
|||
$sdp_media .= |
|||
"\na=crypto:". |
|||
$payload->crypto->attributes()->tag.' '. |
|||
$payload->crypto->attributes()->{'crypto-suite'}.' '. |
|||
$payload->crypto->attributes()->{'key-params'}; |
|||
|
|||
// TODO session params ?
|
|||
} |
|||
break; |
|||
|
|||
case 'payload-type': |
|||
$sdp_media .= |
|||
"\na=rtpmap:". |
|||
$payload->attributes()->id; |
|||
|
|||
array_push($media_header_ids, $payload->attributes()->id); |
|||
|
|||
if(isset($payload->attributes()->name)) { |
|||
$sdp_media .= ' '.$payload->attributes()->name; |
|||
|
|||
if(isset($payload->attributes()->clockrate)) { |
|||
$sdp_media .= '/'.$payload->attributes()->clockrate; |
|||
|
|||
if(isset($payload->attributes()->channels)) { |
|||
$sdp_media .= '/'.$payload->attributes()->channels; |
|||
} |
|||
} |
|||
} |
|||
|
|||
$first_fmtp = true; |
|||
|
|||
foreach($payload->children() as $param) { |
|||
switch($param->getName()) { |
|||
case 'rtcp-fb' : |
|||
$sdp_media .= |
|||
"\na=rtcp-fb:". |
|||
$param->attributes()->id.' '. |
|||
$param->attributes()->type; |
|||
|
|||
if(isset($param->attributes()->subtype)) { |
|||
$sdp_media .= ' '.$param->attributes()->subtype; |
|||
} |
|||
|
|||
break; |
|||
// http://xmpp.org/extensions/xep-0167.html#format
|
|||
case 'parameter' : |
|||
if($first_fmtp) { |
|||
$sdp_media .= |
|||
"\na=fmtp:". |
|||
$payload->attributes()->id. |
|||
' '; |
|||
} else { |
|||
$sdp_media .= '; '; |
|||
} |
|||
|
|||
if(isset($param->attributes()->name)) { |
|||
$sdp_media .= |
|||
$param->attributes()->name. |
|||
'='; |
|||
} |
|||
|
|||
$sdp_media .= |
|||
$param->attributes()->value; |
|||
|
|||
$first_fmtp = false; |
|||
|
|||
break; |
|||
} |
|||
|
|||
// TODO rtcp_fb_trr_int ?
|
|||
} |
|||
|
|||
break; |
|||
|
|||
case 'source': |
|||
foreach($payload->children() as $s) { |
|||
$sdp_media .= |
|||
"\na=ssrc:".$payload->attributes()->id.' '. |
|||
$s->attributes()->name.':'. |
|||
$s->attributes()->value; |
|||
} |
|||
break; |
|||
} |
|||
// TODO sendrecv ?
|
|||
} |
|||
} |
|||
|
|||
if(isset($content->description) |
|||
&& isset($content->description->attributes()->ptime)) { |
|||
$sdp_media .= |
|||
"\na=ptime:".$content->description->attributes()->ptime; |
|||
} |
|||
|
|||
if(isset($content->description) |
|||
&& isset($content->description->attributes()->maxptime)) { |
|||
$sdp_media .= |
|||
"\na=maxptime:".$content->description->attributes()->maxptime; |
|||
} |
|||
|
|||
foreach($content->transport->children() as $payload) { |
|||
switch($payload->getName()) { |
|||
case 'fingerprint': |
|||
if(isset($content->transport->fingerprint->attributes()->hash)) { |
|||
$sdp_media .= |
|||
"\na=fingerprint:". |
|||
$content->transport->fingerprint->attributes()->hash. |
|||
' '. |
|||
$content->transport->fingerprint; |
|||
} |
|||
|
|||
if(isset($content->transport->fingerprint->attributes()->setup)) { |
|||
$sdp_media .= |
|||
"\na=setup:". |
|||
$content->transport->fingerprint->attributes()->setup; |
|||
} |
|||
break; |
|||
|
|||
// http://xmpp.org/extensions/inbox/jingle-dtls.html
|
|||
case 'sctpmap': |
|||
$sdp_media .= |
|||
"\na=sctpmap:". |
|||
$payload->attributes()->number.' '. |
|||
$payload->attributes()->protocol.' '. |
|||
$payload->attributes()->streams.' ' |
|||
; |
|||
|
|||
|
|||
array_push($media_header_ids, $payload->attributes()->number); |
|||
|
|||
break; |
|||
|
|||
case 'candidate': |
|||
$sdp_media .= |
|||
"\na=candidate:". |
|||
$payload->attributes()->foundation.' '. |
|||
$payload->attributes()->component.' '. |
|||
$payload->attributes()->protocol.' '. |
|||
$payload->attributes()->priority.' '. |
|||
$payload->attributes()->ip.' '. |
|||
$payload->attributes()->port.' '. |
|||
'typ '.$payload->attributes()->type; |
|||
|
|||
if(isset($payload->attributes()->{'rel-addr'}) |
|||
&& isset($payload->attributes()->{'rel-port'})) { |
|||
$sdp_media .= |
|||
' raddr '.$payload->attributes()->{'rel-addr'}. |
|||
' rport '.$payload->attributes()->{'rel-port'}; |
|||
|
|||
if($media_header_first_port == null) |
|||
$media_header_first_port = $payload->attributes()->port; |
|||
} |
|||
if(isset($payload->attributes()->generation)) { |
|||
$sdp_media .= |
|||
' generation '.$payload->attributes()->generation. |
|||
' network '.$payload->attributes()->network. |
|||
' id '.$payload->attributes()->id; |
|||
} |
|||
|
|||
$media_header_last_ip = $payload->attributes()->ip; |
|||
|
|||
break; |
|||
} |
|||
} |
|||
|
|||
if($media_header_first_port == null) |
|||
$media_header_first_port = 1; |
|||
|
|||
if($media_header_last_ip == null) |
|||
$media_header_last_ip = '0.0.0.0'; |
|||
|
|||
if(isset($content->description)) |
|||
$this->media = (string)$content->description->attributes()->media; |
|||
else |
|||
$this->media = (string)$content->attributes()->name; |
|||
|
|||
if($this->action != 'transport-info') { |
|||
$sdp_media_header = |
|||
"\nm=".$this->media. |
|||
' '.$media_header_first_port.' '; |
|||
|
|||
if(isset($content->transport->sctpmap)) { |
|||
$sdp_media_header .= 'DTLS/SCTP'; |
|||
} elseif(isset($content->description->crypto) |
|||
|| isset($content->transport->fingerprint)) { |
|||
$sdp_media_header .= 'RTP/SAVPF'; |
|||
} else { |
|||
$sdp_media_header .= 'RTP/AVP'; |
|||
} |
|||
|
|||
|
|||
$sdp_media_header = $sdp_media_header.' '.implode(' ', $media_header_ids); |
|||
|
|||
$sdp_medias .= |
|||
$sdp_media_header. |
|||
"\nc=IN IP4 ".$media_header_last_ip. |
|||
$sdp_media; |
|||
//"\na=sendrecv";
|
|||
} else { |
|||
$sdp_medias = $sdp_media; |
|||
} |
|||
} |
|||
|
|||
if($this->action != 'transport-info') { |
|||
$this->sdp .= "\n".$sdp_version; |
|||
$this->sdp .= "\n".$sdp_origin; |
|||
$this->sdp .= "\n".$sdp_session_name; |
|||
$this->sdp .= "\n".$sdp_timing; |
|||
} |
|||
|
|||
$this->sdp .= $sdp_medias; |
|||
|
|||
//$this->sdp = (string)$this->jingle->sdp;
|
|||
|
|||
return $this->sdp."\n"; |
|||
} |
|||
} |
|||
<?php |
|||
|
|||
class JingletoSDP { |
|||
private $sdp = ''; |
|||
private $jingle; |
|||
|
|||
private $action; |
|||
|
|||
// Only used for ICE Candidate (Jingle transport-info)
|
|||
public $media; |
|||
|
|||
private $values = array( |
|||
'session_id' => 1, |
|||
'session_version' => 0, |
|||
'nettype' => 'IN', |
|||
'addrtype' => 'IP4', |
|||
'unicast_address' => '0.0.0.0' |
|||
); |
|||
|
|||
function __construct($jingle) { |
|||
$this->jingle = $jingle; |
|||
|
|||
$this->action = (string)$this->jingle->attributes()->action; |
|||
} |
|||
|
|||
function getSessionId(){ |
|||
$s = Session::start('movim'); |
|||
if($sid = $s->get('jingleSid')){ |
|||
return $sid; |
|||
} |
|||
else{ |
|||
$sessid = $this->jingle->attributes()->sid; |
|||
return substr(base_convert($sessid, 30, 10), 0, 6); |
|||
} |
|||
} |
|||
|
|||
function generate() { |
|||
if($this->jingle->attributes()->initiator) { |
|||
$username = explode('@', (string)$this->jingle->attributes()->initiator); |
|||
$username = $username[0]; |
|||
} else |
|||
$username = '-'; |
|||
|
|||
$this->values['session_id'] = $this->getSessionId(); |
|||
|
|||
$sdp_version = |
|||
'v=0'; |
|||
|
|||
$sdp_origin = |
|||
'o='. |
|||
$username.' '. |
|||
$this->values['session_id'].' '. |
|||
$this->values['session_version'].' '. |
|||
$this->values['nettype'].' '. |
|||
$this->values['addrtype'].' '. |
|||
$this->values['unicast_address']; |
|||
|
|||
$sdp_session_name = |
|||
's=SIP Call'; // Use the sessid ?
|
|||
|
|||
$sdp_timing = |
|||
't=0 0'; |
|||
|
|||
$sdp_medias = ''; |
|||
|
|||
foreach($this->jingle->children() as $content) { |
|||
|
|||
if($content->getName() != 'content') |
|||
break; |
|||
|
|||
$media_header_ids = array(); |
|||
$media_header_first_port = null; |
|||
$media_header_last_ip = null; |
|||
|
|||
$sdp_media = ''; |
|||
|
|||
if(isset($content->transport->attributes()->ufrag)) |
|||
$sdp_media .= "\r\na=ice-ufrag:".$content->transport->attributes()->ufrag; |
|||
|
|||
if(isset($content->transport->attributes()->pwd)) |
|||
$sdp_media .= "\r\na=ice-pwd:".$content->transport->attributes()->pwd; |
|||
|
|||
if(isset($content->description)) { |
|||
foreach($content->description->children() as $payload) { |
|||
switch($payload->getName()) { |
|||
case 'rtp-hdrext': |
|||
$sdp_media .= |
|||
"\r\na=extmap:". |
|||
$payload->attributes()->id; |
|||
|
|||
if(isset($payload->attributes()->senders)) |
|||
$sdp_media .= ' '.$payload->attributes()->senders; |
|||
|
|||
$sdp_media .= ' '.$payload->attributes()->uri; |
|||
break; |
|||
|
|||
case 'rtcp-mux': |
|||
$sdp_media .= |
|||
"\r\na=rtcp-mux"; |
|||
|
|||
case 'encryption': |
|||
if(isset($payload->crypto)) { |
|||
$sdp_media .= |
|||
"\r\na=crypto:". |
|||
$payload->crypto->attributes()->tag.' '. |
|||
$payload->crypto->attributes()->{'crypto-suite'}.' '. |
|||
$payload->crypto->attributes()->{'key-params'}; |
|||
|
|||
// TODO session params ?
|
|||
} |
|||
break; |
|||
|
|||
case 'payload-type': |
|||
$sdp_media .= |
|||
"\r\na=rtpmap:". |
|||
$payload->attributes()->id; |
|||
|
|||
array_push($media_header_ids, $payload->attributes()->id); |
|||
|
|||
if(isset($payload->attributes()->name)) { |
|||
$sdp_media .= ' '.$payload->attributes()->name; |
|||
|
|||
if(isset($payload->attributes()->clockrate)) { |
|||
$sdp_media .= '/'.$payload->attributes()->clockrate; |
|||
|
|||
if(isset($payload->attributes()->channels)) { |
|||
$sdp_media .= '/'.$payload->attributes()->channels; |
|||
} |
|||
} |
|||
} |
|||
|
|||
$first_fmtp = true; |
|||
|
|||
foreach($payload->children() as $param) { |
|||
switch($param->getName()) { |
|||
case 'rtcp-fb' : |
|||
$sdp_media .= |
|||
"\r\na=rtcp-fb:". |
|||
$param->attributes()->id.' '. |
|||
$param->attributes()->type; |
|||
|
|||
if(isset($param->attributes()->subtype)) { |
|||
$sdp_media .= ' '.$param->attributes()->subtype; |
|||
} |
|||
|
|||
break; |
|||
// http://xmpp.org/extensions/xep-0167.html#format
|
|||
case 'parameter' : |
|||
if($first_fmtp) { |
|||
$sdp_media .= |
|||
"\r\na=fmtp:". |
|||
$payload->attributes()->id. |
|||
' '; |
|||
} else { |
|||
$sdp_media .= '; '; |
|||
} |
|||
|
|||
if(isset($param->attributes()->name)) { |
|||
$sdp_media .= |
|||
$param->attributes()->name. |
|||
'='; |
|||
} |
|||
|
|||
$sdp_media .= |
|||
$param->attributes()->value; |
|||
|
|||
$first_fmtp = false; |
|||
|
|||
break; |
|||
} |
|||
|
|||
// TODO rtcp_fb_trr_int ?
|
|||
} |
|||
|
|||
break; |
|||
|
|||
case 'source': |
|||
foreach($payload->children() as $s) { |
|||
$sdp_media .= |
|||
"\r\na=ssrc:".$payload->attributes()->id.' '. |
|||
$s->attributes()->name.':'. |
|||
$s->attributes()->value; |
|||
} |
|||
break; |
|||
} |
|||
// TODO sendrecv ?
|
|||
} |
|||
} |
|||
|
|||
if(isset($content->description) |
|||
&& isset($content->description->attributes()->ptime)) { |
|||
$sdp_media .= |
|||
"\r\na=ptime:".$content->description->attributes()->ptime; |
|||
} |
|||
|
|||
if(isset($content->description) |
|||
&& isset($content->description->attributes()->maxptime)) { |
|||
$sdp_media .= |
|||
"\r\na=maxptime:".$content->description->attributes()->maxptime; |
|||
} |
|||
|
|||
foreach($content->transport->children() as $payload) { |
|||
switch($payload->getName()) { |
|||
case 'fingerprint': |
|||
if(isset($content->transport->fingerprint->attributes()->hash)) { |
|||
$sdp_media .= |
|||
"\r\na=fingerprint:". |
|||
$content->transport->fingerprint->attributes()->hash. |
|||
' '. |
|||
$content->transport->fingerprint; |
|||
} |
|||
|
|||
if(isset($content->transport->fingerprint->attributes()->setup)) { |
|||
$sdp_media .= |
|||
"\r\na=setup:". |
|||
$content->transport->fingerprint->attributes()->setup; |
|||
} |
|||
break; |
|||
|
|||
// http://xmpp.org/extensions/inbox/jingle-dtls.html
|
|||
case 'sctpmap': |
|||
$sdp_media .= |
|||
"\r\na=sctpmap:". |
|||
$payload->attributes()->number.' '. |
|||
$payload->attributes()->protocol.' '. |
|||
$payload->attributes()->streams.' ' |
|||
; |
|||
|
|||
|
|||
array_push($media_header_ids, $payload->attributes()->number); |
|||
|
|||
break; |
|||
|
|||
case 'candidate': |
|||
$sdp_media .= |
|||
"\r\na=candidate:". |
|||
$payload->attributes()->foundation.' '. |
|||
$payload->attributes()->component.' '. |
|||
$payload->attributes()->protocol.' '. |
|||
$payload->attributes()->priority.' '. |
|||
$payload->attributes()->ip.' '. |
|||
$payload->attributes()->port.' '. |
|||
'typ '.$payload->attributes()->type; |
|||
|
|||
if(isset($payload->attributes()->{'rel-addr'}) |
|||
&& isset($payload->attributes()->{'rel-port'})) { |
|||
$sdp_media .= |
|||
' raddr '.$payload->attributes()->{'rel-addr'}. |
|||
' rport '.$payload->attributes()->{'rel-port'}; |
|||
|
|||
if($media_header_first_port == null) |
|||
$media_header_first_port = $payload->attributes()->port; |
|||
} |
|||
if(isset($payload->attributes()->generation)) { |
|||
$sdp_media .= |
|||
' generation '.$payload->attributes()->generation. |
|||
' network '.$payload->attributes()->network. |
|||
' id '.$payload->attributes()->id; |
|||
} |
|||
|
|||
$media_header_last_ip = $payload->attributes()->ip; |
|||
|
|||
break; |
|||
} |
|||
} |
|||
|
|||
if($media_header_first_port == null) |
|||
$media_header_first_port = 1; |
|||
|
|||
if($media_header_last_ip == null) |
|||
$media_header_last_ip = '0.0.0.0'; |
|||
|
|||
if(isset($content->description)) |
|||
$this->media = (string)$content->description->attributes()->media; |
|||
else |
|||
$this->media = (string)$content->attributes()->name; |
|||
|
|||
if($this->action != 'transport-info') { |
|||
$sdp_media_header = |
|||
"\r\nm=".$this->media. |
|||
' '.$media_header_first_port.' '; |
|||
|
|||
if(isset($content->transport->sctpmap)) { |
|||
$sdp_media_header .= 'DTLS/SCTP'; |
|||
} elseif(isset($content->description->crypto) |
|||
|| isset($content->transport->fingerprint)) { |
|||
$sdp_media_header .= 'RTP/SAVPF'; |
|||
} else { |
|||
$sdp_media_header .= 'RTP/AVP'; |
|||
} |
|||
|
|||
|
|||
$sdp_media_header = $sdp_media_header.' '.implode(' ', $media_header_ids); |
|||
|
|||
$sdp_medias .= |
|||
$sdp_media_header. |
|||
"\r\nc=IN IP4 ".$media_header_last_ip. |
|||
$sdp_media; |
|||
//"\r\na=sendrecv";
|
|||
} else { |
|||
$sdp_medias = $sdp_media; |
|||
} |
|||
} |
|||
|
|||
if($this->action != 'transport-info') { |
|||
$this->sdp .= "\r\n".$sdp_version; |
|||
$this->sdp .= "\r\n".$sdp_origin; |
|||
$this->sdp .= "\r\n".$sdp_session_name; |
|||
$this->sdp .= "\r\n".$sdp_timing; |
|||
} |
|||
|
|||
$this->sdp .= $sdp_medias; |
|||
|
|||
//$this->sdp = (string)$this->jingle->sdp;
|
|||
|
|||
return $this->sdp."\r\n"; |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue