コード例 #1
0
        /// <summary>
        /// Checks whether an SDP attribute is one of the four possible media stream attributes.
        /// </summary>
        /// <param name="attributeString">The attribute string to check.</param>
        /// <param name="mediaStreamStatus">If the attribute was recognised as a media stream attribute this will hold it.</param>
        /// <returns>True if the attribute matched or false if not.</returns>
        public static bool IsMediaStreamStatusAttribute(string attributeString, out MediaStreamStatusEnum mediaStreamStatus)
        {
            mediaStreamStatus = MediaStreamStatusEnum.SendRecv;

            if (string.IsNullOrEmpty(attributeString))
            {
                return(false);
            }
            else
            {
                switch (attributeString.ToLower())
                {
                case SEND_RECV_ATTRIBUTE:
                    mediaStreamStatus = MediaStreamStatusEnum.SendRecv;
                    return(true);

                case SEND_ONLY_ATTRIBUTE:
                    mediaStreamStatus = MediaStreamStatusEnum.SendOnly;
                    return(true);

                case RECV_ONLY_ATTRIBUTE:
                    mediaStreamStatus = MediaStreamStatusEnum.RecvOnly;
                    return(true);

                case INACTIVE_ATTRIBUTE:
                    mediaStreamStatus = MediaStreamStatusEnum.Inactive;
                    return(true);

                default:
                    return(false);
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Creates a lightweight class to track a media stream track within an RTP session
        /// When supporting RFC3550 (the standard RTP specification) the relationship between
        /// an RTP stream and session is 1:1. For WebRTC and RFC8101 there can be multiple
        /// streams per session.
        /// </summary>
        /// <param name="kind">The type of media for this stream. There can only be one
        /// stream per media type.</param>
        /// <param name="isRemote">True if this track corresponds to a media announcement from the
        /// remote party.</param>
        /// <param name="capabilities">The capabilities for the track being added. Where the same media
        /// type is supported locally and remotely only the mutual capabilities can be used. This will
        /// occur if we receive an SDP offer (add track initiated by the remote party) and we need
        /// to remove capabilities we don't support.</param>
        /// <param name="streamStatus">The initial stream status for the media track. Defaults to
        /// send receive.</param>
        /// <param name="ssrcAttributes">If th track is being created from an SDP announcement this
        /// parameter contains a list of </param>
        public MediaStreamTrack(
            SDPMediaTypesEnum kind,
            bool isRemote,
            List <SDPAudioVideoMediaFormat> capabilities,
            MediaStreamStatusEnum streamStatus     = MediaStreamStatusEnum.SendRecv,
            List <SDPSsrcAttribute> ssrcAttributes = null)
        {
            Kind                = kind;
            IsRemote            = isRemote;
            Capabilities        = capabilities;
            StreamStatus        = streamStatus;
            DefaultStreamStatus = streamStatus;

            if (!isRemote)
            {
                Ssrc   = Convert.ToUInt32(Crypto.GetRandomInt(0, Int32.MaxValue));
                SeqNum = Convert.ToUInt16(Crypto.GetRandomInt(0, UInt16.MaxValue));
            }

            // Add the source attributes from the remote SDP to help match RTP SSRC and RTCP CNAME values against
            // RTP and RTCP packets received from the remote party.
            if (ssrcAttributes?.Count > 0)
            {
                foreach (var ssrcAttr in ssrcAttributes)
                {
                    SdpSsrc.Add(ssrcAttr.SSRC, ssrcAttr);
                }
            }
        }
コード例 #3
0
 /// <summary>
 /// Add a local video track.
 /// </summary>
 /// <param name="format">The video format that the local application supports.</param>
 /// <param name="streamStatus">Optional. The stream status for the video track, e.g. whether
 /// send and receive or only one of.</param>
 public MediaStreamTrack(
     VideoFormat format,
     MediaStreamStatusEnum streamStatus = MediaStreamStatusEnum.SendRecv) :
     this(SDPMediaTypesEnum.video, false, new List <SDPAudioVideoMediaFormat> {
     new SDPAudioVideoMediaFormat(format)
 }, streamStatus)
 {
 }
コード例 #4
0
        /// <summary>
        /// Creates a lightweight class to track a media stream track within an RTP session
        /// When supporting RFC3550 (the standard RTP specification) the relationship between
        /// an RTP stream and session is 1:1. For WebRTC and RFC8101 there can be multiple
        /// streams per session.
        /// </summary>
        /// <param name="kind">The type of media for this stream. There can only be one
        /// stream per media type.</param>
        /// <param name="isRemote">True if this track corresponds to a media announcement from the
        /// remote party.</param>
        /// <param name="Capabilities">The capabilities for the track being added. Where the same media
        /// type is supported locally and remotely only the mutual capabilities can be used. This will
        /// occur if we receive an SDP offer (add track initiated by the remote party) and we need
        /// to remove capabilities we don't support.</param>
        /// <param name="streamStatus">The initial stream status for the media track. Defaults to
        /// send receive.</param>
        public MediaStreamTrack(
            SDPMediaTypesEnum kind,
            bool isRemote,
            List <SDPMediaFormat> capabilities,
            MediaStreamStatusEnum streamStatus = MediaStreamStatusEnum.SendRecv)
        {
            Kind                = kind;
            IsRemote            = isRemote;
            Capabilities        = capabilities;
            StreamStatus        = streamStatus;
            DefaultStreamStatus = streamStatus;

            if (!isRemote)
            {
                Ssrc   = Convert.ToUInt32(Crypto.GetRandomInt(0, Int32.MaxValue));
                SeqNum = Convert.ToUInt16(Crypto.GetRandomInt(0, UInt16.MaxValue));
            }
        }
コード例 #5
0
ファイル: SDPTypes.cs プロジェクト: wangscript007/StreamNode
        /// <summary>
        /// Gets the attribute to include in a serialised SDP payload for a media stream status.
        /// </summary>
        /// <param name="mediaStreamStatus">The status to get the attribute for.</param>
        /// <returns>An attribute string matching the status value.</returns>
        public static string GetAttributeForMediaStreamStatus(MediaStreamStatusEnum mediaStreamStatus)
        {
            switch (mediaStreamStatus)
            {
            case MediaStreamStatusEnum.SendRecv:
                return(SEND_RECV_ATTRIBUTE);

            case MediaStreamStatusEnum.SendOnly:
                return(SEND_ONLY_ATTRIBUTE);

            case MediaStreamStatusEnum.RecvOnly:
                return(RECV_ONLY_ATTRIBUTE);

            case MediaStreamStatusEnum.Inactive:
                return(INACTIVE_ATTRIBUTE);

            default:
                return(null);
            }
        }
コード例 #6
0
        /// <summary>
        /// Add a local video track.
        /// </summary>
        /// <param name="videoFormats">The video formats that the local application supports.</param>
        /// <param name="streamStatus">Optional. The stream status for the video track, e.g. whether
        /// send and receive or only one of.</param>
        public MediaStreamTrack(
            List <VideoCodecsEnum> videoFormats,
            MediaStreamStatusEnum streamStatus = MediaStreamStatusEnum.SendRecv)
        {
            Kind                = SDPMediaTypesEnum.video;
            IsRemote            = false;
            StreamStatus        = streamStatus;
            DefaultStreamStatus = streamStatus;
            Ssrc                = Convert.ToUInt32(Crypto.GetRandomInt(0, Int32.MaxValue));
            SeqNum              = Convert.ToUInt16(Crypto.GetRandomInt(0, UInt16.MaxValue));

            if (videoFormats != null && videoFormats.Count > 0)
            {
                Capabilities = new List <SDPMediaFormat>();

                foreach (var format in videoFormats)
                {
                    switch (format)
                    {
                    case SIPSorceryMedia.Abstractions.V1.VideoCodecsEnum.VP8:
                        Capabilities.Add(new SDPMediaFormat(SDPMediaFormatsEnum.VP8));
                        break;

                    case SIPSorceryMedia.Abstractions.V1.VideoCodecsEnum.H264:
                        Capabilities.Add(
                            new SDPMediaFormat(SDPMediaFormatsEnum.H264)
                        {
                            FormatParameterAttribute = "packetization-mode=1"
                        });
                        break;

                    default:
                        // Video codec without inbuilt packetisation support. It will be up to the application
                        // to package appropriately and send via SendRawRtp calls.
                        break;
                    }
                }
            }
        }
コード例 #7
0
        /// <summary>
        /// Add a local audio track.
        /// </summary>
        /// <param name="audioFormats">The audio formats that the local application supports.</param>
        /// <param name="streamStatus">Optional. The stream status for the audio track, e.g. whether
        /// send and receive or only one of.</param>
        public MediaStreamTrack(
            List <AudioCodecsEnum> audioFormats,
            MediaStreamStatusEnum streamStatus = MediaStreamStatusEnum.SendRecv)
        {
            Kind                = SDPMediaTypesEnum.audio;
            IsRemote            = false;
            StreamStatus        = streamStatus;
            DefaultStreamStatus = streamStatus;
            Ssrc                = Convert.ToUInt32(Crypto.GetRandomInt(0, Int32.MaxValue));
            SeqNum              = Convert.ToUInt16(Crypto.GetRandomInt(0, UInt16.MaxValue));

            if (audioFormats != null && audioFormats.Count > 0)
            {
                Capabilities = new List <SDPMediaFormat>();

                foreach (var format in audioFormats)
                {
                    switch (format)
                    {
                    case SIPSorceryMedia.Abstractions.V1.AudioCodecsEnum.PCMU:
                        Capabilities.Add(new SDPMediaFormat(SDPMediaFormatsEnum.PCMU));
                        break;

                    case SIPSorceryMedia.Abstractions.V1.AudioCodecsEnum.PCMA:
                        Capabilities.Add(new SDPMediaFormat(SDPMediaFormatsEnum.PCMA));
                        break;

                    case SIPSorceryMedia.Abstractions.V1.AudioCodecsEnum.G722:
                        Capabilities.Add(new SDPMediaFormat(SDPMediaFormatsEnum.G722));
                        break;

                    default:
                        // Audio codec without encoder support. It will be up to the application
                        // to package appropriately and send via SendRawRtp calls.
                        break;
                    }
                }
            }
        }
コード例 #8
0
 public void SetMediaStreamStatus(SDPMediaTypesEnum kind, MediaStreamStatusEnum status)
 {
     //throw new NotImplementedException();
 }
コード例 #9
0
 /// <summary>
 /// Add a local video track.
 /// </summary>
 /// <param name="videoFormats">The video formats that the local application supports.</param>
 /// <param name="streamStatus">Optional. The stream status for the video track, e.g. whether
 /// send and receive or only one of.</param>
 public MediaStreamTrack(
     List <VideoFormat> formats,
     MediaStreamStatusEnum streamStatus = MediaStreamStatusEnum.SendRecv) :
     this(SDPMediaTypesEnum.video, false, formats.Select(x => new SDPAudioVideoMediaFormat(x)).ToList(), streamStatus)
 {
 }