Exemplo n.º 1
0
        private void ResolvePacedKeyFrames()
        {
            var pacedSegments = GetRelevantPacedSegments();

            foreach (var pacedSegment in pacedSegments)
            {
                var startIndex         = pacedSegment.Offset;
                var startTime          = _keyFrames.ElementBefore(startIndex).ResolvedKeyTime;
                var segmentLengths     = new List <double>(pacedSegment.Count + 1);
                var totalSegmentLength = 0d;
                var from = _keyFrames[startIndex - 1].Value;

                // Calculate the segment lengths for the whole segment. Also include
                // the element after the segment.
                for (int i = pacedSegment.Offset; i < pacedSegment.Offset + pacedSegment.Count; i++)
                {
                    var to = _keyFrames[i].Value;
                    totalSegmentLength += _segmentLengthProvider.GetDistanceBetween(from, to);
                    segmentLengths.Add(totalSegmentLength);
                    from = to;
                }

                int      frameAfterSegmentIndex = pacedSegment.Offset + pacedSegment.Count;
                var      frameAfterSegment      = _keyFrames[frameAfterSegmentIndex];
                TimeSpan totalSegmentDuration   = frameAfterSegment.ResolvedKeyTime - startTime;
                totalSegmentLength += _segmentLengthProvider.GetDistanceBetween(from, frameAfterSegment.Value);

                for (int i = pacedSegment.Offset; i < pacedSegment.Offset + pacedSegment.Count; i++)
                {
                    var currentFrame         = _keyFrames[i];
                    var currentSegmentLength = segmentLengths[i - pacedSegment.Offset];

                    currentFrame.Resolve(
                        startTime + TimeSpan.FromMilliseconds(
                            currentSegmentLength / totalSegmentLength * totalSegmentDuration.TotalMilliseconds));
                }
            }
        }