Search in sources :

Example 1 with SessionDescriptor

use of org.zoolu.sdp.SessionDescriptor in project bigbluebutton by bigbluebutton.

the class SdpUtils method makeMediaPayloadsNegotiation.

/** 
     * 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) {
    log.debug("makeMediaPayloadsNegotiation");
    SessionDescriptor newSdp = null;
    try {
        newSdp = new SessionDescriptor(remoteSdp.getOrigin(), remoteSdp.getSessionName(), localSdp.getConnection(), localSdp.getTime());
        Vector remoteDescriptors = remoteSdp.getMediaDescriptors();
        for (Enumeration descriptorsEnum = remoteDescriptors.elements(); descriptorsEnum.hasMoreElements(); ) {
            MediaDescriptor remoteDescriptor = (MediaDescriptor) descriptorsEnum.nextElement();
            MediaDescriptor localDescriptor = localSdp.getMediaDescriptor(remoteDescriptor.getMedia().getMedia());
            if (localDescriptor != null) {
                Vector remoteAttributes = remoteDescriptor.getAttributes(Codec.ATTRIBUTE_RTPMAP);
                Vector newSdpAttributes = new Vector();
                for (Enumeration attributesEnum = remoteAttributes.elements(); attributesEnum.hasMoreElements(); ) {
                    AttributeField remoteAttribute = (AttributeField) attributesEnum.nextElement();
                    String payloadId = getPayloadIdFromAttribute(remoteAttribute);
                    if ("".equals(payloadId)) {
                        log.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 attributesEnum = newSdpAttributes.elements(); attributesEnum.hasMoreElements(); ) {
                    AttributeField mediaAttribute = (AttributeField) attributesEnum.nextElement();
                    if (newSdp.getMediaDescriptors().size() == 0) {
                        MediaField mf = new MediaField(localDescriptor.getMedia().getMedia(), localDescriptor.getMedia().getPort(), 0, localDescriptor.getMedia().getTransport(), formatList);
                        newSdp.addMediaDescriptor(new MediaDescriptor(mf, localDescriptor.getConnection()));
                    }
                    newSdp.getMediaDescriptor(localDescriptor.getMedia().getMedia()).addAttribute(mediaAttribute);
                }
            }
        }
    } catch (Exception exception) {
        log.error("Failure creating initial SDP: " + exception.toString());
    }
    return newSdp;
}
Also used : Enumeration(java.util.Enumeration) SessionDescriptor(org.zoolu.sdp.SessionDescriptor) AttributeField(org.zoolu.sdp.AttributeField) MediaDescriptor(org.zoolu.sdp.MediaDescriptor) MediaField(org.zoolu.sdp.MediaField) Vector(java.util.Vector)

Example 2 with SessionDescriptor

use of org.zoolu.sdp.SessionDescriptor in project bigbluebutton by bigbluebutton.

the class SdpUtils method createInitialSdp.

/**
     * 
     * @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;
    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.");
            }
        }
    } catch (Exception exception) {
        log.error("Failure creating initial SDP: " + exception.toString());
    }
    log.debug("Created initial SDP");
    return initialDescriptor;
}
Also used : Codec(org.red5.app.sip.codecs.Codec) Enumeration(java.util.Enumeration) SessionDescriptor(org.zoolu.sdp.SessionDescriptor) AttributeField(org.zoolu.sdp.AttributeField) MediaField(org.zoolu.sdp.MediaField) Vector(java.util.Vector)

Example 3 with SessionDescriptor

use of org.zoolu.sdp.SessionDescriptor in project bigbluebutton by bigbluebutton.

the class SdpUtils method makeMediaPayloadsNegotiation.

/** 
     * 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) {
    log.debug("makeMediaPayloadsNegotiation");
    SessionDescriptor newSdp = null;
    try {
        newSdp = new SessionDescriptor(remoteSdp.getOrigin(), remoteSdp.getSessionName(), localSdp.getConnection(), localSdp.getTime());
        Vector remoteDescriptors = remoteSdp.getMediaDescriptors();
        for (Enumeration descriptorsEnum = remoteDescriptors.elements(); descriptorsEnum.hasMoreElements(); ) {
            MediaDescriptor remoteDescriptor = (MediaDescriptor) descriptorsEnum.nextElement();
            MediaDescriptor localDescriptor = localSdp.getMediaDescriptor(remoteDescriptor.getMedia().getMedia());
            if (localDescriptor != null) {
                Vector remoteAttributes = remoteDescriptor.getAttributes(Codec.ATTRIBUTE_RTPMAP);
                Vector<AttributeField> newSdpAttributes = new Vector<AttributeField>();
                for (Enumeration attributesEnum = remoteAttributes.elements(); attributesEnum.hasMoreElements(); ) {
                    AttributeField remoteAttribute = (AttributeField) attributesEnum.nextElement();
                    String payloadId = getPayloadIdFromAttribute(remoteAttribute);
                    if ("".equals(payloadId)) {
                        log.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 attributesEnum = newSdpAttributes.elements(); attributesEnum.hasMoreElements(); ) {
                    AttributeField mediaAttribute = (AttributeField) attributesEnum.nextElement();
                    if (newSdp.getMediaDescriptors().size() == 0) {
                        MediaField mf = new MediaField(localDescriptor.getMedia().getMedia(), localDescriptor.getMedia().getPort(), 0, localDescriptor.getMedia().getTransport(), formatList);
                        newSdp.addMediaDescriptor(new MediaDescriptor(mf, localDescriptor.getConnection()));
                    }
                    newSdp.getMediaDescriptor(localDescriptor.getMedia().getMedia()).addAttribute(mediaAttribute);
                }
            }
        }
    } catch (Exception exception) {
        log.error("Failure creating initial SDP: " + exception.toString());
    }
    return newSdp;
}
Also used : Enumeration(java.util.Enumeration) SessionDescriptor(org.zoolu.sdp.SessionDescriptor) AttributeField(org.zoolu.sdp.AttributeField) MediaDescriptor(org.zoolu.sdp.MediaDescriptor) MediaField(org.zoolu.sdp.MediaField) Vector(java.util.Vector)

Example 4 with SessionDescriptor

use of org.zoolu.sdp.SessionDescriptor in project bigbluebutton by bigbluebutton.

the class SdpUtils method createInitialSdp.

/**
     * 
     * @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;
    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;
        }
        initialDescriptor = new SessionDescriptor(userName, viaAddress);
        if (initialDescriptor == null) {
            log.error("Error instantiating the initialDescriptor!");
            return null;
        }
        if (audioCodecsNumber > 0) {
            Codec[] audioCodecs;
            Vector audioAttributes = new Vector();
            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) {
                    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) {
                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 videoAttributes = new Vector();
            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) {
                    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) {
                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.");
            }
        }
    } catch (Exception exception) {
        log.error("Failure creating initial SDP: " + exception.toString());
    }
    return initialDescriptor;
}
Also used : Codec(org.red5.app.sip.codecs.Codec) Enumeration(java.util.Enumeration) SessionDescriptor(org.zoolu.sdp.SessionDescriptor) AttributeField(org.zoolu.sdp.AttributeField) MediaField(org.zoolu.sdp.MediaField) Vector(java.util.Vector)

Aggregations

Enumeration (java.util.Enumeration)4 Vector (java.util.Vector)4 AttributeField (org.zoolu.sdp.AttributeField)4 MediaField (org.zoolu.sdp.MediaField)4 SessionDescriptor (org.zoolu.sdp.SessionDescriptor)4 Codec (org.red5.app.sip.codecs.Codec)2 MediaDescriptor (org.zoolu.sdp.MediaDescriptor)2