| Index: media/blink/webmediaplayer_impl.cc
|
| diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
|
| index 7c67743e982b430e3c7794a1e1d2a3310806ee3c..bdd19cbff8ad078f50001176bc66c7658bff8d4d 100644
|
| --- a/media/blink/webmediaplayer_impl.cc
|
| +++ b/media/blink/webmediaplayer_impl.cc
|
| @@ -34,6 +34,7 @@
|
| #include "media/base/media_content_type.h"
|
| #include "media/base/media_log.h"
|
| #include "media/base/media_switches.h"
|
| +#include "media/base/stream_position.h"
|
| #include "media/base/text_renderer.h"
|
| #include "media/base/timestamp_constants.h"
|
| #include "media/base/video_frame.h"
|
| @@ -445,15 +446,24 @@ bool WebMediaPlayerImpl::supportsSave() const {
|
| void WebMediaPlayerImpl::seek(double seconds) {
|
| DVLOG(1) << __func__ << "(" << seconds << "s)";
|
| DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| - DoSeek(base::TimeDelta::FromSecondsD(seconds), true);
|
| + DoSeek(StreamPosition::KeyFramePrecedingTime(
|
| + base::TimeDelta::FromSecondsD(seconds)),
|
| + true);
|
| }
|
|
|
| -void WebMediaPlayerImpl::DoSeek(base::TimeDelta time, bool time_updated) {
|
| +void WebMediaPlayerImpl::fastSeek(double seconds) {
|
| + DVLOG(1) << __func__ << "(" << seconds << "s)";
|
| + DCHECK(main_task_runner_->BelongsToCurrentThread());
|
| + DoSeek(StreamPosition::Precise(base::TimeDelta::FromSecondsD(seconds)), true);
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::DoSeek(StreamPosition position, bool time_updated) {
|
| DCHECK(main_task_runner_->BelongsToCurrentThread());
|
|
|
| #if defined(OS_ANDROID) // WMPI_CAST
|
| if (isRemote()) {
|
| - cast_impl_.seek(time);
|
| + // XXX: Revisit.
|
| + cast_impl_.seek(position.time);
|
| return;
|
| }
|
| #endif
|
| @@ -470,8 +480,8 @@ void WebMediaPlayerImpl::DoSeek(base::TimeDelta time, bool time_updated) {
|
| // 2) For MSE.
|
| // Because the buffers may have changed between seeks, MSE seeks are
|
| // never elided.
|
| - if (paused_ && pipeline_controller_.IsStable() && paused_time_ == time &&
|
| - !chunk_demuxer_) {
|
| + if (paused_ && pipeline_controller_.IsStable() &&
|
| + paused_time_ == position.time && !chunk_demuxer_) {
|
| // If the ready state was high enough before, we can indicate that the seek
|
| // completed just by restoring it. Otherwise we will just wait for the real
|
| // ready state change to eventually happen.
|
| @@ -494,10 +504,12 @@ void WebMediaPlayerImpl::DoSeek(base::TimeDelta time, bool time_updated) {
|
| ended_ = false;
|
|
|
| seeking_ = true;
|
| - seek_time_ = time;
|
| + // XXX: Revisit. The page can observe time going backwards, but Android has
|
| + // always had this problem.
|
| + seek_time_ = position.time;
|
| if (paused_)
|
| - paused_time_ = time;
|
| - pipeline_controller_.Seek(time, time_updated);
|
| + paused_time_ = position.time;
|
| + pipeline_controller_.Seek(position, time_updated);
|
|
|
| // This needs to be called after Seek() so that if a resume is triggered, it
|
| // is to the correct time.
|
| @@ -1319,7 +1331,7 @@ void WebMediaPlayerImpl::OnRemotePlaybackEnded() {
|
| }
|
|
|
| void WebMediaPlayerImpl::OnDisconnectedFromRemoteDevice(double t) {
|
| - DoSeek(base::TimeDelta::FromSecondsD(t), false);
|
| + DoSeek(StreamPosition::Precise(base::TimeDelta::FromSecondsD(t)), false);
|
|
|
| // We already told the delegate we're paused when remoting started.
|
| client_->playbackStateChanged();
|
|
|