Exemple #1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="T:SIPLib.SIP.SDPMedia" /> class.
 /// </summary>
 /// <param name="value">The input string representing the m line in the SDP</param>
 /// <param name="attrDict">An optional dictionary containing the m= parameters</param>
 public SDPMedia(string value = null, Dictionary <string, string> attrDict = null)
 {
     Mediaformats    = new List <SDPMediaFormat>();
     OtherAttributes = new Dictionary <string, string>();
     if (value != null)
     {
         string[] values = value.Split(" ".ToCharArray(), 4);
         Media = values[0];
         Port  = values[1];
         Proto = values[2];
         string rest = values[3];
         Mediaformats = new List <SDPMediaFormat>();
         foreach (string s in rest.Split(' '))
         {
             SDPMediaFormat fmt = new SDPMediaFormat {
                 Pt = s
             };
             Mediaformats.Add(fmt);
         }
     }
     else if (attrDict != null && attrDict.ContainsKey("media"))
     {
         Media        = attrDict["media"];
         Port         = attrDict.ContainsKey("port") ? attrDict["port"] : "0";
         Proto        = attrDict.ContainsKey("proto") ? attrDict["proto"] : "RTP/AVP";
         Mediaformats = new List <SDPMediaFormat>();
         if (attrDict.ContainsKey("fmt"))
         {
             foreach (string s in attrDict["fmt"].Split(' '))
             {
                 SDPMediaFormat fmt = new SDPMediaFormat {
                     Pt = s
                 };
                 Mediaformats.Add(fmt);
             }
         }
     }
 }
Exemple #2
0
        /// <summary>
        /// Creates a SDP answer.
        /// </summary>
        /// <param name="streams">A list of SDP Media objects..</param>
        /// <param name="offer">The SDP offer.</param>
        /// <param name="parameters">Optional parameters.</param>
        /// <returns>SDP.</returns>
        public static SDP CreateAnswer(List <SDPMedia> streams, SDP offer, Dictionary <string, string> parameters = null)
        {
            SDP s = new SDP();

            s.Other["v"] = "0";
            foreach (Char a in "iep")
            {
                if (parameters.ContainsKey(a.ToString()))
                {
                    s.Other[a.ToString()] = parameters[a.ToString()];
                }
            }
            s.Originator = new SDPOriginator();
            s.Other["s"] = "-";
            s.Other["t"] = offer.Other["t"];
            foreach (SDPMedia yourMedia in offer.Media)
            {
                SDPMedia myMedia = null;
                foreach (SDPMedia t in streams)
                {
                    if (t.Media != yourMedia.Media)
                    {
                        continue;
                    }
                    myMedia = new SDPMedia(t.ToString());
                    //streams.RemoveAt(i);
                    List <KeyValuePair <SDPMediaFormat, SDPMediaFormat> > found =
                        new List <KeyValuePair <SDPMediaFormat, SDPMediaFormat> >();
                    foreach (SDPMediaFormat yourmf in yourMedia.Mediaformats)
                    {
                        foreach (SDPMediaFormat mymf in myMedia.Mediaformats)
                        {
                            int mymfpt   = -1;
                            int yourmfpt = -1;
                            try
                            {
                                mymfpt   = Int32.Parse(mymf.Pt);
                                yourmfpt = Int32.Parse(yourmf.Pt);
                            }
                            catch (Exception)
                            {
                                mymfpt   = -1;
                                yourmfpt = -1;
                            }
                            if ((0 <= mymfpt && mymfpt < 32 && 0 <= yourmfpt && yourmfpt <= 32 && mymfpt == yourmfpt) ||
                                (mymfpt < 0 && yourmfpt < 0 && mymfpt == yourmfpt) ||
                                (mymf.Name == yourmf.Name && mymf.Rate == yourmf.Rate && mymf.Count == yourmf.Count))
                            {
                                found.Add(new KeyValuePair <SDPMediaFormat, SDPMediaFormat>(yourmf, mymf));
                                break;
                            }
                        }
                    }
                    if (found.Count > 0)
                    {
                        foreach (KeyValuePair <SDPMediaFormat, SDPMediaFormat> kvp in found)
                        {
                            myMedia.Mediaformats.Add(kvp.Key);
                        }
                    }
                    else
                    {
                        myMedia.Mediaformats.Clear();
                        SDPMediaFormat temp = new SDPMediaFormat {
                            Pt = "0"
                        };
                        myMedia.Mediaformats.Add(temp);
                        myMedia.Port = "0";
                    }
                }
                if (myMedia == null)
                {
                    myMedia = new SDPMedia(yourMedia.ToString())
                    {
                        Port = "0"
                    };
                }
                s.Media.Add(myMedia);
            }
            bool valid = s.Media.Any(myMedia => myMedia.Port != "0");

            return(valid ? s : null);
        }