Chromium Code Reviews| Index: media/blink/webmediaplayer_impl.cc | 
| diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc | 
| index 97c5b7f87324732622838bd82182c5c15acdcffe..adf67e38b80e80c85d4607eab68e5d20d79db20d 100644 | 
| --- a/media/blink/webmediaplayer_impl.cc | 
| +++ b/media/blink/webmediaplayer_impl.cc | 
| @@ -215,6 +215,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( | 
| last_reported_memory_usage_(0), | 
| supports_save_(true), | 
| chunk_demuxer_(NULL), | 
| + buffered_data_source_host_( | 
| + base::Bind(&WebMediaPlayerImpl::OnProgress, AsWeakPtr())), | 
| url_index_(url_index), | 
| // Threaded compositing isn't enabled universally yet. | 
| compositor_task_runner_(params.compositor_task_runner() | 
| @@ -845,19 +847,20 @@ bool WebMediaPlayerImpl::didLoadingProgress() { | 
| const bool data_progress = buffered_data_source_host_.DidLoadingProgress(); | 
| const bool did_loading_progress = pipeline_progress || data_progress; | 
| - if (did_loading_progress && | 
| - highest_ready_state_ < ReadyState::ReadyStateHaveFutureData) { | 
| - // Reset the preroll attempt clock. | 
| - preroll_attempt_pending_ = true; | 
| - preroll_attempt_start_time_ = base::TimeTicks(); | 
| - | 
| - // Clear any 'stale' flag and give the pipeline a chance to resume. If we | 
| - // are already resumed, this will cause |preroll_attempt_start_time_| to be | 
| - // set. | 
| - // TODO(sandersd): Should this be on the same stack? It might be surprising | 
| - // that didLoadingProgress() can synchronously change state. | 
| - delegate_->ClearStaleFlag(delegate_id_); | 
| - UpdatePlayState(); | 
| + if (did_loading_progress) { | 
| + if (highest_ready_state_ < ReadyState::ReadyStateHaveFutureData) { | 
| 
 
DaleCurtis
2017/04/06 22:51:40
This whole block can actually be moved to OnProgre
 
hubbe
2017/04/07 19:35:51
Done.
 
 | 
| + // Reset the preroll attempt clock. | 
| + preroll_attempt_pending_ = true; | 
| + preroll_attempt_start_time_ = base::TimeTicks(); | 
| + | 
| + // Clear any 'stale' flag and give the pipeline a chance to resume. If we | 
| + // are already resumed, this will cause |preroll_attempt_start_time_| to | 
| + // be set. | 
| + // TODO(sandersd): Should this be on the same stack? It might be | 
| + // surprising that didLoadingProgress() can synchronously change state. | 
| + delegate_->ClearStaleFlag(delegate_id_); | 
| + UpdatePlayState(); | 
| + } | 
| } | 
| return did_loading_progress; | 
| @@ -1274,6 +1277,22 @@ void WebMediaPlayerImpl::OnMetadata(PipelineMetadata metadata) { | 
| UpdatePlayState(); | 
| } | 
| +void WebMediaPlayerImpl::OnProgress() { | 
| + if (ready_state_ == ReadyState::ReadyStateHaveFutureData && | 
| + CanPlayThrough()) { | 
| + SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 
| + } | 
| +} | 
| + | 
| +bool WebMediaPlayerImpl::CanPlayThrough() { | 
| + if (chunk_demuxer_) | 
| 
 
DaleCurtis
2017/04/06 22:51:40
Ternary?
 
hubbe
2017/04/07 19:35:51
Makes the expression too long I think.
It's alread
 
 | 
| + return true; | 
| + return buffered_data_source_host_.CanPlayThrough( | 
| + base::TimeDelta::FromSecondsD(currentTime()), | 
| + base::TimeDelta::FromSecondsD(duration()), | 
| + playback_rate_ == 0.0 ? 1.0 : playback_rate_); | 
| +} | 
| + | 
| void WebMediaPlayerImpl::OnBufferingStateChange(BufferingState state) { | 
| DVLOG(1) << __func__ << "(" << state << ")"; | 
| DCHECK(main_task_runner_->BelongsToCurrentThread()); | 
| @@ -1293,9 +1312,11 @@ void WebMediaPlayerImpl::OnBufferingStateChange(BufferingState state) { | 
| RecordUnderflowDuration(base::TimeDelta()); | 
| } | 
| - // TODO(chcunningham): Monitor playback position vs buffered. Potentially | 
| - // transition to HAVE_FUTURE_DATA here if not enough is buffered. | 
| - SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 
| + if (CanPlayThrough()) { | 
| 
 
DaleCurtis
2017/04/06 22:51:40
drop one line {}
 
hubbe
2017/04/07 19:35:51
How about ternary? :)
 
 | 
| + SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 
| + } else { | 
| + SetReadyState(WebMediaPlayer::ReadyStateHaveFutureData); | 
| + } | 
| // Let the DataSource know we have enough data. It may use this information | 
| // to release unused network connections. | 
| @@ -1644,6 +1665,8 @@ void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { | 
| SetNetworkState(WebMediaPlayer::NetworkStateIdle); | 
| else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) | 
| SetNetworkState(WebMediaPlayer::NetworkStateLoading); | 
| + if (ready_state_ == ReadyState::ReadyStateHaveFutureData && !is_downloading) | 
| 
 
DaleCurtis
2017/04/06 22:51:40
Don't think this function should call SetReadyStat
 
hubbe
2017/04/07 19:35:51
No, we won't get progress callbacks after we stop
 
 | 
| + SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 
| media_log_->AddEvent( | 
| media_log_->CreateBooleanEvent(MediaLogEvent::NETWORK_ACTIVITY_SET, | 
| "is_downloading_data", is_downloading)); |