| Index: content/renderer/media/android/webmediaplayer_android.cc
|
| diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc
|
| index 5c7e86b6dfe437ac96fd3107b3f7bd787c311493..67aa9b097a3ed7e1755f7f42697bd01a9ab5a5a3 100644
|
| --- a/content/renderer/media/android/webmediaplayer_android.cc
|
| +++ b/content/renderer/media/android/webmediaplayer_android.cc
|
| @@ -135,7 +135,6 @@
|
| stream_id_(0),
|
| is_playing_(false),
|
| needs_establish_peer_(true),
|
| - in_fullscreen_(false),
|
| stream_texture_proxy_initialized_(false),
|
| has_size_info_(false),
|
| stream_texture_factory_(factory),
|
| @@ -163,7 +162,7 @@
|
| if (force_use_overlay_embedded_video_ ||
|
| player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) {
|
| // Defer stream texture creation until we are sure it's necessary.
|
| - needs_external_surface_ = true;
|
| + needs_establish_peer_ = false;
|
| current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1));
|
| }
|
| #endif // defined(VIDEO_HOLE)
|
| @@ -304,11 +303,18 @@
|
| #if defined(VIDEO_HOLE)
|
| if ((hasVideo() || IsHLSStream()) && needs_external_surface_ &&
|
| !player_manager_->IsInFullscreen(frame_)) {
|
| + DCHECK(!needs_establish_peer_);
|
| player_manager_->RequestExternalSurface(player_id_, last_computed_rect_);
|
| }
|
| #endif // defined(VIDEO_HOLE)
|
|
|
| TryCreateStreamTextureProxyIfNeeded();
|
| + // There is no need to establish the surface texture peer for fullscreen
|
| + // video.
|
| + if ((hasVideo() || IsHLSStream()) && needs_establish_peer_ &&
|
| + !player_manager_->IsInFullscreen(frame_)) {
|
| + EstablishSurfaceTexturePeer();
|
| + }
|
|
|
| if (paused())
|
| player_manager_->Start(player_id_);
|
| @@ -748,6 +754,7 @@
|
| // process are sequential, the OnSeekComplete() will only occur
|
| // once OnPlaybackComplete() is done. As the playback can only be executed
|
| // upon completion of OnSeekComplete(), the request needs to be saved.
|
| + is_playing_ = false;
|
| if (seeking_ && seek_time_ == base::TimeDelta())
|
| pending_playback_ = true;
|
| }
|
| @@ -813,18 +820,25 @@
|
| if (force_use_overlay_embedded_video_ ||
|
| (media_source_delegate_ && media_source_delegate_->IsVideoEncrypted() &&
|
| player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo())) {
|
| + needs_external_surface_ = true;
|
| if (!paused() && !player_manager_->IsInFullscreen(frame_))
|
| player_manager_->RequestExternalSurface(player_id_, last_computed_rect_);
|
| - } else {
|
| - needs_external_surface_ = false;
|
| + } else if (stream_texture_proxy_ && !stream_id_) {
|
| + // Do deferred stream texture creation finally.
|
| + DoCreateStreamTexture();
|
| + SetNeedsEstablishPeer(true);
|
| }
|
| #endif // defined(VIDEO_HOLE)
|
| natural_size_.width = width;
|
| natural_size_.height = height;
|
|
|
| - // hasVideo() might have changed since play was called, so need to possibly
|
| - // estlibash peer here.
|
| - EstablishSurfaceTexturePeerIfNeeded();
|
| + // When play() gets called, |natural_size_| may still be empty and
|
| + // EstablishSurfaceTexturePeer() will not get called. As a result, the video
|
| + // may play without a surface texture. When we finally get the valid video
|
| + // size here, we should call EstablishSurfaceTexturePeer() if it has not been
|
| + // previously called.
|
| + if (!paused() && needs_establish_peer_)
|
| + EstablishSurfaceTexturePeer();
|
|
|
| ReallocateVideoFrame();
|
|
|
| @@ -862,15 +876,16 @@
|
| DCHECK(!media_source_delegate_);
|
| DrawRemotePlaybackText(remote_playback_message);
|
| is_remote_ = true;
|
| - needs_establish_peer_ = true;
|
| - EstablishSurfaceTexturePeerIfNeeded();
|
| + SetNeedsEstablishPeer(false);
|
| }
|
|
|
| void WebMediaPlayerAndroid::OnDisconnectedFromRemoteDevice() {
|
| DCHECK(main_thread_checker_.CalledOnValidThread());
|
| DCHECK(!media_source_delegate_);
|
| + SetNeedsEstablishPeer(true);
|
| + if (!paused())
|
| + EstablishSurfaceTexturePeer();
|
| is_remote_ = false;
|
| - EstablishSurfaceTexturePeerIfNeeded();
|
| ReallocateVideoFrame();
|
| }
|
|
|
| @@ -880,8 +895,13 @@
|
| }
|
|
|
| void WebMediaPlayerAndroid::OnDidExitFullscreen() {
|
| - in_fullscreen_ = false;
|
| - EstablishSurfaceTexturePeerIfNeeded();
|
| + // |needs_external_surface_| is always false on non-TV devices.
|
| + if (!needs_external_surface_)
|
| + SetNeedsEstablishPeer(true);
|
| + // We had the fullscreen surface connected to Android MediaPlayer,
|
| + // so reconnect our surface texture for embedded playback.
|
| + if (!paused() && needs_establish_peer_)
|
| + EstablishSurfaceTexturePeer();
|
|
|
| #if defined(VIDEO_HOLE)
|
| if (!paused() && needs_external_surface_)
|
| @@ -943,7 +963,9 @@
|
| }
|
|
|
| void WebMediaPlayerAndroid::OnPlayerReleased() {
|
| - needs_establish_peer_ = true; // Established when this plays.
|
| + // |needs_external_surface_| is always false on non-TV devices.
|
| + if (!needs_external_surface_)
|
| + needs_establish_peer_ = true;
|
|
|
| if (is_playing_)
|
| OnMediaPlayerPause();
|
| @@ -973,7 +995,8 @@
|
| break;
|
| }
|
| player_manager_->ReleaseResources(player_id_);
|
| - needs_establish_peer_ = true; // Established when this plays.
|
| + if (!needs_external_surface_)
|
| + SetNeedsEstablishPeer(true);
|
| }
|
|
|
| void WebMediaPlayerAndroid::OnDestruct() {
|
| @@ -1216,17 +1239,32 @@
|
| if (!stream_texture_factory_)
|
| return;
|
|
|
| - if (needs_external_surface_)
|
| - return;
|
| -
|
| stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy());
|
| - if (stream_texture_proxy_) {
|
| + if (needs_establish_peer_ && stream_texture_proxy_) {
|
| DoCreateStreamTexture();
|
| ReallocateVideoFrame();
|
| -
|
| - if (video_frame_provider_client_)
|
| - stream_texture_proxy_->SetClient(video_frame_provider_client_);
|
| - }
|
| + }
|
| +
|
| + if (stream_texture_proxy_ && video_frame_provider_client_)
|
| + stream_texture_proxy_->SetClient(video_frame_provider_client_);
|
| +}
|
| +
|
| +void WebMediaPlayerAndroid::EstablishSurfaceTexturePeer() {
|
| + DCHECK(main_thread_checker_.CalledOnValidThread());
|
| + if (!stream_texture_proxy_)
|
| + return;
|
| +
|
| + if (stream_texture_factory_.get() && stream_id_)
|
| + stream_texture_factory_->EstablishPeer(stream_id_, player_id_);
|
| +
|
| + // Set the deferred size because the size was changed in remote mode.
|
| + if (!is_remote_ && cached_stream_texture_size_ != natural_size_) {
|
| + stream_texture_factory_->SetStreamTextureSize(
|
| + stream_id_, gfx::Size(natural_size_.width, natural_size_.height));
|
| + cached_stream_texture_size_ = natural_size_;
|
| + }
|
| +
|
| + needs_establish_peer_ = false;
|
| }
|
|
|
| void WebMediaPlayerAndroid::DoCreateStreamTexture() {
|
| @@ -1237,21 +1275,8 @@
|
| kGLTextureExternalOES, &texture_id_, &texture_mailbox_);
|
| }
|
|
|
| -void WebMediaPlayerAndroid::EstablishSurfaceTexturePeerIfNeeded() {
|
| - DCHECK(main_thread_checker_.CalledOnValidThread());
|
| - if (!needs_establish_peer_ || in_fullscreen_ || needs_external_surface_ ||
|
| - is_remote_ || !is_playing_ || !stream_texture_proxy_ ||
|
| - (!hasVideo() && !IsHLSStream())) {
|
| - return;
|
| - }
|
| -
|
| - stream_texture_factory_->EstablishPeer(stream_id_, player_id_);
|
| - if (cached_stream_texture_size_ != natural_size_) {
|
| - stream_texture_factory_->SetStreamTextureSize(
|
| - stream_id_, gfx::Size(natural_size_.width, natural_size_.height));
|
| - cached_stream_texture_size_ = natural_size_;
|
| - }
|
| - needs_establish_peer_ = false;
|
| +void WebMediaPlayerAndroid::SetNeedsEstablishPeer(bool needs_establish_peer) {
|
| + needs_establish_peer_ = needs_establish_peer;
|
| }
|
|
|
| void WebMediaPlayerAndroid::setPoster(const blink::WebURL& poster) {
|
| @@ -1260,7 +1285,6 @@
|
|
|
| void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) {
|
| is_playing_ = is_playing;
|
| - EstablishSurfaceTexturePeerIfNeeded();
|
| if (!delegate_)
|
| return;
|
| if (is_playing)
|
| @@ -1730,10 +1754,8 @@
|
| void WebMediaPlayerAndroid::enterFullscreen() {
|
| if (player_manager_->CanEnterFullscreen(frame_)) {
|
| player_manager_->EnterFullscreen(player_id_, frame_);
|
| - }
|
| - in_fullscreen_ = true;
|
| - needs_establish_peer_ = true;
|
| - EstablishSurfaceTexturePeerIfNeeded();
|
| + SetNeedsEstablishPeer(false);
|
| + }
|
| }
|
|
|
| bool WebMediaPlayerAndroid::canEnterFullscreen() const {
|
|
|