| 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
 | 
| 
 |