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 67aa9b097a3ed7e1755f7f42697bd01a9ab5a5a3..50a135c8b5b4382f740ef420b256af4fbda1cb2b 100644 |
--- a/content/renderer/media/android/webmediaplayer_android.cc |
+++ b/content/renderer/media/android/webmediaplayer_android.cc |
@@ -134,7 +134,8 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
texture_id_(0), |
stream_id_(0), |
is_playing_(false), |
- needs_establish_peer_(true), |
+ peer_established_(false), |
+ in_fullscreen_(false), |
stream_texture_proxy_initialized_(false), |
has_size_info_(false), |
stream_texture_factory_(factory), |
@@ -162,7 +163,7 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
if (force_use_overlay_embedded_video_ || |
player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { |
// Defer stream texture creation until we are sure it's necessary. |
- needs_establish_peer_ = false; |
+ needs_external_surface_ = true; |
qinmin
2014/09/09 06:39:18
why set this to true? if the video is not EME, no
boliu
2014/09/09 21:17:04
Done.
|
current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); |
} |
#endif // defined(VIDEO_HOLE) |
@@ -303,18 +304,11 @@ void WebMediaPlayerAndroid::play() { |
#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_); |
@@ -820,25 +814,19 @@ void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) { |
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 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; |
// 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(); |
+ // EstablishSurfaceTexturePeerIfNeeded() will not get called. As a result, the |
qinmin
2014/09/09 06:39:18
when play is called, isn't updatePlayingState() al
boliu
2014/09/09 21:17:04
Done.
|
+ // video may play without a surface texture. When we finally get the valid |
+ // video size here, we should call EstablishSurfaceTexturePeerIfNeeded() if |
+ // it has not been previously called. |
+ EstablishSurfaceTexturePeerIfNeeded(); |
ReallocateVideoFrame(); |
@@ -876,32 +864,28 @@ void WebMediaPlayerAndroid::OnConnectedToRemoteDevice( |
DCHECK(!media_source_delegate_); |
DrawRemotePlaybackText(remote_playback_message); |
is_remote_ = true; |
- SetNeedsEstablishPeer(false); |
+ peer_established_ = false; |
} |
void WebMediaPlayerAndroid::OnDisconnectedFromRemoteDevice() { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
DCHECK(!media_source_delegate_); |
- SetNeedsEstablishPeer(true); |
- if (!paused()) |
- EstablishSurfaceTexturePeer(); |
is_remote_ = false; |
+ EstablishSurfaceTexturePeerIfNeeded(); |
ReallocateVideoFrame(); |
} |
void WebMediaPlayerAndroid::OnDidEnterFullscreen() { |
if (!player_manager_->IsInFullscreen(frame_)) |
player_manager_->DidEnterFullscreen(frame_); |
+ in_fullscreen_ = true; |
+ peer_established_ = false; |
qinmin
2014/09/09 06:39:18
Sorry, I was confused with this call and the Fulls
boliu
2014/09/09 21:17:04
Done.
|
} |
void WebMediaPlayerAndroid::OnDidExitFullscreen() { |
// |needs_external_surface_| is always false on non-TV devices. |
qinmin
2014/09/09 06:39:18
why removing the if statement? And why not removin
boliu
2014/09/09 21:17:04
Done.
|
- 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(); |
+ in_fullscreen_ = false; |
+ EstablishSurfaceTexturePeerIfNeeded(); |
#if defined(VIDEO_HOLE) |
if (!paused() && needs_external_surface_) |
@@ -963,9 +947,7 @@ void WebMediaPlayerAndroid::UpdateReadyState( |
} |
void WebMediaPlayerAndroid::OnPlayerReleased() { |
- // |needs_external_surface_| is always false on non-TV devices. |
- if (!needs_external_surface_) |
- needs_establish_peer_ = true; |
+ peer_established_ = false; // Established when this plays. |
if (is_playing_) |
OnMediaPlayerPause(); |
@@ -995,8 +977,7 @@ void WebMediaPlayerAndroid::ReleaseMediaResources() { |
break; |
} |
player_manager_->ReleaseResources(player_id_); |
- if (!needs_external_surface_) |
- SetNeedsEstablishPeer(true); |
+ peer_established_ = false; // Established when this plays. |
} |
void WebMediaPlayerAndroid::OnDestruct() { |
@@ -1240,31 +1221,13 @@ void WebMediaPlayerAndroid::TryCreateStreamTextureProxyIfNeeded() { |
return; |
stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy()); |
- if (needs_establish_peer_ && stream_texture_proxy_) { |
+ if (stream_texture_proxy_) { |
qinmin
2014/09/09 06:39:18
why we remove the if condition? if we use external
boliu
2014/09/09 21:17:04
Done.
|
DoCreateStreamTexture(); |
ReallocateVideoFrame(); |
- } |
- |
- 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_; |
+ if (video_frame_provider_client_) |
+ stream_texture_proxy_->SetClient(video_frame_provider_client_); |
} |
- |
- needs_establish_peer_ = false; |
} |
void WebMediaPlayerAndroid::DoCreateStreamTexture() { |
@@ -1275,8 +1238,21 @@ void WebMediaPlayerAndroid::DoCreateStreamTexture() { |
kGLTextureExternalOES, &texture_id_, &texture_mailbox_); |
} |
-void WebMediaPlayerAndroid::SetNeedsEstablishPeer(bool needs_establish_peer) { |
- needs_establish_peer_ = needs_establish_peer; |
+void WebMediaPlayerAndroid::EstablishSurfaceTexturePeerIfNeeded() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
+ if (peer_established_ || 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_; |
+ } |
+ peer_established_ = true; |
} |
void WebMediaPlayerAndroid::setPoster(const blink::WebURL& poster) { |
@@ -1285,6 +1261,7 @@ void WebMediaPlayerAndroid::setPoster(const blink::WebURL& poster) { |
void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) { |
is_playing_ = is_playing; |
+ EstablishSurfaceTexturePeerIfNeeded(); |
qinmin
2014/09/09 06:39:18
UpdatePlayingState() can be called by 4 different
boliu
2014/09/09 21:17:04
Because contract is any states change should lead
|
if (!delegate_) |
return; |
if (is_playing) |
@@ -1754,7 +1731,6 @@ void WebMediaPlayerAndroid::SetDecryptorReadyCB( |
void WebMediaPlayerAndroid::enterFullscreen() { |
if (player_manager_->CanEnterFullscreen(frame_)) { |
player_manager_->EnterFullscreen(player_id_, frame_); |
- SetNeedsEstablishPeer(false); |
} |
} |