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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <limits> | 9 #include <limits> |
10 | 10 |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 WebMediaPlayerAndroid::WebMediaPlayerAndroid( | 170 WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
171 blink::WebFrame* frame, | 171 blink::WebFrame* frame, |
172 blink::WebMediaPlayerClient* client, | 172 blink::WebMediaPlayerClient* client, |
173 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, | 173 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, |
174 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, | 174 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, |
175 RendererMediaPlayerManager* player_manager, | 175 RendererMediaPlayerManager* player_manager, |
176 media::CdmFactory* cdm_factory, | 176 media::CdmFactory* cdm_factory, |
177 scoped_refptr<StreamTextureFactory> factory, | 177 scoped_refptr<StreamTextureFactory> factory, |
178 int frame_id, | 178 int frame_id, |
179 const media::WebMediaPlayerParams& params) | 179 const media::WebMediaPlayerParams& params) |
180 : RenderFrameObserver(RenderFrame::FromWebFrame(frame)), | 180 : frame_(frame), |
181 frame_(frame), | |
182 client_(client), | 181 client_(client), |
183 encrypted_client_(encrypted_client), | 182 encrypted_client_(encrypted_client), |
184 delegate_(delegate), | 183 delegate_(delegate), |
185 defer_load_cb_(params.defer_load_cb()), | 184 defer_load_cb_(params.defer_load_cb()), |
186 buffered_(static_cast<size_t>(1)), | 185 buffered_(static_cast<size_t>(1)), |
187 media_task_runner_(params.media_task_runner()), | 186 media_task_runner_(params.media_task_runner()), |
188 ignore_metadata_duration_change_(false), | 187 ignore_metadata_duration_change_(false), |
189 pending_seek_(false), | 188 pending_seek_(false), |
190 seeking_(false), | 189 seeking_(false), |
191 did_loading_progress_(false), | 190 did_loading_progress_(false), |
(...skipping 19 matching lines...) Expand all Loading... |
211 player_type_(MEDIA_PLAYER_TYPE_URL), | 210 player_type_(MEDIA_PLAYER_TYPE_URL), |
212 is_remote_(false), | 211 is_remote_(false), |
213 media_log_(params.media_log()), | 212 media_log_(params.media_log()), |
214 init_data_type_(media::EmeInitDataType::UNKNOWN), | 213 init_data_type_(media::EmeInitDataType::UNKNOWN), |
215 cdm_context_(nullptr), | 214 cdm_context_(nullptr), |
216 allow_stored_credentials_(false), | 215 allow_stored_credentials_(false), |
217 is_local_resource_(false), | 216 is_local_resource_(false), |
218 interpolator_(&default_tick_clock_), | 217 interpolator_(&default_tick_clock_), |
219 frame_id_(frame_id), | 218 frame_id_(frame_id), |
220 suppress_deleting_texture_(false), | 219 suppress_deleting_texture_(false), |
| 220 playback_completed_(false), |
221 weak_factory_(this) { | 221 weak_factory_(this) { |
222 DCHECK(player_manager_); | 222 DCHECK(player_manager_); |
223 DCHECK(cdm_factory_); | 223 DCHECK(cdm_factory_); |
224 | 224 |
225 DCHECK(main_thread_checker_.CalledOnValidThread()); | 225 DCHECK(main_thread_checker_.CalledOnValidThread()); |
226 stream_texture_factory_->AddObserver(this); | 226 stream_texture_factory_->AddObserver(this); |
227 | 227 |
| 228 if (delegate) |
| 229 delegate->AddObserver(this); |
| 230 |
228 player_id_ = player_manager_->RegisterMediaPlayer(this); | 231 player_id_ = player_manager_->RegisterMediaPlayer(this); |
229 | 232 |
230 #if defined(VIDEO_HOLE) | 233 #if defined(VIDEO_HOLE) |
231 const RendererPreferences& prefs = | 234 const RendererPreferences& prefs = |
232 static_cast<RenderFrameImpl*>(render_frame()) | 235 static_cast<RenderFrameImpl*>(RenderFrame::FromRoutingID(frame_id)) |
233 ->render_view() | 236 ->render_view() |
234 ->renderer_preferences(); | 237 ->renderer_preferences(); |
235 force_use_overlay_embedded_video_ = prefs.use_view_overlay_for_all_video; | 238 force_use_overlay_embedded_video_ = prefs.use_view_overlay_for_all_video; |
236 if (force_use_overlay_embedded_video_ || | 239 if (force_use_overlay_embedded_video_ || |
237 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { | 240 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { |
238 // Defer stream texture creation until we are sure it's necessary. | 241 // Defer stream texture creation until we are sure it's necessary. |
239 needs_establish_peer_ = false; | 242 needs_establish_peer_ = false; |
240 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); | 243 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); |
241 } | 244 } |
242 #endif // defined(VIDEO_HOLE) | 245 #endif // defined(VIDEO_HOLE) |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 } | 439 } |
437 | 440 |
438 void WebMediaPlayerAndroid::requestRemotePlaybackControl() { | 441 void WebMediaPlayerAndroid::requestRemotePlaybackControl() { |
439 player_manager_->RequestRemotePlaybackControl(player_id_); | 442 player_manager_->RequestRemotePlaybackControl(player_id_); |
440 } | 443 } |
441 | 444 |
442 void WebMediaPlayerAndroid::seek(double seconds) { | 445 void WebMediaPlayerAndroid::seek(double seconds) { |
443 DCHECK(main_thread_checker_.CalledOnValidThread()); | 446 DCHECK(main_thread_checker_.CalledOnValidThread()); |
444 DVLOG(1) << __FUNCTION__ << "(" << seconds << ")"; | 447 DVLOG(1) << __FUNCTION__ << "(" << seconds << ")"; |
445 | 448 |
| 449 playback_completed_ = false; |
446 base::TimeDelta new_seek_time = base::TimeDelta::FromSecondsD(seconds); | 450 base::TimeDelta new_seek_time = base::TimeDelta::FromSecondsD(seconds); |
447 | 451 |
448 if (seeking_) { | 452 if (seeking_) { |
449 if (new_seek_time == seek_time_) { | 453 if (new_seek_time == seek_time_) { |
450 if (media_source_delegate_) { | 454 if (media_source_delegate_) { |
451 // Don't suppress any redundant in-progress MSE seek. There could have | 455 // Don't suppress any redundant in-progress MSE seek. There could have |
452 // been changes to the underlying buffers after seeking the demuxer and | 456 // been changes to the underlying buffers after seeking the demuxer and |
453 // before receiving OnSeekComplete() for the currently in-progress seek. | 457 // before receiving OnSeekComplete() for the currently in-progress seek. |
454 MEDIA_LOG(DEBUG, media_log_) | 458 MEDIA_LOG(DEBUG, media_log_) |
455 << "Detected MediaSource seek to same time as in-progress seek to " | 459 << "Detected MediaSource seek to same time as in-progress seek to " |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
836 // know that the playback has finished. To solve this, we set the | 840 // know that the playback has finished. To solve this, we set the |
837 // current time to media duration when OnPlaybackComplete() get called. | 841 // current time to media duration when OnPlaybackComplete() get called. |
838 interpolator_.SetBounds(duration_, duration_); | 842 interpolator_.SetBounds(duration_, duration_); |
839 client_->timeChanged(); | 843 client_->timeChanged(); |
840 | 844 |
841 // If the loop attribute is set, timeChanged() will update the current time | 845 // If the loop attribute is set, timeChanged() will update the current time |
842 // to 0. It will perform a seek to 0. Issue a command to the player to start | 846 // to 0. It will perform a seek to 0. Issue a command to the player to start |
843 // playing after seek completes. | 847 // playing after seek completes. |
844 if (seeking_ && seek_time_ == base::TimeDelta()) | 848 if (seeking_ && seek_time_ == base::TimeDelta()) |
845 player_manager_->Start(player_id_); | 849 player_manager_->Start(player_id_); |
| 850 else |
| 851 playback_completed_ = true; |
846 } | 852 } |
847 | 853 |
848 void WebMediaPlayerAndroid::OnBufferingUpdate(int percentage) { | 854 void WebMediaPlayerAndroid::OnBufferingUpdate(int percentage) { |
849 buffered_[0].end = duration() * percentage / 100; | 855 buffered_[0].end = duration() * percentage / 100; |
850 did_loading_progress_ = true; | 856 did_loading_progress_ = true; |
851 | 857 |
852 if (percentage == 100 && network_state_ < WebMediaPlayer::NetworkStateLoaded) | 858 if (percentage == 100 && network_state_ < WebMediaPlayer::NetworkStateLoaded) |
853 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded); | 859 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded); |
854 } | 860 } |
855 | 861 |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 case WebMediaPlayer::NetworkStateFormatError: | 1107 case WebMediaPlayer::NetworkStateFormatError: |
1102 case WebMediaPlayer::NetworkStateNetworkError: | 1108 case WebMediaPlayer::NetworkStateNetworkError: |
1103 case WebMediaPlayer::NetworkStateDecodeError: | 1109 case WebMediaPlayer::NetworkStateDecodeError: |
1104 break; | 1110 break; |
1105 } | 1111 } |
1106 player_manager_->SuspendAndReleaseResources(player_id_); | 1112 player_manager_->SuspendAndReleaseResources(player_id_); |
1107 if (!needs_external_surface_) | 1113 if (!needs_external_surface_) |
1108 SetNeedsEstablishPeer(true); | 1114 SetNeedsEstablishPeer(true); |
1109 } | 1115 } |
1110 | 1116 |
1111 void WebMediaPlayerAndroid::OnDestruct() { | |
1112 NOTREACHED() << "WebMediaPlayer should be destroyed before any " | |
1113 "RenderFrameObserver::OnDestruct() gets called when " | |
1114 "the RenderFrame goes away."; | |
1115 } | |
1116 | |
1117 void WebMediaPlayerAndroid::InitializePlayer( | 1117 void WebMediaPlayerAndroid::InitializePlayer( |
1118 const GURL& url, | 1118 const GURL& url, |
1119 const GURL& first_party_for_cookies, | 1119 const GURL& first_party_for_cookies, |
1120 bool allow_stored_credentials, | 1120 bool allow_stored_credentials, |
1121 int demuxer_client_id) { | 1121 int demuxer_client_id) { |
1122 ReportHLSMetrics(); | 1122 ReportHLSMetrics(); |
1123 | 1123 |
1124 allow_stored_credentials_ = allow_stored_credentials; | 1124 allow_stored_credentials_ = allow_stored_credentials; |
1125 player_manager_->Initialize( | 1125 player_manager_->Initialize( |
1126 player_type_, player_id_, url, first_party_for_cookies, demuxer_client_id, | 1126 player_type_, player_id_, url, first_party_for_cookies, demuxer_client_id, |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1444 | 1444 |
1445 is_playing_ = is_playing; | 1445 is_playing_ = is_playing; |
1446 | 1446 |
1447 if (is_playing) | 1447 if (is_playing) |
1448 interpolator_.StartInterpolating(); | 1448 interpolator_.StartInterpolating(); |
1449 else | 1449 else |
1450 interpolator_.StopInterpolating(); | 1450 interpolator_.StopInterpolating(); |
1451 | 1451 |
1452 if (delegate_) { | 1452 if (delegate_) { |
1453 if (is_playing) | 1453 if (is_playing) |
1454 delegate_->DidPlay(this); | 1454 delegate_->DidPlay(this, hasVideo(), hasAudio(), isRemote(), duration_); |
1455 else | 1455 else |
1456 delegate_->DidPause(this); | 1456 delegate_->DidPause(this, playback_completed_); |
1457 } | 1457 } |
1458 } | 1458 } |
1459 | 1459 |
1460 #if defined(VIDEO_HOLE) | 1460 #if defined(VIDEO_HOLE) |
1461 bool WebMediaPlayerAndroid::UpdateBoundaryRectangle() { | 1461 bool WebMediaPlayerAndroid::UpdateBoundaryRectangle() { |
1462 if (!video_weblayer_) | 1462 if (!video_weblayer_) |
1463 return false; | 1463 return false; |
1464 | 1464 |
1465 // Compute the geometry of video frame layer. | 1465 // Compute the geometry of video frame layer. |
1466 cc::Layer* layer = video_weblayer_->layer(); | 1466 cc::Layer* layer = video_weblayer_->layer(); |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1828 | 1828 |
1829 void WebMediaPlayerAndroid::OnWaitingForDecryptionKey() { | 1829 void WebMediaPlayerAndroid::OnWaitingForDecryptionKey() { |
1830 encrypted_client_->didBlockPlaybackWaitingForKey(); | 1830 encrypted_client_->didBlockPlaybackWaitingForKey(); |
1831 | 1831 |
1832 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called | 1832 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called |
1833 // when a key has been successfully added (e.g. OnSessionKeysChange() with | 1833 // when a key has been successfully added (e.g. OnSessionKeysChange() with |
1834 // |has_additional_usable_key| = true). http://crbug.com/461903 | 1834 // |has_additional_usable_key| = true). http://crbug.com/461903 |
1835 encrypted_client_->didResumePlaybackBlockedForKey(); | 1835 encrypted_client_->didResumePlaybackBlockedForKey(); |
1836 } | 1836 } |
1837 | 1837 |
| 1838 void WebMediaPlayerAndroid::OnHidden() {} |
| 1839 |
| 1840 void WebMediaPlayerAndroid::OnShown() {} |
| 1841 |
| 1842 void WebMediaPlayerAndroid::OnPlay() { |
| 1843 play(); |
| 1844 client_->playbackStateChanged(); |
| 1845 } |
| 1846 |
| 1847 void WebMediaPlayerAndroid::OnPause() { |
| 1848 pause(); |
| 1849 client_->playbackStateChanged(); |
| 1850 } |
| 1851 |
1838 void WebMediaPlayerAndroid::OnCdmContextReady(media::CdmContext* cdm_context) { | 1852 void WebMediaPlayerAndroid::OnCdmContextReady(media::CdmContext* cdm_context) { |
1839 DCHECK(!cdm_context_); | 1853 DCHECK(!cdm_context_); |
1840 | 1854 |
1841 if (!cdm_context) { | 1855 if (!cdm_context) { |
1842 LOG(ERROR) << "CdmContext not available (e.g. CDM creation failed)."; | 1856 LOG(ERROR) << "CdmContext not available (e.g. CDM creation failed)."; |
1843 return; | 1857 return; |
1844 } | 1858 } |
1845 | 1859 |
1846 cdm_context_ = cdm_context; | 1860 cdm_context_ = cdm_context; |
1847 | 1861 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1954 result = PREDICTION_RESULT_PATH_BASED_WAS_BETTER; | 1968 result = PREDICTION_RESULT_PATH_BASED_WAS_BETTER; |
1955 } else if (is_hls_url == is_hls) { | 1969 } else if (is_hls_url == is_hls) { |
1956 result = PREDICTION_RESULT_URL_BASED_WAS_BETTER; | 1970 result = PREDICTION_RESULT_URL_BASED_WAS_BETTER; |
1957 } | 1971 } |
1958 UMA_HISTOGRAM_ENUMERATION( | 1972 UMA_HISTOGRAM_ENUMERATION( |
1959 "Media.Android.IsHttpLiveStreamingMediaPredictionResult", | 1973 "Media.Android.IsHttpLiveStreamingMediaPredictionResult", |
1960 result, PREDICTION_RESULT_MAX); | 1974 result, PREDICTION_RESULT_MAX); |
1961 } | 1975 } |
1962 | 1976 |
1963 } // namespace content | 1977 } // namespace content |
OLD | NEW |