public async Task Start(string baseurl, string guid, Manifest manifest, Media media, CancellationToken token, IProgress <double> progress) { this.media = media; this.guid = guid; this.baseurl = baseurl; this.bootstrap = media.Info.Info; this.manifest = manifest; await InitFile(); await DoNextFragment(); progress.Report((double)bootstrap.CurrentFragmentWrite * 100D / (double)bootstrap.FragmentCount); token.ThrowIfCancellationRequested(); await ThreadProcessor(token, progress); token.ThrowIfCancellationRequested(); }
public bool ReadBootStrap(BootStrap info) { info.Version = ReadByte(); info.Flags = EReadInt24(); info.BootStrapVersion = EReadInt32(); byte flags = ReadByte(); info.ProfileType = (flags & 0xc0) >> 6; if ((flags & 0x20) == 0x20) { info.Live = true; info.HasMetadata = false; } info.IsUpdate = ((flags & 0x10) == 0x10); if (!info.IsUpdate) { info.SegmentTables = new Dictionary <int, Segment>(); info.FragmentTables = new Dictionary <int, Fragment>(); } info.Timescale = EReadInt32(); info.CurrentMediaTime = EReadInt64(); info.SmpteTimeCodeOffset = EReadInt64(); info.MovieIdentifier = EReadString(); int cnt = ReadByte(); info.ServerEntryTable = new List <string>(); for (int x = 0; x < cnt; x++) { info.ServerEntryTable.Add(EReadString()); } cnt = ReadByte(); info.QualityEntryTable = new List <string>(); for (int x = 0; x < cnt; x++) { info.QualityEntryTable.Add(EReadString()); } info.DrmData = ReadString(); info.MetaData = ReadString(); cnt = ReadByte(); for (int x = 0; x < cnt; x++) { string name; long left = ReadHeader(out name); if (name == "asrt") { ReadSegment().ToList().ForEach(a => info.SegmentTables[a.Key] = a.Value); } else { BaseStream.Seek(left, SeekOrigin.Current); } } cnt = ReadByte(); for (int x = 0; x < cnt; x++) { string name; long left = ReadHeader(out name); if (name == "afrt") { ReadFragment().ToList().ForEach(a => info.FragmentTables[a.Key] = a.Value); } else { BaseStream.Seek(left, SeekOrigin.Current); } } info.SegmentTables = info.SegmentTables.OrderBy(a => a.Key).ToDictionary(a => a.Key, a => a.Value); info.FragmentTables = info.FragmentTables.OrderBy(a => a.Key).ToDictionary(a => a.Key, a => a.Value); info.InitFragments(); return(true); }