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 |