Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(278)

Unified Diff: webkit/glue/webmediaplayer_proxy.cc

Issue 7493030: Split WebMediaPlayerImpl::Proxy into its own class. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: fixes Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/glue/webmediaplayer_proxy.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/webmediaplayer_proxy.cc
diff --git a/webkit/glue/webmediaplayer_proxy.cc b/webkit/glue/webmediaplayer_proxy.cc
new file mode 100644
index 0000000000000000000000000000000000000000..27c0c88de827b7329e8c3bd8c64c311775afa174
--- /dev/null
+++ b/webkit/glue/webmediaplayer_proxy.cc
@@ -0,0 +1,243 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/glue/webmediaplayer_proxy.h"
+
+#include "base/logging.h"
+#include "base/message_loop.h"
+#include "media/base/pipeline_status.h"
+#include "media/filters/chunk_demuxer.h"
+#include "webkit/glue/media/web_video_renderer.h"
+#include "webkit/glue/webmediaplayer_impl.h"
+
+using media::PipelineStatus;
+
+namespace webkit_glue {
+
+// Limits the maximum outstanding repaints posted on render thread.
+// This number of 50 is a guess, it does not take too much memory on the task
+// queue but gives up a pretty good latency on repaint.
+static const int kMaxOutstandingRepaints = 50;
+
+WebMediaPlayerProxy::WebMediaPlayerProxy(MessageLoop* render_loop,
+ WebMediaPlayerImpl* webmediaplayer)
+ : render_loop_(render_loop),
+ webmediaplayer_(webmediaplayer),
+ outstanding_repaints_(0) {
+ DCHECK(render_loop_);
+ DCHECK(webmediaplayer_);
+}
+
+WebMediaPlayerProxy::~WebMediaPlayerProxy() {
+ Detach();
+}
+
+void WebMediaPlayerProxy::Repaint() {
+ base::AutoLock auto_lock(lock_);
+ if (outstanding_repaints_ < kMaxOutstandingRepaints) {
+ ++outstanding_repaints_;
+
+ render_loop_->PostTask(FROM_HERE,
+ NewRunnableMethod(this, &WebMediaPlayerProxy::RepaintTask));
+ }
+}
+
+void WebMediaPlayerProxy::SetVideoRenderer(
+ scoped_refptr<WebVideoRenderer> video_renderer) {
+ video_renderer_ = video_renderer;
+}
+
+WebDataSourceBuildObserverHack* WebMediaPlayerProxy::GetBuildObserver() {
+ if (!build_observer_.get())
+ build_observer_.reset(NewCallback(this,
+ &WebMediaPlayerProxy::AddDataSource));
+ return build_observer_.get();
+}
+
+void WebMediaPlayerProxy::Paint(SkCanvas* canvas, const gfx::Rect& dest_rect) {
+ DCHECK(MessageLoop::current() == render_loop_);
+ if (video_renderer_) {
+ video_renderer_->Paint(canvas, dest_rect);
+ }
+}
+
+void WebMediaPlayerProxy::SetSize(const gfx::Rect& rect) {
+ DCHECK(MessageLoop::current() == render_loop_);
+ if (video_renderer_) {
+ video_renderer_->SetRect(rect);
+ }
+}
+
+bool WebMediaPlayerProxy::HasSingleOrigin() {
+ DCHECK(MessageLoop::current() == render_loop_);
+
+ base::AutoLock auto_lock(data_sources_lock_);
+
+ for (DataSourceList::iterator itr = data_sources_.begin();
+ itr != data_sources_.end();
+ itr++) {
+ if (!(*itr)->HasSingleOrigin())
+ return false;
+ }
+ return true;
+}
+
+void WebMediaPlayerProxy::AbortDataSources() {
+ DCHECK(MessageLoop::current() == render_loop_);
+ base::AutoLock auto_lock(data_sources_lock_);
+
+ for (DataSourceList::iterator itr = data_sources_.begin();
+ itr != data_sources_.end();
+ itr++) {
+ (*itr)->Abort();
+ }
+}
+
+void WebMediaPlayerProxy::Detach() {
+ DCHECK(MessageLoop::current() == render_loop_);
+ webmediaplayer_ = NULL;
+ video_renderer_ = NULL;
+
+ {
+ base::AutoLock auto_lock(data_sources_lock_);
+ data_sources_.clear();
+ }
+}
+
+void WebMediaPlayerProxy::PipelineInitializationCallback(
+ PipelineStatus status) {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerProxy::PipelineInitializationTask, status));
+}
+
+void WebMediaPlayerProxy::PipelineSeekCallback(PipelineStatus status) {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerProxy::PipelineSeekTask, status));
+}
+
+void WebMediaPlayerProxy::PipelineEndedCallback(PipelineStatus status) {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerProxy::PipelineEndedTask, status));
+}
+
+void WebMediaPlayerProxy::PipelineErrorCallback(PipelineStatus error) {
+ DCHECK_NE(error, media::PIPELINE_OK);
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerProxy::PipelineErrorTask, error));
+}
+
+void WebMediaPlayerProxy::NetworkEventCallback(PipelineStatus status) {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerProxy::NetworkEventTask, status));
+}
+
+void WebMediaPlayerProxy::AddDataSource(WebDataSource* data_source) {
+ base::AutoLock auto_lock(data_sources_lock_);
+ data_sources_.push_back(make_scoped_refptr(data_source));
+}
+
+void WebMediaPlayerProxy::RepaintTask() {
+ DCHECK(MessageLoop::current() == render_loop_);
+ {
+ base::AutoLock auto_lock(lock_);
+ --outstanding_repaints_;
+ DCHECK_GE(outstanding_repaints_, 0);
+ }
+ if (webmediaplayer_) {
+ webmediaplayer_->Repaint();
+ }
+}
+
+void WebMediaPlayerProxy::PipelineInitializationTask(PipelineStatus status) {
+ DCHECK(MessageLoop::current() == render_loop_);
+ if (webmediaplayer_) {
+ webmediaplayer_->OnPipelineInitialize(status);
+ }
+}
+
+void WebMediaPlayerProxy::PipelineSeekTask(PipelineStatus status) {
+ DCHECK(MessageLoop::current() == render_loop_);
+ if (webmediaplayer_) {
+ webmediaplayer_->OnPipelineSeek(status);
+ }
+}
+
+void WebMediaPlayerProxy::PipelineEndedTask(PipelineStatus status) {
+ DCHECK(MessageLoop::current() == render_loop_);
+ if (webmediaplayer_) {
+ webmediaplayer_->OnPipelineEnded(status);
+ }
+}
+
+void WebMediaPlayerProxy::PipelineErrorTask(PipelineStatus error) {
+ DCHECK(MessageLoop::current() == render_loop_);
+ if (webmediaplayer_) {
+ webmediaplayer_->OnPipelineError(error);
+ }
+}
+
+void WebMediaPlayerProxy::NetworkEventTask(PipelineStatus status) {
+ DCHECK(MessageLoop::current() == render_loop_);
+ if (webmediaplayer_) {
+ webmediaplayer_->OnNetworkEvent(status);
+ }
+}
+
+void WebMediaPlayerProxy::GetCurrentFrame(
+ scoped_refptr<media::VideoFrame>* frame_out) {
+ if (video_renderer_)
+ video_renderer_->GetCurrentFrame(frame_out);
+}
+
+void WebMediaPlayerProxy::PutCurrentFrame(
+ scoped_refptr<media::VideoFrame> frame) {
+ if (video_renderer_)
+ video_renderer_->PutCurrentFrame(frame);
+}
+
+void WebMediaPlayerProxy::DemuxerOpened(media::ChunkDemuxer* demuxer) {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerProxy::DemuxerOpenedTask,
+ scoped_refptr<media::ChunkDemuxer>(demuxer)));
+}
+
+void WebMediaPlayerProxy::DemuxerClosed() {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerProxy::DemuxerClosedTask));
+}
+
+void WebMediaPlayerProxy::DemuxerFlush() {
+ if (chunk_demuxer_.get())
+ chunk_demuxer_->FlushData();
+}
+
+bool WebMediaPlayerProxy::DemuxerAppend(const uint8* data, size_t length) {
+ if (chunk_demuxer_.get())
+ return chunk_demuxer_->AppendData(data, length);
+ return false;
+}
+
+void WebMediaPlayerProxy::DemuxerEndOfStream(media::PipelineStatus status) {
+ if (chunk_demuxer_.get())
+ chunk_demuxer_->EndOfStream(status);
+}
+
+void WebMediaPlayerProxy::DemuxerShutdown() {
+ if (chunk_demuxer_.get())
+ chunk_demuxer_->Shutdown();
+}
+
+void WebMediaPlayerProxy::DemuxerOpenedTask(
+ const scoped_refptr<media::ChunkDemuxer>& demuxer) {
+ DCHECK(MessageLoop::current() == render_loop_);
+ chunk_demuxer_ = demuxer;
+ if (webmediaplayer_)
+ webmediaplayer_->OnDemuxerOpened();
+}
+
+void WebMediaPlayerProxy::DemuxerClosedTask() {
+ chunk_demuxer_ = NULL;
+}
+
+} // namespace webkit_glue
« no previous file with comments | « webkit/glue/webmediaplayer_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698