OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/android/webmediaplayer_android.h" | 5 #include "content/renderer/media/android/webmediaplayer_android.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/android/build_info.h" | 9 #include "base/android/build_info.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 seeking_(false), | 128 seeking_(false), |
129 did_loading_progress_(false), | 129 did_loading_progress_(false), |
130 player_manager_(player_manager), | 130 player_manager_(player_manager), |
131 cdm_manager_(cdm_manager), | 131 cdm_manager_(cdm_manager), |
132 network_state_(WebMediaPlayer::NetworkStateEmpty), | 132 network_state_(WebMediaPlayer::NetworkStateEmpty), |
133 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 133 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
134 texture_id_(0), | 134 texture_id_(0), |
135 stream_id_(0), | 135 stream_id_(0), |
136 is_playing_(false), | 136 is_playing_(false), |
137 needs_establish_peer_(true), | 137 needs_establish_peer_(true), |
138 in_fullscreen_(false), | |
139 stream_texture_proxy_initialized_(false), | 138 stream_texture_proxy_initialized_(false), |
140 has_size_info_(false), | 139 has_size_info_(false), |
141 stream_texture_factory_(factory), | 140 stream_texture_factory_(factory), |
142 needs_external_surface_(false), | 141 needs_external_surface_(false), |
143 video_frame_provider_client_(NULL), | 142 video_frame_provider_client_(NULL), |
144 pending_playback_(false), | 143 pending_playback_(false), |
145 player_type_(MEDIA_PLAYER_TYPE_URL), | 144 player_type_(MEDIA_PLAYER_TYPE_URL), |
146 current_time_(0), | 145 current_time_(0), |
147 is_remote_(false), | 146 is_remote_(false), |
148 media_log_(media_log), | 147 media_log_(media_log), |
149 web_cdm_(NULL), | 148 web_cdm_(NULL), |
150 allow_stored_credentials_(false), | 149 allow_stored_credentials_(false), |
151 is_local_resource_(false), | 150 is_local_resource_(false), |
152 weak_factory_(this) { | 151 weak_factory_(this) { |
153 DCHECK(player_manager_); | 152 DCHECK(player_manager_); |
154 DCHECK(cdm_manager_); | 153 DCHECK(cdm_manager_); |
155 | 154 |
156 DCHECK(main_thread_checker_.CalledOnValidThread()); | 155 DCHECK(main_thread_checker_.CalledOnValidThread()); |
157 | 156 |
158 player_id_ = player_manager_->RegisterMediaPlayer(this); | 157 player_id_ = player_manager_->RegisterMediaPlayer(this); |
159 | 158 |
160 #if defined(VIDEO_HOLE) | 159 #if defined(VIDEO_HOLE) |
161 force_use_overlay_embedded_video_ = CommandLine::ForCurrentProcess()-> | 160 force_use_overlay_embedded_video_ = CommandLine::ForCurrentProcess()-> |
162 HasSwitch(switches::kForceUseOverlayEmbeddedVideo); | 161 HasSwitch(switches::kForceUseOverlayEmbeddedVideo); |
163 if (force_use_overlay_embedded_video_ || | 162 if (force_use_overlay_embedded_video_ || |
164 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { | 163 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { |
165 // Defer stream texture creation until we are sure it's necessary. | 164 // Defer stream texture creation until we are sure it's necessary. |
166 needs_external_surface_ = true; | 165 needs_establish_peer_ = false; |
167 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); | 166 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); |
168 } | 167 } |
169 #endif // defined(VIDEO_HOLE) | 168 #endif // defined(VIDEO_HOLE) |
170 TryCreateStreamTextureProxyIfNeeded(); | 169 TryCreateStreamTextureProxyIfNeeded(); |
171 } | 170 } |
172 | 171 |
173 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { | 172 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
174 DCHECK(main_thread_checker_.CalledOnValidThread()); | 173 DCHECK(main_thread_checker_.CalledOnValidThread()); |
175 SetVideoFrameProviderClient(NULL); | 174 SetVideoFrameProviderClient(NULL); |
176 client_->setWebLayer(NULL); | 175 client_->setWebLayer(NULL); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 } | 296 } |
298 | 297 |
299 void WebMediaPlayerAndroid::play() { | 298 void WebMediaPlayerAndroid::play() { |
300 DCHECK(main_thread_checker_.CalledOnValidThread()); | 299 DCHECK(main_thread_checker_.CalledOnValidThread()); |
301 | 300 |
302 // For HLS streams, some devices cannot detect the video size unless a surface | 301 // For HLS streams, some devices cannot detect the video size unless a surface |
303 // texture is bind to it. See http://crbug.com/400145. | 302 // texture is bind to it. See http://crbug.com/400145. |
304 #if defined(VIDEO_HOLE) | 303 #if defined(VIDEO_HOLE) |
305 if ((hasVideo() || IsHLSStream()) && needs_external_surface_ && | 304 if ((hasVideo() || IsHLSStream()) && needs_external_surface_ && |
306 !player_manager_->IsInFullscreen(frame_)) { | 305 !player_manager_->IsInFullscreen(frame_)) { |
| 306 DCHECK(!needs_establish_peer_); |
307 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); | 307 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); |
308 } | 308 } |
309 #endif // defined(VIDEO_HOLE) | 309 #endif // defined(VIDEO_HOLE) |
310 | 310 |
311 TryCreateStreamTextureProxyIfNeeded(); | 311 TryCreateStreamTextureProxyIfNeeded(); |
| 312 // There is no need to establish the surface texture peer for fullscreen |
| 313 // video. |
| 314 if ((hasVideo() || IsHLSStream()) && needs_establish_peer_ && |
| 315 !player_manager_->IsInFullscreen(frame_)) { |
| 316 EstablishSurfaceTexturePeer(); |
| 317 } |
312 | 318 |
313 if (paused()) | 319 if (paused()) |
314 player_manager_->Start(player_id_); | 320 player_manager_->Start(player_id_); |
315 UpdatePlayingState(true); | 321 UpdatePlayingState(true); |
316 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); | 322 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); |
317 } | 323 } |
318 | 324 |
319 void WebMediaPlayerAndroid::pause() { | 325 void WebMediaPlayerAndroid::pause() { |
320 DCHECK(main_thread_checker_.CalledOnValidThread()); | 326 DCHECK(main_thread_checker_.CalledOnValidThread()); |
321 Pause(true); | 327 Pause(true); |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 // know that the playback has finished. To solve this, we set the | 747 // know that the playback has finished. To solve this, we set the |
742 // current time to media duration when OnPlaybackComplete() get called. | 748 // current time to media duration when OnPlaybackComplete() get called. |
743 OnTimeUpdate(duration_); | 749 OnTimeUpdate(duration_); |
744 client_->timeChanged(); | 750 client_->timeChanged(); |
745 | 751 |
746 // if the loop attribute is set, timeChanged() will update the current time | 752 // if the loop attribute is set, timeChanged() will update the current time |
747 // to 0. It will perform a seek to 0. As the requests to the renderer | 753 // to 0. It will perform a seek to 0. As the requests to the renderer |
748 // process are sequential, the OnSeekComplete() will only occur | 754 // process are sequential, the OnSeekComplete() will only occur |
749 // once OnPlaybackComplete() is done. As the playback can only be executed | 755 // once OnPlaybackComplete() is done. As the playback can only be executed |
750 // upon completion of OnSeekComplete(), the request needs to be saved. | 756 // upon completion of OnSeekComplete(), the request needs to be saved. |
| 757 is_playing_ = false; |
751 if (seeking_ && seek_time_ == base::TimeDelta()) | 758 if (seeking_ && seek_time_ == base::TimeDelta()) |
752 pending_playback_ = true; | 759 pending_playback_ = true; |
753 } | 760 } |
754 | 761 |
755 void WebMediaPlayerAndroid::OnBufferingUpdate(int percentage) { | 762 void WebMediaPlayerAndroid::OnBufferingUpdate(int percentage) { |
756 buffered_[0].end = duration() * percentage / 100; | 763 buffered_[0].end = duration() * percentage / 100; |
757 did_loading_progress_ = true; | 764 did_loading_progress_ = true; |
758 } | 765 } |
759 | 766 |
760 void WebMediaPlayerAndroid::OnSeekRequest(const base::TimeDelta& time_to_seek) { | 767 void WebMediaPlayerAndroid::OnSeekRequest(const base::TimeDelta& time_to_seek) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 has_size_info_ = true; | 813 has_size_info_ = true; |
807 if (natural_size_.width == width && natural_size_.height == height) | 814 if (natural_size_.width == width && natural_size_.height == height) |
808 return; | 815 return; |
809 | 816 |
810 #if defined(VIDEO_HOLE) | 817 #if defined(VIDEO_HOLE) |
811 // Use H/W surface for encrypted video. | 818 // Use H/W surface for encrypted video. |
812 // TODO(qinmin): Change this so that only EME needs the H/W surface | 819 // TODO(qinmin): Change this so that only EME needs the H/W surface |
813 if (force_use_overlay_embedded_video_ || | 820 if (force_use_overlay_embedded_video_ || |
814 (media_source_delegate_ && media_source_delegate_->IsVideoEncrypted() && | 821 (media_source_delegate_ && media_source_delegate_->IsVideoEncrypted() && |
815 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo())) { | 822 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo())) { |
| 823 needs_external_surface_ = true; |
816 if (!paused() && !player_manager_->IsInFullscreen(frame_)) | 824 if (!paused() && !player_manager_->IsInFullscreen(frame_)) |
817 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); | 825 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); |
818 } else { | 826 } else if (stream_texture_proxy_ && !stream_id_) { |
819 needs_external_surface_ = false; | 827 // Do deferred stream texture creation finally. |
| 828 DoCreateStreamTexture(); |
| 829 SetNeedsEstablishPeer(true); |
820 } | 830 } |
821 #endif // defined(VIDEO_HOLE) | 831 #endif // defined(VIDEO_HOLE) |
822 natural_size_.width = width; | 832 natural_size_.width = width; |
823 natural_size_.height = height; | 833 natural_size_.height = height; |
824 | 834 |
825 // hasVideo() might have changed since play was called, so need to possibly | 835 // When play() gets called, |natural_size_| may still be empty and |
826 // estlibash peer here. | 836 // EstablishSurfaceTexturePeer() will not get called. As a result, the video |
827 EstablishSurfaceTexturePeerIfNeeded(); | 837 // may play without a surface texture. When we finally get the valid video |
| 838 // size here, we should call EstablishSurfaceTexturePeer() if it has not been |
| 839 // previously called. |
| 840 if (!paused() && needs_establish_peer_) |
| 841 EstablishSurfaceTexturePeer(); |
828 | 842 |
829 ReallocateVideoFrame(); | 843 ReallocateVideoFrame(); |
830 | 844 |
831 // For hidden video element (with style "display:none"), ensure the texture | 845 // For hidden video element (with style "display:none"), ensure the texture |
832 // size is set. | 846 // size is set. |
833 if (!is_remote_ && cached_stream_texture_size_ != natural_size_) { | 847 if (!is_remote_ && cached_stream_texture_size_ != natural_size_) { |
834 stream_texture_factory_->SetStreamTextureSize( | 848 stream_texture_factory_->SetStreamTextureSize( |
835 stream_id_, gfx::Size(natural_size_.width, natural_size_.height)); | 849 stream_id_, gfx::Size(natural_size_.width, natural_size_.height)); |
836 cached_stream_texture_size_ = natural_size_; | 850 cached_stream_texture_size_ = natural_size_; |
837 } | 851 } |
(...skipping 17 matching lines...) Expand all Loading... |
855 if (is_local_resource_ && current_time_ <= duration()) | 869 if (is_local_resource_ && current_time_ <= duration()) |
856 buffered_[0].end = current_time_; | 870 buffered_[0].end = current_time_; |
857 } | 871 } |
858 | 872 |
859 void WebMediaPlayerAndroid::OnConnectedToRemoteDevice( | 873 void WebMediaPlayerAndroid::OnConnectedToRemoteDevice( |
860 const std::string& remote_playback_message) { | 874 const std::string& remote_playback_message) { |
861 DCHECK(main_thread_checker_.CalledOnValidThread()); | 875 DCHECK(main_thread_checker_.CalledOnValidThread()); |
862 DCHECK(!media_source_delegate_); | 876 DCHECK(!media_source_delegate_); |
863 DrawRemotePlaybackText(remote_playback_message); | 877 DrawRemotePlaybackText(remote_playback_message); |
864 is_remote_ = true; | 878 is_remote_ = true; |
865 needs_establish_peer_ = true; | 879 SetNeedsEstablishPeer(false); |
866 EstablishSurfaceTexturePeerIfNeeded(); | |
867 } | 880 } |
868 | 881 |
869 void WebMediaPlayerAndroid::OnDisconnectedFromRemoteDevice() { | 882 void WebMediaPlayerAndroid::OnDisconnectedFromRemoteDevice() { |
870 DCHECK(main_thread_checker_.CalledOnValidThread()); | 883 DCHECK(main_thread_checker_.CalledOnValidThread()); |
871 DCHECK(!media_source_delegate_); | 884 DCHECK(!media_source_delegate_); |
| 885 SetNeedsEstablishPeer(true); |
| 886 if (!paused()) |
| 887 EstablishSurfaceTexturePeer(); |
872 is_remote_ = false; | 888 is_remote_ = false; |
873 EstablishSurfaceTexturePeerIfNeeded(); | |
874 ReallocateVideoFrame(); | 889 ReallocateVideoFrame(); |
875 } | 890 } |
876 | 891 |
877 void WebMediaPlayerAndroid::OnDidEnterFullscreen() { | 892 void WebMediaPlayerAndroid::OnDidEnterFullscreen() { |
878 if (!player_manager_->IsInFullscreen(frame_)) | 893 if (!player_manager_->IsInFullscreen(frame_)) |
879 player_manager_->DidEnterFullscreen(frame_); | 894 player_manager_->DidEnterFullscreen(frame_); |
880 } | 895 } |
881 | 896 |
882 void WebMediaPlayerAndroid::OnDidExitFullscreen() { | 897 void WebMediaPlayerAndroid::OnDidExitFullscreen() { |
883 in_fullscreen_ = false; | 898 // |needs_external_surface_| is always false on non-TV devices. |
884 EstablishSurfaceTexturePeerIfNeeded(); | 899 if (!needs_external_surface_) |
| 900 SetNeedsEstablishPeer(true); |
| 901 // We had the fullscreen surface connected to Android MediaPlayer, |
| 902 // so reconnect our surface texture for embedded playback. |
| 903 if (!paused() && needs_establish_peer_) |
| 904 EstablishSurfaceTexturePeer(); |
885 | 905 |
886 #if defined(VIDEO_HOLE) | 906 #if defined(VIDEO_HOLE) |
887 if (!paused() && needs_external_surface_) | 907 if (!paused() && needs_external_surface_) |
888 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); | 908 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); |
889 #endif // defined(VIDEO_HOLE) | 909 #endif // defined(VIDEO_HOLE) |
890 | 910 |
891 player_manager_->DidExitFullscreen(); | 911 player_manager_->DidExitFullscreen(); |
892 client_->repaint(); | 912 client_->repaint(); |
893 } | 913 } |
894 | 914 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
936 client_->networkStateChanged(); | 956 client_->networkStateChanged(); |
937 } | 957 } |
938 | 958 |
939 void WebMediaPlayerAndroid::UpdateReadyState( | 959 void WebMediaPlayerAndroid::UpdateReadyState( |
940 WebMediaPlayer::ReadyState state) { | 960 WebMediaPlayer::ReadyState state) { |
941 ready_state_ = state; | 961 ready_state_ = state; |
942 client_->readyStateChanged(); | 962 client_->readyStateChanged(); |
943 } | 963 } |
944 | 964 |
945 void WebMediaPlayerAndroid::OnPlayerReleased() { | 965 void WebMediaPlayerAndroid::OnPlayerReleased() { |
946 needs_establish_peer_ = true; // Established when this plays. | 966 // |needs_external_surface_| is always false on non-TV devices. |
| 967 if (!needs_external_surface_) |
| 968 needs_establish_peer_ = true; |
947 | 969 |
948 if (is_playing_) | 970 if (is_playing_) |
949 OnMediaPlayerPause(); | 971 OnMediaPlayerPause(); |
950 | 972 |
951 #if defined(VIDEO_HOLE) | 973 #if defined(VIDEO_HOLE) |
952 last_computed_rect_ = gfx::RectF(); | 974 last_computed_rect_ = gfx::RectF(); |
953 #endif // defined(VIDEO_HOLE) | 975 #endif // defined(VIDEO_HOLE) |
954 } | 976 } |
955 | 977 |
956 void WebMediaPlayerAndroid::ReleaseMediaResources() { | 978 void WebMediaPlayerAndroid::ReleaseMediaResources() { |
957 switch (network_state_) { | 979 switch (network_state_) { |
958 // Pause the media player and inform WebKit if the player is in a good | 980 // Pause the media player and inform WebKit if the player is in a good |
959 // shape. | 981 // shape. |
960 case WebMediaPlayer::NetworkStateIdle: | 982 case WebMediaPlayer::NetworkStateIdle: |
961 case WebMediaPlayer::NetworkStateLoading: | 983 case WebMediaPlayer::NetworkStateLoading: |
962 case WebMediaPlayer::NetworkStateLoaded: | 984 case WebMediaPlayer::NetworkStateLoaded: |
963 Pause(false); | 985 Pause(false); |
964 client_->playbackStateChanged(); | 986 client_->playbackStateChanged(); |
965 break; | 987 break; |
966 // If a WebMediaPlayer instance has entered into one of these states, | 988 // If a WebMediaPlayer instance has entered into one of these states, |
967 // the internal network state in HTMLMediaElement could be set to empty. | 989 // the internal network state in HTMLMediaElement could be set to empty. |
968 // And calling playbackStateChanged() could get this object deleted. | 990 // And calling playbackStateChanged() could get this object deleted. |
969 case WebMediaPlayer::NetworkStateEmpty: | 991 case WebMediaPlayer::NetworkStateEmpty: |
970 case WebMediaPlayer::NetworkStateFormatError: | 992 case WebMediaPlayer::NetworkStateFormatError: |
971 case WebMediaPlayer::NetworkStateNetworkError: | 993 case WebMediaPlayer::NetworkStateNetworkError: |
972 case WebMediaPlayer::NetworkStateDecodeError: | 994 case WebMediaPlayer::NetworkStateDecodeError: |
973 break; | 995 break; |
974 } | 996 } |
975 player_manager_->ReleaseResources(player_id_); | 997 player_manager_->ReleaseResources(player_id_); |
976 needs_establish_peer_ = true; // Established when this plays. | 998 if (!needs_external_surface_) |
| 999 SetNeedsEstablishPeer(true); |
977 } | 1000 } |
978 | 1001 |
979 void WebMediaPlayerAndroid::OnDestruct() { | 1002 void WebMediaPlayerAndroid::OnDestruct() { |
980 NOTREACHED() << "WebMediaPlayer should be destroyed before any " | 1003 NOTREACHED() << "WebMediaPlayer should be destroyed before any " |
981 "RenderFrameObserver::OnDestruct() gets called when " | 1004 "RenderFrameObserver::OnDestruct() gets called when " |
982 "the RenderFrame goes away."; | 1005 "the RenderFrame goes away."; |
983 } | 1006 } |
984 | 1007 |
985 void WebMediaPlayerAndroid::InitializePlayer( | 1008 void WebMediaPlayerAndroid::InitializePlayer( |
986 const GURL& url, | 1009 const GURL& url, |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1209 void WebMediaPlayerAndroid::TryCreateStreamTextureProxyIfNeeded() { | 1232 void WebMediaPlayerAndroid::TryCreateStreamTextureProxyIfNeeded() { |
1210 DCHECK(main_thread_checker_.CalledOnValidThread()); | 1233 DCHECK(main_thread_checker_.CalledOnValidThread()); |
1211 // Already created. | 1234 // Already created. |
1212 if (stream_texture_proxy_) | 1235 if (stream_texture_proxy_) |
1213 return; | 1236 return; |
1214 | 1237 |
1215 // No factory to create proxy. | 1238 // No factory to create proxy. |
1216 if (!stream_texture_factory_) | 1239 if (!stream_texture_factory_) |
1217 return; | 1240 return; |
1218 | 1241 |
1219 if (needs_external_surface_) | 1242 stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy()); |
| 1243 if (needs_establish_peer_ && stream_texture_proxy_) { |
| 1244 DoCreateStreamTexture(); |
| 1245 ReallocateVideoFrame(); |
| 1246 } |
| 1247 |
| 1248 if (stream_texture_proxy_ && video_frame_provider_client_) |
| 1249 stream_texture_proxy_->SetClient(video_frame_provider_client_); |
| 1250 } |
| 1251 |
| 1252 void WebMediaPlayerAndroid::EstablishSurfaceTexturePeer() { |
| 1253 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 1254 if (!stream_texture_proxy_) |
1220 return; | 1255 return; |
1221 | 1256 |
1222 stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy()); | 1257 if (stream_texture_factory_.get() && stream_id_) |
1223 if (stream_texture_proxy_) { | 1258 stream_texture_factory_->EstablishPeer(stream_id_, player_id_); |
1224 DoCreateStreamTexture(); | |
1225 ReallocateVideoFrame(); | |
1226 | 1259 |
1227 if (video_frame_provider_client_) | 1260 // Set the deferred size because the size was changed in remote mode. |
1228 stream_texture_proxy_->SetClient(video_frame_provider_client_); | 1261 if (!is_remote_ && cached_stream_texture_size_ != natural_size_) { |
| 1262 stream_texture_factory_->SetStreamTextureSize( |
| 1263 stream_id_, gfx::Size(natural_size_.width, natural_size_.height)); |
| 1264 cached_stream_texture_size_ = natural_size_; |
1229 } | 1265 } |
| 1266 |
| 1267 needs_establish_peer_ = false; |
1230 } | 1268 } |
1231 | 1269 |
1232 void WebMediaPlayerAndroid::DoCreateStreamTexture() { | 1270 void WebMediaPlayerAndroid::DoCreateStreamTexture() { |
1233 DCHECK(main_thread_checker_.CalledOnValidThread()); | 1271 DCHECK(main_thread_checker_.CalledOnValidThread()); |
1234 DCHECK(!stream_id_); | 1272 DCHECK(!stream_id_); |
1235 DCHECK(!texture_id_); | 1273 DCHECK(!texture_id_); |
1236 stream_id_ = stream_texture_factory_->CreateStreamTexture( | 1274 stream_id_ = stream_texture_factory_->CreateStreamTexture( |
1237 kGLTextureExternalOES, &texture_id_, &texture_mailbox_); | 1275 kGLTextureExternalOES, &texture_id_, &texture_mailbox_); |
1238 } | 1276 } |
1239 | 1277 |
1240 void WebMediaPlayerAndroid::EstablishSurfaceTexturePeerIfNeeded() { | 1278 void WebMediaPlayerAndroid::SetNeedsEstablishPeer(bool needs_establish_peer) { |
1241 DCHECK(main_thread_checker_.CalledOnValidThread()); | 1279 needs_establish_peer_ = needs_establish_peer; |
1242 if (!needs_establish_peer_ || in_fullscreen_ || needs_external_surface_ || | |
1243 is_remote_ || !is_playing_ || !stream_texture_proxy_ || | |
1244 (!hasVideo() && !IsHLSStream())) { | |
1245 return; | |
1246 } | |
1247 | |
1248 stream_texture_factory_->EstablishPeer(stream_id_, player_id_); | |
1249 if (cached_stream_texture_size_ != natural_size_) { | |
1250 stream_texture_factory_->SetStreamTextureSize( | |
1251 stream_id_, gfx::Size(natural_size_.width, natural_size_.height)); | |
1252 cached_stream_texture_size_ = natural_size_; | |
1253 } | |
1254 needs_establish_peer_ = false; | |
1255 } | 1280 } |
1256 | 1281 |
1257 void WebMediaPlayerAndroid::setPoster(const blink::WebURL& poster) { | 1282 void WebMediaPlayerAndroid::setPoster(const blink::WebURL& poster) { |
1258 player_manager_->SetPoster(player_id_, poster); | 1283 player_manager_->SetPoster(player_id_, poster); |
1259 } | 1284 } |
1260 | 1285 |
1261 void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) { | 1286 void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) { |
1262 is_playing_ = is_playing; | 1287 is_playing_ = is_playing; |
1263 EstablishSurfaceTexturePeerIfNeeded(); | |
1264 if (!delegate_) | 1288 if (!delegate_) |
1265 return; | 1289 return; |
1266 if (is_playing) | 1290 if (is_playing) |
1267 delegate_->DidPlay(this); | 1291 delegate_->DidPlay(this); |
1268 else | 1292 else |
1269 delegate_->DidPause(this); | 1293 delegate_->DidPause(this); |
1270 } | 1294 } |
1271 | 1295 |
1272 #if defined(VIDEO_HOLE) | 1296 #if defined(VIDEO_HOLE) |
1273 bool WebMediaPlayerAndroid::UpdateBoundaryRectangle() { | 1297 bool WebMediaPlayerAndroid::UpdateBoundaryRectangle() { |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1723 decryptor_ready_cb.Run(web_cdm_->GetDecryptor(), base::Bind(DoNothing)); | 1747 decryptor_ready_cb.Run(web_cdm_->GetDecryptor(), base::Bind(DoNothing)); |
1724 return; | 1748 return; |
1725 } | 1749 } |
1726 | 1750 |
1727 decryptor_ready_cb_ = decryptor_ready_cb; | 1751 decryptor_ready_cb_ = decryptor_ready_cb; |
1728 } | 1752 } |
1729 | 1753 |
1730 void WebMediaPlayerAndroid::enterFullscreen() { | 1754 void WebMediaPlayerAndroid::enterFullscreen() { |
1731 if (player_manager_->CanEnterFullscreen(frame_)) { | 1755 if (player_manager_->CanEnterFullscreen(frame_)) { |
1732 player_manager_->EnterFullscreen(player_id_, frame_); | 1756 player_manager_->EnterFullscreen(player_id_, frame_); |
| 1757 SetNeedsEstablishPeer(false); |
1733 } | 1758 } |
1734 in_fullscreen_ = true; | |
1735 needs_establish_peer_ = true; | |
1736 EstablishSurfaceTexturePeerIfNeeded(); | |
1737 } | 1759 } |
1738 | 1760 |
1739 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1761 bool WebMediaPlayerAndroid::canEnterFullscreen() const { |
1740 return player_manager_->CanEnterFullscreen(frame_); | 1762 return player_manager_->CanEnterFullscreen(frame_); |
1741 } | 1763 } |
1742 | 1764 |
1743 bool WebMediaPlayerAndroid::IsHLSStream() const { | 1765 bool WebMediaPlayerAndroid::IsHLSStream() const { |
1744 std::string mime; | 1766 std::string mime; |
1745 GURL url = redirected_url_.is_empty() ? url_ : redirected_url_; | 1767 GURL url = redirected_url_.is_empty() ? url_ : redirected_url_; |
1746 if (!net::GetMimeTypeFromFile(base::FilePath(url.path()), &mime)) | 1768 if (!net::GetMimeTypeFromFile(base::FilePath(url.path()), &mime)) |
1747 return false; | 1769 return false; |
1748 return !mime.compare("application/x-mpegurl"); | 1770 return !mime.compare("application/x-mpegurl"); |
1749 } | 1771 } |
1750 | 1772 |
1751 } // namespace content | 1773 } // namespace content |
OLD | NEW |