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

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: 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
Index: media/renderers/video_renderer_impl.cc
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc
index cb92e45dcc62afa7f3b380afbbb0b15ac1166c02..8d87219a2d42b1b83fd07e19ce39efbc808c4af4 100644
--- a/media/renderers/video_renderer_impl.cc
+++ b/media/renderers/video_renderer_impl.cc
@@ -374,9 +374,6 @@ void VideoRendererImpl::FrameReady(uint32_t sequence_token,
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
@@ -397,19 +394,28 @@ void VideoRendererImpl::FrameReady(uint32_t sequence_token,
// 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
xhwang 2016/05/24 21:46:29 Could you please explain more about why when we se
DaleCurtis 2016/05/24 22:58:24 Done. Also fixed this such that it will also consi
+ // 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

Powered by Google App Engine
This is Rietveld 408576698