public TimedTextElement()
 {
     Type       = "captionelement";
     Style      = new TimedTextStyle();
     Animations = new MediaMarkerCollection <TimedTextAnimation>();
     Children   = new MediaMarkerCollection <TimedTextElement>();
 }
        private static void UpdateCaptions <TElement>(MediaMarkerCollection <TElement> originalElements, IEnumerable <TElement> newElements) where TElement : TimedTextElement
        {
            foreach (var updatedElement in newElements)
            {
                if (originalElements.ContainsId(updatedElement.Id))
                {
                    bool updated         = false;
                    var  originalElement = originalElements.GetById(updatedElement.Id);

                    if (originalElement.Begin > updatedElement.Begin)
                    {
                        updated = true;
                        originalElement.Begin = updatedElement.Begin;
                    }

                    if (originalElement.End < updatedElement.End)
                    {
                        updated             = true;
                        originalElement.End = updatedElement.End;
                    }

                    if (updated)
                    {
                        originalElement.NotifyPositionChanged();
                    }

                    UpdateCaptions(originalElement.Children, updatedElement.Children);
                }
                else
                {
                    originalElements.Add(updatedElement);
                }
            }
        }
コード例 #3
0
 public TimedTextElement()
 {
     Type = "captionelement";
     Style = new TimedTextStyle();
     Animations = new MediaMarkerCollection<TimedTextAnimation>();
     Children = new MediaMarkerCollection<TimedTextElement>();
 }
        /// <summary>
        /// Checks for markers that have been skipped.
        /// </summary>
        public void CheckForSkippedMarkers(TimeSpan mediaPosition, MediaMarkerCollection <T> markers)
        {
            if (PreviousPosition.HasValue)
            {
                bool     movingForward = mediaPosition > PreviousPosition.Value;
                TimeSpan rangeStart    = movingForward ? PreviousPosition.Value : mediaPosition;
                TimeSpan rangeEnd      = movingForward ? mediaPosition : PreviousPosition.Value;

                var skippedMarkers = markers.WhereContainedByRange(rangeStart, rangeEnd);
                skippedMarkers.ForEach(OnMarkerSkipped);
            }
        }
        /// <summary>
        /// Checks for markers whose position has been reached or left.
        /// </summary>
        public void CheckMarkerPositions(TimeSpan mediaPosition, MediaMarkerCollection <TMediaMarker> markers, bool seeking = false, bool ignoreSearchWindow = false)
        {
            lock (_syncObject)
            {
                // clean up any previously active markers that are no longer in the markers list
                PreviouslyActiveMarkers.ToList()
                .Where(i => !markers.Contains(i))
                .ForEach(OnMarkerLeft)
                .ForEach(i => PreviouslyActiveMarkers.Remove(i));

                //Safeguard against large unusual position changes
                if (!seeking && PreviousPosition.HasValue)
                {
                    var rangeStart = PreviousPosition.Value < mediaPosition ? PreviousPosition.Value : mediaPosition;
                    var rangeEnd   = PreviousPosition.Value > mediaPosition ? PreviousPosition.Value : mediaPosition;

                    seeking = rangeEnd.Subtract(rangeStart) > LargestNormalStepSize;
                }

                IList <TMediaMarker> activeMarkers;
                var searchAfter = SeekingSearchWindow.HasValue && !ignoreSearchWindow
                                        ? mediaPosition.Subtract(SeekingSearchWindow.Value)
                                        : (TimeSpan?)null;

                if (!seeking && PreviousPosition.HasValue)
                {
                    var rangeStart = PreviousPosition.Value < mediaPosition ? PreviousPosition.Value : mediaPosition;
                    var rangeEnd   = PreviousPosition.Value > mediaPosition ? PreviousPosition.Value : mediaPosition;
                    activeMarkers = markers.WhereActiveInRange(rangeStart, rangeEnd, searchAfter).ToList();
                }
                else
                {
                    activeMarkers = markers.WhereActiveAtPosition(mediaPosition, searchAfter).ToList();
                }


                PreviouslyActiveMarkers.Where(i => !i.IsActiveAtPosition(mediaPosition))
                .ForEach(OnMarkerLeft)
                .ForEach(i => activeMarkers.Remove(i));

                activeMarkers.Where(i => !PreviousPosition.HasValue || !PreviouslyActiveMarkers.Contains(i))
                .ForEach(i => OnMarkerReached(i, seeking));

                PreviouslyActiveMarkers = PreviouslyActiveMarkers.Where(i => i.IsActiveAtPosition(mediaPosition) && !activeMarkers.Contains(i))
                                          .Concat(activeMarkers)
                                          .ToList();
                PreviousPosition = mediaPosition;
            }
        }
コード例 #6
0
        public TimedTextCaptions(IMarkerManager<CaptionRegion> CaptionManager = null, Func<MediaMarkerCollection<TimedTextElement>, IMarkerManager<TimedTextElement>> RegionManagerFactory = null)
        {
            DefaultStyleKey = typeof(TimedTextCaptions);

            factory.NewMarkers += NewMarkers;
            factory.MarkersRemoved += MarkersRemoved;

            this.SizeChanged += this_SizeChanged;

            captionManager = CaptionManager ?? new MediaMarkerManager<CaptionRegion>();
            regionManagerFactory = RegionManagerFactory ?? (m => new MediaMarkerManager<TimedTextElement>() { Markers = m });

            Captions = new MediaMarkerCollection<CaptionRegion>();

            captionManager.MarkerLeft += captionManager_MarkerLeft;
            captionManager.MarkerReached += captionManager_MarkerReached;
        }
        private void OnCaptionsChanged(MediaMarkerCollection<CaptionRegion> oldValue, MediaMarkerCollection<CaptionRegion> newValue)
        {
            if (newValue != null)
            {
                newValue.CollectionChanged += Captions_CollectionChanged;
                newValue.MarkerPositionChanged += CaptionPositionChanged;
            }

            if (oldValue != null)
            {
                oldValue.CollectionChanged -= Captions_CollectionChanged;
                oldValue.MarkerPositionChanged -= CaptionPositionChanged;
            }
        }
        private void OnChaptersChanged(MediaMarkerCollection<Chapter> oldChapters, MediaMarkerCollection<Chapter> newChapters)
        {
            oldChapters.IfNotNull(i => i.CollectionChanged -= Chapters_CollectionChanged);
            newChapters.IfNotNull(i => i.CollectionChanged += Chapters_CollectionChanged);

            ChaptersChanged.IfNotNull(i => i(this, EventArgs.Empty));
        }
        private void OnAdMarkersChanged(MediaMarkerCollection<AdMarker> oldAdMarkers, MediaMarkerCollection<AdMarker> newAdMarkers)
        {
            oldAdMarkers.IfNotNull(i => i.CollectionChanged -= AdMarkers_CollectionChanged);
            newAdMarkers.IfNotNull(i => i.CollectionChanged += AdMarkers_CollectionChanged);

            AdMarkersChanged.IfNotNull(i => i(this, EventArgs.Empty));
        }
        private void OnTimelineMarkersChanged(MediaMarkerCollection<TimelineMediaMarker> oldTimelineMarkers, MediaMarkerCollection<TimelineMediaMarker> newTimelineMarkers)
        {
            oldTimelineMarkers.IfNotNull(i => i.CollectionChanged -= TimelineMarkers_CollectionChanged);
            newTimelineMarkers.IfNotNull(i => i.CollectionChanged += TimelineMarkers_CollectionChanged);

            TimelineMarkersChanged.IfNotNull(i => i(this, EventArgs.Empty));
        }
コード例 #11
0
 public MediaMarkerManager()
 {
     Markers = new MediaMarkerCollection();
 }