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

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: addressing feedbacks 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 b4184dadadf9ce8f67da5840da276baabb343e96..8122a734ce9d1478caf79fba9540e58950769acb 100644
--- a/webkit/media/android/webmediaplayer_android.cc
+++ b/webkit/media/android/webmediaplayer_android.cc
@@ -17,6 +17,8 @@
#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 +35,9 @@ using media::MediaPlayerBridge;
using media::VideoFrame;
using webkit_media::WebVideoFrameImpl;
+// TODO(qinmin): Figure out where we should define this more appropriately
+#define GL_TEXTURE_EXTERNAL_OES 0x8D65
scherkus (not reviewing) 2012/05/26 00:56:09 static const uint32 and kCamelCase?
qinmin 2012/05/29 18:29:34 Done.
+
namespace webkit_media {
// Because we create the media player lazily on android, the duration of the
@@ -48,7 +53,9 @@ bool WebMediaPlayerAndroid::incognito_mode_ = false;
WebMediaPlayerAndroid::WebMediaPlayerAndroid(
WebMediaPlayerClient* client,
- WebKit::WebCookieJar* cookie_jar)
+ WebKit::WebCookieJar* cookie_jar,
+ webkit_media::WebMediaPlayerManagerAndroid* manager,
+ webkit_media::StreamTextureFactory* factory)
: client_(client),
buffered_(1u),
video_frame_(new WebVideoFrameImpl(VideoFrame::CreateEmptyFrame())),
@@ -61,16 +68,25 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
playback_completed_(false),
buffered_bytes_(0),
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) {
@@ -429,9 +445,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() {
@@ -458,6 +485,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_));
@@ -475,7 +512,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_,
+ GL_TEXTURE_EXTERNAL_OES,
+ 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();
}
@@ -483,4 +549,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

Powered by Google App Engine
This is Rietveld 408576698