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())); |
} |