Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(529)

Unified Diff: webkit/media/android/webmediaplayer_android.cc

Issue 10413015: Upstream implementation for embedded video for WebMediaPlayerAndroid (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase after https://chromiumcodereview.appspot.com/10469003/ got committed Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « webkit/media/android/webmediaplayer_android.h ('k') | webkit/media/android/webmediaplayer_manager_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698