panlinlin
4 years ago
9 changed files with 80 additions and 699 deletions
@ -1,65 +0,0 @@ |
|||
/* |
|||
This file is part of Peers, a java SIP softphone. |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
|||
Copyright 2010 Yohann Martineau |
|||
*/ |
|||
|
|||
package com.genersoft.iot.vmp.gb28181.sdp; |
|||
|
|||
public class Codec { |
|||
|
|||
private int payloadType; |
|||
private String name; |
|||
|
|||
public int getPayloadType() { |
|||
return payloadType; |
|||
} |
|||
|
|||
public void setPayloadType(int payloadType) { |
|||
this.payloadType = payloadType; |
|||
} |
|||
|
|||
public String getName() { |
|||
return name; |
|||
} |
|||
|
|||
public void setName(String name) { |
|||
this.name = name; |
|||
} |
|||
|
|||
@Override |
|||
public boolean equals(Object obj) { |
|||
if (!(obj instanceof Codec)) { |
|||
return false; |
|||
} |
|||
Codec codec = (Codec)obj; |
|||
if (codec.getName() == null) { |
|||
return name == null; |
|||
} |
|||
return codec.getName().equalsIgnoreCase(name); |
|||
} |
|||
|
|||
@Override |
|||
public String toString() { |
|||
StringBuffer buf = new StringBuffer(); |
|||
buf.append(RFC4566_28181.TYPE_ATTRIBUTE).append(RFC4566_28181.SEPARATOR); |
|||
buf.append(RFC4566_28181.ATTR_RTPMAP).append(RFC4566_28181.ATTR_SEPARATOR); |
|||
buf.append(payloadType).append(" ").append(name).append("/"); |
|||
buf.append(9000).append("\r\n"); |
|||
return buf.toString(); |
|||
} |
|||
|
|||
} |
@ -1,123 +0,0 @@ |
|||
/* |
|||
This file is part of Peers, a java SIP softphone. |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
|||
Copyright 2007, 2008, 2009, 2010 Yohann Martineau |
|||
*/ |
|||
|
|||
package com.genersoft.iot.vmp.gb28181.sdp; |
|||
|
|||
import java.net.Inet4Address; |
|||
import java.net.Inet6Address; |
|||
import java.net.InetAddress; |
|||
import java.util.Hashtable; |
|||
import java.util.List; |
|||
|
|||
public class MediaDescription { |
|||
|
|||
private String type; |
|||
private InetAddress ipAddress; |
|||
// attributes not codec-related
|
|||
private Hashtable<String, String> attributes; |
|||
private int port; |
|||
private List<Codec> codecs; |
|||
|
|||
public String getType() { |
|||
return type; |
|||
} |
|||
|
|||
public void setType(String type) { |
|||
this.type = type; |
|||
} |
|||
|
|||
public Hashtable<String, String> getAttributes() { |
|||
return attributes; |
|||
} |
|||
|
|||
public void setAttributes(Hashtable<String, String> attributes) { |
|||
this.attributes = attributes; |
|||
} |
|||
|
|||
public InetAddress getIpAddress() { |
|||
return ipAddress; |
|||
} |
|||
|
|||
public void setIpAddress(InetAddress ipAddress) { |
|||
this.ipAddress = ipAddress; |
|||
} |
|||
|
|||
public int getPort() { |
|||
return port; |
|||
} |
|||
|
|||
public void setPort(int port) { |
|||
this.port = port; |
|||
} |
|||
|
|||
public List<Codec> getCodecs() { |
|||
return codecs; |
|||
} |
|||
|
|||
public void setCodecs(List<Codec> codecs) { |
|||
this.codecs = codecs; |
|||
} |
|||
|
|||
@Override |
|||
public String toString() { |
|||
StringBuffer buf = new StringBuffer(); |
|||
buf.append(RFC4566_28181.TYPE_MEDIA).append(RFC4566_28181.SEPARATOR); |
|||
buf.append(type).append(" ").append(port); |
|||
buf.append(" RTP/AVP"); |
|||
if (codecs != null) { |
|||
for (Codec codec: codecs) { |
|||
buf.append(" "); |
|||
buf.append(codec.getPayloadType()); |
|||
} |
|||
buf.append("\r\n"); |
|||
} |
|||
if (ipAddress != null) { |
|||
int ipVersion; |
|||
if (ipAddress instanceof Inet4Address) { |
|||
ipVersion = 4; |
|||
} else if (ipAddress instanceof Inet6Address) { |
|||
ipVersion = 6; |
|||
} else { |
|||
throw new RuntimeException("unknown ip version: " + ipAddress); |
|||
} |
|||
buf.append(RFC4566_28181.TYPE_CONNECTION).append(RFC4566_28181.SEPARATOR); |
|||
buf.append("IN IP").append(ipVersion).append(" "); |
|||
buf.append(ipAddress.getHostAddress()).append("\r\n"); |
|||
} |
|||
if (codecs != null) { |
|||
for (Codec codec: codecs) { |
|||
buf.append(codec.toString()); |
|||
} |
|||
} |
|||
|
|||
if (attributes != null) { |
|||
for (String attributeName: attributes.keySet()) { |
|||
buf.append(RFC4566_28181.TYPE_ATTRIBUTE).append(RFC4566_28181.SEPARATOR); |
|||
buf.append(attributeName); |
|||
String attributeValue = attributes.get(attributeName); |
|||
if (attributeValue != null && !"".equals(attributeValue.trim())) { |
|||
buf.append(":").append(attributeValue); |
|||
} |
|||
buf.append("\r\n"); |
|||
} |
|||
} |
|||
return buf.toString(); |
|||
} |
|||
|
|||
} |
@ -1,51 +0,0 @@ |
|||
/* |
|||
This file is part of Peers, a java SIP softphone. |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
|||
Copyright 2007, 2008, 2009, 2010 Yohann Martineau |
|||
*/ |
|||
|
|||
package com.genersoft.iot.vmp.gb28181.sdp; |
|||
|
|||
public class RFC4566_28181 { |
|||
|
|||
public static final char VERSION = '0'; |
|||
|
|||
public static final char TYPE_VERSION = 'v'; |
|||
public static final char TYPE_ORIGIN = 'o'; |
|||
public static final char TYPE_SUBJECT = 's'; |
|||
public static final char TYPE_INFO = 'i'; |
|||
public static final char TYPE_URI = 'u'; |
|||
public static final char TYPE_EMAIL = 'e'; |
|||
public static final char TYPE_PHONE = 'p'; |
|||
public static final char TYPE_CONNECTION = 'c'; |
|||
public static final char TYPE_BANDWITH = 'b'; |
|||
public static final char TYPE_TIME = 't'; |
|||
public static final char TYPE_REPEAT = 'r'; |
|||
public static final char TYPE_ZONE = 'z'; |
|||
public static final char TYPE_KEY = 'k'; |
|||
public static final char TYPE_ATTRIBUTE = 'a'; |
|||
public static final char TYPE_MEDIA = 'm'; |
|||
public static final char TYPE_SSRC = 'y'; |
|||
public static final char TYPE_MEDIA_DES = 'f'; |
|||
|
|||
public static final char SEPARATOR = '='; |
|||
public static final char ATTR_SEPARATOR = ':'; |
|||
|
|||
public static final String MEDIA_AUDIO = "audio"; |
|||
|
|||
public static final String ATTR_RTPMAP = "rtpmap"; |
|||
public static final String ATTR_SENDRECV = "sendrecv"; |
|||
} |
@ -1,38 +0,0 @@ |
|||
/* |
|||
This file is part of Peers, a java SIP softphone. |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
|||
Copyright 2007, 2008, 2009, 2010 Yohann Martineau |
|||
*/ |
|||
|
|||
package com.genersoft.iot.vmp.gb28181.sdp; |
|||
|
|||
public class SdpLine { |
|||
private char type; |
|||
private String value; |
|||
public char getType() { |
|||
return type; |
|||
} |
|||
public void setType(char type) { |
|||
this.type = type; |
|||
} |
|||
public String getValue() { |
|||
return value; |
|||
} |
|||
public void setValue(String value) { |
|||
this.value = value; |
|||
} |
|||
|
|||
} |
@ -1,230 +0,0 @@ |
|||
/* |
|||
This file is part of Peers, a java SIP softphone. |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
|||
Copyright 2007, 2008, 2009, 2010 Yohann Martineau |
|||
*/ |
|||
|
|||
package com.genersoft.iot.vmp.gb28181.sdp; |
|||
|
|||
import java.io.BufferedReader; |
|||
import java.io.ByteArrayInputStream; |
|||
import java.io.IOException; |
|||
import java.io.InputStreamReader; |
|||
import java.net.InetAddress; |
|||
import java.util.ArrayList; |
|||
import java.util.Hashtable; |
|||
import java.util.List; |
|||
|
|||
public class SdpParser { |
|||
|
|||
public SessionDescription parse(byte[] body) throws IOException { |
|||
if (body == null || body.length == 0) { |
|||
return null; |
|||
} |
|||
ByteArrayInputStream in = new ByteArrayInputStream(body); |
|||
InputStreamReader inputStreamReader = new InputStreamReader(in); |
|||
BufferedReader reader = new BufferedReader(inputStreamReader); |
|||
SessionDescription sessionDescription = new SessionDescription(); |
|||
|
|||
//version
|
|||
|
|||
String line = reader.readLine(); |
|||
if (line.length() < 3) { |
|||
return null; |
|||
} |
|||
if (line.charAt(0) != RFC4566_28181.TYPE_VERSION |
|||
|| line.charAt(1) != RFC4566_28181.SEPARATOR |
|||
|| line.charAt(2) != RFC4566_28181.VERSION) { |
|||
return null; |
|||
} |
|||
|
|||
//origin
|
|||
|
|||
line = reader.readLine(); |
|||
if (line.length() < 3) { |
|||
return null; |
|||
} |
|||
if (line.charAt(0) != RFC4566_28181.TYPE_ORIGIN |
|||
|| line.charAt(1) != RFC4566_28181.SEPARATOR) { |
|||
return null; |
|||
} |
|||
line = line.substring(2); |
|||
String[] originArr = line.split(" "); |
|||
if (originArr == null || originArr.length != 6) { |
|||
return null; |
|||
} |
|||
sessionDescription.setUsername(originArr[0]); |
|||
sessionDescription.setId(Long.parseLong(originArr[1])); |
|||
sessionDescription.setVersion(Long.parseLong(originArr[2])); |
|||
sessionDescription.setIpAddress(InetAddress.getByName(originArr[5])); |
|||
|
|||
//name
|
|||
|
|||
line = reader.readLine(); |
|||
if (line.length() < 3) { |
|||
return null; |
|||
} |
|||
if (line.charAt(0) != RFC4566_28181.TYPE_SUBJECT |
|||
|| line.charAt(1) != RFC4566_28181.SEPARATOR) { |
|||
return null; |
|||
} |
|||
sessionDescription.setName(line.substring(2)); |
|||
|
|||
//session connection and attributes
|
|||
Hashtable<String, String> sessionAttributes = new Hashtable<String, String>(); |
|||
sessionDescription.setAttributes(sessionAttributes); |
|||
|
|||
while ((line = reader.readLine()) != null |
|||
&& line.charAt(0) != RFC4566_28181.TYPE_MEDIA) { |
|||
if (line.length() > 3 |
|||
&& line.charAt(0) == RFC4566_28181.TYPE_CONNECTION |
|||
&& line.charAt(1) == RFC4566_28181.SEPARATOR) { |
|||
String connection = parseConnection(line.substring(2)); |
|||
if (connection == null) { |
|||
continue; |
|||
} |
|||
sessionDescription.setIpAddress(InetAddress.getByName(connection)); |
|||
} else if (line.length() > 3 |
|||
&& line.charAt(0) == RFC4566_28181.TYPE_ATTRIBUTE |
|||
&& line.charAt(1) == RFC4566_28181.SEPARATOR) { |
|||
String value = line.substring(2); |
|||
int pos = value.indexOf(RFC4566_28181.ATTR_SEPARATOR); |
|||
if (pos > -1) { |
|||
sessionAttributes.put(value.substring(0, pos), |
|||
value.substring(pos + 1)); |
|||
} else { |
|||
sessionAttributes.put(value, ""); |
|||
} |
|||
} |
|||
} |
|||
if (line == null) { |
|||
return null; |
|||
} |
|||
//we are at the first media line
|
|||
|
|||
ArrayList<SdpLine> mediaLines = new ArrayList<SdpLine>(); |
|||
do { |
|||
if (line.length() < 2) { |
|||
return null; |
|||
} |
|||
if (line.charAt(1) != RFC4566_28181.SEPARATOR) { |
|||
return null; |
|||
} |
|||
if (line.charAt(0) == RFC4566_28181.TYPE_SSRC) { |
|||
sessionDescription.setSsrc(line.length() >=2 ?line.substring(2):""); |
|||
}else if (line.charAt(0) == RFC4566_28181.TYPE_MEDIA_DES) { |
|||
sessionDescription.setGbMediaDescriptions(line.length() >=2 ?line.substring(2):""); |
|||
}else { |
|||
SdpLine mediaLine = new SdpLine(); |
|||
mediaLine.setType(line.charAt(0)); |
|||
mediaLine.setValue(line.substring(2)); |
|||
mediaLines.add(mediaLine); |
|||
} |
|||
|
|||
} |
|||
while ((line = reader.readLine()) != null ); |
|||
|
|||
ArrayList<MediaDescription> mediaDescriptions = new ArrayList<MediaDescription>(); |
|||
sessionDescription.setMediaDescriptions(mediaDescriptions); |
|||
|
|||
for (SdpLine sdpLine : mediaLines) { |
|||
MediaDescription mediaDescription; |
|||
if (sdpLine.getType() == RFC4566_28181.TYPE_MEDIA) { |
|||
String[] mediaArr = sdpLine.getValue().split(" "); |
|||
if (mediaArr == null || mediaArr.length < 4) { |
|||
return null; |
|||
} |
|||
mediaDescription = new MediaDescription(); |
|||
mediaDescription.setType(mediaArr[0]); |
|||
//TODO manage port range
|
|||
mediaDescription.setPort(Integer.parseInt(mediaArr[1])); |
|||
mediaDescription.setAttributes(new Hashtable<String, String>()); |
|||
List<Codec> codecs = new ArrayList<Codec>(); |
|||
for (int i = 3; i < mediaArr.length; ++i) { |
|||
int payloadType = Integer.parseInt(mediaArr[i]); |
|||
Codec codec = new Codec(); |
|||
codec.setPayloadType(payloadType); |
|||
codec.setName("unsupported"); |
|||
codecs.add(codec); |
|||
} |
|||
mediaDescription.setCodecs(codecs); |
|||
mediaDescriptions.add(mediaDescription); |
|||
} else { |
|||
mediaDescription = mediaDescriptions.get(mediaDescriptions.size() - 1); |
|||
String sdpLineValue = sdpLine.getValue(); |
|||
if (sdpLine.getType() == RFC4566_28181.TYPE_CONNECTION) { |
|||
String ipAddress = parseConnection(sdpLineValue); |
|||
mediaDescription.setIpAddress(InetAddress.getByName(ipAddress)); |
|||
} else if (sdpLine.getType() == RFC4566_28181.TYPE_ATTRIBUTE) { |
|||
Hashtable<String, String> attributes = mediaDescription.getAttributes(); |
|||
int pos = sdpLineValue.indexOf(RFC4566_28181.ATTR_SEPARATOR); |
|||
if (pos > -1) { |
|||
String name = sdpLineValue.substring(0, pos); |
|||
String value = sdpLineValue.substring(pos + 1); |
|||
pos = value.indexOf(" "); |
|||
if (pos > -1) { |
|||
int payloadType; |
|||
try { |
|||
payloadType = Integer.parseInt(value.substring(0, pos)); |
|||
List<Codec> codecs = mediaDescription.getCodecs(); |
|||
for (Codec codec: codecs) { |
|||
if (codec.getPayloadType() == payloadType) { |
|||
value = value.substring(pos + 1); |
|||
pos = value.indexOf("/"); |
|||
if (pos > -1) { |
|||
value = value.substring(0, pos); |
|||
codec.setName(value); |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
} catch (NumberFormatException e) { |
|||
attributes.put(name, value); |
|||
} |
|||
} else { |
|||
attributes.put(name, value); |
|||
} |
|||
} else { |
|||
attributes.put(sdpLineValue, ""); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
sessionDescription.setMediaDescriptions(mediaDescriptions); |
|||
|
|||
for (MediaDescription description : mediaDescriptions) { |
|||
if (description.getIpAddress() == null) { |
|||
InetAddress sessionAddress = sessionDescription.getIpAddress(); |
|||
if (sessionAddress == null) { |
|||
return null; |
|||
} |
|||
description.setIpAddress(sessionAddress); |
|||
} |
|||
} |
|||
|
|||
|
|||
return sessionDescription; |
|||
} |
|||
|
|||
private String parseConnection(String line) { |
|||
String[] connectionArr = line.split(" "); |
|||
if (connectionArr == null || connectionArr.length != 3) { |
|||
return null; |
|||
} |
|||
return connectionArr[2]; |
|||
} |
|||
|
|||
} |
@ -1,162 +0,0 @@ |
|||
/* |
|||
This file is part of Peers, a java SIP softphone. |
|||
|
|||
This program is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
|
|||
Copyright 2007, 2008, 2009, 2010 Yohann Martineau |
|||
*/ |
|||
|
|||
package com.genersoft.iot.vmp.gb28181.sdp; |
|||
|
|||
import java.net.Inet4Address; |
|||
import java.net.Inet6Address; |
|||
import java.net.InetAddress; |
|||
import java.util.Hashtable; |
|||
import java.util.List; |
|||
|
|||
public class SessionDescription { |
|||
|
|||
private long id; |
|||
private long version; |
|||
private String name; |
|||
private String username; |
|||
private InetAddress ipAddress; |
|||
private List<MediaDescription> mediaDescriptions; |
|||
private Hashtable<String, String> attributes; |
|||
private String ssrc; |
|||
private String gbMediaDescriptions; |
|||
|
|||
public SessionDescription() { |
|||
} |
|||
|
|||
public long getId() { |
|||
return id; |
|||
} |
|||
|
|||
public void setId(long id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
public InetAddress getIpAddress() { |
|||
return ipAddress; |
|||
} |
|||
|
|||
public void setIpAddress(InetAddress ipAddress) { |
|||
this.ipAddress = ipAddress; |
|||
} |
|||
|
|||
public List<MediaDescription> getMediaDescriptions() { |
|||
return mediaDescriptions; |
|||
} |
|||
|
|||
public void setMediaDescriptions(List<MediaDescription> mediaDescriptions) { |
|||
this.mediaDescriptions = mediaDescriptions; |
|||
} |
|||
|
|||
public String getName() { |
|||
return name; |
|||
} |
|||
|
|||
public void setName(String name) { |
|||
this.name = name; |
|||
} |
|||
|
|||
public String getUsername() { |
|||
return username; |
|||
} |
|||
|
|||
public void setUsername(String username) { |
|||
this.username = username; |
|||
} |
|||
|
|||
public long getVersion() { |
|||
return version; |
|||
} |
|||
|
|||
public void setVersion(long version) { |
|||
this.version = version; |
|||
} |
|||
|
|||
public Hashtable<String, String> getAttributes() { |
|||
return attributes; |
|||
} |
|||
|
|||
public void setAttributes(Hashtable<String, String> attributes) { |
|||
this.attributes = attributes; |
|||
} |
|||
|
|||
public String getSsrc() { |
|||
return ssrc; |
|||
} |
|||
|
|||
public void setSsrc(String ssrc) { |
|||
this.ssrc = ssrc; |
|||
} |
|||
|
|||
public String getGbMediaDescriptions() { |
|||
return gbMediaDescriptions; |
|||
} |
|||
|
|||
public void setGbMediaDescriptions(String gbMediaDescriptions) { |
|||
this.gbMediaDescriptions = gbMediaDescriptions; |
|||
} |
|||
|
|||
@Override |
|||
public String toString() { |
|||
StringBuilder buf = new StringBuilder(); |
|||
buf.append("v=0\r\n"); |
|||
buf.append("o=").append(username).append(" ").append(id); |
|||
buf.append(" ").append(version); |
|||
int ipVersion; |
|||
if (ipAddress instanceof Inet4Address) { |
|||
ipVersion = 4; |
|||
} else if (ipAddress instanceof Inet6Address) { |
|||
ipVersion = 6; |
|||
} else { |
|||
throw new RuntimeException("unknown ip version: " + ipAddress); |
|||
} |
|||
buf.append(" IN IP").append(ipVersion).append(" "); |
|||
String hostAddress = ipAddress.getHostAddress(); |
|||
buf.append(hostAddress).append("\r\n"); |
|||
buf.append("s=").append(name).append("\r\n"); |
|||
buf.append("c=IN IP").append(ipVersion).append(" "); |
|||
buf.append(hostAddress).append("\r\n"); |
|||
buf.append("t=0 0\r\n"); |
|||
if (attributes != null){ |
|||
for (String attributeName: attributes.keySet()) { |
|||
String attributeValue = attributes.get(attributeName); |
|||
buf.append("a=").append(attributeName); |
|||
if (attributeValue != null && !"".equals(attributeValue.trim())) { |
|||
buf.append(":"); |
|||
buf.append(attributeValue); |
|||
buf.append("\r\n"); |
|||
} |
|||
} |
|||
} |
|||
if (mediaDescriptions != null){ |
|||
for (MediaDescription mediaDescription: mediaDescriptions) { |
|||
buf.append(mediaDescription.toString()); |
|||
} |
|||
} |
|||
|
|||
if (ssrc != null){ |
|||
buf.append("y=").append(ssrc).append("\r\n"); |
|||
} |
|||
if (gbMediaDescriptions != null){ |
|||
buf.append("f=").append(gbMediaDescriptions).append("\r\n"); |
|||
} |
|||
return buf.toString(); |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue