Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(325)

Unified Diff: media/renderers/video_renderer_impl.cc

Issue 2007463005: Paint first frame faster, don't crash with no frames during EOS. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Whoops, fix comment. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/video_frame.cc ('k') | media/renderers/video_renderer_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/renderers/video_renderer_impl.cc
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc
index 35747764cf8e6a803e3ff5a11ec1dce2c24a6b0f..9e4954e2783e1b282759171b9425fbbbfd32bf87 100644
--- a/media/renderers/video_renderer_impl.cc
+++ b/media/renderers/video_renderer_impl.cc
@@ -368,9 +368,6 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status,
if (frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)) {
DCHECK(!received_end_of_stream_);
received_end_of_stream_ = true;
-
- // See if we can fire EOS immediately instead of waiting for Render().
- MaybeFireEndedCallback_Locked(time_progressing_);
} else if ((low_delay_ || !video_frame_stream_->CanReadWithoutStalling()) &&
IsBeforeStartTime(frame->timestamp())) {
// Don't accumulate frames that are earlier than the start time if we
@@ -391,19 +388,28 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status,
// Attempt to purge bad frames in case of underflow or backgrounding.
RemoveFramesForUnderflowOrBackgroundRendering();
- // Signal buffering state if we've met our conditions.
- if (buffering_state_ == BUFFERING_HAVE_NOTHING && HaveEnoughData_Locked()) {
- TransitionToHaveEnough_Locked();
-
- // Paint the first frame if necessary.
- if (!rendered_end_of_stream_ && !sink_started_) {
- DCHECK(algorithm_->frames_queued());
+ // We may have removed all frames above and have reached end of stream.
+ MaybeFireEndedCallback_Locked(time_progressing_);
+
+ // Paint the first frame if possible and necessary. PaintSingleFrame() will
+ // ignore repeated calls for the same frame. Paint ahead of HAVE_ENOUGH_DATA
+ // to ensure the user sees the frame as early as possible.
+ if (!sink_started_ && algorithm_->frames_queued()) {
+ // We want to paint the first frame under two conditions: Either (1) we have
+ // enough frames to know it's definitely the first frame or (2) there may be
+ // no more frames coming (sometimes unless we paint one of them).
+ if (algorithm_->frames_queued() > 1 || received_end_of_stream_ ||
+ low_delay_ || !video_frame_stream_->CanReadWithoutStalling()) {
scoped_refptr<VideoFrame> frame = algorithm_->first_frame();
CheckForMetadataChanges(frame->format(), frame->natural_size());
sink_->PaintSingleFrame(frame);
}
}
+ // Signal buffering state if we've met our conditions.
+ if (buffering_state_ == BUFFERING_HAVE_NOTHING && HaveEnoughData_Locked())
+ TransitionToHaveEnough_Locked();
+
// Always request more decoded video if we have capacity. This serves two
// purposes:
// 1) Prerolling while paused
« no previous file with comments | « media/base/video_frame.cc ('k') | media/renderers/video_renderer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698