| 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/bind.h" | 9 #include "base/bind.h" | 
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 101       pending_seek_(false), | 101       pending_seek_(false), | 
| 102       seeking_(false), | 102       seeking_(false), | 
| 103       did_loading_progress_(false), | 103       did_loading_progress_(false), | 
| 104       player_manager_(player_manager), | 104       player_manager_(player_manager), | 
| 105       cdm_manager_(cdm_manager), | 105       cdm_manager_(cdm_manager), | 
| 106       network_state_(WebMediaPlayer::NetworkStateEmpty), | 106       network_state_(WebMediaPlayer::NetworkStateEmpty), | 
| 107       ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 107       ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 
| 108       texture_id_(0), | 108       texture_id_(0), | 
| 109       stream_id_(0), | 109       stream_id_(0), | 
| 110       is_playing_(false), | 110       is_playing_(false), | 
| 111       playing_started_(false), |  | 
| 112       needs_establish_peer_(true), | 111       needs_establish_peer_(true), | 
| 113       stream_texture_proxy_initialized_(false), | 112       stream_texture_proxy_initialized_(false), | 
| 114       has_size_info_(false), | 113       has_size_info_(false), | 
| 115       has_media_metadata_(false), |  | 
| 116       has_media_info_(false), |  | 
| 117       stream_texture_factory_(factory), | 114       stream_texture_factory_(factory), | 
| 118       needs_external_surface_(false), | 115       needs_external_surface_(false), | 
| 119       video_frame_provider_client_(NULL), | 116       video_frame_provider_client_(NULL), | 
| 120       pending_playback_(false), | 117       pending_playback_(false), | 
| 121       player_type_(MEDIA_PLAYER_TYPE_URL), | 118       player_type_(MEDIA_PLAYER_TYPE_URL), | 
| 122       current_time_(0), | 119       current_time_(0), | 
| 123       is_remote_(false), | 120       is_remote_(false), | 
| 124       media_log_(media_log), | 121       media_log_(media_log), | 
| 125       web_cdm_(NULL), | 122       web_cdm_(NULL), | 
| 126       weak_factory_(this) { | 123       weak_factory_(this) { | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 183     case LoadTypeMediaSource: | 180     case LoadTypeMediaSource: | 
| 184       player_type_ = MEDIA_PLAYER_TYPE_MEDIA_SOURCE; | 181       player_type_ = MEDIA_PLAYER_TYPE_MEDIA_SOURCE; | 
| 185       break; | 182       break; | 
| 186 | 183 | 
| 187     case LoadTypeMediaStream: | 184     case LoadTypeMediaStream: | 
| 188       CHECK(false) << "WebMediaPlayerAndroid doesn't support MediaStream on " | 185       CHECK(false) << "WebMediaPlayerAndroid doesn't support MediaStream on " | 
| 189                       "this platform"; | 186                       "this platform"; | 
| 190       return; | 187       return; | 
| 191   } | 188   } | 
| 192 | 189 | 
| 193   has_media_metadata_ = false; | 190   url_ = url; | 
| 194   has_media_info_ = false; |  | 
| 195 |  | 
| 196   int demuxer_client_id = 0; | 191   int demuxer_client_id = 0; | 
| 197   if (player_type_ != MEDIA_PLAYER_TYPE_URL) { | 192   if (player_type_ != MEDIA_PLAYER_TYPE_URL) { | 
| 198     has_media_info_ = true; |  | 
| 199 |  | 
| 200     RendererDemuxerAndroid* demuxer = | 193     RendererDemuxerAndroid* demuxer = | 
| 201         RenderThreadImpl::current()->renderer_demuxer(); | 194         RenderThreadImpl::current()->renderer_demuxer(); | 
| 202     demuxer_client_id = demuxer->GetNextDemuxerClientID(); | 195     demuxer_client_id = demuxer->GetNextDemuxerClientID(); | 
| 203 | 196 | 
| 204     media_source_delegate_.reset(new MediaSourceDelegate( | 197     media_source_delegate_.reset(new MediaSourceDelegate( | 
| 205         demuxer, demuxer_client_id, media_loop_, media_log_)); | 198         demuxer, demuxer_client_id, media_loop_, media_log_)); | 
| 206 | 199 | 
| 207     if (player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { | 200     if (player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { | 
| 208       media::SetDecryptorReadyCB set_decryptor_ready_cb = | 201       media::SetDecryptorReadyCB set_decryptor_ready_cb = | 
| 209           media::BindToCurrentLoop( | 202           media::BindToCurrentLoop( | 
| 210               base::Bind(&WebMediaPlayerAndroid::SetDecryptorReadyCB, | 203               base::Bind(&WebMediaPlayerAndroid::SetDecryptorReadyCB, | 
| 211                          weak_factory_.GetWeakPtr())); | 204                          weak_factory_.GetWeakPtr())); | 
| 212 | 205 | 
| 213       media_source_delegate_->InitializeMediaSource( | 206       media_source_delegate_->InitializeMediaSource( | 
| 214           base::Bind(&WebMediaPlayerAndroid::OnMediaSourceOpened, | 207           base::Bind(&WebMediaPlayerAndroid::OnMediaSourceOpened, | 
| 215                      weak_factory_.GetWeakPtr()), | 208                      weak_factory_.GetWeakPtr()), | 
| 216           base::Bind(&WebMediaPlayerAndroid::OnNeedKey, | 209           base::Bind(&WebMediaPlayerAndroid::OnNeedKey, | 
| 217                      weak_factory_.GetWeakPtr()), | 210                      weak_factory_.GetWeakPtr()), | 
| 218           set_decryptor_ready_cb, | 211           set_decryptor_ready_cb, | 
| 219           base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, | 212           base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, | 
| 220                      weak_factory_.GetWeakPtr()), | 213                      weak_factory_.GetWeakPtr()), | 
| 221           base::Bind(&WebMediaPlayerAndroid::OnDurationChanged, | 214           base::Bind(&WebMediaPlayerAndroid::OnDurationChanged, | 
| 222                      weak_factory_.GetWeakPtr())); | 215                      weak_factory_.GetWeakPtr())); | 
|  | 216       InitializePlayer(demuxer_client_id); | 
| 223     } | 217     } | 
| 224   } else { | 218   } else { | 
| 225     info_loader_.reset( | 219     info_loader_.reset( | 
| 226         new MediaInfoLoader( | 220         new MediaInfoLoader( | 
| 227             url, | 221             url, | 
| 228             cors_mode, | 222             cors_mode, | 
| 229             base::Bind(&WebMediaPlayerAndroid::DidLoadMediaInfo, | 223             base::Bind(&WebMediaPlayerAndroid::DidLoadMediaInfo, | 
| 230                        weak_factory_.GetWeakPtr()))); | 224                        weak_factory_.GetWeakPtr()))); | 
| 231     // TODO(qinmin): The url might be redirected when android media player | 225     // TODO(qinmin): The url might be redirected when android media player | 
| 232     // requests the stream. As a result, we cannot guarantee there is only | 226     // requests the stream. As a result, we cannot guarantee there is only | 
| 233     // a single origin. Remove the following line when b/12573548 is fixed. | 227     // a single origin. Remove the following line when b/12573548 is fixed. | 
| 234     // Check http://crbug.com/334204. | 228     // Check http://crbug.com/334204. | 
| 235     info_loader_->set_single_origin(false); | 229     info_loader_->set_single_origin(false); | 
| 236     info_loader_->Start(frame_); | 230     info_loader_->Start(frame_); | 
| 237   } | 231   } | 
| 238 | 232 | 
| 239   url_ = url; |  | 
| 240   GURL first_party_url = frame_->document().firstPartyForCookies(); |  | 
| 241   player_manager_->Initialize( |  | 
| 242       player_type_, player_id_, url, first_party_url, demuxer_client_id, |  | 
| 243       frame_->document().url()); |  | 
| 244 |  | 
| 245   if (player_manager_->ShouldEnterFullscreen(frame_)) | 233   if (player_manager_->ShouldEnterFullscreen(frame_)) | 
| 246     player_manager_->EnterFullscreen(player_id_, frame_); | 234     player_manager_->EnterFullscreen(player_id_, frame_); | 
| 247 | 235 | 
| 248   UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); | 236   UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); | 
| 249   UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); | 237   UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); | 
| 250 } | 238 } | 
| 251 | 239 | 
| 252 void WebMediaPlayerAndroid::DidLoadMediaInfo(MediaInfoLoader::Status status) { | 240 void WebMediaPlayerAndroid::DidLoadMediaInfo(MediaInfoLoader::Status status) { | 
| 253   DCHECK(!media_source_delegate_); | 241   DCHECK(!media_source_delegate_); | 
| 254   if (status == MediaInfoLoader::kFailed) { | 242   if (status == MediaInfoLoader::kFailed) { | 
| 255     info_loader_.reset(); | 243     info_loader_.reset(); | 
| 256     UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError); | 244     UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError); | 
| 257     return; | 245     return; | 
| 258   } | 246   } | 
| 259 | 247 | 
| 260   has_media_info_ = true; | 248   InitializePlayer(0); | 
| 261   if (has_media_metadata_ && | 249 | 
| 262       ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { | 250   UpdateNetworkState(WebMediaPlayer::NetworkStateIdle); | 
| 263     UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |  | 
| 264     UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |  | 
| 265   } |  | 
| 266   // Android doesn't start fetching resources until an implementation-defined |  | 
| 267   // event (e.g. playback request) occurs. Sets the network state to IDLE |  | 
| 268   // if play is not requested yet. |  | 
| 269   if (!playing_started_) |  | 
| 270     UpdateNetworkState(WebMediaPlayer::NetworkStateIdle); |  | 
| 271 } | 251 } | 
| 272 | 252 | 
| 273 void WebMediaPlayerAndroid::play() { | 253 void WebMediaPlayerAndroid::play() { | 
| 274 #if defined(VIDEO_HOLE) | 254 #if defined(VIDEO_HOLE) | 
| 275   if (hasVideo() && needs_external_surface_ && | 255   if (hasVideo() && needs_external_surface_ && | 
| 276       !player_manager_->IsInFullscreen(frame_)) { | 256       !player_manager_->IsInFullscreen(frame_)) { | 
| 277     DCHECK(!needs_establish_peer_); | 257     DCHECK(!needs_establish_peer_); | 
| 278     player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); | 258     player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); | 
| 279   } | 259   } | 
| 280 #endif  // defined(VIDEO_HOLE) | 260 #endif  // defined(VIDEO_HOLE) | 
| 281 | 261 | 
| 282   TryCreateStreamTextureProxyIfNeeded(); | 262   TryCreateStreamTextureProxyIfNeeded(); | 
| 283   // There is no need to establish the surface texture peer for fullscreen | 263   // There is no need to establish the surface texture peer for fullscreen | 
| 284   // video. | 264   // video. | 
| 285   if (hasVideo() && needs_establish_peer_ && | 265   if (hasVideo() && needs_establish_peer_ && | 
| 286       !player_manager_->IsInFullscreen(frame_)) { | 266       !player_manager_->IsInFullscreen(frame_)) { | 
| 287     EstablishSurfaceTexturePeer(); | 267     EstablishSurfaceTexturePeer(); | 
| 288   } | 268   } | 
| 289 | 269 | 
| 290   if (paused()) | 270   if (paused()) | 
| 291     player_manager_->Start(player_id_); | 271     player_manager_->Start(player_id_); | 
| 292   UpdatePlayingState(true); | 272   UpdatePlayingState(true); | 
| 293   UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); | 273   UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); | 
| 294   playing_started_ = true; |  | 
| 295 } | 274 } | 
| 296 | 275 | 
| 297 void WebMediaPlayerAndroid::pause() { | 276 void WebMediaPlayerAndroid::pause() { | 
| 298   Pause(true); | 277   Pause(true); | 
| 299 } | 278 } | 
| 300 | 279 | 
| 301 void WebMediaPlayerAndroid::seek(double seconds) { | 280 void WebMediaPlayerAndroid::seek(double seconds) { | 
| 302   DCHECK(main_thread_checker_.CalledOnValidThread()); | 281   DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| 303   DVLOG(1) << __FUNCTION__ << "(" << seconds << ")"; | 282   DVLOG(1) << __FUNCTION__ << "(" << seconds << ")"; | 
| 304 | 283 | 
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 606     // already triggers a durationchanged event. If this is a different | 585     // already triggers a durationchanged event. If this is a different | 
| 607     // transition, remember to signal durationchanged. | 586     // transition, remember to signal durationchanged. | 
| 608     // Do not ever signal durationchanged on metadata change in MSE case | 587     // Do not ever signal durationchanged on metadata change in MSE case | 
| 609     // because OnDurationChanged() handles this. | 588     // because OnDurationChanged() handles this. | 
| 610     if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing && | 589     if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing && | 
| 611         player_type_ != MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { | 590         player_type_ != MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { | 
| 612       need_to_signal_duration_changed = true; | 591       need_to_signal_duration_changed = true; | 
| 613     } | 592     } | 
| 614   } | 593   } | 
| 615 | 594 | 
| 616   has_media_metadata_ = true; | 595   if (ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { | 
| 617   if (has_media_info_ && |  | 
| 618       ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { |  | 
| 619     UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 596     UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 
| 620     UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 597     UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 
| 621   } | 598   } | 
| 622 | 599 | 
| 623   // TODO(wolenetz): Should we just abort early and set network state to an | 600   // TODO(wolenetz): Should we just abort early and set network state to an | 
| 624   // error if success == false? See http://crbug.com/248399 | 601   // error if success == false? See http://crbug.com/248399 | 
| 625   if (success) | 602   if (success) | 
| 626     OnVideoSizeChanged(width, height); | 603     OnVideoSizeChanged(width, height); | 
| 627 | 604 | 
| 628   if (need_to_signal_duration_changed) | 605   if (need_to_signal_duration_changed) | 
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 873   if (!needs_external_surface_) | 850   if (!needs_external_surface_) | 
| 874     SetNeedsEstablishPeer(true); | 851     SetNeedsEstablishPeer(true); | 
| 875 } | 852 } | 
| 876 | 853 | 
| 877 void WebMediaPlayerAndroid::OnDestruct() { | 854 void WebMediaPlayerAndroid::OnDestruct() { | 
| 878   NOTREACHED() << "WebMediaPlayer should be destroyed before any " | 855   NOTREACHED() << "WebMediaPlayer should be destroyed before any " | 
| 879                   "RenderFrameObserver::OnDestruct() gets called when " | 856                   "RenderFrameObserver::OnDestruct() gets called when " | 
| 880                   "the RenderFrame goes away."; | 857                   "the RenderFrame goes away."; | 
| 881 } | 858 } | 
| 882 | 859 | 
|  | 860 void WebMediaPlayerAndroid::InitializePlayer( | 
|  | 861     int demuxer_client_id) { | 
|  | 862   GURL first_party_url = frame_->document().firstPartyForCookies(); | 
|  | 863   player_manager_->Initialize( | 
|  | 864       player_type_, player_id_, url_, first_party_url, demuxer_client_id, | 
|  | 865       frame_->document().url()); | 
|  | 866 } | 
|  | 867 | 
| 883 void WebMediaPlayerAndroid::Pause(bool is_media_related_action) { | 868 void WebMediaPlayerAndroid::Pause(bool is_media_related_action) { | 
| 884   player_manager_->Pause(player_id_, is_media_related_action); | 869   player_manager_->Pause(player_id_, is_media_related_action); | 
| 885   UpdatePlayingState(false); | 870   UpdatePlayingState(false); | 
| 886 } | 871 } | 
| 887 | 872 | 
| 888 void WebMediaPlayerAndroid::DrawRemotePlaybackText( | 873 void WebMediaPlayerAndroid::DrawRemotePlaybackText( | 
| 889     const std::string& remote_playback_message) { | 874     const std::string& remote_playback_message) { | 
| 890 | 875 | 
| 891   DCHECK(main_thread_checker_.CalledOnValidThread()); | 876   DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| 892   if (!video_weblayer_) | 877   if (!video_weblayer_) | 
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1537     player_manager_->EnterFullscreen(player_id_, frame_); | 1522     player_manager_->EnterFullscreen(player_id_, frame_); | 
| 1538     SetNeedsEstablishPeer(false); | 1523     SetNeedsEstablishPeer(false); | 
| 1539   } | 1524   } | 
| 1540 } | 1525 } | 
| 1541 | 1526 | 
| 1542 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1527 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 
| 1543   return player_manager_->CanEnterFullscreen(frame_); | 1528   return player_manager_->CanEnterFullscreen(frame_); | 
| 1544 } | 1529 } | 
| 1545 | 1530 | 
| 1546 }  // namespace content | 1531 }  // namespace content | 
| OLD | NEW | 
|---|