| Index: webkit/media/android/webmediaplayer_android.cc
|
| diff --git a/webkit/media/android/webmediaplayer_android.cc b/webkit/media/android/webmediaplayer_android.cc
|
| index 1b99ebb6dfb8e1bb9131311a342c1b8536d17f7e..faaadaf79731cebeadb3c1947b04d0003aa3bea2 100644
|
| --- a/webkit/media/android/webmediaplayer_android.cc
|
| +++ b/webkit/media/android/webmediaplayer_android.cc
|
| @@ -13,10 +13,14 @@
|
| #include "base/utf_string_conversions.h"
|
| #include "media/base/android/media_player_bridge.h"
|
| #include "net/base/mime_util.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.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 "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCookieJar.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebRect.h"
|
| +#include "webkit/media/android/stream_texture_factory_android.h"
|
| +#include "webkit/media/android/webmediaplayer_manager_android.h"
|
| #include "webkit/media/android/webmediaplayer_proxy_android.h"
|
| #include "webkit/media/webmediaplayer_util.h"
|
| #include "webkit/media/webvideoframe_impl.h"
|
| @@ -33,6 +37,9 @@ using media::MediaPlayerBridge;
|
| using media::VideoFrame;
|
| using webkit_media::WebVideoFrameImpl;
|
|
|
| +// TODO(qinmin): Figure out where we should define this more appropriately
|
| +static const uint32 kGLTextureExternalOES = 0x8D65;
|
| +
|
| namespace webkit_media {
|
|
|
| // Because we create the media player lazily on android, the duration of the
|
| @@ -47,9 +54,13 @@ static const float kTemporaryDuration = 100.0f;
|
| bool WebMediaPlayerAndroid::incognito_mode_ = false;
|
|
|
| WebMediaPlayerAndroid::WebMediaPlayerAndroid(
|
| + WebKit::WebFrame* frame,
|
| WebMediaPlayerClient* client,
|
| - WebKit::WebCookieJar* cookie_jar)
|
| - : client_(client),
|
| + WebKit::WebCookieJar* cookie_jar,
|
| + webkit_media::WebMediaPlayerManagerAndroid* manager,
|
| + webkit_media::StreamTextureFactory* factory)
|
| + : frame_(frame),
|
| + client_(client),
|
| buffered_(1u),
|
| video_frame_(new WebVideoFrameImpl(VideoFrame::CreateEmptyFrame())),
|
| proxy_(new WebMediaPlayerProxyAndroid(base::MessageLoopProxy::current(),
|
| @@ -62,16 +73,25 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
|
| buffered_bytes_(0),
|
| did_loading_progress_(false),
|
| cookie_jar_(cookie_jar),
|
| + manager_(manager),
|
| pending_play_event_(false),
|
| network_state_(WebMediaPlayer::NetworkStateEmpty),
|
| - ready_state_(WebMediaPlayer::ReadyStateHaveNothing) {
|
| - video_frame_.reset(new WebVideoFrameImpl(VideoFrame::CreateEmptyFrame()));
|
| + ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
|
| + texture_id_(0),
|
| + stream_id_(0),
|
| + needs_establish_peer_(true),
|
| + stream_texture_factory_(factory) {
|
| + player_id_ = manager_->RegisterMediaPlayer(this);
|
| + if (stream_texture_factory_.get())
|
| + stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy());
|
| }
|
|
|
| WebMediaPlayerAndroid::~WebMediaPlayerAndroid() {
|
| if (media_player_.get()) {
|
| media_player_->Stop();
|
| }
|
| +
|
| + manager_->UnregisterMediaPlayer(player_id_);
|
| }
|
|
|
| void WebMediaPlayerAndroid::InitIncognito(bool incognito_mode) {
|
| @@ -437,9 +457,20 @@ void WebMediaPlayerAndroid::UpdateReadyState(
|
| client_->readyStateChanged();
|
| }
|
|
|
| -void WebMediaPlayerAndroid::SetVideoSurface(jobject j_surface) {
|
| - if (media_player_.get())
|
| - media_player_->SetVideoSurface(j_surface);
|
| +void WebMediaPlayerAndroid::ReleaseMediaResources() {
|
| + // Pause the media player first.
|
| + pause();
|
| + client_->playbackStateChanged();
|
| +
|
| + if (media_player_.get()) {
|
| + // Save the current media player status.
|
| + pending_seek_ = currentTime();
|
| + duration_ = duration();
|
| +
|
| + media_player_.reset();
|
| + needs_establish_peer_ = true;
|
| + }
|
| + prepared_ = false;
|
| }
|
|
|
| void WebMediaPlayerAndroid::InitializeMediaPlayer() {
|
| @@ -450,8 +481,8 @@ void WebMediaPlayerAndroid::InitializeMediaPlayer() {
|
|
|
| std::string cookies;
|
| if (cookie_jar_ != NULL) {
|
| - WebURL url(url_);
|
| - cookies = UTF16ToUTF8(cookie_jar_->cookies(url, url));
|
| + WebURL first_party_url(frame_->document().firstPartyForCookies());
|
| + cookies = UTF16ToUTF8(cookie_jar_->cookies(url_, first_party_url));
|
| }
|
| media_player_->SetDataSource(url_.spec(), cookies, incognito_mode_);
|
|
|
| @@ -466,6 +497,16 @@ void WebMediaPlayerAndroid::InitializeMediaPlayer() {
|
| void WebMediaPlayerAndroid::PlayInternal() {
|
| CHECK(prepared_);
|
|
|
| + if (hasVideo() && stream_texture_factory_.get()) {
|
| + if (!stream_id_)
|
| + CreateStreamTexture();
|
| +
|
| + if (needs_establish_peer_) {
|
| + stream_texture_factory_->EstablishPeer(stream_id_, player_id_);
|
| + needs_establish_peer_ = false;
|
| + }
|
| + }
|
| +
|
| if (paused())
|
| media_player_->Start(base::Bind(
|
| &WebMediaPlayerProxyAndroid::PlaybackCompleteCallback, proxy_));
|
| @@ -483,7 +524,36 @@ void WebMediaPlayerAndroid::SeekInternal(float seconds) {
|
| &WebMediaPlayerProxyAndroid::SeekCompleteCallback, proxy_));
|
| }
|
|
|
| +void WebMediaPlayerAndroid::CreateStreamTexture() {
|
| + DCHECK(!stream_id_);
|
| + DCHECK(!texture_id_);
|
| + stream_id_ = stream_texture_factory_->CreateStreamTexture(&texture_id_);
|
| + if (texture_id_)
|
| + video_frame_.reset(new WebVideoFrameImpl(VideoFrame::WrapNativeTexture(
|
| + texture_id_,
|
| + kGLTextureExternalOES,
|
| + texture_size_.width,
|
| + texture_size_.height,
|
| + base::TimeDelta(),
|
| + base::TimeDelta(),
|
| + base::Bind(&WebMediaPlayerAndroid::DestroyStreamTexture,
|
| + base::Unretained(this)))));
|
| +}
|
| +
|
| +void WebMediaPlayerAndroid::DestroyStreamTexture() {
|
| + DCHECK(stream_id_);
|
| + DCHECK(texture_id_);
|
| + stream_texture_factory_->DestroyStreamTexture(texture_id_);
|
| + texture_id_ = 0;
|
| + stream_id_ = 0;
|
| +}
|
| +
|
| WebVideoFrame* WebMediaPlayerAndroid::getCurrentFrame() {
|
| + if (!stream_texture_proxy_->IsInitialized() && stream_id_) {
|
| + stream_texture_proxy_->Initialize(
|
| + stream_id_, video_frame_->width(), video_frame_->height());
|
| + }
|
| +
|
| return video_frame_.get();
|
| }
|
|
|
| @@ -491,4 +561,11 @@ void WebMediaPlayerAndroid::putCurrentFrame(
|
| WebVideoFrame* web_video_frame) {
|
| }
|
|
|
| +// This gets called both on compositor and main thread.
|
| +void WebMediaPlayerAndroid::setStreamTextureClient(
|
| + WebKit::WebStreamTextureClient* client) {
|
| + if (stream_texture_proxy_.get())
|
| + stream_texture_proxy_->SetClient(client);
|
| +}
|
| +
|
| } // namespace webkit_media
|
|
|