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); }
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); }