Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Side by Side Diff: media/blink/webmediaplayer_impl.cc

Issue 2289543005: Allow suspension prior to reaching kHaveFutureData. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/blink/webmediaplayer_impl.h" 5 #include "media/blink/webmediaplayer_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <limits> 9 #include <limits>
10 #include <string> 10 #include <string>
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 #if defined(OS_ANDROID) // WMPI_CAST 219 #if defined(OS_ANDROID) // WMPI_CAST
220 cast_impl_(this, client_, params.context_3d_cb()), 220 cast_impl_(this, client_, params.context_3d_cb()),
221 #endif 221 #endif
222 volume_(1.0), 222 volume_(1.0),
223 volume_multiplier_(1.0), 223 volume_multiplier_(1.0),
224 renderer_factory_(std::move(renderer_factory)), 224 renderer_factory_(std::move(renderer_factory)),
225 surface_manager_(params.surface_manager()), 225 surface_manager_(params.surface_manager()),
226 overlay_surface_id_(SurfaceManager::kNoSurfaceID), 226 overlay_surface_id_(SurfaceManager::kNoSurfaceID),
227 suppress_destruction_errors_(false), 227 suppress_destruction_errors_(false),
228 can_suspend_state_(CanSuspendState::UNKNOWN), 228 can_suspend_state_(CanSuspendState::UNKNOWN),
229 is_encrypted_(false) { 229 is_encrypted_(false),
230 client_playback_state_(PlaybackState::Paused) {
230 DCHECK(!adjust_allocated_memory_cb_.is_null()); 231 DCHECK(!adjust_allocated_memory_cb_.is_null());
231 DCHECK(renderer_factory_); 232 DCHECK(renderer_factory_);
232 DCHECK(client_); 233 DCHECK(client_);
233 234
234 force_video_overlays_ = base::CommandLine::ForCurrentProcess()->HasSwitch( 235 force_video_overlays_ = base::CommandLine::ForCurrentProcess()->HasSwitch(
235 switches::kForceVideoOverlays); 236 switches::kForceVideoOverlays);
236 237
237 if (delegate_) 238 if (delegate_)
238 delegate_id_ = delegate_->AddObserver(this); 239 delegate_id_ = delegate_->AddObserver(this);
239 240
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 buffering_strategy_ = MultibufferDataSource::BUFFERING_STRATEGY_NORMAL; 582 buffering_strategy_ = MultibufferDataSource::BUFFERING_STRATEGY_NORMAL;
582 #else 583 #else
583 buffering_strategy_ = 584 buffering_strategy_ =
584 static_cast<MultibufferDataSource::BufferingStrategy>(buffering_strategy); 585 static_cast<MultibufferDataSource::BufferingStrategy>(buffering_strategy);
585 #endif 586 #endif
586 587
587 if (data_source_) 588 if (data_source_)
588 data_source_->SetBufferingStrategy(buffering_strategy_); 589 data_source_->SetBufferingStrategy(buffering_strategy_);
589 } 590 }
590 591
592 void WebMediaPlayerImpl::setPlaybackState(
593 WebMediaPlayer::PlaybackState playback_state) {
594 client_playback_state_ = playback_state;
595 if (highest_ready_state_ >= WebMediaPlayer::ReadyStateHaveFutureData) {
596 DCHECK_EQ(client_playback_state_ == WebMediaPlayer::PlaybackState::Paused,
597 paused_);
598 }
599
600 UpdatePlayState();
601 }
602
591 bool WebMediaPlayerImpl::hasVideo() const { 603 bool WebMediaPlayerImpl::hasVideo() const {
592 DCHECK(main_task_runner_->BelongsToCurrentThread()); 604 DCHECK(main_task_runner_->BelongsToCurrentThread());
593 605
594 return pipeline_metadata_.has_video; 606 return pipeline_metadata_.has_video;
595 } 607 }
596 608
597 bool WebMediaPlayerImpl::hasAudio() const { 609 bool WebMediaPlayerImpl::hasAudio() const {
598 DCHECK(main_task_runner_->BelongsToCurrentThread()); 610 DCHECK(main_task_runner_->BelongsToCurrentThread());
599 611
600 return pipeline_metadata_.has_audio; 612 return pipeline_metadata_.has_audio;
(...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after
1632 // errors. 1644 // errors.
1633 bool has_error = IsNetworkStateError(network_state_); 1645 bool has_error = IsNetworkStateError(network_state_);
1634 1646
1635 // After HaveMetadata, we know which tracks are present and the duration. 1647 // After HaveMetadata, we know which tracks are present and the duration.
1636 bool have_metadata = ready_state_ >= WebMediaPlayer::ReadyStateHaveMetadata; 1648 bool have_metadata = ready_state_ >= WebMediaPlayer::ReadyStateHaveMetadata;
1637 1649
1638 // After HaveFutureData, Blink will call play() if the state is not paused. 1650 // After HaveFutureData, Blink will call play() if the state is not paused.
1639 bool have_future_data = 1651 bool have_future_data =
1640 highest_ready_state_ >= WebMediaPlayer::ReadyStateHaveFutureData; 1652 highest_ready_state_ >= WebMediaPlayer::ReadyStateHaveFutureData;
1641 1653
1654 // Once we reach HaveFutureData, our internal paused state should be accurate,
1655 // 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
1656 bool is_paused =
1657 have_future_data ? paused_ : client_playback_state_ ==
1658 WebMediaPlayer::PlaybackState::Paused;
1659
1642 // Background suspend is not enabled for audio-only players unless paused, 1660 // Background suspend is not enabled for audio-only players unless paused,
1643 // though in the case of audio-only the session should be kept. 1661 // though in the case of audio-only the session should be kept.
1644 // Videos are not suspended if the user resumed the playback via the remote 1662 // Videos are not suspended if the user resumed the playback via the remote
1645 // controls earlier and it's still playing. 1663 // controls earlier and it's still playing.
1646 bool is_backgrounded_video = is_backgrounded && have_metadata && hasVideo(); 1664 bool is_backgrounded_video = is_backgrounded && have_metadata && hasVideo();
1647 bool can_play_backgrounded = is_backgrounded_video && !is_remote && 1665 bool can_play_backgrounded = is_backgrounded_video && !is_remote &&
1648 hasAudio() && IsResumeBackgroundVideosEnabled(); 1666 hasAudio() && IsResumeBackgroundVideosEnabled();
1649 bool is_background_playing = 1667 bool is_background_playing =
1650 delegate_ && delegate_->IsPlayingBackgroundVideo(); 1668 delegate_ && delegate_->IsPlayingBackgroundVideo();
1651 bool background_suspended = is_backgrounded_video && 1669 bool background_suspended = is_backgrounded_video &&
1652 !(can_play_backgrounded && is_background_playing); 1670 !(can_play_backgrounded && is_background_playing);
1653 1671 bool background_pause_suspended = is_backgrounded && is_paused;
1654 // The |paused_| state is not reliable until we |have_future_data|.
1655 bool background_pause_suspended =
1656 is_backgrounded && have_future_data && paused_;
1657 1672
1658 // Idle suspend is enabled once there is future data. We don't want to idle 1673 // Idle suspend is enabled once there is future data. We don't want to idle
1659 // suspend before that because play() may never be triggered to leave the idle 1674 // suspend before that because play() may never be triggered to leave the idle
1660 // state. There could be other theoretical problems if the page is waiting for 1675 // state. There could be other theoretical problems if the page is waiting for
1661 // other events before actually calling play(), but at least we don't break 1676 // other events before actually calling play(), but at least we don't break
1662 // Blink. 1677 // Blink.
1663 // 1678 //
1664 // TODO(sandersd): Make the delegate suspend idle players immediately when 1679 // TODO(sandersd): Make the delegate suspend idle players immediately when
1665 // hidden. 1680 // hidden.
1666 // TODO(sandersd): If Blink told us the paused state sooner, we could 1681 bool idle_suspended = is_idle_ && is_paused;
1667 // idle suspend sooner.
1668 bool idle_suspended = is_idle_ && have_future_data;
1669 1682
1670 // Combined suspend state. 1683 // Combined suspend state.
1671 result.is_suspended = 1684 result.is_suspended =
1672 is_remote || must_suspend_ || idle_suspended || background_suspended || 1685 is_remote || must_suspend_ || idle_suspended || background_suspended ||
1673 background_pause_suspended || 1686 background_pause_suspended ||
1674 // If we're already suspended, see if we can wait for user interaction. 1687 // If we're already suspended, see if we can wait for user interaction.
1675 (is_suspended && have_future_data && paused_ && !seeking_); 1688 (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.
1676 1689
1677 // We do not treat |playback_rate_| == 0 as paused. For the media session, 1690 // We do not treat |playback_rate_| == 0 as paused. For the media session,
1678 // being paused implies displaying a play button, which is incorrect in this 1691 // being paused implies displaying a play button, which is incorrect in this
1679 // case. For memory usage reporting, we just use the same definition (but we 1692 // case. For memory usage reporting, we just use the same definition (but we
1680 // don't have to). 1693 // don't have to).
1681 // 1694 //
1682 // Similarly, we don't consider |ended_| to be paused. Blink will immediately 1695 // Similarly, we don't consider |ended_| to be paused. Blink will immediately
1683 // call pause() or seek(), so |ended_| should not affect the computation. 1696 // call pause() or seek(), so |ended_| should not affect the computation.
1684 // Despite that, |ended_| does result in a separate paused state, to simplfy 1697 // Despite that, |ended_| does result in a separate paused state, to simplfy
1685 // the contract for SetDelegateState(). 1698 // the contract for SetDelegateState().
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1792 pipeline_metadata_.natural_size, 1805 pipeline_metadata_.natural_size,
1793 base::Bind(&GetCurrentTimeInternal, this))); 1806 base::Bind(&GetCurrentTimeInternal, this)));
1794 watch_time_reporter_->OnVolumeChange(volume_); 1807 watch_time_reporter_->OnVolumeChange(volume_);
1795 if (delegate_ && delegate_->IsHidden()) 1808 if (delegate_ && delegate_->IsHidden())
1796 watch_time_reporter_->OnHidden(); 1809 watch_time_reporter_->OnHidden();
1797 else 1810 else
1798 watch_time_reporter_->OnShown(); 1811 watch_time_reporter_->OnShown();
1799 } 1812 }
1800 1813
1801 } // namespace media 1814 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698