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