Index: webkit/compositor_bindings/web_to_ccvideo_frame_provider.cc |
diff --git a/webkit/compositor_bindings/web_to_ccvideo_frame_provider.cc b/webkit/compositor_bindings/web_to_ccvideo_frame_provider.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7838c35c22b41a1791fd11a37b066363f78e81e5 |
--- /dev/null |
+++ b/webkit/compositor_bindings/web_to_ccvideo_frame_provider.cc |
@@ -0,0 +1,85 @@ |
+// Copyright 2012 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/compositor_bindings/web_to_ccvideo_frame_provider.h" |
+ |
+#include "base/logging.h" |
+#include "media/base/video_frame.h" |
+#include "third_party/WebKit/Source/Platform/chromium/public/WebVideoFrameProvider.h" |
+#include "webkit/media/webvideoframe_impl.h" |
+ |
+using WebKit::WebVideoFrameProvider; |
+using webkit_media::WebVideoFrameImpl; |
+ |
+namespace webkit { |
+ |
+scoped_ptr<WebToCCVideoFrameProvider> WebToCCVideoFrameProvider::Create( |
+ WebVideoFrameProvider* web_provider) { |
+ return make_scoped_ptr(new WebToCCVideoFrameProvider(web_provider)); |
+} |
+ |
+WebToCCVideoFrameProvider::WebToCCVideoFrameProvider( |
+ WebVideoFrameProvider* web_provider) |
+ : web_provider_(web_provider), |
+ web_frame_(NULL) { |
+} |
+ |
+WebToCCVideoFrameProvider::~WebToCCVideoFrameProvider() { |
+} |
+ |
+class WebToCCVideoFrameProvider::ClientAdapter |
+ : public WebVideoFrameProvider::Client { |
+ public: |
+ explicit ClientAdapter(cc::VideoFrameProvider::Client* cc_client) |
+ : cc_client_(cc_client) {} |
+ virtual ~ClientAdapter() {} |
+ |
+ // WebVideoFrameProvider::Client implementation. |
+ virtual void stopUsingProvider() { |
+ cc_client_->StopUsingProvider(); |
+ } |
+ |
+ virtual void didReceiveFrame() { |
+ cc_client_->DidReceiveFrame(); |
+ } |
+ |
+ virtual void didUpdateMatrix(const float* matrix) { |
+ cc_client_->DidUpdateMatrix(matrix); |
+ } |
+ |
+ private: |
+ cc::VideoFrameProvider::Client* cc_client_; |
+}; |
+ |
+void WebToCCVideoFrameProvider::SetVideoFrameProviderClient(Client* client) { |
+ scoped_ptr<ClientAdapter> client_adapter; |
+ if (client) |
+ client_adapter.reset(new ClientAdapter(client)); |
+ web_provider_->setVideoFrameProviderClient(client_adapter.get()); |
+ client_adapter_ = client_adapter.Pass(); |
+} |
+ |
+scoped_refptr<media::VideoFrame> WebToCCVideoFrameProvider::GetCurrentFrame() { |
+ web_frame_ = web_provider_->getCurrentFrame(); |
+ if (!web_frame_) |
+ return scoped_refptr<media::VideoFrame>(); |
+ WebVideoFrameImpl* impl = static_cast<WebVideoFrameImpl*>(web_frame_); |
+ return impl->video_frame; |
+} |
+ |
+void WebToCCVideoFrameProvider::PutCurrentFrame( |
+ const scoped_refptr<media::VideoFrame>& frame) { |
+ if (!frame) { |
+ DCHECK(!web_frame_); |
+ web_provider_->putCurrentFrame(web_frame_); |
+ return; |
+ } |
+ DCHECK(web_frame_); |
+ WebVideoFrameImpl* impl = static_cast<WebVideoFrameImpl*>(web_frame_); |
+ DCHECK_EQ(impl->video_frame.get(), frame.get()); |
+ web_provider_->putCurrentFrame(web_frame_); |
+ web_frame_ = NULL; |
+} |
+ |
+} // namespace webkit |