* @return Return the initial local SDP.
*/
public static SessionDescriptor createInitialSdp(String userName, String viaAddress,
int audioPort, int videoPort, String audioCodecsPrecedence) {
SessionDescriptor initialDescriptor = null;
try {
log.debug("userName = [" + userName + "], viaAddress = [" + viaAddress +
"], audioPort = [" + audioPort + "], videoPort = [" + videoPort +
"], audioCodecsPrecedence = [" + audioCodecsPrecedence + "]." );
int audioCodecsNumber = CodecFactory.getInstance().getAvailableAudioCodecsCount();
int videoCodecsNumber = CodecFactory.getInstance().getAvailableVideoCodecsCount();
if ((audioCodecsNumber == 0) && (videoCodecsNumber == 0)) {
log.debug("audioCodecsNumber = [" + audioCodecsNumber +
"], videoCodecsNumber = [" + videoCodecsNumber + "].");
return null;
}
//Bug Session descriptor cannot have spaces.. Username is not forced to be compliant with SIP Spec
/* RFC 2327 - page 8 of April 1998 Version,
Origin
o=<username> <session id> <version> <network type> <address type>
<address>
The "o=" field gives the originator of the session (their username
and the address of the user's host) plus a session id and session
version number.
<username> is the user's login on the originating host, or it is "-"
if the originating host does not support the concept of user ids.
<username> must not contain spaces. <session id> is a numeric string
such that the tuple of <username>, <session id>, <network type>,
<address type> and <address> form a globally unique identifier for
the session.
*/
String owner = userName.replaceAll(" ", "_");
initialDescriptor = new SessionDescriptor(owner, viaAddress);
if (initialDescriptor == null) {
log.error("Error instantiating the initialDescriptor!");
return null;
}
if (audioCodecsNumber > 0) {
Codec[] audioCodecs;
Vector<AttributeField> audioAttributes = new Vector<AttributeField>();
if (audioCodecsPrecedence.isEmpty()) {
audioCodecs = CodecFactory.getInstance().getAvailableAudioCodecs();
} else {
audioCodecs = CodecFactory.getInstance().getAvailableAudioCodecsWithPrecedence(audioCodecsPrecedence);
}
for (int audioIndex = 0; audioIndex < audioCodecsNumber; audioIndex++) {
String payloadId = String.valueOf(audioCodecs[audioIndex].getCodecId());
String rtpmapParamValue = payloadId;
rtpmapParamValue += " " + audioCodecs[audioIndex].getCodecName();
rtpmapParamValue += "/" + audioCodecs[audioIndex].getSampleRate() + "/1";
log.debug("Adding rtpmap for payload [" + payloadId +
"] with value = [" + rtpmapParamValue + "]." );
audioAttributes.add(new AttributeField(Codec.ATTRIBUTE_RTPMAP, rtpmapParamValue));
String[] codecMediaAttributes = audioCodecs[audioIndex].getCodecMediaAttributes();
if (codecMediaAttributes != null) {
log.debug("Adding " + codecMediaAttributes.length +
" audio codec media attributes." );
for (int attribIndex = 0; attribIndex < codecMediaAttributes.length; attribIndex++) {
log.debug("Adding audio media attribute [" +
codecMediaAttributes[attribIndex] + "]." );
AttributeField newAttribute = parseAttributeField(codecMediaAttributes[attribIndex]);
if (newAttribute != null) {
audioAttributes.add(newAttribute);
}
}
} else {
log.warn("Audio codec has no especific media attributes." );
}
}
// Calculate the format list to be used on MediaDescriptor creation.
String formatList = getFormatList(audioAttributes);
for (Enumeration attributesEnum = audioAttributes.elements(); attributesEnum.hasMoreElements();) {
AttributeField audioAttribute = (AttributeField) attributesEnum.nextElement();
if (initialDescriptor.getMediaDescriptor(Codec.MEDIA_TYPE_AUDIO) == null) {
log.debug("Creating audio media descriptor." );
MediaField mf = new MediaField(Codec.MEDIA_TYPE_AUDIO, audioPort, 0, "RTP/AVP", formatList);
initialDescriptor.addMedia(mf, audioAttribute);
} else {
log.debug("Just adding attribute.");
initialDescriptor.getMediaDescriptor(Codec.MEDIA_TYPE_AUDIO).addAttribute(audioAttribute);
}
}
String[] commonAudioMediaAttributes = CodecFactory.getInstance().getCommonAudioMediaAttributes();
if (commonAudioMediaAttributes != null) {
log.debug("Adding " + commonAudioMediaAttributes.length + " common audio media attributes." );
for (int attribIndex = 0; attribIndex < commonAudioMediaAttributes.length; attribIndex++) {
log.debug("Adding common audio media attribute [" + commonAudioMediaAttributes[attribIndex] + "].");
AttributeField newAttribute = parseAttributeField(commonAudioMediaAttributes[attribIndex]);
if (newAttribute != null) {
initialDescriptor.getMediaDescriptor(Codec.MEDIA_TYPE_AUDIO).addAttribute( newAttribute);
}
}
} else {
log.debug("No common audio media attributes.");
}
}
if (videoCodecsNumber > 0) {
Codec[] videoCodecs = CodecFactory.getInstance().getAvailableVideoCodecs();
Vector<AttributeField> videoAttributes = new Vector<AttributeField>();
for (int videoIndex = 0; videoIndex < audioCodecsNumber; videoIndex++) {
String payloadId = String.valueOf(videoCodecs[videoIndex].getCodecId());
String rtpmapParamValue = payloadId;
rtpmapParamValue += " " + videoCodecs[videoIndex].getCodecName();
rtpmapParamValue += "/" + videoCodecs[videoIndex].getSampleRate() + "/1";
log.debug("Adding rtpmap for payload [" + payloadId + "] with value = [" + rtpmapParamValue + "].");
videoAttributes.add(new AttributeField(Codec.ATTRIBUTE_RTPMAP, rtpmapParamValue));
String[] codecMediaAttributes = videoCodecs[videoIndex].getCodecMediaAttributes();
if (codecMediaAttributes != null) {
log.debug("Adding " + codecMediaAttributes.length + " video codec media attributes.");
for (int attribIndex = 0; attribIndex < codecMediaAttributes.length; attribIndex++) {
log.debug("Adding video media attribute [" + codecMediaAttributes[attribIndex] + "].");
AttributeField newAttribute = parseAttributeField(codecMediaAttributes[attribIndex]);
if (newAttribute != null) {
videoAttributes.add(newAttribute);
}
}
} else {
log.info("Video codec has no especific media attributes.");
}
}
// Calculate the format list to be used on MediaDescriptor creation.
String formatList = getFormatList(videoAttributes);
for (Enumeration attributesEnum = videoAttributes.elements(); attributesEnum.hasMoreElements();) {
AttributeField videoAttribute = (AttributeField) attributesEnum.nextElement();
if (initialDescriptor.getMediaDescriptor(Codec.MEDIA_TYPE_VIDEO) == null) {
MediaField mf = new MediaField(Codec.MEDIA_TYPE_VIDEO, audioPort, 0, "RTP/AVP", formatList);
initialDescriptor.addMedia(mf, videoAttribute);
} else {
initialDescriptor.getMediaDescriptor(Codec.MEDIA_TYPE_VIDEO).addAttribute(videoAttribute);
}
}
String[] commonVideoMediaAttributes = CodecFactory.getInstance().getCommonAudioMediaAttributes();
if (commonVideoMediaAttributes != null) {
log.debug("Adding " + commonVideoMediaAttributes.length + " common video media attributes.");
for (int attribIndex = 0; attribIndex < commonVideoMediaAttributes.length; attribIndex++) {
log.debug("Adding common video media attribute [" + commonVideoMediaAttributes[attribIndex] + "]." );
AttributeField newAttribute = parseAttributeField(commonVideoMediaAttributes[attribIndex]);
if (newAttribute != null) {
initialDescriptor.getMediaDescriptor(Codec.MEDIA_TYPE_VIDEO).addAttribute(newAttribute);
}
}
} else {
log.info("No common video media attributes.");
}