diff options
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/glue/webmediaplayer_impl.cc | 28 | ||||
-rw-r--r-- | webkit/glue/webmediaplayer_impl.h | 6 |
2 files changed, 32 insertions, 2 deletions
diff --git a/webkit/glue/webmediaplayer_impl.cc b/webkit/glue/webmediaplayer_impl.cc index 04f5dc8..4f37785 100644 --- a/webkit/glue/webmediaplayer_impl.cc +++ b/webkit/glue/webmediaplayer_impl.cc @@ -112,6 +112,11 @@ void WebMediaPlayerImpl::Proxy::PipelineSeekCallback() { &WebMediaPlayerImpl::Proxy::PipelineSeekTask)); } +void WebMediaPlayerImpl::Proxy::PipelineEndedCallback() { + render_loop_->PostTask(FROM_HERE, NewRunnableMethod(this, + &WebMediaPlayerImpl::Proxy::PipelineEndedTask)); +} + void WebMediaPlayerImpl::Proxy::PipelineErrorCallback() { render_loop_->PostTask(FROM_HERE, NewRunnableMethod(this, &WebMediaPlayerImpl::Proxy::PipelineErrorTask)); @@ -143,6 +148,13 @@ void WebMediaPlayerImpl::Proxy::PipelineSeekTask() { } } +void WebMediaPlayerImpl::Proxy::PipelineEndedTask() { + DCHECK(MessageLoop::current() == render_loop_); + if (webmediaplayer_) { + webmediaplayer_->OnPipelineEnded(); + } +} + void WebMediaPlayerImpl::Proxy::PipelineErrorTask() { DCHECK(MessageLoop::current() == render_loop_); if (webmediaplayer_) { @@ -181,7 +193,9 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(WebKit::WebMediaPlayerClient* client, // Creates the proxy. proxy_ = new Proxy(main_loop_, this); - // Sets the pipeline's error reporting callback. + // Set our pipeline callbacks. + pipeline_->SetPipelineEndedCallback(NewCallback(proxy_.get(), + &WebMediaPlayerImpl::Proxy::PipelineEndedCallback)); pipeline_->SetPipelineErrorCallback(NewCallback(proxy_.get(), &WebMediaPlayerImpl::Proxy::PipelineErrorCallback)); @@ -248,9 +262,12 @@ bool WebMediaPlayerImpl::supportsSave() const { void WebMediaPlayerImpl::seek(float seconds) { DCHECK(MessageLoop::current() == main_loop_); + // TODO(scherkus): WebKit fires a seek(0) at the very start, however pipeline + // already does a seek(0) internally. Investigate whether doing two seek(0) + // at the start impacts startup latency. + // Try to preserve as much accuracy as possible. float microseconds = seconds * base::Time::kMicrosecondsPerSecond; - if (seconds != 0) pipeline_->Seek( base::TimeDelta::FromMicroseconds(static_cast<int64>(microseconds)), NewCallback(proxy_.get(), @@ -453,6 +470,13 @@ void WebMediaPlayerImpl::OnPipelineSeek() { } } +void WebMediaPlayerImpl::OnPipelineEnded() { + DCHECK(MessageLoop::current() == main_loop_); + if (pipeline_->GetError() == media::PIPELINE_OK) { + GetClient()->timeChanged(); + } +} + void WebMediaPlayerImpl::OnPipelineError() { DCHECK(MessageLoop::current() == main_loop_); switch (pipeline_->GetError()) { diff --git a/webkit/glue/webmediaplayer_impl.h b/webkit/glue/webmediaplayer_impl.h index 187c753..da1b142 100644 --- a/webkit/glue/webmediaplayer_impl.h +++ b/webkit/glue/webmediaplayer_impl.h @@ -106,6 +106,7 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer, // WebMediaPlayerImpl. void PipelineInitializationCallback(); void PipelineSeekCallback(); + void PipelineEndedCallback(); void PipelineErrorCallback(); private: @@ -118,6 +119,9 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer, // Notify |webmediaplayer_| that a seek has finished. void PipelineSeekTask(); + // Notify |webmediaplayer_| that the media has ended. + void PipelineEndedTask(); + // Notify |webmediaplayer_| that a pipeline error has been set. void PipelineErrorTask(); @@ -220,6 +224,8 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer, void OnPipelineSeek(); + void OnPipelineEnded(); + void OnPipelineError(); private: |