You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openmeetings.apache.org by co...@google.com on 2013/02/21 10:11:38 UTC
[red5phone] r96 committed - Video support: NPE are not thrown in case
there is no video configured...
Revision: 96
Author: solomax666@gmail.com
Date: Thu Feb 21 01:11:26 2013
Log: Video support: NPE are not thrown in case there is no video
configured;
code clean up;
http://code.google.com/p/red5phone/source/detail?r=96
Modified:
/branches/red5sip/src/java/org/red5/sip/app/SdpUtils.java
=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/SdpUtils.java Tue Feb 19
11:33:08 2013
+++ /branches/red5sip/src/java/org/red5/sip/app/SdpUtils.java Thu Feb 21
01:11:26 2013
@@ -14,776 +14,690 @@
public class SdpUtils {
- protected static Logger log = LoggerFactory.getLogger( SdpUtils.class
);
-
-
- public static SIPCodec getNegotiatedVideoCodec(SessionDescriptor
negotiatedSDP) {
- String rtpmap =
negotiatedSDP.getMediaDescriptor(SIPCodec.MEDIA_TYPE_VIDEO).
- getAttribute(SIPCodec.ATTRIBUTE_RTPMAP).getAttributeValue();
- printLog( "getNegotiatedVideoCodec", "rtpmap = [" + rtpmap + "]." );
- if (rtpmap.isEmpty()) return null;
- int payloadId = Integer.parseInt(rtpmap.substring(0,
rtpmap.indexOf(" ")));
- SIPCodec sipCodec =
SIPCodecFactory.getInstance().getSIPMediaCodec(payloadId);
- if ( sipCodec == null ) {
-
- printLog( "getNegotiatedAudioCodec", "Error... codec not
found." );
- }
- else {
-
- printLog( "getNegotiatedAudioCodec",
- "payloadType = " + sipCodec.getCodecId() +
- ", payloadName = " + sipCodec.getCodecName() + "." );
- }
- return sipCodec;
- }
-
- /**
- * @return Returns the audio codec to be used on current session.
- */
- public static SIPCodec getNegotiatedAudioCodec( SessionDescriptor
negotiatedSDP )
- {
- int payloadId;
- String rtpmap;
- SIPCodec sipCodec = null;
-
- printLog( "getNegotiatedAudioCodec", "Init..." );
-
- rtpmap = negotiatedSDP.getMediaDescriptor(
SIPCodec.MEDIA_TYPE_AUDIO ).
- getAttribute( SIPCodec.ATTRIBUTE_RTPMAP
).getAttributeValue();
-
- printLog( "getNegotiatedAudioCodec", "rtpmap = [" + rtpmap + "]."
);
-
- if ( !rtpmap.isEmpty() ) {
-
- payloadId = Integer.parseInt(
- rtpmap.substring(0, rtpmap.indexOf(" ")));
-
- printLog( "getNegotiatedAudioCodec", "payloadId = [" +
payloadId + "]." );
-
- sipCodec = SIPCodecFactory.getInstance().getSIPMediaCodec(
payloadId );
-
- if ( sipCodec == null ) {
-
- printLog( "getNegotiatedAudioCodec", "Error... codec not
found." );
- }
- else {
-
- printLog( "getNegotiatedAudioCodec",
- "payloadType = " + sipCodec.getCodecId() +
- ", payloadName = " + sipCodec.getCodecName() + "."
);
- }
- }
-
- printLog( "getNegotiatedAudioCodec", "End..." );
-
- return sipCodec;
- }
-
-
- /**
- *
- * @param userName
- * @param viaAddress
- *
- * @return Return the initial local SDP.
- */
- public static SessionDescriptor createInitialSdp(
- String userName, String viaAddress, int audioPort,
- int videoPort, String audioCodecsPrecedence ) {
-
- SessionDescriptor initialDescriptor = null;
-
- printLog( "createInitialSdp", "Init..." );
-
- try {
-
- printLog( "createInitialSdp",
- "userName = [" + userName + "], viaAddress = [" +
viaAddress +
- "], audioPort = [" + audioPort + "], videoPort = [" +
videoPort +
- "], audioCodecsPrecedence = [" + audioCodecsPrecedence
+ "]." );
-
- int audioCodecsNumber =
SIPCodecFactory.getInstance().getAvailableAudioCodecsCount();
- int videoCodecsNumber =
SIPCodecFactory.getInstance().getAvailableVideoCodecsCount();
-
- if ( ( audioCodecsNumber == 0 ) && ( videoCodecsNumber == 0 )
) {
-
- printLog( "createInitialSdp",
- "audioCodecsNumber = [" + audioCodecsNumber +
- "], videoCodecsNumber = [" + videoCodecsNumber
+ "]." );
-
- return null;
- }
-
- initialDescriptor = new SessionDescriptor( userName,
viaAddress );
-
- if ( audioCodecsNumber > 0 ) {
-
- SIPCodec[] audioCodecs;
- Vector<AttributeField> audioAttributes = new
Vector<AttributeField>();
-
- if ( audioCodecsPrecedence.isEmpty() ) {
-
- audioCodecs =
SIPCodecFactory.getInstance().getAvailableAudioCodecs();
- }
- else {
-
- audioCodecs = SIPCodecFactory.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";
-
- printLog( "createInitialSdp",
- "Adding rtpmap for payload [" + payloadId +
- "] with value = [" + rtpmapParamValue + "]." );
-
- audioAttributes.add( new AttributeField(
- SIPCodec.ATTRIBUTE_RTPMAP, rtpmapParamValue )
);
-
- String[] codecMediaAttributes =
-
audioCodecs[audioIndex].getCodecMediaAttributes();
-
- if ( codecMediaAttributes != null ) {
-
- printLog( "createInitialSdp",
- "Adding " + codecMediaAttributes.length +
- " audio codec media attributes." );
-
- for ( int attribIndex = 0; attribIndex <
codecMediaAttributes.length; attribIndex++ ) {
-
- printLog( "createInitialSdp",
- "Adding audio media attribute [" +
- codecMediaAttributes[attribIndex]
+ "]." );
-
- AttributeField newAttribute =
- parseAttributeField(
codecMediaAttributes[attribIndex] );
-
- if ( newAttribute != null ) {
-
- audioAttributes.add( newAttribute );
- }
- }
- }
- else {
-
- printLog( "createInitialSdp",
- "Audio codec has no especific media
attributes." );
- }
- }
-
- // Calculate the format list to be used on MediaDescriptor
creation.
- String formatList = getFormatList( audioAttributes );
-
- for ( Enumeration<AttributeField> attributesEnum =
audioAttributes.elements(); attributesEnum.hasMoreElements(); ) {
-
- AttributeField audioAttribute =
attributesEnum.nextElement();
-
- if ( initialDescriptor.getMediaDescriptor(
SIPCodec.MEDIA_TYPE_AUDIO ) == null ) {
-
- printLog( "createInitialSdp",
- "Creating audio media descriptor." );
-
- initialDescriptor.addMedia(
- new MediaField( SIPCodec.MEDIA_TYPE_AUDIO,
audioPort, 0, "RTP/AVP", formatList ),
- audioAttribute );
- }
- else {
-
- printLog( "createInitialSdp",
- "Just adding attribute." );
-
- initialDescriptor.getMediaDescriptor(
SIPCodec.MEDIA_TYPE_AUDIO ).
- addAttribute( audioAttribute );
- }
- }
-
- String[] commonAudioMediaAttributes =
-
SIPCodecFactory.getInstance().getCommonAudioMediaAttributes();
-
- if ( commonAudioMediaAttributes != null ) {
-
- printLog( "createInitialSdp", "Adding " +
- commonAudioMediaAttributes.length + " common
audio media attributes." );
-
- for ( int attribIndex = 0; attribIndex <
commonAudioMediaAttributes.length; attribIndex++ ) {
-
- printLog( "createInitialSdp",
- "Adding common audio media attribute [" +
- commonAudioMediaAttributes[attribIndex]
+ "]." );
-
- AttributeField newAttribute =
- parseAttributeField(
commonAudioMediaAttributes[attribIndex] );
-
- if ( newAttribute != null ) {
-
- initialDescriptor.getMediaDescriptor(
SIPCodec.MEDIA_TYPE_AUDIO ).
- addAttribute( newAttribute );
- }
- }
- }
- else {
-
- printLog( "createInitialSdp", "No common audio media
attributes." );
- }
- }
-
- if ( videoCodecsNumber > 0 ) {
-
- SIPCodec[] videoCodecs =
SIPCodecFactory.getInstance().getAvailableVideoCodecs();
- Vector<AttributeField> videoAttributes = new
Vector<AttributeField>();
-
- for ( int videoIndex = 0; videoIndex < videoCodecsNumber;
videoIndex++ ) {
-
- String payloadId = String.valueOf(
videoCodecs[videoIndex].getCodecId() );
- String rtpmapParamValue = payloadId;
- rtpmapParamValue += " " +
videoCodecs[videoIndex].getCodecName();
- rtpmapParamValue += "/" +
videoCodecs[videoIndex].getSampleRate() + "/1";
-
- printLog( "createInitialSdp",
- "Adding rtpmap for payload [" + payloadId +
- "] with value = [" + rtpmapParamValue + "]." );
-
- videoAttributes.add( new AttributeField(
- SIPCodec.ATTRIBUTE_RTPMAP, rtpmapParamValue )
);
-
- String[] codecMediaAttributes =
videoCodecs[videoIndex].getCodecMediaAttributes();
-
- if ( codecMediaAttributes != null ) {
-
- printLog( "createInitialSdp",
- "Adding " + codecMediaAttributes.length +
- " video codec media attributes." );
-
- for ( int attribIndex = 0; attribIndex <
codecMediaAttributes.length; attribIndex++ ) {
-
- printLog( "createInitialSdp",
- "Adding video media attribute [" +
- codecMediaAttributes[attribIndex]
+ "]." );
-
- AttributeField newAttribute =
- parseAttributeField(
codecMediaAttributes[attribIndex] );
-
- if ( newAttribute != null ) {
-
- videoAttributes.add( newAttribute );
- }
- }
- }
- else {
-
- printLog( "createInitialSdp",
- "Video codec has no especific media
attributes." );
- }
- }
-
- // Calculate the format list to be used on MediaDescriptor
creation.
- String formatList = getFormatList( videoAttributes );
-
- for ( Enumeration<AttributeField> attributesEnum =
videoAttributes.elements(); attributesEnum.hasMoreElements(); ) {
-
- AttributeField videoAttribute =
attributesEnum.nextElement();
-
- if ( initialDescriptor.getMediaDescriptor(
SIPCodec.MEDIA_TYPE_VIDEO ) == null ) {
-
- initialDescriptor.addMedia(
- new MediaField( SIPCodec.MEDIA_TYPE_VIDEO,
videoPort, 0, "RTP/AVP", formatList ),
- videoAttribute );
- }
- else {
-
- initialDescriptor.getMediaDescriptor(
SIPCodec.MEDIA_TYPE_VIDEO ).
- addAttribute( videoAttribute );
- }
- }
-
- String[] commonVideoMediaAttributes =
-
SIPCodecFactory.getInstance().getCommonVideoMediaAttributes();
-
- if ( commonVideoMediaAttributes != null ) {
-
- printLog( "createInitialSdp", "Adding " +
- commonVideoMediaAttributes.length + " common
video media attributes." );
-
- for ( int attribIndex = 0; attribIndex <
commonVideoMediaAttributes.length; attribIndex++ ) {
-
- printLog( "createInitialSdp",
- "Adding common video media attribute [" +
- commonVideoMediaAttributes[attribIndex]
+ "]." );
-
- AttributeField newAttribute =
- parseAttributeField(
commonVideoMediaAttributes[attribIndex] );
-
- if ( newAttribute != null ) {
-
- initialDescriptor.getMediaDescriptor(
SIPCodec.MEDIA_TYPE_VIDEO ).
- addAttribute( newAttribute );
- }
- }
- }
- else {
-
- printLog( "createInitialSdp", "No common video media
attributes." );
- }
- }
- }
- catch ( Exception exception ) {
-
- printLog( "createInitialSdp", "Failure creating initial SDP: "
);
- log.error("Exception", exception);
- }
-
- printLog( "createInitialSdp", "End..." );
-
- return initialDescriptor;
- }
-
-
- private static String getFormatList( Vector<AttributeField>
mediaAttributes ) {
-
- AttributeField mediaAttribute = null;
- String formatList = "";
-
- printLog( "getFormatList", "Init..." );
-
- for ( Enumeration<AttributeField> attributeEnum =
mediaAttributes.elements(); attributeEnum.hasMoreElements(); ) {
-
- mediaAttribute = (AttributeField) attributeEnum.nextElement();
-
- if ( mediaAttribute.getAttributeName().equalsIgnoreCase(
SIPCodec.ATTRIBUTE_RTPMAP ) ) {
-
- if ( !formatList.isEmpty() ) {
- formatList += " ";
- }
-
- formatList += getPayloadIdFromAttribute( mediaAttribute );
- }
- }
-
- printLog( "getFormatList", "formatList = [" + formatList + "]." );
-
- printLog( "getFormatList", "End..." );
-
- return formatList;
- }
-
-
- private static AttributeField parseAttributeField( String
codecMediaAttribute ) {
-
- AttributeField newAttribute = null;
-
- printLog( "parseAttributeField", "Init..." );
-
- printLog( "parseAttributeField",
- "codecMediaAttribute = [" + codecMediaAttribute + "]." );
-
- String attribName = codecMediaAttribute.substring(
- 0, codecMediaAttribute.indexOf( ":" ) );
- String attribValue = codecMediaAttribute.substring(
- codecMediaAttribute.indexOf( ":" ) + 1 );
-
- printLog( "parseAttributeField",
- "attribName = [" + attribName +
- "] attribValue = [" + attribValue + "]." );
-
- if ( ( !attribName.isEmpty() ) && ( !attribValue.isEmpty() ) ) {
-
- newAttribute = new AttributeField( attribName, attribValue );
- }
-
- printLog( "parseAttributeField", "End..." );
-
- return newAttribute;
- }
-
-
- /**
- * We must validate the existence of all remote "rtpmap" attributes
- * on local SDP.
- * If some exist, we add it to newSdp negotiated SDP result.
- *
- * @param localSdp
- * @param remoteSdp
- *
- * @return Returns the new local descriptor as a result of media
- * payloads negotiation.
- */
- public static SessionDescriptor makeMediaPayloadsNegotiation(
- SessionDescriptor localSdp, SessionDescriptor remoteSdp ) {
-
- SessionDescriptor newSdp = null;
-
- printLog( "makeMediaPayloadsNegotiation", "Init..." );
-
- try {
-
- newSdp = new SessionDescriptor( remoteSdp.getOrigin(),
remoteSdp.getSessionName(),
- localSdp.getConnection(), localSdp.getTime() );
-
- Vector<MediaDescriptor> remoteDescriptors =
remoteSdp.getMediaDescriptors();
-
- for ( Enumeration<MediaDescriptor> descriptorsEnum =
remoteDescriptors.elements(); descriptorsEnum.hasMoreElements(); ) {
-
- MediaDescriptor remoteDescriptor = (MediaDescriptor)
descriptorsEnum.nextElement();
- MediaDescriptor localDescriptor =
localSdp.getMediaDescriptor(
- remoteDescriptor.getMedia().getMedia() );
-
- if ( localDescriptor != null ) {
-
- Vector<AttributeField> remoteAttributes =
remoteDescriptor.getAttributes( SIPCodec.ATTRIBUTE_RTPMAP );
- Vector<AttributeField> newSdpAttributes = new
Vector<AttributeField>();
-
- for ( Enumeration<AttributeField> attributesEnum =
remoteAttributes.elements(); attributesEnum.hasMoreElements(); ) {
-
- AttributeField remoteAttribute =
attributesEnum.nextElement();
-
- String payloadId = getPayloadIdFromAttribute(
remoteAttribute );
-
- if ( "".equals( payloadId ) ) {
-
- printLog( "makeMediaPayloadsNegotiation",
- "Error! Payload id not found on
attribute: Name = [" +
- remoteAttribute.getAttributeName()
+ "], Value = [" +
- remoteAttribute.getAttributeValue()
+ "]." );
- }
- else if ( findAttributeByPayloadId(
- remoteAttribute.getAttributeName(),
payloadId,
- localDescriptor ) != null ) {
-
- newSdpAttributes.add( remoteAttribute );
- }
- }
-
- // Calculate the format list to be used on
MediaDescriptor creation.
- String formatList = getFormatList( newSdpAttributes );
-
- for ( Enumeration<AttributeField> attributesEnum =
newSdpAttributes.elements(); attributesEnum.hasMoreElements(); ) {
-
- AttributeField mediaAttribute =
attributesEnum.nextElement();
-
- newSdp.addMediaDescriptor( new MediaDescriptor(
- new MediaField(
localDescriptor.getMedia().getMedia(),
-
localDescriptor.getMedia().getPort(),
- 0,
- localDescriptor.getMedia().getTransport(),
- formatList ),
- localDescriptor.getConnection() ) );
-
- newSdp.getMediaDescriptor(
localDescriptor.getMedia().getMedia() ).
- addAttribute( mediaAttribute );
- }
- }
- }
- }
- catch ( Exception exception ) {
-
- printLog( "makeMediaPayloadsNegotiation", "Failure creating
initial SDP: " );
- log.error("Exception", exception);
- }
-
- printLog( "makeMediaPayloadsNegotiation", "End..." );
-
- return newSdp;
- }
-
-
- /**
- * Parameter "newSdp" must be the returning value from method's
- * "makeMediaPayloadsNegotiation" execution.
- * Here the pending attributes will be negotiated as well.
- *
- * @param newSdp
- * @param localSdp
- * @param remoteSdp
- *
- */
- public static void completeSdpNegotiation(
- SessionDescriptor newSdp, SessionDescriptor localSdp,
- SessionDescriptor remoteSdp ) {
-
- printLog( "makeSdpNegotiation", "Init..." );
-
- try {
-
- if ( newSdp.getMediaDescriptors().size() == 0 ) {
-
- // Something is wrong.
- // We should have at least a "audio" media descriptor with
- // all audio payloads suported.
-
- printLog( "completeSdpNegotiation",
- "Error! No media descriptors after
\"makeMediaPayloadsNegotiation\"." );
-
- return;
- }
-
- Vector<MediaDescriptor> remoteDescriptors =
remoteSdp.getMediaDescriptors();
-
- for ( Enumeration<MediaDescriptor> descriptorsEnum =
remoteDescriptors.elements(); descriptorsEnum.hasMoreElements(); ) {
-
- MediaDescriptor remoteDescriptor =
descriptorsEnum.nextElement();
- MediaDescriptor localDescriptor =
localSdp.getMediaDescriptor(
- remoteDescriptor.getMedia().getMedia() );
-
- if ( localDescriptor != null ) {
-
- // First we make the negotiation of remote attributes
with
- // local ones to generate the new SDP "newSdp".
-
- Vector<AttributeField> remoteAttributes =
remoteDescriptor.getAttributes();
-
- for ( Enumeration<AttributeField> atributesEnum =
remoteAttributes.elements(); atributesEnum.hasMoreElements(); ) {
-
- AttributeField remoteAttribute =
atributesEnum.nextElement();
-
- makeAttributeNegotiation( newSdp, localDescriptor,
remoteAttribute );
- }
-
- // Now we add to "newSdp" all the local attributes that
- // were not negotiated yet.
-
- Vector<AttributeField> localAttributes =
localDescriptor.getAttributes();
-
- for ( Enumeration<AttributeField> atributesEnum =
localAttributes.elements(); atributesEnum.hasMoreElements(); ) {
-
- AttributeField localAttribute = (AttributeField)
atributesEnum.nextElement();
- MediaDescriptor newLocalDescriptor =
- newSdp.getMediaDescriptor(
localDescriptor.getMedia().getMedia() );
-
- if ( isPayloadRelatedAttribute( localAttribute ) )
{
-
- String payloadId = getPayloadIdFromAttribute(
localAttribute );
-
- if ( findAttributeByPayloadId(
- localAttribute.getAttributeName(),
- payloadId,
- newLocalDescriptor) == null ) {
-
- newLocalDescriptor.addAttribute(
localAttribute );
- }
- }
- else if ( newLocalDescriptor.getAttribute(
- localAttribute.getAttributeName() ) ==
null ) {
-
- newLocalDescriptor.addAttribute(
localAttribute );
- }
- }
- }
- }
- }
- catch ( Exception exception ) {
-
- printLog( "completeSdpNegotiation", "Failure creating initial
SDP: " );
- log.error("Exception", exception);
- }
-
- printLog( "completeSdpNegotiation", "End..." );
- }
-
-
- /**
- * Here we make the negotiation of all attributes besides "rtpmap" (
- * these are negotiated on "makeMediaPayloadsNegotiation" method).
- *
- * @param newSdp
- * @param localMedia
- * @param remoteAttribute
- */
- private static void makeAttributeNegotiation(
- SessionDescriptor newSdp, MediaDescriptor localMedia,
AttributeField remoteAttribute ) {
-
- printLog( "makeAttributeNegotiation", "Init..." );
-
- try {
-
- printLog( "makeAttributeNegotiation",
- "AttributeName = [" +
remoteAttribute.getAttributeName() +
- "], AttributeValue = [" +
remoteAttribute.getAttributeValue() + "].");
-
- if ( remoteAttribute.getAttributeName().equals(
SIPCodec.ATTRIBUTE_RTPMAP ) ) {
-
- printLog( "makeAttributeNegotiation",
- "\"rtpmap\" attributes were already negotiated." );
- }
- else if ( !isPayloadRelatedAttribute( remoteAttribute ) ) {
-
- // We do nothing with attributes that are not payload
- // related, like: "ptime", "direction", etc.
- // For now, we consider that they don't demand negotiation.
-
- printLog( "makeAttributeNegotiation",
- "Attribute is not payload related. Do not
negotiate it..." );
- }
- else {
-
- String payloadId = getPayloadIdFromAttribute(
remoteAttribute );
-
- if ( "".equals( payloadId ) ) {
-
- printLog( "makeAttributeNegotiation",
- "Error! Payload id not found on attribute:
Name = [" +
- remoteAttribute.getAttributeName() + "], Value
= [" +
- remoteAttribute.getAttributeValue() + "]." );
- }
- // We must be sure this attribute is related with a payload
- // already present on newSdp.
- else if ( findAttributeByPayloadId(
SIPCodec.ATTRIBUTE_RTPMAP, payloadId,
- newSdp.getMediaDescriptor(
localMedia.getMedia().getMedia() ) ) != null ) {
-
- printLog( "makeAttributeNegotiation",
- "Payload " + payloadId + " present on newSdp."
);
-
- AttributeField localAttribute =
findAttributeByPayloadId(
- remoteAttribute.getAttributeName(), payloadId,
localMedia );
-
- SIPCodec sipCodec =
SIPCodecFactory.getInstance().getSIPMediaCodec(
- Integer.valueOf( payloadId ) );
-
- if ( sipCodec != null ) {
-
- String localAttibuteValue = "";
-
- if ( localAttribute != null ) {
-
- localAttibuteValue =
localAttribute.getAttributeValue();
- }
- else {
-
- printLog( "makeAttributeNegotiation",
- "Attribute not found on local media."
);
- }
-
- String attributeValueResult =
sipCodec.codecNegotiateAttribute(
- remoteAttribute.getAttributeName(),
- localAttibuteValue,
- remoteAttribute.getAttributeValue() );
-
- if ( ( attributeValueResult != null ) &&
( !"".equals( attributeValueResult ) ) ) {
-
- newSdp.getMediaDescriptor(
localMedia.getMedia().getMedia() ).
- addAttribute( new AttributeField(
-
remoteAttribute.getAttributeName(), attributeValueResult ) );
- }
- }
- else {
-
- printLog( "makeAttributeNegotiation", "Codec not
found!" );
- }
- }
- }
- }
- catch ( Exception exception ) {
-
- printLog( "makeAttributeNegotiation", "Failure creating
initial SDP: " );
- log.error("Exception", exception);
- }
-
- printLog( "makeAttributeNegotiation", "End..." );
- }
-
-
- private static AttributeField findAttributeByPayloadId(
- String attributeName, String payloadId, MediaDescriptor
mediaDescriptor ) {
-
- printLog( "findAttributeByPayloadId", "Init..." );
-
- AttributeField searchingMediaAttribute = null;
-
- printLog( "findAttributeByPayloadId",
- "attributeName = [" + attributeName +
- "], payloadId = [" + payloadId + "]." );
-
- Vector<AttributeField> mediaAttributes =
mediaDescriptor.getAttributes( attributeName );
-
- for ( Enumeration<AttributeField> attributesEnum =
mediaAttributes.elements(); attributesEnum.hasMoreElements(); ) {
-
- AttributeField mediaAttribute = (AttributeField)
attributesEnum.nextElement();
-
- printLog( "findAttributeByPayloadId",
- "Validating attribute with name = [" +
mediaAttribute.getAttributeName() +
- "] and value = [" + mediaAttribute.getAttributeValue()
+ "]." );
-
- if ( getPayloadIdFromAttribute( mediaAttribute ).equals(
payloadId ) ) {
-
- searchingMediaAttribute = mediaAttribute;
- break;
- }
- }
-
- if ( searchingMediaAttribute != null ) {
-
- printLog( "findAttributeByPayloadId",
- "Attribute found with name = [" +
- searchingMediaAttribute.getAttributeName() + "] and
value = [" +
- searchingMediaAttribute.getAttributeValue() + "]." );
- }
- else {
-
- printLog( "findAttributeByPayloadId",
- "Attribute with name [" + attributeName +
- "] and payloadId [" + payloadId + "] was not found." );
- }
-
- printLog( "findAttributeByPayloadId", "End..." );
-
- return searchingMediaAttribute;
- }
-
-
- private static String getPayloadIdFromAttribute( AttributeField
attribute ) {
-
- String payloadId = "";
-
- printLog( "getPayloadIdFromAttribute", "Init..." );
-
- printLog( "getPayloadIdFromAttribute",
- "AttributeName = [" + attribute.getAttributeName() +
- "], AttributeValue = [" + attribute.getAttributeValue()
+ "]." );
-
- if ( isPayloadRelatedAttribute( attribute ) ) {
-
- payloadId = attribute.getAttributeValue().substring( 0,
- attribute.getAttributeValue().indexOf( " " ) );
- }
-
- printLog( "getPayloadIdFromAttribute", "payloadId = " + payloadId
);
-
- printLog( "getPayloadIdFromAttribute", "End..." );
-
- return payloadId;
- }
-
-
- private static boolean isPayloadRelatedAttribute( AttributeField
attribute ) {
-
- boolean isPayloadAttribute = false;
-
- printLog( "isPayloadRelatedAttribute", "Init..." );
-
- printLog( "isPayloadRelatedAttribute",
- "AttributeName = [" + attribute.getAttributeName() +
- "], AttributeValue = [" + attribute.getAttributeValue()
+ "]." );
-
- if ( ( attribute.getAttributeName().compareToIgnoreCase(
SIPCodec.ATTRIBUTE_RTPMAP ) == 0 ) ||
- ( attribute.getAttributeName().compareToIgnoreCase(
SIPCodec.ATTRIBUTE_AS ) == 0 ) ||
- ( attribute.getAttributeName().compareToIgnoreCase(
SIPCodec.ATTRIBUTE_FMTP ) == 0 ) ) {
-
- isPayloadAttribute = true;
- }
-
- printLog( "isPayloadRelatedAttribute", "isPayloadAttribute = " +
isPayloadAttribute );
-
- printLog( "isPayloadRelatedAttribute", "End..." );
-
- return isPayloadAttribute;
- }
+ protected static Logger log = LoggerFactory.getLogger(SdpUtils.class);
+ public static SIPCodec getNegotiatedVideoCodec(SessionDescriptor
negotiatedSDP) {
+ MediaDescriptor md =
negotiatedSDP.getMediaDescriptor(SIPCodec.MEDIA_TYPE_VIDEO);
+ if (md == null) {
+ return null;
+ }
+ String rtpmap =
md.getAttribute(SIPCodec.ATTRIBUTE_RTPMAP).getAttributeValue();
+ printLog("getNegotiatedVideoCodec", "rtpmap = [" + rtpmap + "].");
+ if (rtpmap == null || rtpmap.isEmpty()) {
+ return null;
+ }
+ int payloadId = Integer.parseInt(rtpmap.substring(0,
rtpmap.indexOf(" ")));
+ SIPCodec sipCodec =
SIPCodecFactory.getInstance().getSIPMediaCodec(payloadId);
+ if (sipCodec == null) {
+ printLog("getNegotiatedVideoCodec", "Error... codec not found.");
+ } else {
+ printLog("getNegotiatedVideoCodec", "payloadType = " +
sipCodec.getCodecId() + ", payloadName = "
+ + sipCodec.getCodecName() + ".");
+ }
+ return sipCodec;
+ }
- private static void printLog( String method, String message ) {
- log.debug( "SdpUtils - " + method + " -> " + message );
- }
+ /**
+ * @return Returns the audio codec to be used on current session.
+ */
+ public static SIPCodec getNegotiatedAudioCodec(SessionDescriptor
negotiatedSDP) {
+ int payloadId;
+ String rtpmap;
+ SIPCodec sipCodec = null;
+
+ printLog("getNegotiatedAudioCodec", "Init...");
+
+ rtpmap =
negotiatedSDP.getMediaDescriptor(SIPCodec.MEDIA_TYPE_AUDIO).getAttribute(SIPCodec.ATTRIBUTE_RTPMAP)
+ .getAttributeValue();
+
+ printLog("getNegotiatedAudioCodec", "rtpmap = [" + rtpmap + "].");
+
+ if (!rtpmap.isEmpty()) {
+
+ payloadId = Integer.parseInt(rtpmap.substring(0, rtpmap.indexOf(" ")));
+
+ printLog("getNegotiatedAudioCodec", "payloadId = [" + payloadId + "].");
+
+ sipCodec = SIPCodecFactory.getInstance().getSIPMediaCodec(payloadId);
+
+ if (sipCodec == null) {
+
+ printLog("getNegotiatedAudioCodec", "Error... codec not found.");
+ } else {
+
+ printLog("getNegotiatedAudioCodec", "payloadType = " +
sipCodec.getCodecId() + ", payloadName = "
+ + sipCodec.getCodecName() + ".");
+ }
+ }
+
+ printLog("getNegotiatedAudioCodec", "End...");
+
+ return sipCodec;
+ }
+
+ /**
+ *
+ * @param userName
+ * @param viaAddress
+ *
+ * @return Return the initial local SDP.
+ */
+ public static SessionDescriptor createInitialSdp(String userName, String
viaAddress, int audioPort, int videoPort,
+ String audioCodecsPrecedence) {
+
+ SessionDescriptor initialDescriptor = null;
+
+ printLog("createInitialSdp", "Init...");
+
+ try {
+
+ printLog("createInitialSdp", "userName = [" + userName + "], viaAddress
= [" + viaAddress
+ + "], audioPort = [" + audioPort + "], videoPort = [" + videoPort
+ "], audioCodecsPrecedence = ["
+ + audioCodecsPrecedence + "].");
+
+ int audioCodecsNumber =
SIPCodecFactory.getInstance().getAvailableAudioCodecsCount();
+ int videoCodecsNumber =
SIPCodecFactory.getInstance().getAvailableVideoCodecsCount();
+
+ if ((audioCodecsNumber == 0) && (videoCodecsNumber == 0)) {
+
+ printLog("createInitialSdp", "audioCodecsNumber = [" +
audioCodecsNumber + "], videoCodecsNumber = ["
+ + videoCodecsNumber + "].");
+
+ return null;
+ }
+
+ initialDescriptor = new SessionDescriptor(userName, viaAddress);
+
+ if (audioCodecsNumber > 0) {
+
+ SIPCodec[] audioCodecs;
+ Vector<AttributeField> audioAttributes = new Vector<AttributeField>();
+
+ if (audioCodecsPrecedence.isEmpty()) {
+
+ audioCodecs = SIPCodecFactory.getInstance().getAvailableAudioCodecs();
+ } else {
+
+ audioCodecs =
SIPCodecFactory.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";
+
+ printLog("createInitialSdp", "Adding rtpmap for payload [" +
payloadId + "] with value = ["
+ + rtpmapParamValue + "].");
+
+ audioAttributes.add(new AttributeField(SIPCodec.ATTRIBUTE_RTPMAP,
rtpmapParamValue));
+
+ String[] codecMediaAttributes =
audioCodecs[audioIndex].getCodecMediaAttributes();
+
+ if (codecMediaAttributes != null) {
+
+ printLog("createInitialSdp", "Adding " + codecMediaAttributes.length
+ + " audio codec media attributes.");
+
+ for (int attribIndex = 0; attribIndex < codecMediaAttributes.length;
attribIndex++) {
+
+ printLog("createInitialSdp", "Adding audio media attribute ["
+ + codecMediaAttributes[attribIndex] + "].");
+
+ AttributeField newAttribute =
parseAttributeField(codecMediaAttributes[attribIndex]);
+
+ if (newAttribute != null) {
+
+ audioAttributes.add(newAttribute);
+ }
+ }
+ } else {
+
+ printLog("createInitialSdp", "Audio codec has no especific media
attributes.");
+ }
+ }
+
+ // Calculate the format list to be used on MediaDescriptor
+ // creation.
+ String formatList = getFormatList(audioAttributes);
+
+ for (Enumeration<AttributeField> attributesEnum =
audioAttributes.elements(); attributesEnum
+ .hasMoreElements();) {
+
+ AttributeField audioAttribute = attributesEnum.nextElement();
+
+ if (initialDescriptor.getMediaDescriptor(SIPCodec.MEDIA_TYPE_AUDIO)
== null) {
+
+ printLog("createInitialSdp", "Creating audio media descriptor.");
+
+ initialDescriptor.addMedia(new MediaField(SIPCodec.MEDIA_TYPE_AUDIO,
audioPort, 0, "RTP/AVP",
+ formatList), audioAttribute);
+ } else {
+
+ printLog("createInitialSdp", "Just adding attribute.");
+
+
initialDescriptor.getMediaDescriptor(SIPCodec.MEDIA_TYPE_AUDIO).addAttribute(audioAttribute);
+ }
+ }
+
+ String[] commonAudioMediaAttributes =
SIPCodecFactory.getInstance().getCommonAudioMediaAttributes();
+
+ if (commonAudioMediaAttributes != null) {
+
+ printLog("createInitialSdp", "Adding " +
commonAudioMediaAttributes.length
+ + " common audio media attributes.");
+
+ for (int attribIndex = 0; attribIndex <
commonAudioMediaAttributes.length; attribIndex++) {
+
+ printLog("createInitialSdp", "Adding common audio media attribute ["
+ + commonAudioMediaAttributes[attribIndex] + "].");
+
+ AttributeField newAttribute =
parseAttributeField(commonAudioMediaAttributes[attribIndex]);
+
+ if (newAttribute != null) {
+
+
initialDescriptor.getMediaDescriptor(SIPCodec.MEDIA_TYPE_AUDIO).addAttribute(newAttribute);
+ }
+ }
+ } else {
+
+ printLog("createInitialSdp", "No common audio media attributes.");
+ }
+ }
+
+ if (videoCodecsNumber > 0) {
+
+ SIPCodec[] videoCodecs =
SIPCodecFactory.getInstance().getAvailableVideoCodecs();
+ Vector<AttributeField> videoAttributes = new Vector<AttributeField>();
+
+ for (int videoIndex = 0; videoIndex < videoCodecsNumber; videoIndex++)
{
+
+ String payloadId =
String.valueOf(videoCodecs[videoIndex].getCodecId());
+ String rtpmapParamValue = payloadId;
+ rtpmapParamValue += " " + videoCodecs[videoIndex].getCodecName();
+ rtpmapParamValue += "/" + videoCodecs[videoIndex].getSampleRate()
+ "/1";
+
+ printLog("createInitialSdp", "Adding rtpmap for payload [" +
payloadId + "] with value = ["
+ + rtpmapParamValue + "].");
+
+ videoAttributes.add(new AttributeField(SIPCodec.ATTRIBUTE_RTPMAP,
rtpmapParamValue));
+
+ String[] codecMediaAttributes =
videoCodecs[videoIndex].getCodecMediaAttributes();
+
+ if (codecMediaAttributes != null) {
+
+ printLog("createInitialSdp", "Adding " + codecMediaAttributes.length
+ + " video codec media attributes.");
+
+ for (int attribIndex = 0; attribIndex < codecMediaAttributes.length;
attribIndex++) {
+
+ printLog("createInitialSdp", "Adding video media attribute ["
+ + codecMediaAttributes[attribIndex] + "].");
+
+ AttributeField newAttribute =
parseAttributeField(codecMediaAttributes[attribIndex]);
+
+ if (newAttribute != null) {
***The diff for this file has been truncated for email.***