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 |