summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
Diffstat (limited to 'webkit')
-rw-r--r--webkit/glue/webmediaplayer_impl.cc28
-rw-r--r--webkit/glue/webmediaplayer_impl.h6
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: