@@ -135,7 +135,6 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
135
135
stream_id_(0 ),
136
136
is_playing_(false ),
137
137
needs_establish_peer_(true ),
138
- in_fullscreen_(false ),
139
138
stream_texture_proxy_initialized_(false ),
140
139
has_size_info_(false ),
141
140
stream_texture_factory_(factory),
@@ -164,7 +163,7 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
164
163
if (force_use_overlay_embedded_video_ ||
165
164
player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo ()) {
166
165
// Defer stream texture creation until we are sure it's necessary.
167
- needs_external_surface_ = true ;
166
+ needs_establish_peer_ = false ;
168
167
current_frame_ = VideoFrame::CreateBlackFrame (gfx::Size (1 , 1 ));
169
168
}
170
169
#endif // defined(VIDEO_HOLE)
@@ -305,11 +304,18 @@ void WebMediaPlayerAndroid::play() {
305
304
#if defined(VIDEO_HOLE)
306
305
if ((hasVideo () || IsHLSStream ()) && needs_external_surface_ &&
307
306
!player_manager_->IsInFullscreen (frame_)) {
307
+ DCHECK (!needs_establish_peer_);
308
308
player_manager_->RequestExternalSurface (player_id_, last_computed_rect_);
309
309
}
310
310
#endif // defined(VIDEO_HOLE)
311
311
312
312
TryCreateStreamTextureProxyIfNeeded ();
313
+ // There is no need to establish the surface texture peer for fullscreen
314
+ // video.
315
+ if ((hasVideo () || IsHLSStream ()) && needs_establish_peer_ &&
316
+ !player_manager_->IsInFullscreen (frame_)) {
317
+ EstablishSurfaceTexturePeer ();
318
+ }
313
319
314
320
if (paused ())
315
321
player_manager_->Start (player_id_);
@@ -753,6 +759,7 @@ void WebMediaPlayerAndroid::OnPlaybackComplete() {
753
759
// process are sequential, the OnSeekComplete() will only occur
754
760
// once OnPlaybackComplete() is done. As the playback can only be executed
755
761
// upon completion of OnSeekComplete(), the request needs to be saved.
762
+ is_playing_ = false ;
756
763
if (seeking_ && seek_time_ == base::TimeDelta ())
757
764
pending_playback_ = true ;
758
765
}
@@ -818,18 +825,25 @@ void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) {
818
825
if (force_use_overlay_embedded_video_ ||
819
826
(media_source_delegate_ && media_source_delegate_->IsVideoEncrypted () &&
820
827
player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo ())) {
828
+ needs_external_surface_ = true ;
821
829
if (!paused () && !player_manager_->IsInFullscreen (frame_))
822
830
player_manager_->RequestExternalSurface (player_id_, last_computed_rect_);
823
- } else {
824
- needs_external_surface_ = false ;
831
+ } else if (stream_texture_proxy_ && !stream_id_) {
832
+ // Do deferred stream texture creation finally.
833
+ DoCreateStreamTexture ();
834
+ SetNeedsEstablishPeer (true );
825
835
}
826
836
#endif // defined(VIDEO_HOLE)
827
837
natural_size_.width = width;
828
838
natural_size_.height = height;
829
839
830
- // hasVideo() might have changed since play was called, so need to possibly
831
- // estlibash peer here.
832
- EstablishSurfaceTexturePeerIfNeeded ();
840
+ // When play() gets called, |natural_size_| may still be empty and
841
+ // EstablishSurfaceTexturePeer() will not get called. As a result, the video
842
+ // may play without a surface texture. When we finally get the valid video
843
+ // size here, we should call EstablishSurfaceTexturePeer() if it has not been
844
+ // previously called.
845
+ if (!paused () && needs_establish_peer_)
846
+ EstablishSurfaceTexturePeer ();
833
847
834
848
ReallocateVideoFrame ();
835
849
@@ -867,15 +881,16 @@ void WebMediaPlayerAndroid::OnConnectedToRemoteDevice(
867
881
DCHECK (!media_source_delegate_);
868
882
DrawRemotePlaybackText (remote_playback_message);
869
883
is_remote_ = true ;
870
- needs_establish_peer_ = true ;
871
- EstablishSurfaceTexturePeerIfNeeded ();
884
+ SetNeedsEstablishPeer (false );
872
885
}
873
886
874
887
void WebMediaPlayerAndroid::OnDisconnectedFromRemoteDevice () {
875
888
DCHECK (main_thread_checker_.CalledOnValidThread ());
876
889
DCHECK (!media_source_delegate_);
890
+ SetNeedsEstablishPeer (true );
891
+ if (!paused ())
892
+ EstablishSurfaceTexturePeer ();
877
893
is_remote_ = false ;
878
- EstablishSurfaceTexturePeerIfNeeded ();
879
894
ReallocateVideoFrame ();
880
895
}
881
896
@@ -885,8 +900,13 @@ void WebMediaPlayerAndroid::OnDidEnterFullscreen() {
885
900
}
886
901
887
902
void WebMediaPlayerAndroid::OnDidExitFullscreen () {
888
- in_fullscreen_ = false ;
889
- EstablishSurfaceTexturePeerIfNeeded ();
903
+ // |needs_external_surface_| is always false on non-TV devices.
904
+ if (!needs_external_surface_)
905
+ SetNeedsEstablishPeer (true );
906
+ // We had the fullscreen surface connected to Android MediaPlayer,
907
+ // so reconnect our surface texture for embedded playback.
908
+ if (!paused () && needs_establish_peer_)
909
+ EstablishSurfaceTexturePeer ();
890
910
891
911
#if defined(VIDEO_HOLE)
892
912
if (!paused () && needs_external_surface_)
@@ -948,7 +968,9 @@ void WebMediaPlayerAndroid::UpdateReadyState(
948
968
}
949
969
950
970
void WebMediaPlayerAndroid::OnPlayerReleased () {
951
- needs_establish_peer_ = true ; // Established when this plays.
971
+ // |needs_external_surface_| is always false on non-TV devices.
972
+ if (!needs_external_surface_)
973
+ needs_establish_peer_ = true ;
952
974
953
975
if (is_playing_)
954
976
OnMediaPlayerPause ();
@@ -978,7 +1000,8 @@ void WebMediaPlayerAndroid::ReleaseMediaResources() {
978
1000
break ;
979
1001
}
980
1002
player_manager_->ReleaseResources (player_id_);
981
- needs_establish_peer_ = true ; // Established when this plays.
1003
+ if (!needs_external_surface_)
1004
+ SetNeedsEstablishPeer (true );
982
1005
}
983
1006
984
1007
void WebMediaPlayerAndroid::OnDestruct () {
@@ -1221,51 +1244,52 @@ void WebMediaPlayerAndroid::TryCreateStreamTextureProxyIfNeeded() {
1221
1244
if (!stream_texture_factory_)
1222
1245
return ;
1223
1246
1224
- if (needs_external_surface_)
1225
- return ;
1226
-
1227
1247
stream_texture_proxy_.reset (stream_texture_factory_->CreateProxy ());
1228
- if (stream_texture_proxy_) {
1248
+ if (needs_establish_peer_ && stream_texture_proxy_) {
1229
1249
DoCreateStreamTexture ();
1230
1250
ReallocateVideoFrame ();
1231
-
1232
- if (video_frame_provider_client_)
1233
- stream_texture_proxy_->SetClient (video_frame_provider_client_);
1234
1251
}
1235
- }
1236
1252
1237
- void WebMediaPlayerAndroid::DoCreateStreamTexture () {
1238
- DCHECK (main_thread_checker_.CalledOnValidThread ());
1239
- DCHECK (!stream_id_);
1240
- DCHECK (!texture_id_);
1241
- stream_id_ = stream_texture_factory_->CreateStreamTexture (
1242
- kGLTextureExternalOES , &texture_id_, &texture_mailbox_);
1253
+ if (stream_texture_proxy_ && video_frame_provider_client_)
1254
+ stream_texture_proxy_->SetClient (video_frame_provider_client_);
1243
1255
}
1244
1256
1245
- void WebMediaPlayerAndroid::EstablishSurfaceTexturePeerIfNeeded () {
1257
+ void WebMediaPlayerAndroid::EstablishSurfaceTexturePeer () {
1246
1258
DCHECK (main_thread_checker_.CalledOnValidThread ());
1247
- if (!needs_establish_peer_ || in_fullscreen_ || needs_external_surface_ ||
1248
- is_remote_ || !is_playing_ || !stream_texture_proxy_ ||
1249
- (!hasVideo () && !IsHLSStream ())) {
1259
+ if (!stream_texture_proxy_)
1250
1260
return ;
1251
- }
1252
1261
1253
- stream_texture_factory_->EstablishPeer (stream_id_, player_id_);
1254
- if (cached_stream_texture_size_ != natural_size_) {
1262
+ if (stream_texture_factory_.get () && stream_id_)
1263
+ stream_texture_factory_->EstablishPeer (stream_id_, player_id_);
1264
+
1265
+ // Set the deferred size because the size was changed in remote mode.
1266
+ if (!is_remote_ && cached_stream_texture_size_ != natural_size_) {
1255
1267
stream_texture_factory_->SetStreamTextureSize (
1256
1268
stream_id_, gfx::Size (natural_size_.width , natural_size_.height ));
1257
1269
cached_stream_texture_size_ = natural_size_;
1258
1270
}
1271
+
1259
1272
needs_establish_peer_ = false ;
1260
1273
}
1261
1274
1275
+ void WebMediaPlayerAndroid::DoCreateStreamTexture () {
1276
+ DCHECK (main_thread_checker_.CalledOnValidThread ());
1277
+ DCHECK (!stream_id_);
1278
+ DCHECK (!texture_id_);
1279
+ stream_id_ = stream_texture_factory_->CreateStreamTexture (
1280
+ kGLTextureExternalOES , &texture_id_, &texture_mailbox_);
1281
+ }
1282
+
1283
+ void WebMediaPlayerAndroid::SetNeedsEstablishPeer (bool needs_establish_peer) {
1284
+ needs_establish_peer_ = needs_establish_peer;
1285
+ }
1286
+
1262
1287
void WebMediaPlayerAndroid::setPoster (const blink::WebURL& poster) {
1263
1288
player_manager_->SetPoster (player_id_, poster);
1264
1289
}
1265
1290
1266
1291
void WebMediaPlayerAndroid::UpdatePlayingState (bool is_playing) {
1267
1292
is_playing_ = is_playing;
1268
- EstablishSurfaceTexturePeerIfNeeded ();
1269
1293
if (!delegate_)
1270
1294
return ;
1271
1295
if (is_playing)
@@ -1735,10 +1759,8 @@ void WebMediaPlayerAndroid::SetDecryptorReadyCB(
1735
1759
void WebMediaPlayerAndroid::enterFullscreen () {
1736
1760
if (player_manager_->CanEnterFullscreen (frame_)) {
1737
1761
player_manager_->EnterFullscreen (player_id_, frame_);
1762
+ SetNeedsEstablishPeer (false );
1738
1763
}
1739
- in_fullscreen_ = true ;
1740
- needs_establish_peer_ = true ;
1741
- EstablishSurfaceTexturePeerIfNeeded ();
1742
1764
}
1743
1765
1744
1766
bool WebMediaPlayerAndroid::canEnterFullscreen () const {
0 commit comments