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