/// <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); } } } }
/// <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); }