| Index: media/filters/video_renderer_base.cc
|
| diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc
|
| index c50dfd4ecfd708876314f2d7af5e24320f32c14c..00cf9dc9559566a837787c14f93d9ba11449dab9 100644
|
| --- a/media/filters/video_renderer_base.cc
|
| +++ b/media/filters/video_renderer_base.cc
|
| @@ -151,6 +151,7 @@ void VideoRendererBase::Seek(base::TimeDelta time, FilterCallback* callback) {
|
| DCHECK_EQ(0u, pending_reads_) << "Pending reads should have completed";
|
| state_ = kSeeking;
|
| seek_callback_.reset(callback);
|
| + seek_timestamp_ = time;
|
|
|
| // Throw away everything and schedule our reads.
|
| // TODO(jiesun): this should be guaranteed by pause/flush before seek happen.
|
| @@ -390,10 +391,16 @@ void VideoRendererBase::OnFillBufferDone(scoped_refptr<VideoFrame> frame) {
|
| DCHECK_GT(pending_reads_, 0u);
|
| --pending_reads_;
|
|
|
| - // Enqueue the frame.
|
| - frames_queue_ready_.push_back(frame);
|
| - DCHECK_LE(frames_queue_ready_.size(), kMaxFrames);
|
| - frame_available_.Signal();
|
| + // Discard frames until we reach our desired seek timestamp.
|
| + if (state_ == kSeeking && !frame->IsEndOfStream() &&
|
| + (frame->GetTimestamp() + frame->GetDuration()) < seek_timestamp_) {
|
| + frames_queue_done_.push_back(frame);
|
| + ScheduleRead_Locked();
|
| + } else {
|
| + frames_queue_ready_.push_back(frame);
|
| + DCHECK_LE(frames_queue_ready_.size(), kMaxFrames);
|
| + frame_available_.Signal();
|
| + }
|
|
|
| // Check for our preroll complete condition.
|
| if (state_ == kSeeking) {
|
|
|