Chromium Code Reviews| Index: media/blink/webmediaplayer_impl.cc |
| diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
| index 3389d4a33706376b74273ac2d14951542df66f04..8cc7c905a102c4769c9d5eebd42c99f901d818ee 100644 |
| --- a/media/blink/webmediaplayer_impl.cc |
| +++ b/media/blink/webmediaplayer_impl.cc |
| @@ -226,7 +226,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
| overlay_surface_id_(SurfaceManager::kNoSurfaceID), |
| suppress_destruction_errors_(false), |
| can_suspend_state_(CanSuspendState::UNKNOWN), |
| - is_encrypted_(false) { |
| + is_encrypted_(false), |
| + client_playback_state_(PlaybackState::Paused) { |
| DCHECK(!adjust_allocated_memory_cb_.is_null()); |
| DCHECK(renderer_factory_); |
| DCHECK(client_); |
| @@ -588,6 +589,17 @@ void WebMediaPlayerImpl::setBufferingStrategy( |
| data_source_->SetBufferingStrategy(buffering_strategy_); |
| } |
| +void WebMediaPlayerImpl::setPlaybackState( |
| + WebMediaPlayer::PlaybackState playback_state) { |
| + client_playback_state_ = playback_state; |
| + if (highest_ready_state_ >= WebMediaPlayer::ReadyStateHaveFutureData) { |
| + DCHECK_EQ(client_playback_state_ == WebMediaPlayer::PlaybackState::Paused, |
| + paused_); |
| + } |
| + |
| + UpdatePlayState(); |
| +} |
| + |
| bool WebMediaPlayerImpl::hasVideo() const { |
| DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| @@ -1639,6 +1651,12 @@ WebMediaPlayerImpl::UpdatePlayState_ComputePlayState(bool is_remote, |
| bool have_future_data = |
| highest_ready_state_ >= WebMediaPlayer::ReadyStateHaveFutureData; |
| + // Once we reach HaveFutureData, our internal paused state should be accurate, |
| + // due to ordering of calls we may temporarily be out of sync though. |
|
sandersd (OOO until July 31)
2016/08/30 18:40:17
It's worth explicitly describing this as retaining
DaleCurtis
2016/08/30 21:56:04
This does happen, HTMLMediaElement::UpdatePlayStat
|
| + bool is_paused = |
| + have_future_data ? paused_ : client_playback_state_ == |
| + WebMediaPlayer::PlaybackState::Paused; |
| + |
| // Background suspend is not enabled for audio-only players unless paused, |
| // though in the case of audio-only the session should be kept. |
| // Videos are not suspended if the user resumed the playback via the remote |
| @@ -1650,10 +1668,7 @@ WebMediaPlayerImpl::UpdatePlayState_ComputePlayState(bool is_remote, |
| delegate_ && delegate_->IsPlayingBackgroundVideo(); |
| bool background_suspended = is_backgrounded_video && |
| !(can_play_backgrounded && is_background_playing); |
| - |
| - // The |paused_| state is not reliable until we |have_future_data|. |
| - bool background_pause_suspended = |
| - is_backgrounded && have_future_data && paused_; |
| + bool background_pause_suspended = is_backgrounded && is_paused; |
| // Idle suspend is enabled once there is future data. We don't want to idle |
| // suspend before that because play() may never be triggered to leave the idle |
| @@ -1663,16 +1678,14 @@ WebMediaPlayerImpl::UpdatePlayState_ComputePlayState(bool is_remote, |
| // |
| // TODO(sandersd): Make the delegate suspend idle players immediately when |
| // hidden. |
| - // TODO(sandersd): If Blink told us the paused state sooner, we could |
| - // idle suspend sooner. |
| - bool idle_suspended = is_idle_ && have_future_data; |
| + bool idle_suspended = is_idle_ && is_paused; |
| // Combined suspend state. |
| result.is_suspended = |
| is_remote || must_suspend_ || idle_suspended || background_suspended || |
| background_pause_suspended || |
| // If we're already suspended, see if we can wait for user interaction. |
| - (is_suspended && have_future_data && paused_ && !seeking_); |
| + (is_suspended && is_paused && !seeking_); |
|
sandersd (OOO until July 31)
2016/08/30 18:40:18
While you're in here, can you pull this condition
DaleCurtis
2016/08/30 21:56:04
Done.
|
| // We do not treat |playback_rate_| == 0 as paused. For the media session, |
| // being paused implies displaying a play button, which is incorrect in this |