public uint GetSegmentFromFragment(uint fragN)
        {
            if (segmentRunTables.Count == 0)
            {
                return(1);
            }

            if (!live)
            {
                SegmentFragmentPair firstSegment = GetFirstSegment();

                if (firstSegment == null)
                {
                    return(1);
                }

                uint segNum = firstSegment.firstSegment;
                foreach (var tab in segmentRunTables)
                {
                    foreach (var s in tab.segmentFragmentPairs)
                    {
                        if ((segNum >= s.firstSegment) && (fragN < (s.fragmentsAccrued + s.fragmentsPerSegment)))
                        {
                            return(segNum);
                        }
                    }
                }
            }
            return(GetLastSegment().firstSegment);
        }
        public uint totalFragments()
        {
            if (segmentFragmentPairs.Count < 1)
            {
                return(0);
            }
            SegmentFragmentPair sfp = segmentFragmentPairs[segmentFragmentPairs.Count - 1];

            return(sfp.fragmentsPerSegment + sfp.fragmentsAccrued);
        }
        /// <summary>
        /// Adds the given SegmentFragmentPair to this run table.
        /// </summary>
        private void addSegmentFragmentPair(SegmentFragmentPair sfp)
        {
            SegmentFragmentPair prevSfp = segmentFragmentPairs.Count <= 0 ? null : segmentFragmentPairs[segmentFragmentPairs.Count - 1];
            uint fragmentsAccrued       = 0;

            if (prevSfp != null)
            {
                fragmentsAccrued = prevSfp.fragmentsAccrued + (sfp.firstSegment - prevSfp.firstSegment) * prevSfp.fragmentsPerSegment;
            }
            sfp.fragmentsAccrued = fragmentsAccrued;
            segmentFragmentPairs.Add(sfp);
        }
        ///<summary>The total number of fragments in the movie.</summary>
        public uint GetFragmentsCount()
        {
            AdobeFragmentRunTable       lastFragmentTable = fragmentRunTables[fragmentRunTables.Count - 1];
            List <FragmentDurationPair> fdps = lastFragmentTable.fragmentDurationPairs;

            if (fdps.Count < 1)
            {
                SegmentFragmentPair lastSegment = GetLastSegment();
                return(lastSegment.fragmentsAccrued + lastSegment.fragmentsPerSegment - 1);
            }

            FragmentDurationPair lastValidFdp = fdps[fdps.Count - 1];

            if (lastValidFdp.duration == 0)
            {
                lastValidFdp = fdps[fdps.Count - 2];
            }

            int  deltaTime = (int)(currentMediaTime - lastValidFdp.durationAccrued);
            uint fragCount = (uint)((deltaTime <= lastValidFdp.duration) ? 1 : (deltaTime / lastValidFdp.duration));

            return(lastValidFdp.firstFragment + fragCount - 1);
        }
 private uint calculateSegmentId(SegmentFragmentPair sfp, uint fragmentId)
 {
     return(sfp.firstSegment + ((fragmentId - sfp.fragmentsAccrued - 1) / sfp.fragmentsPerSegment));
 }