private int SendBlockToRenderer(MediaBlock currentBlock, TimeSpan playbackPosition)
        {
            // No blocks were rendered
            if (currentBlock == null || currentBlock.IsDisposed)
            {
                return(0);
            }

            var t = currentBlock.MediaType;
            var isAttachedPicture      = t == MediaType.Video && Container.Components[t].StreamInfo.IsAttachedPictureDisposition;
            var lastBlockStartTime     = MediaCore.LastRenderTime[t];
            var isRepeatedBlock        = lastBlockStartTime != TimeSpan.MinValue && lastBlockStartTime == currentBlock.StartTime;
            var requiresRepeatedBlocks = t == MediaType.Audio || isAttachedPicture;

            // For live streams, we don't want to display previosu blocks
            if (t == MediaType.Video && !isRepeatedBlock && !isAttachedPicture && Container.IsLiveStream)
            {
                isRepeatedBlock = lastBlockStartTime.Ticks >= currentBlock.StartTime.Ticks;
            }

            // Render by forced signal (TimeSpan.MinValue) or because simply it is time to do so
            // otherwise simply skip block rendering as we have sent the block already.
            if (isRepeatedBlock && !requiresRepeatedBlocks)
            {
                return(0);
            }

            // Process property changes coming from video blocks
            State.UpdateDynamicBlockProperties(currentBlock);

            // Capture the last render time so we don't repeat the block
            MediaCore.LastRenderTime[t] = currentBlock.StartTime;

            // Send the block to its corresponding renderer
            MediaCore.Renderers[t]?.Render(currentBlock, playbackPosition);

            // Log the block statistics for debugging
            LogRenderBlock(currentBlock, playbackPosition);

            return(1);
        }
예제 #2
0
        private int SendBlockToRenderer(MediaBlock incomingBlock, TimeSpan playbackPosition)
        {
            // No blocks were rendered
            if (incomingBlock == null || incomingBlock.IsDisposed)
            {
                return(0);
            }

            var t = incomingBlock.MediaType;
            var isAttachedPicture     = t == MediaType.Video && Container.Components[t].IsStillPictures;
            var currentBlockStartTime = MediaCore.CurrentRenderStartTime.ContainsKey(t)
                ? MediaCore.CurrentRenderStartTime[t]
                : TimeSpan.MinValue;

            var isRepeatedBlock        = currentBlockStartTime != TimeSpan.MinValue && currentBlockStartTime == incomingBlock.StartTime;
            var requiresRepeatedBlocks = t == MediaType.Audio || isAttachedPicture;

            // Render by forced signal (TimeSpan.MinValue) or because simply it is time to do so
            // otherwise simply skip block rendering as we have sent the block already.
            if (isRepeatedBlock && !requiresRepeatedBlocks)
            {
                return(0);
            }

            // Process property changes coming from video blocks
            State.UpdateDynamicBlockProperties(incomingBlock);

            // Capture the last render time so we don't repeat the block
            MediaCore.CurrentRenderStartTime[t] = incomingBlock.StartTime;

            // Send the block to its corresponding renderer
            MediaCore.Renderers[t]?.Render(incomingBlock, playbackPosition);

            // Log the block statistics for debugging
            LogRenderBlock(incomingBlock, playbackPosition);

            return(1);
        }