Search in sources :

Example 1 with Group

use of eu.siacs.conversations.xmpp.jingle.stanzas.Group in project Conversations by siacs.

the class RtpContentMap method of.

public static RtpContentMap of(final SessionDescription sessionDescription) {
    final ImmutableMap.Builder<String, DescriptionTransport> contentMapBuilder = new ImmutableMap.Builder<>();
    for (SessionDescription.Media media : sessionDescription.media) {
        final String id = Iterables.getFirst(media.attributes.get("mid"), null);
        Preconditions.checkNotNull(id, "media has no mid");
        contentMapBuilder.put(id, DescriptionTransport.of(sessionDescription, media));
    }
    final String groupAttribute = Iterables.getFirst(sessionDescription.attributes.get("group"), null);
    final Group group = groupAttribute == null ? null : Group.ofSdpString(groupAttribute);
    return new RtpContentMap(group, contentMapBuilder.build());
}
Also used : Group(eu.siacs.conversations.xmpp.jingle.stanzas.Group) ImmutableMap(com.google.common.collect.ImmutableMap)

Example 2 with Group

use of eu.siacs.conversations.xmpp.jingle.stanzas.Group in project Conversations by siacs.

the class SessionDescription method of.

public static SessionDescription of(final RtpContentMap contentMap) {
    final SessionDescriptionBuilder sessionDescriptionBuilder = new SessionDescriptionBuilder();
    final ArrayListMultimap<String, String> attributeMap = ArrayListMultimap.create();
    final ImmutableList.Builder<Media> mediaListBuilder = new ImmutableList.Builder<>();
    final Group group = contentMap.group;
    if (group != null) {
        final String semantics = group.getSemantics();
        checkNoWhitespace(semantics, "group semantics value must not contain any whitespace");
        attributeMap.put("group", group.getSemantics() + " " + Joiner.on(' ').join(group.getIdentificationTags()));
    }
    attributeMap.put("msid-semantic", " WMS my-media-stream");
    for (final Map.Entry<String, RtpContentMap.DescriptionTransport> entry : contentMap.contents.entrySet()) {
        final String name = entry.getKey();
        RtpContentMap.DescriptionTransport descriptionTransport = entry.getValue();
        RtpDescription description = descriptionTransport.description;
        IceUdpTransportInfo transport = descriptionTransport.transport;
        final ArrayListMultimap<String, String> mediaAttributes = ArrayListMultimap.create();
        final String ufrag = transport.getAttribute("ufrag");
        final String pwd = transport.getAttribute("pwd");
        if (Strings.isNullOrEmpty(ufrag)) {
            throw new IllegalArgumentException("Transport element is missing required ufrag attribute");
        }
        checkNoWhitespace(ufrag, "ufrag value must not contain any whitespaces");
        mediaAttributes.put("ice-ufrag", ufrag);
        if (Strings.isNullOrEmpty(pwd)) {
            throw new IllegalArgumentException("Transport element is missing required pwd attribute");
        }
        checkNoWhitespace(pwd, "pwd value must not contain any whitespaces");
        mediaAttributes.put("ice-pwd", pwd);
        mediaAttributes.put("ice-options", HARDCODED_ICE_OPTIONS);
        final IceUdpTransportInfo.Fingerprint fingerprint = transport.getFingerprint();
        if (fingerprint != null) {
            mediaAttributes.put("fingerprint", fingerprint.getHash() + " " + fingerprint.getContent());
            final IceUdpTransportInfo.Setup setup = fingerprint.getSetup();
            if (setup != null) {
                mediaAttributes.put("setup", setup.toString().toLowerCase(Locale.ROOT));
            }
        }
        final ImmutableList.Builder<Integer> formatBuilder = new ImmutableList.Builder<>();
        for (RtpDescription.PayloadType payloadType : description.getPayloadTypes()) {
            final String id = payloadType.getId();
            if (Strings.isNullOrEmpty(id)) {
                throw new IllegalArgumentException("Payload type is missing id");
            }
            if (!isInt(id)) {
                throw new IllegalArgumentException("Payload id is not numeric");
            }
            formatBuilder.add(payloadType.getIntId());
            mediaAttributes.put("rtpmap", payloadType.toSdpAttribute());
            final List<RtpDescription.Parameter> parameters = payloadType.getParameters();
            if (parameters.size() == 1) {
                mediaAttributes.put("fmtp", RtpDescription.Parameter.toSdpString(id, parameters.get(0)));
            } else if (parameters.size() > 0) {
                mediaAttributes.put("fmtp", RtpDescription.Parameter.toSdpString(id, parameters));
            }
            for (RtpDescription.FeedbackNegotiation feedbackNegotiation : payloadType.getFeedbackNegotiations()) {
                final String type = feedbackNegotiation.getType();
                final String subtype = feedbackNegotiation.getSubType();
                if (Strings.isNullOrEmpty(type)) {
                    throw new IllegalArgumentException("a feedback for payload-type " + id + " negotiation is missing type");
                }
                checkNoWhitespace(type, "feedback negotiation type must not contain whitespace");
                mediaAttributes.put("rtcp-fb", id + " " + type + (Strings.isNullOrEmpty(subtype) ? "" : " " + subtype));
            }
            for (RtpDescription.FeedbackNegotiationTrrInt feedbackNegotiationTrrInt : payloadType.feedbackNegotiationTrrInts()) {
                mediaAttributes.put("rtcp-fb", id + " trr-int " + feedbackNegotiationTrrInt.getValue());
            }
        }
        for (RtpDescription.FeedbackNegotiation feedbackNegotiation : description.getFeedbackNegotiations()) {
            final String type = feedbackNegotiation.getType();
            final String subtype = feedbackNegotiation.getSubType();
            if (Strings.isNullOrEmpty(type)) {
                throw new IllegalArgumentException("a feedback negotiation is missing type");
            }
            checkNoWhitespace(type, "feedback negotiation type must not contain whitespace");
            mediaAttributes.put("rtcp-fb", "* " + type + (Strings.isNullOrEmpty(subtype) ? "" : " " + subtype));
        }
        for (final RtpDescription.FeedbackNegotiationTrrInt feedbackNegotiationTrrInt : description.feedbackNegotiationTrrInts()) {
            mediaAttributes.put("rtcp-fb", "* trr-int " + feedbackNegotiationTrrInt.getValue());
        }
        for (final RtpDescription.RtpHeaderExtension extension : description.getHeaderExtensions()) {
            final String id = extension.getId();
            final String uri = extension.getUri();
            if (Strings.isNullOrEmpty(id)) {
                throw new IllegalArgumentException("A header extension is missing id");
            }
            checkNoWhitespace(id, "header extension id must not contain whitespace");
            if (Strings.isNullOrEmpty(uri)) {
                throw new IllegalArgumentException("A header extension is missing uri");
            }
            checkNoWhitespace(uri, "feedback negotiation uri must not contain whitespace");
            mediaAttributes.put("extmap", id + " " + uri);
        }
        if (description.hasChild("extmap-allow-mixed", Namespace.JINGLE_RTP_HEADER_EXTENSIONS)) {
            mediaAttributes.put("extmap-allow-mixed", "");
        }
        for (final RtpDescription.SourceGroup sourceGroup : description.getSourceGroups()) {
            final String semantics = sourceGroup.getSemantics();
            final List<String> groups = sourceGroup.getSsrcs();
            if (Strings.isNullOrEmpty(semantics)) {
                throw new IllegalArgumentException("A SSRC group is missing semantics attribute");
            }
            checkNoWhitespace(semantics, "source group semantics must not contain whitespace");
            if (groups.size() == 0) {
                throw new IllegalArgumentException("A SSRC group is missing SSRC ids");
            }
            mediaAttributes.put("ssrc-group", String.format("%s %s", semantics, Joiner.on(' ').join(groups)));
        }
        for (final RtpDescription.Source source : description.getSources()) {
            for (final RtpDescription.Source.Parameter parameter : source.getParameters()) {
                final String id = source.getSsrcId();
                final String parameterName = parameter.getParameterName();
                final String parameterValue = parameter.getParameterValue();
                if (Strings.isNullOrEmpty(id)) {
                    throw new IllegalArgumentException("A source specific media attribute is missing the id");
                }
                checkNoWhitespace(id, "A source specific media attributes must not contain whitespaces");
                if (Strings.isNullOrEmpty(parameterName)) {
                    throw new IllegalArgumentException("A source specific media attribute is missing its name");
                }
                if (Strings.isNullOrEmpty(parameterValue)) {
                    throw new IllegalArgumentException("A source specific media attribute is missing its value");
                }
                mediaAttributes.put("ssrc", id + " " + parameterName + ":" + parameterValue);
            }
        }
        mediaAttributes.put("mid", name);
        // random additional attributes
        mediaAttributes.put("rtcp", "9 IN IP4 0.0.0.0");
        mediaAttributes.put("sendrecv", "");
        if (description.hasChild("rtcp-mux", Namespace.JINGLE_APPS_RTP)) {
            mediaAttributes.put("rtcp-mux", "");
        }
        final MediaBuilder mediaBuilder = new MediaBuilder();
        mediaBuilder.setMedia(description.getMedia().toString().toLowerCase(Locale.ROOT));
        mediaBuilder.setConnectionData(HARDCODED_CONNECTION);
        mediaBuilder.setPort(HARDCODED_MEDIA_PORT);
        mediaBuilder.setProtocol(HARDCODED_MEDIA_PROTOCOL);
        mediaBuilder.setAttributes(mediaAttributes);
        mediaBuilder.setFormats(formatBuilder.build());
        mediaListBuilder.add(mediaBuilder.createMedia());
    }
    sessionDescriptionBuilder.setVersion(0);
    sessionDescriptionBuilder.setName("-");
    sessionDescriptionBuilder.setMedia(mediaListBuilder.build());
    sessionDescriptionBuilder.setAttributes(attributeMap);
    return sessionDescriptionBuilder.createSessionDescription();
}
Also used : Group(eu.siacs.conversations.xmpp.jingle.stanzas.Group) ImmutableList(com.google.common.collect.ImmutableList) RtpDescription(eu.siacs.conversations.xmpp.jingle.stanzas.RtpDescription) IceUdpTransportInfo(eu.siacs.conversations.xmpp.jingle.stanzas.IceUdpTransportInfo) Map(java.util.Map)

Example 3 with Group

use of eu.siacs.conversations.xmpp.jingle.stanzas.Group in project Conversations by siacs.

the class JingleRtpConnection method toIdentificationTags.

private List<String> toIdentificationTags(final RtpContentMap rtpContentMap) {
    final Group originalGroup = rtpContentMap.group;
    final List<String> identificationTags = originalGroup == null ? rtpContentMap.getNames() : originalGroup.getIdentificationTags();
    if (identificationTags.size() == 0) {
        Log.w(Config.LOGTAG, id.account.getJid().asBareJid() + ": no identification tags found in initial offer. we won't be able to calculate mLineIndices");
    }
    return identificationTags;
}
Also used : Group(eu.siacs.conversations.xmpp.jingle.stanzas.Group)

Aggregations

Group (eu.siacs.conversations.xmpp.jingle.stanzas.Group)3 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 IceUdpTransportInfo (eu.siacs.conversations.xmpp.jingle.stanzas.IceUdpTransportInfo)1 RtpDescription (eu.siacs.conversations.xmpp.jingle.stanzas.RtpDescription)1 Map (java.util.Map)1