Index: webkit/media/webmediaplayer_ms.cc |
diff --git a/webkit/media/webmediaplayer_ms.cc b/webkit/media/webmediaplayer_ms.cc |
index fc21a3a5639b85af2470fcc8ca59aa5b5757828b..99d73b596a1287d4eeeebfbb131bbb6b972a0aa9 100644 |
--- a/webkit/media/webmediaplayer_ms.cc |
+++ b/webkit/media/webmediaplayer_ms.cc |
@@ -10,21 +10,21 @@ |
#include "base/callback.h" |
#include "base/message_loop.h" |
#include "base/metrics/histogram.h" |
+#include "cc/layers/video_layer.h" |
#include "media/base/media_log.h" |
#include "media/base/video_frame.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" |
-#include "third_party/WebKit/Source/Platform/chromium/public/WebVideoFrame.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
+#include "webkit/compositor_bindings/web_layer_impl.h" |
#include "webkit/media/media_stream_audio_renderer.h" |
#include "webkit/media/media_stream_client.h" |
#include "webkit/media/video_frame_provider.h" |
#include "webkit/media/webmediaplayer_delegate.h" |
#include "webkit/media/webmediaplayer_util.h" |
-#include "webkit/media/webvideoframe_impl.h" |
using WebKit::WebCanvas; |
using WebKit::WebMediaPlayer; |
@@ -49,12 +49,13 @@ WebMediaPlayerMS::WebMediaPlayerMS( |
paused_(true), |
current_frame_used_(false), |
pending_repaint_(false), |
+ video_frame_provider_client_(NULL), |
received_first_frame_(false), |
sequence_started_(false), |
total_frame_count_(0), |
dropped_frame_count_(0), |
media_log_(media_log) { |
- DVLOG(1) << "WebMediaPlayerMS::ctor"; |
+ DVLOG(1) << "WebMediaPlayerMS::ctor"; |
DCHECK(media_stream_client); |
media_log_->AddEvent( |
media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
@@ -63,9 +64,15 @@ WebMediaPlayerMS::WebMediaPlayerMS( |
WebMediaPlayerMS::~WebMediaPlayerMS() { |
DVLOG(1) << "WebMediaPlayerMS::dtor"; |
DCHECK(thread_checker_.CalledOnValidThread()); |
- if (video_frame_provider_) { |
+ |
+ SetVideoFrameProviderClient(NULL); |
+ // No need for a lock here, as GetCurrentFrame/PutCurrentFrame can't be |
+ // called now that the client is no longer using this provider. Also, load() |
+ // and this destructor are called from the same thread. |
+ setStreamTextureClient(NULL); |
scherkus (not reviewing)
2013/03/18 21:38:24
ditto
|
+ |
+ if (video_frame_provider_) |
video_frame_provider_->Stop(); |
- } |
if (audio_renderer_) { |
if (audio_renderer_->IsLocalRenderer()) { |
@@ -358,27 +365,46 @@ unsigned WebMediaPlayerMS::videoDecodedByteCount() const { |
return 0; |
} |
-WebKit::WebVideoFrame* WebMediaPlayerMS::getCurrentFrame() { |
+WebKit::WebLayer* WebMediaPlayerMS::createCompositingLayer() { |
+ return new webkit::WebLayerImpl(cc::VideoLayer::Create(this)); |
+} |
+ |
+void WebMediaPlayerMS::SetVideoFrameProviderClient( |
+ cc::VideoFrameProvider::Client* client) { |
+ base::AutoLock auto_lock(provider_lock_); |
+ if (video_frame_provider_client_) |
+ video_frame_provider_client_->StopUsingProvider(); |
+ video_frame_provider_client_ = client; |
+ setStreamTextureClient(client ? this : NULL); |
+} |
+ |
+scoped_refptr<media::VideoFrame> WebMediaPlayerMS::GetCurrentFrame() { |
DVLOG(3) << "WebMediaPlayerMS::getCurrentFrame"; |
base::AutoLock auto_lock(current_frame_lock_); |
DCHECK(!pending_repaint_); |
- if (current_frame_.get()) { |
- pending_repaint_ = true; |
- current_frame_used_ = true; |
- return new webkit_media::WebVideoFrameImpl(current_frame_); |
- } |
- return NULL; |
+ if (!current_frame_) |
+ return NULL; |
+ pending_repaint_ = true; |
+ current_frame_used_ = true; |
+ return current_frame_; |
} |
-void WebMediaPlayerMS::putCurrentFrame( |
- WebKit::WebVideoFrame* web_video_frame) { |
+void WebMediaPlayerMS::PutCurrentFrame( |
+ const scoped_refptr<media::VideoFrame>& frame) { |
DVLOG(3) << "WebMediaPlayerMS::putCurrentFrame"; |
base::AutoLock auto_lock(current_frame_lock_); |
DCHECK(pending_repaint_); |
pending_repaint_ = false; |
- if (web_video_frame) { |
- delete web_video_frame; |
- } |
+} |
+ |
+void WebMediaPlayerMS::didReceiveFrame() { |
+ // No lock since this gets called on the client's thread. |
+ video_frame_provider_client_->DidReceiveFrame(); |
+} |
+ |
+void WebMediaPlayerMS::didUpdateMatrix(const float* matrix) { |
+ // No lock since this gets called on the client's thread. |
+ video_frame_provider_client_->DidUpdateMatrix(matrix); |
} |
void WebMediaPlayerMS::OnFrameAvailable( |