private int NextFragment(int prevfragment) { if (prevfragment == FragmentCount) { return(prevfragment); } prevfragment++; Fragment f = FragmentFromFragmentNumber(prevfragment); if (f.DiscontinuityIndicator.HasValue) { int idx = FragmentTables.IndexOf(f) + 1; prevfragment = idx < FragmentTables.Count ? FragmentTables.ElementAt(idx).Value.FirstFragment : FragmentCount; } return(prevfragment); }
private Fragment FragmentFromFragmentNumber(int fragment) { if (FragmentTables.Count == 1) { return(FragmentTables.ElementAt(0).Value); } for (int x = 0; x < FragmentTables.Count - 1; x++) { Fragment cu = FragmentTables.ElementAt(x).Value; Fragment ne = FragmentTables.ElementAt(x + 1).Value; if (fragment >= cu.FirstFragment && fragment < ne.FirstFragment) { return(cu); } } return(FragmentTables.ElementAt(FragmentTables.Count - 1).Value); }
public void InitFragments() { Segment first_segment = SegmentTables[SegmentTables.Keys.Min()]; Segment last_segment = SegmentTables[SegmentTables.Keys.Max()]; Fragment first_fragment = FragmentTables[FragmentTables.Keys.Min()]; Fragment last_fragment = FragmentTables[FragmentTables.Keys.Max()]; if ((last_fragment.FragmentDuration == 0) && (last_fragment.DiscontinuityIndicator.HasValue && last_fragment.DiscontinuityIndicator == 0)) { Live = false; FragmentTables.Remove(FragmentTables.Keys.Max()); last_fragment = FragmentTables[FragmentTables.Keys.Max()]; } InvalidFragCount = false; Segment prev = null; FragmentCount = 0; foreach (int n in SegmentTables.Keys) { Segment seg = SegmentTables[n]; if (prev != null) { FragmentCount += (seg.FirstEntry - prev.FirstEntry - 1) * prev.NumFragments; } FragmentCount += seg.NumFragments; prev = seg; } if ((FragmentCount & 0x80000000) != 0x80000000) { FragmentCount += first_fragment.FirstFragment - 1; } else { FragmentCount = 0; InvalidFragCount = true; } if (FragmentCount < last_fragment.FirstFragment) { FragmentCount = last_fragment.FirstFragment; } if (SegmentStart == -1) { SegmentStart = Live ? last_segment.FirstEntry : first_segment.FirstEntry; if (SegmentStart < 1) { SegmentStart = 1; } } if (FragmentStart == -1) { if (Live && !InvalidFragCount) { FragmentStart = FragmentCount - 2; } else { FragmentStart = first_fragment.FirstFragment - 1; if (FragmentStart < 0) { FragmentStart = 0; } } } }