コード例 #1
0
        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);
        }
コード例 #2
0
 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);
 }
コード例 #3
0
        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;
                    }
                }
            }
        }