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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 blink::WebFrame* frame, | 177 blink::WebFrame* frame, |
178 blink::WebMediaPlayerClient* client, | 178 blink::WebMediaPlayerClient* client, |
179 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, | 179 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, |
180 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, | 180 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, |
181 RendererMediaPlayerManager* player_manager, | 181 RendererMediaPlayerManager* player_manager, |
182 media::CdmFactory* cdm_factory, | 182 media::CdmFactory* cdm_factory, |
183 scoped_refptr<StreamTextureFactory> factory, | 183 scoped_refptr<StreamTextureFactory> factory, |
184 int frame_id, | 184 int frame_id, |
185 bool enable_texture_copy, | 185 bool enable_texture_copy, |
186 const media::WebMediaPlayerParams& params) | 186 const media::WebMediaPlayerParams& params) |
187 : RenderFrameObserver(RenderFrame::FromWebFrame(frame)), | 187 : frame_(frame), |
188 frame_(frame), | |
189 client_(client), | 188 client_(client), |
190 encrypted_client_(encrypted_client), | 189 encrypted_client_(encrypted_client), |
191 delegate_(delegate), | 190 delegate_(delegate), |
192 defer_load_cb_(params.defer_load_cb()), | 191 defer_load_cb_(params.defer_load_cb()), |
193 buffered_(static_cast<size_t>(1)), | 192 buffered_(static_cast<size_t>(1)), |
194 media_task_runner_(params.media_task_runner()), | 193 media_task_runner_(params.media_task_runner()), |
195 ignore_metadata_duration_change_(false), | 194 ignore_metadata_duration_change_(false), |
196 pending_seek_(false), | 195 pending_seek_(false), |
197 seeking_(false), | 196 seeking_(false), |
198 did_loading_progress_(false), | 197 did_loading_progress_(false), |
(...skipping 20 matching lines...) Expand all Loading... | |
219 is_remote_(false), | 218 is_remote_(false), |
220 media_log_(params.media_log()), | 219 media_log_(params.media_log()), |
221 init_data_type_(media::EmeInitDataType::UNKNOWN), | 220 init_data_type_(media::EmeInitDataType::UNKNOWN), |
222 cdm_context_(nullptr), | 221 cdm_context_(nullptr), |
223 allow_stored_credentials_(false), | 222 allow_stored_credentials_(false), |
224 is_local_resource_(false), | 223 is_local_resource_(false), |
225 interpolator_(&default_tick_clock_), | 224 interpolator_(&default_tick_clock_), |
226 frame_id_(frame_id), | 225 frame_id_(frame_id), |
227 enable_texture_copy_(enable_texture_copy), | 226 enable_texture_copy_(enable_texture_copy), |
228 suppress_deleting_texture_(false), | 227 suppress_deleting_texture_(false), |
228 playback_completed_(false), | |
229 volume_(1.0), | |
230 volume_multiplier_(1.0), | |
229 weak_factory_(this) { | 231 weak_factory_(this) { |
230 DCHECK(player_manager_); | 232 DCHECK(player_manager_); |
231 DCHECK(cdm_factory_); | 233 DCHECK(cdm_factory_); |
232 | 234 |
233 DCHECK(main_thread_checker_.CalledOnValidThread()); | 235 DCHECK(main_thread_checker_.CalledOnValidThread()); |
234 stream_texture_factory_->AddObserver(this); | 236 stream_texture_factory_->AddObserver(this); |
235 | 237 |
238 if (delegate) | |
239 delegate->AddObserver(this); | |
240 | |
236 player_id_ = player_manager_->RegisterMediaPlayer(this); | 241 player_id_ = player_manager_->RegisterMediaPlayer(this); |
237 | 242 |
238 #if defined(VIDEO_HOLE) | 243 #if defined(VIDEO_HOLE) |
239 const RendererPreferences& prefs = | 244 const RendererPreferences& prefs = |
240 static_cast<RenderFrameImpl*>(render_frame()) | 245 static_cast<RenderFrameImpl*>(RenderFrame::FromRoutingID(frame_id)) |
nasko
2016/01/22 17:28:32
Why not call RenderFrameImpl::FromRoutingID and av
DaleCurtis
2016/01/23 02:11:00
Done.
| |
241 ->render_view() | 246 ->render_view() |
242 ->renderer_preferences(); | 247 ->renderer_preferences(); |
243 force_use_overlay_embedded_video_ = prefs.use_view_overlay_for_all_video; | 248 force_use_overlay_embedded_video_ = prefs.use_view_overlay_for_all_video; |
244 if (force_use_overlay_embedded_video_ || | 249 if (force_use_overlay_embedded_video_ || |
245 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { | 250 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { |
246 // Defer stream texture creation until we are sure it's necessary. | 251 // Defer stream texture creation until we are sure it's necessary. |
247 needs_establish_peer_ = false; | 252 needs_establish_peer_ = false; |
248 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); | 253 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); |
249 } | 254 } |
250 #endif // defined(VIDEO_HOLE) | 255 #endif // defined(VIDEO_HOLE) |
(...skipping 24 matching lines...) Expand all Loading... | |
275 texture_id_ = 0; | 280 texture_id_ = 0; |
276 texture_mailbox_ = gpu::Mailbox(); | 281 texture_mailbox_ = gpu::Mailbox(); |
277 stream_id_ = 0; | 282 stream_id_ = 0; |
278 } | 283 } |
279 | 284 |
280 { | 285 { |
281 base::AutoLock auto_lock(current_frame_lock_); | 286 base::AutoLock auto_lock(current_frame_lock_); |
282 current_frame_ = NULL; | 287 current_frame_ = NULL; |
283 } | 288 } |
284 | 289 |
285 if (delegate_) | 290 if (delegate_) { |
286 delegate_->PlayerGone(this); | 291 delegate_->PlayerGone(this); |
292 delegate_->RemoveObserver(this); | |
293 } | |
287 | 294 |
288 stream_texture_factory_->RemoveObserver(this); | 295 stream_texture_factory_->RemoveObserver(this); |
289 | 296 |
290 if (media_source_delegate_) { | 297 if (media_source_delegate_) { |
291 // Part of |media_source_delegate_| needs to be stopped on the media thread. | 298 // Part of |media_source_delegate_| needs to be stopped on the media thread. |
292 // Wait until |media_source_delegate_| is fully stopped before tearing | 299 // Wait until |media_source_delegate_| is fully stopped before tearing |
293 // down other objects. | 300 // down other objects. |
294 base::WaitableEvent waiter(false, false); | 301 base::WaitableEvent waiter(false, false); |
295 media_source_delegate_->Stop( | 302 media_source_delegate_->Stop( |
296 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter))); | 303 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter))); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
445 } | 452 } |
446 | 453 |
447 void WebMediaPlayerAndroid::requestRemotePlaybackControl() { | 454 void WebMediaPlayerAndroid::requestRemotePlaybackControl() { |
448 player_manager_->RequestRemotePlaybackControl(player_id_); | 455 player_manager_->RequestRemotePlaybackControl(player_id_); |
449 } | 456 } |
450 | 457 |
451 void WebMediaPlayerAndroid::seek(double seconds) { | 458 void WebMediaPlayerAndroid::seek(double seconds) { |
452 DCHECK(main_thread_checker_.CalledOnValidThread()); | 459 DCHECK(main_thread_checker_.CalledOnValidThread()); |
453 DVLOG(1) << __FUNCTION__ << "(" << seconds << ")"; | 460 DVLOG(1) << __FUNCTION__ << "(" << seconds << ")"; |
454 | 461 |
462 playback_completed_ = false; | |
455 base::TimeDelta new_seek_time = base::TimeDelta::FromSecondsD(seconds); | 463 base::TimeDelta new_seek_time = base::TimeDelta::FromSecondsD(seconds); |
456 | 464 |
457 if (seeking_) { | 465 if (seeking_) { |
458 if (new_seek_time == seek_time_) { | 466 if (new_seek_time == seek_time_) { |
459 if (media_source_delegate_) { | 467 if (media_source_delegate_) { |
460 // Don't suppress any redundant in-progress MSE seek. There could have | 468 // Don't suppress any redundant in-progress MSE seek. There could have |
461 // been changes to the underlying buffers after seeking the demuxer and | 469 // been changes to the underlying buffers after seeking the demuxer and |
462 // before receiving OnSeekComplete() for the currently in-progress seek. | 470 // before receiving OnSeekComplete() for the currently in-progress seek. |
463 MEDIA_LOG(DEBUG, media_log_) | 471 MEDIA_LOG(DEBUG, media_log_) |
464 << "Detected MediaSource seek to same time as in-progress seek to " | 472 << "Detected MediaSource seek to same time as in-progress seek to " |
(...skipping 23 matching lines...) Expand all Loading... | |
488 media_source_delegate_->StartWaitingForSeek(seek_time_); | 496 media_source_delegate_->StartWaitingForSeek(seek_time_); |
489 | 497 |
490 // Kick off the asynchronous seek! | 498 // Kick off the asynchronous seek! |
491 player_manager_->Seek(player_id_, seek_time_); | 499 player_manager_->Seek(player_id_, seek_time_); |
492 } | 500 } |
493 | 501 |
494 bool WebMediaPlayerAndroid::supportsSave() const { | 502 bool WebMediaPlayerAndroid::supportsSave() const { |
495 return false; | 503 return false; |
496 } | 504 } |
497 | 505 |
498 void WebMediaPlayerAndroid::setRate(double rate) { | 506 void WebMediaPlayerAndroid::setRate(double rate) {} |
499 NOTIMPLEMENTED(); | |
500 } | |
501 | 507 |
502 void WebMediaPlayerAndroid::setVolume(double volume) { | 508 void WebMediaPlayerAndroid::setVolume(double volume) { |
503 DCHECK(main_thread_checker_.CalledOnValidThread()); | 509 DCHECK(main_thread_checker_.CalledOnValidThread()); |
504 player_manager_->SetVolume(player_id_, volume); | 510 volume_ = volume; |
511 player_manager_->SetVolume(player_id_, volume_ * volume_multiplier_); | |
505 } | 512 } |
506 | 513 |
507 void WebMediaPlayerAndroid::setSinkId( | 514 void WebMediaPlayerAndroid::setSinkId( |
508 const blink::WebString& sink_id, | 515 const blink::WebString& sink_id, |
509 const blink::WebSecurityOrigin& security_origin, | 516 const blink::WebSecurityOrigin& security_origin, |
510 blink::WebSetSinkIdCallbacks* web_callback) { | 517 blink::WebSetSinkIdCallbacks* web_callback) { |
511 DCHECK(main_thread_checker_.CalledOnValidThread()); | 518 DCHECK(main_thread_checker_.CalledOnValidThread()); |
512 scoped_ptr<blink::WebSetSinkIdCallbacks> callback(web_callback); | 519 scoped_ptr<blink::WebSetSinkIdCallbacks> callback(web_callback); |
513 callback->onError(blink::WebSetSinkIdError::NotSupported); | 520 callback->onError(blink::WebSetSinkIdError::NotSupported); |
514 } | 521 } |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
845 // know that the playback has finished. To solve this, we set the | 852 // know that the playback has finished. To solve this, we set the |
846 // current time to media duration when OnPlaybackComplete() get called. | 853 // current time to media duration when OnPlaybackComplete() get called. |
847 interpolator_.SetBounds(duration_, duration_); | 854 interpolator_.SetBounds(duration_, duration_); |
848 client_->timeChanged(); | 855 client_->timeChanged(); |
849 | 856 |
850 // If the loop attribute is set, timeChanged() will update the current time | 857 // If the loop attribute is set, timeChanged() will update the current time |
851 // to 0. It will perform a seek to 0. Issue a command to the player to start | 858 // to 0. It will perform a seek to 0. Issue a command to the player to start |
852 // playing after seek completes. | 859 // playing after seek completes. |
853 if (seeking_ && seek_time_ == base::TimeDelta()) | 860 if (seeking_ && seek_time_ == base::TimeDelta()) |
854 player_manager_->Start(player_id_); | 861 player_manager_->Start(player_id_); |
862 else | |
863 playback_completed_ = true; | |
855 } | 864 } |
856 | 865 |
857 void WebMediaPlayerAndroid::OnBufferingUpdate(int percentage) { | 866 void WebMediaPlayerAndroid::OnBufferingUpdate(int percentage) { |
858 buffered_[0].end = duration() * percentage / 100; | 867 buffered_[0].end = duration() * percentage / 100; |
859 did_loading_progress_ = true; | 868 did_loading_progress_ = true; |
860 | 869 |
861 if (percentage == 100 && network_state_ < WebMediaPlayer::NetworkStateLoaded) | 870 if (percentage == 100 && network_state_ < WebMediaPlayer::NetworkStateLoaded) |
862 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded); | 871 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded); |
863 } | 872 } |
864 | 873 |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1081 } | 1090 } |
1082 | 1091 |
1083 void WebMediaPlayerAndroid::OnPlayerReleased() { | 1092 void WebMediaPlayerAndroid::OnPlayerReleased() { |
1084 // |needs_external_surface_| is always false on non-TV devices. | 1093 // |needs_external_surface_| is always false on non-TV devices. |
1085 if (!needs_external_surface_) | 1094 if (!needs_external_surface_) |
1086 needs_establish_peer_ = true; | 1095 needs_establish_peer_ = true; |
1087 | 1096 |
1088 if (is_playing_) | 1097 if (is_playing_) |
1089 OnMediaPlayerPause(); | 1098 OnMediaPlayerPause(); |
1090 | 1099 |
1100 if (delegate_) | |
1101 delegate_->PlayerGone(this); | |
1102 | |
1091 #if defined(VIDEO_HOLE) | 1103 #if defined(VIDEO_HOLE) |
1092 last_computed_rect_ = gfx::RectF(); | 1104 last_computed_rect_ = gfx::RectF(); |
1093 #endif // defined(VIDEO_HOLE) | 1105 #endif // defined(VIDEO_HOLE) |
1094 } | 1106 } |
1095 | 1107 |
1096 void WebMediaPlayerAndroid::SuspendAndReleaseResources() { | 1108 void WebMediaPlayerAndroid::SuspendAndReleaseResources() { |
1097 switch (network_state_) { | 1109 switch (network_state_) { |
1098 // Pause the media player and inform WebKit if the player is in a good | 1110 // Pause the media player and inform WebKit if the player is in a good |
1099 // shape. | 1111 // shape. |
1100 case WebMediaPlayer::NetworkStateIdle: | 1112 case WebMediaPlayer::NetworkStateIdle: |
1101 case WebMediaPlayer::NetworkStateLoading: | 1113 case WebMediaPlayer::NetworkStateLoading: |
1102 case WebMediaPlayer::NetworkStateLoaded: | 1114 case WebMediaPlayer::NetworkStateLoaded: |
1115 OnPlayerReleased(); | |
1103 Pause(false); | 1116 Pause(false); |
1104 client_->playbackStateChanged(); | |
1105 break; | 1117 break; |
1106 // If a WebMediaPlayer instance has entered into one of these states, | 1118 // If a WebMediaPlayer instance has entered into one of these states, |
1107 // the internal network state in HTMLMediaElement could be set to empty. | 1119 // the internal network state in HTMLMediaElement could be set to empty. |
1108 // And calling playbackStateChanged() could get this object deleted. | 1120 // And calling playbackStateChanged() could get this object deleted. |
1109 case WebMediaPlayer::NetworkStateEmpty: | 1121 case WebMediaPlayer::NetworkStateEmpty: |
1110 case WebMediaPlayer::NetworkStateFormatError: | 1122 case WebMediaPlayer::NetworkStateFormatError: |
1111 case WebMediaPlayer::NetworkStateNetworkError: | 1123 case WebMediaPlayer::NetworkStateNetworkError: |
1112 case WebMediaPlayer::NetworkStateDecodeError: | 1124 case WebMediaPlayer::NetworkStateDecodeError: |
1113 break; | 1125 break; |
1114 } | 1126 } |
1115 player_manager_->SuspendAndReleaseResources(player_id_); | 1127 player_manager_->SuspendAndReleaseResources(player_id_); |
1116 if (!needs_external_surface_) | 1128 if (!needs_external_surface_) |
1117 SetNeedsEstablishPeer(true); | 1129 SetNeedsEstablishPeer(true); |
1118 } | 1130 } |
1119 | 1131 |
1120 void WebMediaPlayerAndroid::OnDestruct() { | |
1121 NOTREACHED() << "WebMediaPlayer should be destroyed before any " | |
1122 "RenderFrameObserver::OnDestruct() gets called when " | |
1123 "the RenderFrame goes away."; | |
1124 } | |
1125 | |
1126 void WebMediaPlayerAndroid::InitializePlayer( | 1132 void WebMediaPlayerAndroid::InitializePlayer( |
1127 const GURL& url, | 1133 const GURL& url, |
1128 const GURL& first_party_for_cookies, | 1134 const GURL& first_party_for_cookies, |
1129 bool allow_stored_credentials, | 1135 bool allow_stored_credentials, |
1130 int demuxer_client_id) { | 1136 int demuxer_client_id) { |
1131 ReportHLSMetrics(); | 1137 ReportHLSMetrics(); |
1132 | 1138 |
1133 allow_stored_credentials_ = allow_stored_credentials; | 1139 allow_stored_credentials_ = allow_stored_credentials; |
1134 player_manager_->Initialize( | 1140 player_manager_->Initialize( |
1135 player_type_, player_id_, url, first_party_for_cookies, demuxer_client_id, | 1141 player_type_, player_id_, url, first_party_for_cookies, demuxer_client_id, |
1136 frame_->document().url(), allow_stored_credentials); | 1142 frame_->document().url(), allow_stored_credentials, this); |
1137 is_player_initialized_ = true; | 1143 is_player_initialized_ = true; |
1138 | 1144 |
1139 if (is_fullscreen_) | 1145 if (is_fullscreen_) |
1140 player_manager_->EnterFullscreen(player_id_); | 1146 player_manager_->EnterFullscreen(player_id_); |
1141 | 1147 |
1142 if (cdm_context_) | 1148 if (cdm_context_) |
1143 SetCdmInternal(base::Bind(&media::IgnoreCdmAttached)); | 1149 SetCdmInternal(base::Bind(&media::IgnoreCdmAttached)); |
1144 } | 1150 } |
1145 | 1151 |
1146 void WebMediaPlayerAndroid::Pause(bool is_media_related_action) { | 1152 void WebMediaPlayerAndroid::Pause(bool is_media_related_action) { |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1366 return; | 1372 return; |
1367 | 1373 |
1368 is_playing_ = is_playing; | 1374 is_playing_ = is_playing; |
1369 | 1375 |
1370 if (is_playing) | 1376 if (is_playing) |
1371 interpolator_.StartInterpolating(); | 1377 interpolator_.StartInterpolating(); |
1372 else | 1378 else |
1373 interpolator_.StopInterpolating(); | 1379 interpolator_.StopInterpolating(); |
1374 | 1380 |
1375 if (delegate_) { | 1381 if (delegate_) { |
1376 if (is_playing) | 1382 if (is_playing) { |
1377 delegate_->DidPlay(this); | 1383 // We must specify either video or audio to the delegate, but neither may |
1378 else | 1384 // be known at this point -- there are no video only containers, so only |
1379 delegate_->DidPause(this); | 1385 // send audio if we know for sure its audio. The browser side player will |
1386 // fill in the correct value later for media sessions. | |
1387 delegate_->DidPlay(this, hasVideo(), !hasVideo(), isRemote(), duration_); | |
1388 } else { | |
1389 // Even if OnPlaybackComplete() has not been called yet, Blink may have | |
1390 // already fired the ended event based on current time relative to | |
1391 // duration -- so we need to check both possibilities here. | |
1392 delegate_->DidPause(this, | |
1393 playback_completed_ || currentTime() >= duration()); | |
1394 } | |
1380 } | 1395 } |
1381 } | 1396 } |
1382 | 1397 |
1383 #if defined(VIDEO_HOLE) | 1398 #if defined(VIDEO_HOLE) |
1384 bool WebMediaPlayerAndroid::UpdateBoundaryRectangle() { | 1399 bool WebMediaPlayerAndroid::UpdateBoundaryRectangle() { |
1385 if (!video_weblayer_) | 1400 if (!video_weblayer_) |
1386 return false; | 1401 return false; |
1387 | 1402 |
1388 // Compute the geometry of video frame layer. | 1403 // Compute the geometry of video frame layer. |
1389 cc::Layer* layer = video_weblayer_->layer(); | 1404 cc::Layer* layer = video_weblayer_->layer(); |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1752 | 1767 |
1753 void WebMediaPlayerAndroid::OnWaitingForDecryptionKey() { | 1768 void WebMediaPlayerAndroid::OnWaitingForDecryptionKey() { |
1754 encrypted_client_->didBlockPlaybackWaitingForKey(); | 1769 encrypted_client_->didBlockPlaybackWaitingForKey(); |
1755 | 1770 |
1756 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called | 1771 // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called |
1757 // when a key has been successfully added (e.g. OnSessionKeysChange() with | 1772 // when a key has been successfully added (e.g. OnSessionKeysChange() with |
1758 // |has_additional_usable_key| = true). http://crbug.com/461903 | 1773 // |has_additional_usable_key| = true). http://crbug.com/461903 |
1759 encrypted_client_->didResumePlaybackBlockedForKey(); | 1774 encrypted_client_->didResumePlaybackBlockedForKey(); |
1760 } | 1775 } |
1761 | 1776 |
1777 void WebMediaPlayerAndroid::OnHidden() {} | |
1778 | |
1779 void WebMediaPlayerAndroid::OnShown() {} | |
1780 | |
1781 void WebMediaPlayerAndroid::OnPlay() { | |
1782 play(); | |
1783 client_->playbackStateChanged(); | |
1784 } | |
1785 | |
1786 void WebMediaPlayerAndroid::OnPause() { | |
1787 pause(); | |
1788 client_->playbackStateChanged(); | |
1789 } | |
1790 | |
1791 void WebMediaPlayerAndroid::OnVolumeMultiplierUpdate(double multiplier) { | |
1792 volume_multiplier_ = multiplier; | |
1793 setVolume(volume_); | |
mlamouri (slow - plz ping)
2016/01/22 16:58:31
I would consider having an UpdateVolume() method.
DaleCurtis
2016/01/23 02:11:00
Follow up :) I'm trying to avoid breaking a 1000 l
| |
1794 } | |
1795 | |
1762 void WebMediaPlayerAndroid::OnCdmContextReady(media::CdmContext* cdm_context) { | 1796 void WebMediaPlayerAndroid::OnCdmContextReady(media::CdmContext* cdm_context) { |
1763 DCHECK(!cdm_context_); | 1797 DCHECK(!cdm_context_); |
1764 | 1798 |
1765 if (!cdm_context) { | 1799 if (!cdm_context) { |
1766 LOG(ERROR) << "CdmContext not available (e.g. CDM creation failed)."; | 1800 LOG(ERROR) << "CdmContext not available (e.g. CDM creation failed)."; |
1767 return; | 1801 return; |
1768 } | 1802 } |
1769 | 1803 |
1770 cdm_context_ = cdm_context; | 1804 cdm_context_ = cdm_context; |
1771 | 1805 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1878 result = PREDICTION_RESULT_PATH_BASED_WAS_BETTER; | 1912 result = PREDICTION_RESULT_PATH_BASED_WAS_BETTER; |
1879 } else if (is_hls_url == is_hls) { | 1913 } else if (is_hls_url == is_hls) { |
1880 result = PREDICTION_RESULT_URL_BASED_WAS_BETTER; | 1914 result = PREDICTION_RESULT_URL_BASED_WAS_BETTER; |
1881 } | 1915 } |
1882 UMA_HISTOGRAM_ENUMERATION( | 1916 UMA_HISTOGRAM_ENUMERATION( |
1883 "Media.Android.IsHttpLiveStreamingMediaPredictionResult", | 1917 "Media.Android.IsHttpLiveStreamingMediaPredictionResult", |
1884 result, PREDICTION_RESULT_MAX); | 1918 result, PREDICTION_RESULT_MAX); |
1885 } | 1919 } |
1886 | 1920 |
1887 } // namespace content | 1921 } // namespace content |
OLD | NEW |