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