Exemplo n.º 1
0
        /// <summary>
        /// Forces the SDP to use the selected audio and video codecs.
        /// </summary>
        /// <param name="sdp">Session description.</param>
        /// <param name="audioCodec">Audio codec.</param>
        /// <param name="videoCodec">Video codec.</param>
        /// <returns>True if succeeds to force to use the selected audio/video codecs.</returns>
        public static bool SelectCodecs(ref string sdp, CodecInfo audioCodec, CodecInfo videoCodec)
        {
            string audioCodecName = audioCodec?.Name ?? null;
            string videoCodecName = videoCodec?.Name ?? null;

            if (audioCodecName != null)
            {
                MaybePreferCodec(ref sdp, "audio", "receive", audioCodecName);
                MaybePreferCodec(ref sdp, "audio", "send", audioCodecName);
            }

            if (videoCodecName != null)
            {
                MaybePreferCodec(ref sdp, "video", "receive", videoCodecName);
                MaybePreferCodec(ref sdp, "video", "send", videoCodecName);
            }

            return(true);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Forces the SDP to use the selected audio and video codecs.
        /// </summary>
        /// <param name="sdp">Session description.</param>
        /// <param name="audioCodec">Audio codec.</param>
        /// <param name="videoCodec">Video codec.</param>
        /// <returns>True if succeeds to force to use the selected audio/video codecs.</returns>
#if ORTCLIB
        public static bool SelectCodecs(ref string sdp, CodecInfo audioCodec, CodecInfo videoCodec)
Exemplo n.º 3
0
        /// <summary>
        /// Forces the SDP to use the selected audio and video codecs.
        /// </summary>
        /// <param name="sdp">Session description.</param>
        /// <param name="audioCodec">Audio codec.</param>
        /// <param name="videoCodec">Video codec.</param>
        /// <returns>True if succeeds to force to use the selected audio/video codecs.</returns>
        public static bool SelectCodecs(ref string sdp, CodecInfo audioCodec, CodecInfo videoCodec)
        {
            Regex         mfdRegex            = new Regex("\r\nm=audio.*RTP.*?( .\\d*)+\r\n");
            Match         mfdMatch            = mfdRegex.Match(sdp);
            List <string> mfdListToErase      = new List <string>();       //mdf = media format descriptor
            bool          audioMediaDescFound = mfdMatch.Groups.Count > 1; //Group 0 is whole match

#if ORTCLIB
            byte audioCodecId = audioCodec?.PreferredPayloadType ?? 0;
            byte videoCodecId = videoCodec?.PreferredPayloadType ?? 0;
#else
            int audioCodecId = audioCodec?.Id ?? 0;
            int videoCodecId = videoCodec?.Id ?? 0;
#endif
            if (audioMediaDescFound)
            {
                if (audioCodec == null)
                {
                    return(false);
                }
                for (int groupCtr = 1 /*Group 0 is whole match*/; groupCtr < mfdMatch.Groups.Count; groupCtr++)
                {
                    for (int captureCtr = 0; captureCtr < mfdMatch.Groups[groupCtr].Captures.Count; captureCtr++)
                    {
                        mfdListToErase.Add(mfdMatch.Groups[groupCtr].Captures[captureCtr].Value.TrimStart());
                    }
                }
                if (!mfdListToErase.Remove(audioCodecId.ToString()))
                {
                    return(false);
                }
            }

            mfdRegex = new Regex("\r\nm=video.*RTP.*?( .\\d*)+\r\n");
            mfdMatch = mfdRegex.Match(sdp);
            bool videoMediaDescFound = mfdMatch.Groups.Count > 1; //Group 0 is whole match
            if (videoMediaDescFound)
            {
                if (videoCodec == null)
                {
                    return(false);
                }
                for (int groupCtr = 1 /*Group 0 is whole match*/; groupCtr < mfdMatch.Groups.Count; groupCtr++)
                {
                    for (int captureCtr = 0; captureCtr < mfdMatch.Groups[groupCtr].Captures.Count; captureCtr++)
                    {
                        mfdListToErase.Add(mfdMatch.Groups[groupCtr].Captures[captureCtr].Value.TrimStart());
                    }
                }
                if (!mfdListToErase.Remove(videoCodecId.ToString()))
                {
                    return(false);
                }
            }

            if (audioMediaDescFound)
            {
                // Alter audio entry
                Regex audioRegex = new Regex("\r\n(m=audio.*RTP.*?)( .\\d*)+");
                sdp = audioRegex.Replace(sdp, "\r\n$1 " + audioCodecId);
            }

            if (videoMediaDescFound)
            {
                // Alter video entry
                Regex videoRegex = new Regex("\r\n(m=video.*RTP.*?)( .\\d*)+");
                sdp = videoRegex.Replace(sdp, "\r\n$1 " + videoCodecId);
            }

            // Remove associated rtp mapping, format parameters, feedback parameters
            Regex removeOtherMdfs = new Regex("a=(rtpmap|fmtp|rtcp-fb):(" + String.Join("|", mfdListToErase) + ") .*\r\n");
            sdp = removeOtherMdfs.Replace(sdp, "");

            return(true);
        }