Index: media/blink/webmediaplayer_impl.cc |
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
index 6bdb267db295750a9d56df5ee433ed1e6254d9a7..37306d7b322d5e686f8fd5b51e0237739654e343 100644 |
--- a/media/blink/webmediaplayer_impl.cc |
+++ b/media/blink/webmediaplayer_impl.cc |
@@ -236,6 +236,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
DCHECK(renderer_factory_); |
DCHECK(client_); |
+ tick_clock_ = &default_tick_clock_; |
+ |
force_video_overlays_ = base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kForceVideoOverlays); |
@@ -782,6 +784,9 @@ bool WebMediaPlayerImpl::didLoadingProgress() { |
UpdatePlayState(); |
} |
+ if (did_loading_progress) |
+ last_time_loading_progressed_ = tick_clock_->NowTicks(); |
+ |
return did_loading_progress; |
} |
@@ -1311,12 +1316,31 @@ void WebMediaPlayerImpl::OnShown() { |
void WebMediaPlayerImpl::OnSuspendRequested(bool must_suspend) { |
DCHECK(main_task_runner_->BelongsToCurrentThread()); |
- if (must_suspend) |
+ if (must_suspend) { |
must_suspend_ = true; |
- else |
+ UpdatePlayState(); |
+ return; |
+ } |
+ |
+ // If we're beyond HaveFutureData, we can safely suspend at any time. |
+ if (highest_ready_state_ >= WebMediaPlayer::ReadyStateHaveFutureData) { |
is_idle_ = true; |
+ UpdatePlayState(); |
+ return; |
+ } |
- UpdatePlayState(); |
+ // Before HaveFutureData blink will not call play(), so we must be careful to |
DaleCurtis
2016/10/28 19:11:42
This will never be called again. So even after 3 s
watk
2016/10/28 20:03:22
What about calling delegate_->DidPause()? Then the
|
+ // only suspend if we'll eventually receive an event that will trigger a |
+ // resume. If the last time loading progressed was longer than 3 seconds ago, |
+ // and we still haven't reached HaveFutureData, assume that we're waiting on |
+ // more data to proceed. When that data is loaded the pipeline will be resumed |
+ // by didLoadingProgress(). |
+ if (last_time_loading_progressed_.is_null() || |
+ (tick_clock_->NowTicks() - last_time_loading_progressed_) > |
+ base::TimeDelta::FromSeconds(3)) { |
+ is_idle_ = true; |
+ UpdatePlayState(); |
+ } |
} |
void WebMediaPlayerImpl::OnPlay() { |