Index: media/filters/video_renderer_impl.cc |
diff --git a/media/filters/video_renderer_impl.cc b/media/filters/video_renderer_impl.cc |
index 531c1731059ad124bd367eedd3083549bbb5fdd6..da07d9a6afb68d4dabf8f3f093b63089a405cd52 100644 |
--- a/media/filters/video_renderer_impl.cc |
+++ b/media/filters/video_renderer_impl.cc |
@@ -128,13 +128,27 @@ void VideoRendererImpl::Preroll(base::TimeDelta time, |
const PipelineStatusCB& cb) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
base::AutoLock auto_lock(lock_); |
- DCHECK_EQ(state_, kFlushed) << "Must flush prior to prerolling."; |
DCHECK(!cb.is_null()); |
DCHECK(preroll_cb_.is_null()); |
+ DCHECK(state_ == kFlushed || state_== kPaused) << "state_ " << state_; |
+ |
+ if (state_ == kFlushed) { |
+ DCHECK(time != kNoTimestamp()); |
+ DCHECK(!pending_read_); |
+ DCHECK(ready_frames_.empty()); |
+ } else { |
+ DCHECK(time == kNoTimestamp()); |
+ } |
state_ = kPrerolling; |
preroll_cb_ = cb; |
preroll_timestamp_ = time; |
+ |
+ if (ShouldTransitionToPrerolled_Locked()) { |
+ TransitionToPrerolled_Locked(); |
+ return; |
+ } |
+ |
AttemptRead_Locked(); |
} |
@@ -388,18 +402,15 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status, |
// Maintain the latest frame decoded so the correct frame is displayed after |
// prerolling has completed. |
- if (state_ == kPrerolling && frame->GetTimestamp() <= preroll_timestamp_) { |
+ if (state_ == kPrerolling && preroll_timestamp_ != kNoTimestamp() && |
+ frame->GetTimestamp() <= preroll_timestamp_) { |
ready_frames_.clear(); |
} |
AddReadyFrame_Locked(frame); |
- if (state_ == kPrerolling) { |
- if (!video_frame_stream_.CanReadWithoutStalling() || |
- ready_frames_.size() >= static_cast<size_t>(limits::kMaxVideoFrames)) { |
- TransitionToPrerolled_Locked(); |
- } |
- } |
+ if (ShouldTransitionToPrerolled_Locked()) |
+ TransitionToPrerolled_Locked(); |
// Always request more decoded video if we have capacity. This serves two |
// purposes: |
@@ -408,6 +419,12 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status, |
AttemptRead_Locked(); |
} |
+bool VideoRendererImpl::ShouldTransitionToPrerolled_Locked() { |
+ return state_ == kPrerolling && |
+ (!video_frame_stream_.CanReadWithoutStalling() || |
+ ready_frames_.size() >= static_cast<size_t>(limits::kMaxVideoFrames)); |
+} |
+ |
void VideoRendererImpl::AddReadyFrame_Locked( |
const scoped_refptr<VideoFrame>& frame) { |
lock_.AssertAcquired(); |