| Index: webkit/media/webmediaplayer_ms.cc
|
| diff --git a/webkit/media/webmediaplayer_ms.cc b/webkit/media/webmediaplayer_ms.cc
|
| index fc21a3a5639b85af2470fcc8ca59aa5b5757828b..fd34b05468347b74e040908a612b7bb0262dca1c 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,6 +49,7 @@ 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),
|
| @@ -63,9 +64,12 @@ WebMediaPlayerMS::WebMediaPlayerMS(
|
| WebMediaPlayerMS::~WebMediaPlayerMS() {
|
| DVLOG(1) << "WebMediaPlayerMS::dtor";
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (video_frame_provider_) {
|
| +
|
| + SetVideoFrameProviderClient(NULL);
|
| + GetClient()->setWebLayer(NULL);
|
| +
|
| + if (video_frame_provider_)
|
| video_frame_provider_->Stop();
|
| - }
|
|
|
| if (audio_renderer_) {
|
| if (audio_renderer_->IsLocalRenderer()) {
|
| @@ -358,27 +362,31 @@ unsigned WebMediaPlayerMS::videoDecodedByteCount() const {
|
| return 0;
|
| }
|
|
|
| -WebKit::WebVideoFrame* WebMediaPlayerMS::getCurrentFrame() {
|
| +void WebMediaPlayerMS::SetVideoFrameProviderClient(
|
| + cc::VideoFrameProvider::Client* client) {
|
| + // This is called from both the main renderer thread and the compositor
|
| + // thread (when the main thread is blocked).
|
| + if (video_frame_provider_client_)
|
| + video_frame_provider_client_->StopUsingProvider();
|
| + video_frame_provider_client_ = client;
|
| +}
|
| +
|
| +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::OnFrameAvailable(
|
| @@ -397,6 +405,12 @@ void WebMediaPlayerMS::OnFrameAvailable(
|
| SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
|
| SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
|
| GetClient()->sizeChanged();
|
| +
|
| + if (video_frame_provider_ && GetClient()->needsWebLayer()) {
|
| + video_weblayer_.reset(
|
| + new webkit::WebLayerImpl(cc::VideoLayer::Create(this)));
|
| + GetClient()->setWebLayer(video_weblayer_.get());
|
| + }
|
| }
|
|
|
| // Do not update |current_frame_| when paused.
|
|
|