summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/media/ipc_video_renderer.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/media/ipc_video_renderer.h')
-rw-r--r--chrome/renderer/media/ipc_video_renderer.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/chrome/renderer/media/ipc_video_renderer.h b/chrome/renderer/media/ipc_video_renderer.h
new file mode 100644
index 0000000..839df03
--- /dev/null
+++ b/chrome/renderer/media/ipc_video_renderer.h
@@ -0,0 +1,108 @@
+// Copyright (c) 2010 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.
+
+// This video renderer implementation uses IPC to signal the browser process to
+// composite the video as a separate layer underneath the backing store.
+//
+// Extremely experimental. Use at own risk!
+
+#ifndef CHROME_RENDERER_MEDIA_IPC_VIDEO_RENDERER_H_
+#define CHROME_RENDERER_MEDIA_IPC_VIDEO_RENDERER_H_
+
+#include "base/gfx/rect.h"
+#include "base/gfx/size.h"
+#include "base/waitable_event.h"
+#include "chrome/common/transport_dib.h"
+#include "media/filters/video_renderer_base.h"
+#include "webkit/glue/media/web_video_renderer.h"
+#include "webkit/glue/webmediaplayer_impl.h"
+
+class IPCVideoRenderer : public webkit_glue::WebVideoRenderer {
+ public:
+ // WebVideoRenderer implementation.
+ virtual void SetRect(const gfx::Rect& rect);
+ virtual void Paint(skia::PlatformCanvas* canvas, const gfx::Rect& dest_rect);
+
+ void OnUpdateVideo();
+ void OnUpdateVideoAck();
+ void OnDestroyVideo();
+
+ // Static method for creating factory for this object.
+ static media::FilterFactory* CreateFactory(
+ webkit_glue::WebMediaPlayerImpl::Proxy* proxy,
+ int routing_id);
+
+ // FilterFactoryImpl2 implementation.
+ static bool IsMediaFormatSupported(const media::MediaFormat& media_format);
+
+ // TODO(scherkus): remove this mega-hack, see http://crbug.com/28207
+ class FactoryFactory : public webkit_glue::WebVideoRendererFactoryFactory {
+ public:
+ FactoryFactory(int routing_id)
+ : webkit_glue::WebVideoRendererFactoryFactory(),
+ routing_id_(routing_id) {
+ }
+
+ virtual media::FilterFactory* CreateFactory(
+ webkit_glue::WebMediaPlayerImpl::Proxy* proxy) {
+ return IPCVideoRenderer::CreateFactory(proxy, routing_id_);
+ }
+
+ private:
+ int routing_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(FactoryFactory);
+ };
+
+ protected:
+ // VideoRendererBase implementation.
+ virtual bool OnInitialize(media::VideoDecoder* decoder);
+ virtual void OnStop();
+ virtual void OnFrameAvailable();
+
+ private:
+ // Only the filter factories can create instances.
+ friend class media::FilterFactoryImpl2<
+ IPCVideoRenderer,
+ webkit_glue::WebMediaPlayerImpl::Proxy*,
+ int>;
+ IPCVideoRenderer(webkit_glue::WebMediaPlayerImpl::Proxy* proxy,
+ int routing_id);
+ virtual ~IPCVideoRenderer();
+
+ // Send an IPC message to the browser process. The routing ID of the message
+ // is assumed to match |routing_id_|.
+ void Send(IPC::Message* msg);
+
+ // Handles updating the video on the render thread.
+ void DoUpdateVideo();
+
+ // Handles destroying the video on the render thread.
+ void DoDestroyVideo();
+
+ // Pointer to our parent object that is called to request repaints.
+ scoped_refptr<webkit_glue::WebMediaPlayerImpl::Proxy> proxy_;
+
+ // The size of the video.
+ gfx::Size video_size_;
+
+ // The rect of the video.
+ gfx::Rect video_rect_;
+
+ // Whether we've created the video layer on the browser.
+ bool created_;
+
+ // Used to transporting YUV to the browser process.
+ int routing_id_;
+ scoped_ptr<TransportDIB> transport_dib_;
+
+ // Used to determine whether we've been instructed to stop.
+ // TODO(scherkus): work around because we don't have asynchronous stopping.
+ // Refer to http://crbug.com/16059
+ base::WaitableEvent stopped_;
+
+ DISALLOW_COPY_AND_ASSIGN(IPCVideoRenderer);
+};
+
+#endif // CHROME_RENDERER_MEDIA_IPC_VIDEO_RENDERER_H_