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