Chromium Code Reviews| 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 |