void VideoSink::Redraw(const VideoInfo& aInfo) { AssertOwnerThread(); // No video track, nothing to draw. if (!aInfo.IsValid() || !mContainer) { return; } auto now = TimeStamp::Now(); RefPtr<VideoData> video = VideoQueue().PeekFront(); if (video) { if (mBlankImage) { video->mImage = mBlankImage; } video->MarkSentToCompositor(); mContainer->SetCurrentFrame(video->mDisplay, video->mImage, now); if (mSecondaryContainer) { mSecondaryContainer->SetCurrentFrame(video->mDisplay, video->mImage, now); } return; } // When we reach here, it means there are no frames in this video track. // Draw a blank frame to ensure there is something in the image container // to fire 'loadeddata'. RefPtr<Image> blank = mContainer->GetImageContainer()->CreatePlanarYCbCrImage(); mContainer->SetCurrentFrame(aInfo.mDisplay, blank, now); if (mSecondaryContainer) { mSecondaryContainer->SetCurrentFrame(aInfo.mDisplay, blank, now); } }
void VideoSink::Redraw(const VideoInfo& aInfo) { AssertOwnerThread(); // No video track, nothing to draw. if (!aInfo.IsValid() || !mContainer) { return; } if (VideoQueue().GetSize() > 0) { RenderVideoFrames(1); return; } // When we reach here, it means there are no frames in this video track. // Draw a blank frame to ensure there is something in the image container // to fire 'loadeddata'. RefPtr<Image> blank = mContainer->GetImageContainer()->CreatePlanarYCbCrImage(); mContainer->SetCurrentFrame(aInfo.mDisplay, blank, TimeStamp::Now()); }