/// <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); } } }
/// <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); } } }
/// <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) { }
/// <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)); } }
/// <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); } }
/// <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; } } } }
/// <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; } } } }
public void SetMediaStreamStatus(SDPMediaTypesEnum kind, MediaStreamStatusEnum status) { //throw new NotImplementedException(); }
/// <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) { }