public bool Equals(MediaDescription other) { return(EnumerableExtensions.SequenceEquals(this, other)); //using (var one = other.GetEnumerator()) //{ // using (var two = GetEnumerator()) // { // while (one.MoveNext() && two.MoveNext()) // { // if (one.Current.Equals(two.Current).Equals(false)) return false; // } // return true; // } //} }
public static TimeDescription GetTimeDescription(this MediaDescription mediaDescription, SessionDescription sessionDescription) { if (IDisposedExtensions.IsNullOrDisposed(mediaDescription) || IDisposedExtensions.IsNullOrDisposed(sessionDescription)) { return(null); } //Get index of mediaDescription //Needs a better way to get the index of the media description int index = sessionDescription.GetIndexFor(mediaDescription); //Array.IndexOf(sessionDescription.MediaDescriptions.ToArray(), mediaDescription); if (index == -1) { return(null); } return(sessionDescription.GetTimeDescription(index)); }
//Should have a date when or should return the date playable, which would then be used by another method to compare against a time. public static bool IsPlayable(this MediaDescription mediaDescription, SessionDescription sessionDescription) //, DateTime? check = null) ,TimeSpan within = TimeSpan.Zero { if (IDisposedExtensions.IsNullOrDisposed(mediaDescription) || IDisposedExtensions.IsNullOrDisposed(sessionDescription)) { return(false); } //Get index of mediaDesription //Check TimeDescription @ index. TimeDescription td = GetTimeDescription(mediaDescription, sessionDescription); //Assume true if (IDisposedExtensions.IsNullOrDisposed(td)) { return(true); } //Unbound start and end ? if (td.IsPermanent) { return(true); } //Notes multiple calls to UtcNow... (avoid with a within parameter)? try { //Ensure not a bounded end and that the end time is less than now if (false.Equals(td.StopTime.Equals(0)) && td.NtpStopDateTime >= DateTime.UtcNow) { return(false); } //Ensure start time is not bounded and that the start time is greater than now if (false.Equals(td.StartTime.Equals(0)) && td.NtpStartDateTime > DateTime.UtcNow) { return(false); } //Check repeat times. //td.RepeatTimes; } catch { //Out of range values for conversion, assume true if end is unbounded if (false.Equals(td.StopTime.Equals(0))) { return(false); } } finally { td = null; } return(true); }
/// <summary> /// Parses the <see cref="MediaDescription.ControlLine"/> and if present /// </summary> /// <param name="mediaDescription"></param> /// <param name="source"></param> /// <returns></returns> public static Uri GetAbsoluteControlUri(this MediaDescription mediaDescription, Uri source, SessionDescription sessionDescription = null) { if (object.ReferenceEquals(source, null)) { throw new ArgumentNullException("source"); } if (IDisposedExtensions.IsNullOrDisposed(mediaDescription)) { return(source); } if (source.IsAbsoluteUri.Equals(false)) { throw new InvalidOperationException("source.IsAbsoluteUri must be true."); } SessionDescriptionLine controlLine = mediaDescription.ControlLine; //If there is a control line in the SDP it contains the URI used to setup and control the media if (object.ReferenceEquals(controlLine, null).Equals(false)) { //Todo, make typed line for controlLine string controlPart = controlLine.Parts.Last(); //controlLine.Parts.Where(p => p.StartsWith(AttributeFields.Control)).FirstOrDefault(); //If there is a controlPart in the controlLine if (string.IsNullOrWhiteSpace(controlPart).Equals(false)) { //Prepare the part controlPart = controlPart.Split(Media.Sdp.SessionDescription.ColonSplit, 2, StringSplitOptions.RemoveEmptyEntries).Last(); //Create a uri Uri controlUri = new Uri(controlPart, UriKind.RelativeOrAbsolute); //Determine if its a Absolute Uri if (controlUri.IsAbsoluteUri) { return(controlUri); } //Return a new uri using the original string and the controlUri relative path. //Hopefully the direction of the braces matched.. //string.Join(source.OriginalString, controlUri.OriginalString); return(new Uri(source.OriginalString.EndsWith(SessionDescription.ForwardSlashString) ? source.OriginalString + controlUri.OriginalString : string.Join(SessionDescription.ForwardSlashString, source.OriginalString, controlUri.OriginalString))); //Todo, ensure that any parameters have also been restored... #region Explination //I wonder if Mr./(Dr) Fielding is happy... //Let source = //rtsp://alt1.v7.cache3.c.youtube.com/CigLENy73wIaHwmddh2T-s8niRMYDSANFEgGUgx1c2VyX3VwbG9hZHMM/0/0/0/1/video.3gp/trackID=0 //Call //return new Uri(source, controlUri); //Result = //rtsp://alt1.v7.cache3.c.youtube.com/CigLENy73wIaHwmddh2T-s8niRMYDSANFEgGUgx1c2VyX3VwbG9hZHMM/0/0/0/1/trackID=0 //Useless when the source doesn't end with '/', e.g. same problem with Uri constructor. //System.UriBuilder builder = new UriBuilder(source); //builder.Path += controlUri.ToString(); //"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov/trackID=1" #endregion } } //Try to take the session level control uri Uri sessionControlUri; //If there was a session description given and it supports aggregate media control then return that uri if (IDisposedExtensions.IsNullOrDisposed(sessionDescription).Equals(false) && sessionDescription.SupportsAggregateMediaControl(out sessionControlUri, source)) { return(sessionControlUri); } //There is no control line, just return the source. return(source); }