Chromium Code Reviews| Index: webkit/media/webmediaplayer_impl.cc |
| diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc |
| index 0bac0049e0a7df0ff14b6dca665c5d724c202613..67111f5588f8eacecbdb582c1d01f0c729880a1c 100644 |
| --- a/webkit/media/webmediaplayer_impl.cc |
| +++ b/webkit/media/webmediaplayer_impl.cc |
| @@ -131,7 +131,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
| audio_source_provider_(audio_source_provider), |
| audio_renderer_sink_(audio_renderer_sink), |
| is_local_source_(false), |
| - decryptor_(proxy_.get(), client, frame) { |
| + decryptor_(proxy_.get(), client, frame), |
| + starting_(false) { |
| media_log_->AddEvent( |
| media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
| @@ -309,7 +310,7 @@ bool WebMediaPlayerImpl::supportsSave() const { |
| void WebMediaPlayerImpl::seek(float seconds) { |
| DCHECK_EQ(main_loop_, MessageLoop::current()); |
| - if (seeking_) { |
| + if (starting_ || seeking_) { |
| pending_seek_ = true; |
| pending_seek_seconds_ = seconds; |
| proxy_->DemuxerCancelPendingSeek(); |
| @@ -760,6 +761,8 @@ void WebMediaPlayerImpl::Repaint() { |
| } |
| void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) { |
| + starting_ = false; |
|
Ami GONE FROM CHROMIUM
2012/08/15 18:00:08
put below DCHECK below.
acolwell GONE FROM CHROMIUM
2012/08/15 23:21:15
Done.
|
| + |
| DCHECK_EQ(main_loop_, MessageLoop::current()); |
| if (status != media::PIPELINE_OK) { |
| // Any error that occurs before the pipeline can initialize should be |
| @@ -776,14 +779,11 @@ void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) { |
| if (is_local_source_) |
| SetNetworkState(WebMediaPlayer::NetworkStateLoaded); |
| - SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
| - // Fire canplaythrough immediately after playback begins because of |
| - // crbug.com/106480. |
| - // TODO(vrk): set ready state to HaveFutureData when bug above is fixed. |
| - SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
| + if (!pending_seek_) |
| + return; |
| - // Repaint to trigger UI update. |
| - Repaint(); |
| + pending_seek_ = false; |
| + seek(pending_seek_seconds_); |
| } |
| void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) { |
| @@ -865,6 +865,26 @@ void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { |
| Repaint(); |
| } |
| +void WebMediaPlayerImpl::OnPipelineReadyState( |
| + media::Pipeline::ReadyState readyState) { |
| + DVLOG(1) << "OnPipelineReadyState(" << readyState << ")"; |
| + |
| + switch(readyState) { |
| + case media::Pipeline::HaveMetadata: |
| + SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
| + break; |
| + case media::Pipeline::HaveEnoughData: |
| + // Fire canplaythrough immediately after playback begins because of |
| + // crbug.com/106480. |
| + // TODO(vrk): set ready state to HaveFutureData when bug above is fixed. |
| + SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
| + break; |
| + } |
| + |
| + // Repaint to trigger UI update. |
| + Repaint(); |
| +} |
| + |
| void WebMediaPlayerImpl::OnDemuxerOpened() { |
| DCHECK_EQ(main_loop_, MessageLoop::current()); |
| @@ -959,11 +979,14 @@ void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { |
| } |
| void WebMediaPlayerImpl::StartPipeline() { |
| + starting_ = true; |
| pipeline_->Start( |
| filter_collection_.Pass(), |
| base::Bind(&WebMediaPlayerProxy::PipelineEndedCallback, proxy_.get()), |
| base::Bind(&WebMediaPlayerProxy::PipelineErrorCallback, proxy_.get()), |
| base::Bind(&WebMediaPlayerProxy::PipelineInitializationCallback, |
| + proxy_.get()), |
| + base::Bind(&WebMediaPlayerProxy::PipelineReadyStateCallback, |
| proxy_.get())); |
| } |