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 "media/blink/webmediaplayer_impl.h" | 5 #include "media/blink/webmediaplayer_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <limits> | 9 #include <limits> |
10 #include <string> | 10 #include <string> |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 return result; | 137 return result; |
138 } | 138 } |
139 | 139 |
140 gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) { | 140 gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) { |
141 if (rotation == VIDEO_ROTATION_90 || rotation == VIDEO_ROTATION_270) | 141 if (rotation == VIDEO_ROTATION_90 || rotation == VIDEO_ROTATION_270) |
142 return gfx::Size(natural_size.height(), natural_size.width()); | 142 return gfx::Size(natural_size.height(), natural_size.width()); |
143 return natural_size; | 143 return natural_size; |
144 } | 144 } |
145 | 145 |
146 base::TimeDelta GetCurrentTimeInternal(WebMediaPlayerImpl* p_this) { | 146 base::TimeDelta GetCurrentTimeInternal(WebMediaPlayerImpl* p_this) { |
147 // We wrap currentTime() instead of using pipeline_.GetMediaTime() since there | 147 // We wrap currentTime() instead of using pipeline_controller_.GetMediaTime() |
148 // are a variety of cases in which that time is not accurate; e.g., while | 148 // since there are a variety of cases in which that time is not accurate; |
149 // remoting and during a pause or seek. | 149 // e.g., while remoting and during a pause or seek. |
150 return base::TimeDelta::FromSecondsD(p_this->currentTime()); | 150 return base::TimeDelta::FromSecondsD(p_this->currentTime()); |
151 } | 151 } |
152 | 152 |
153 // How much time must have elapsed since loading last progressed before we | 153 // How much time must have elapsed since loading last progressed before we |
154 // assume that the decoder will have had time to complete preroll. | 154 // assume that the decoder will have had time to complete preroll. |
155 constexpr base::TimeDelta kPrerollAttemptTimeout = | 155 constexpr base::TimeDelta kPrerollAttemptTimeout = |
156 base::TimeDelta::FromSeconds(3); | 156 base::TimeDelta::FromSeconds(3); |
157 | 157 |
158 } // namespace | 158 } // namespace |
159 | 159 |
(...skipping 18 matching lines...) Expand all Loading... |
178 delegate_has_audio_(false), | 178 delegate_has_audio_(false), |
179 network_state_(WebMediaPlayer::NetworkStateEmpty), | 179 network_state_(WebMediaPlayer::NetworkStateEmpty), |
180 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 180 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
181 highest_ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 181 highest_ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
182 preload_(MultibufferDataSource::AUTO), | 182 preload_(MultibufferDataSource::AUTO), |
183 buffering_strategy_(MultibufferDataSource::BUFFERING_STRATEGY_NORMAL), | 183 buffering_strategy_(MultibufferDataSource::BUFFERING_STRATEGY_NORMAL), |
184 main_task_runner_(frame->loadingTaskRunner()), | 184 main_task_runner_(frame->loadingTaskRunner()), |
185 media_task_runner_(params.media_task_runner()), | 185 media_task_runner_(params.media_task_runner()), |
186 worker_task_runner_(params.worker_task_runner()), | 186 worker_task_runner_(params.worker_task_runner()), |
187 media_log_(params.media_log()), | 187 media_log_(params.media_log()), |
188 pipeline_(media_task_runner_, media_log_.get()), | |
189 pipeline_controller_( | 188 pipeline_controller_( |
190 &pipeline_, | 189 base::MakeUnique<PipelineImpl>(media_task_runner_, media_log_.get()), |
191 base::Bind(&WebMediaPlayerImpl::CreateRenderer, | 190 base::Bind(&WebMediaPlayerImpl::CreateRenderer, |
192 base::Unretained(this)), | 191 base::Unretained(this)), |
193 base::Bind(&WebMediaPlayerImpl::OnPipelineSeeked, AsWeakPtr()), | 192 base::Bind(&WebMediaPlayerImpl::OnPipelineSeeked, AsWeakPtr()), |
194 base::Bind(&WebMediaPlayerImpl::OnPipelineSuspended, AsWeakPtr()), | 193 base::Bind(&WebMediaPlayerImpl::OnPipelineSuspended, AsWeakPtr()), |
195 base::Bind(&WebMediaPlayerImpl::OnBeforePipelineResume, AsWeakPtr()), | 194 base::Bind(&WebMediaPlayerImpl::OnBeforePipelineResume, AsWeakPtr()), |
196 base::Bind(&WebMediaPlayerImpl::OnPipelineResumed, AsWeakPtr()), | 195 base::Bind(&WebMediaPlayerImpl::OnPipelineResumed, AsWeakPtr()), |
197 base::Bind(&WebMediaPlayerImpl::OnError, AsWeakPtr())), | 196 base::Bind(&WebMediaPlayerImpl::OnError, AsWeakPtr())), |
198 load_type_(LoadTypeURL), | 197 load_type_(LoadTypeURL), |
199 opaque_(false), | 198 opaque_(false), |
200 playback_rate_(0.0), | 199 playback_rate_(0.0), |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 274 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
276 | 275 |
277 suppress_destruction_errors_ = true; | 276 suppress_destruction_errors_ = true; |
278 | 277 |
279 delegate_->PlayerGone(delegate_id_); | 278 delegate_->PlayerGone(delegate_id_); |
280 delegate_->RemoveObserver(delegate_id_); | 279 delegate_->RemoveObserver(delegate_id_); |
281 | 280 |
282 // Finalize any watch time metrics before destroying the pipeline. | 281 // Finalize any watch time metrics before destroying the pipeline. |
283 watch_time_reporter_.reset(); | 282 watch_time_reporter_.reset(); |
284 | 283 |
285 // Pipeline must be stopped before it is destroyed. | 284 // The underlying Pipeline must be stopped before it is destroyed. |
286 pipeline_.Stop(); | 285 pipeline_controller_.Stop(); |
287 | 286 |
288 if (last_reported_memory_usage_) | 287 if (last_reported_memory_usage_) |
289 adjust_allocated_memory_cb_.Run(-last_reported_memory_usage_); | 288 adjust_allocated_memory_cb_.Run(-last_reported_memory_usage_); |
290 | 289 |
291 // Destruct compositor resources in the proper order. | 290 // Destruct compositor resources in the proper order. |
292 client_->setWebLayer(nullptr); | 291 client_->setWebLayer(nullptr); |
293 if (video_weblayer_) | 292 if (video_weblayer_) |
294 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); | 293 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); |
295 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_); | 294 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_); |
296 | 295 |
297 media_log_->AddEvent( | 296 media_log_->AddEvent( |
298 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); | 297 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); |
299 } | 298 } |
300 | 299 |
301 void WebMediaPlayerImpl::load(LoadType load_type, | 300 void WebMediaPlayerImpl::load(LoadType load_type, |
302 const blink::WebMediaPlayerSource& source, | 301 const blink::WebMediaPlayerSource& source, |
303 CORSMode cors_mode) { | 302 CORSMode cors_mode) { |
304 // Only URL or MSE blob URL is supported. | 303 // Only URL or MSE blob URL is supported. |
305 DCHECK(source.isURL()); | 304 DCHECK(source.isURL()); |
306 blink::WebURL url = source.getAsURL(); | 305 blink::WebURL url = source.getAsURL(); |
307 DVLOG(1) << __func__ << "(" << load_type << ", " << url << ", " << cors_mode | 306 DVLOG(1) << __func__ << "(" << load_type << ", " << url << ", " << cors_mode |
308 << ")"; | 307 << ")"; |
309 if (!defer_load_cb_.is_null()) { | 308 if (!defer_load_cb_.is_null()) { |
310 defer_load_cb_.Run(base::Bind( | 309 defer_load_cb_.Run(base::Bind(&WebMediaPlayerImpl::DoLoad, AsWeakPtr(), |
311 &WebMediaPlayerImpl::DoLoad, AsWeakPtr(), load_type, url, cors_mode)); | 310 load_type, url, cors_mode)); |
312 return; | 311 return; |
313 } | 312 } |
314 DoLoad(load_type, url, cors_mode); | 313 DoLoad(load_type, url, cors_mode); |
315 } | 314 } |
316 | 315 |
317 bool WebMediaPlayerImpl::supportsOverlayFullscreenVideo() { | 316 bool WebMediaPlayerImpl::supportsOverlayFullscreenVideo() { |
318 #if defined(OS_ANDROID) | 317 #if defined(OS_ANDROID) |
319 return true; | 318 return true; |
320 #else | 319 #else |
321 return false; | 320 return false; |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 | 420 |
422 #if defined(OS_ANDROID) // WMPI_CAST | 421 #if defined(OS_ANDROID) // WMPI_CAST |
423 if (isRemote()) { | 422 if (isRemote()) { |
424 cast_impl_.play(); | 423 cast_impl_.play(); |
425 return; | 424 return; |
426 } | 425 } |
427 #endif | 426 #endif |
428 // TODO(sandersd): Do we want to reset the idle timer here? | 427 // TODO(sandersd): Do we want to reset the idle timer here? |
429 delegate_->SetIdle(delegate_id_, false); | 428 delegate_->SetIdle(delegate_id_, false); |
430 paused_ = false; | 429 paused_ = false; |
431 pipeline_.SetPlaybackRate(playback_rate_); | 430 pipeline_controller_.SetPlaybackRate(playback_rate_); |
432 background_pause_timer_.Stop(); | 431 background_pause_timer_.Stop(); |
433 | 432 |
434 if (data_source_) | 433 if (data_source_) |
435 data_source_->MediaIsPlaying(); | 434 data_source_->MediaIsPlaying(); |
436 | 435 |
437 if (observer_) | 436 if (observer_) |
438 observer_->OnPlaying(); | 437 observer_->OnPlaying(); |
439 | 438 |
440 DCHECK(watch_time_reporter_); | 439 DCHECK(watch_time_reporter_); |
441 watch_time_reporter_->OnPlaying(); | 440 watch_time_reporter_->OnPlaying(); |
(...skipping 13 matching lines...) Expand all Loading... |
455 // No longer paused because it was hidden. | 454 // No longer paused because it was hidden. |
456 paused_when_hidden_ = false; | 455 paused_when_hidden_ = false; |
457 | 456 |
458 #if defined(OS_ANDROID) // WMPI_CAST | 457 #if defined(OS_ANDROID) // WMPI_CAST |
459 if (isRemote()) { | 458 if (isRemote()) { |
460 cast_impl_.pause(); | 459 cast_impl_.pause(); |
461 return; | 460 return; |
462 } | 461 } |
463 #endif | 462 #endif |
464 | 463 |
465 pipeline_.SetPlaybackRate(0.0); | 464 pipeline_controller_.SetPlaybackRate(0.0); |
466 | 465 |
467 // pause() may be called after playback has ended and the HTMLMediaElement | 466 // pause() may be called after playback has ended and the HTMLMediaElement |
468 // requires that currentTime() == duration() after ending. We want to ensure | 467 // requires that currentTime() == duration() after ending. We want to ensure |
469 // |paused_time_| matches currentTime() in this case or a future seek() may | 468 // |paused_time_| matches currentTime() in this case or a future seek() may |
470 // incorrectly discard what it thinks is a seek to the existing time. | 469 // incorrectly discard what it thinks is a seek to the existing time. |
471 paused_time_ = ended_ ? GetPipelineMediaDuration() : pipeline_.GetMediaTime(); | 470 paused_time_ = |
| 471 ended_ ? GetPipelineMediaDuration() : pipeline_controller_.GetMediaTime(); |
472 | 472 |
473 if (observer_) | 473 if (observer_) |
474 observer_->OnPaused(); | 474 observer_->OnPaused(); |
475 | 475 |
476 DCHECK(watch_time_reporter_); | 476 DCHECK(watch_time_reporter_); |
477 watch_time_reporter_->OnPaused(); | 477 watch_time_reporter_->OnPaused(); |
478 media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PAUSE)); | 478 media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PAUSE)); |
479 | 479 |
480 UpdatePlayState(); | 480 UpdatePlayState(); |
481 } | 481 } |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 // Limit rates to reasonable values by clamping. | 558 // Limit rates to reasonable values by clamping. |
559 if (rate != 0.0) { | 559 if (rate != 0.0) { |
560 if (rate < kMinRate) | 560 if (rate < kMinRate) |
561 rate = kMinRate; | 561 rate = kMinRate; |
562 else if (rate > kMaxRate) | 562 else if (rate > kMaxRate) |
563 rate = kMaxRate; | 563 rate = kMaxRate; |
564 } | 564 } |
565 | 565 |
566 playback_rate_ = rate; | 566 playback_rate_ = rate; |
567 if (!paused_) { | 567 if (!paused_) { |
568 pipeline_.SetPlaybackRate(rate); | 568 pipeline_controller_.SetPlaybackRate(rate); |
569 if (data_source_) | 569 if (data_source_) |
570 data_source_->MediaPlaybackRateChanged(rate); | 570 data_source_->MediaPlaybackRateChanged(rate); |
571 } | 571 } |
572 } | 572 } |
573 | 573 |
574 void WebMediaPlayerImpl::setVolume(double volume) { | 574 void WebMediaPlayerImpl::setVolume(double volume) { |
575 DVLOG(1) << __func__ << "(" << volume << ")"; | 575 DVLOG(1) << __func__ << "(" << volume << ")"; |
576 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 576 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
577 volume_ = volume; | 577 volume_ = volume; |
578 pipeline_.SetVolume(volume_ * volume_multiplier_); | 578 pipeline_controller_.SetVolume(volume_ * volume_multiplier_); |
579 if (watch_time_reporter_) | 579 if (watch_time_reporter_) |
580 watch_time_reporter_->OnVolumeChange(volume); | 580 watch_time_reporter_->OnVolumeChange(volume); |
581 | 581 |
582 // The play state is updated because the player might have left the autoplay | 582 // The play state is updated because the player might have left the autoplay |
583 // muted state. | 583 // muted state. |
584 UpdatePlayState(); | 584 UpdatePlayState(); |
585 } | 585 } |
586 | 586 |
587 void WebMediaPlayerImpl::setSinkId( | 587 void WebMediaPlayerImpl::setSinkId( |
588 const blink::WebString& sink_id, | 588 const blink::WebString& sink_id, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
657 | 657 |
658 std::ostringstream logstr; | 658 std::ostringstream logstr; |
659 std::vector<MediaTrack::Id> enabledMediaTrackIds; | 659 std::vector<MediaTrack::Id> enabledMediaTrackIds; |
660 for (const auto& blinkTrackId : enabledTrackIds) { | 660 for (const auto& blinkTrackId : enabledTrackIds) { |
661 MediaTrack::Id track_id = blinkTrackId.utf8().data(); | 661 MediaTrack::Id track_id = blinkTrackId.utf8().data(); |
662 logstr << track_id << " "; | 662 logstr << track_id << " "; |
663 enabledMediaTrackIds.push_back(track_id); | 663 enabledMediaTrackIds.push_back(track_id); |
664 } | 664 } |
665 MEDIA_LOG(INFO, media_log_) << "Enabled audio tracks: [" << logstr.str() | 665 MEDIA_LOG(INFO, media_log_) << "Enabled audio tracks: [" << logstr.str() |
666 << "]"; | 666 << "]"; |
667 pipeline_.OnEnabledAudioTracksChanged(enabledMediaTrackIds); | 667 pipeline_controller_.OnEnabledAudioTracksChanged(enabledMediaTrackIds); |
668 } | 668 } |
669 | 669 |
670 void WebMediaPlayerImpl::selectedVideoTrackChanged( | 670 void WebMediaPlayerImpl::selectedVideoTrackChanged( |
671 blink::WebMediaPlayer::TrackId* selectedTrackId) { | 671 blink::WebMediaPlayer::TrackId* selectedTrackId) { |
672 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 672 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
673 | 673 |
674 std::ostringstream logstr; | 674 std::ostringstream logstr; |
675 std::vector<MediaTrack::Id> selectedVideoMediaTrackId; | 675 std::vector<MediaTrack::Id> selectedVideoMediaTrackId; |
676 if (selectedTrackId && !video_track_disabled_) { | 676 if (selectedTrackId && !video_track_disabled_) { |
677 selectedVideoMediaTrackId.push_back(selectedTrackId->utf8().data()); | 677 selectedVideoMediaTrackId.push_back(selectedTrackId->utf8().data()); |
678 logstr << selectedVideoMediaTrackId[0]; | 678 logstr << selectedVideoMediaTrackId[0]; |
679 } | 679 } |
680 MEDIA_LOG(INFO, media_log_) << "Selected video track: [" << logstr.str() | 680 MEDIA_LOG(INFO, media_log_) << "Selected video track: [" << logstr.str() |
681 << "]"; | 681 << "]"; |
682 pipeline_.OnSelectedVideoTrackChanged(selectedVideoMediaTrackId); | 682 pipeline_controller_.OnSelectedVideoTrackChanged(selectedVideoMediaTrackId); |
683 } | 683 } |
684 | 684 |
685 blink::WebSize WebMediaPlayerImpl::naturalSize() const { | 685 blink::WebSize WebMediaPlayerImpl::naturalSize() const { |
686 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 686 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
687 | 687 |
688 return blink::WebSize(pipeline_metadata_.natural_size); | 688 return blink::WebSize(pipeline_metadata_.natural_size); |
689 } | 689 } |
690 | 690 |
691 bool WebMediaPlayerImpl::paused() const { | 691 bool WebMediaPlayerImpl::paused() const { |
692 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 692 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
693 | 693 |
694 #if defined(OS_ANDROID) // WMPI_CAST | 694 #if defined(OS_ANDROID) // WMPI_CAST |
695 if (isRemote()) | 695 if (isRemote()) |
696 return cast_impl_.IsPaused(); | 696 return cast_impl_.IsPaused(); |
697 #endif | 697 #endif |
698 | 698 |
699 return pipeline_.GetPlaybackRate() == 0.0f; | 699 return pipeline_controller_.GetPlaybackRate() == 0.0f; |
700 } | 700 } |
701 | 701 |
702 bool WebMediaPlayerImpl::seeking() const { | 702 bool WebMediaPlayerImpl::seeking() const { |
703 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 703 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
704 | 704 |
705 if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) | 705 if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) |
706 return false; | 706 return false; |
707 | 707 |
708 return seeking_; | 708 return seeking_; |
709 } | 709 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 return seek_time_.InSecondsF(); | 750 return seek_time_.InSecondsF(); |
751 | 751 |
752 #if defined(OS_ANDROID) // WMPI_CAST | 752 #if defined(OS_ANDROID) // WMPI_CAST |
753 if (isRemote()) | 753 if (isRemote()) |
754 return cast_impl_.currentTime(); | 754 return cast_impl_.currentTime(); |
755 #endif | 755 #endif |
756 | 756 |
757 if (paused_) | 757 if (paused_) |
758 return paused_time_.InSecondsF(); | 758 return paused_time_.InSecondsF(); |
759 | 759 |
760 return pipeline_.GetMediaTime().InSecondsF(); | 760 return pipeline_controller_.GetMediaTime().InSecondsF(); |
761 } | 761 } |
762 | 762 |
763 WebMediaPlayer::NetworkState WebMediaPlayerImpl::getNetworkState() const { | 763 WebMediaPlayer::NetworkState WebMediaPlayerImpl::getNetworkState() const { |
764 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 764 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
765 return network_state_; | 765 return network_state_; |
766 } | 766 } |
767 | 767 |
768 WebMediaPlayer::ReadyState WebMediaPlayerImpl::getReadyState() const { | 768 WebMediaPlayer::ReadyState WebMediaPlayerImpl::getReadyState() const { |
769 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 769 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
770 return ready_state_; | 770 return ready_state_; |
771 } | 771 } |
772 | 772 |
773 blink::WebString WebMediaPlayerImpl::getErrorMessage() { | 773 blink::WebString WebMediaPlayerImpl::getErrorMessage() { |
774 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 774 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
775 return blink::WebString::fromUTF8(media_log_->GetLastErrorMessage()); | 775 return blink::WebString::fromUTF8(media_log_->GetLastErrorMessage()); |
776 } | 776 } |
777 | 777 |
778 blink::WebTimeRanges WebMediaPlayerImpl::buffered() const { | 778 blink::WebTimeRanges WebMediaPlayerImpl::buffered() const { |
779 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 779 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
780 | 780 |
781 Ranges<base::TimeDelta> buffered_time_ranges = | 781 Ranges<base::TimeDelta> buffered_time_ranges = |
782 pipeline_.GetBufferedTimeRanges(); | 782 pipeline_controller_.GetBufferedTimeRanges(); |
783 | 783 |
784 const base::TimeDelta duration = GetPipelineMediaDuration(); | 784 const base::TimeDelta duration = GetPipelineMediaDuration(); |
785 if (duration != kInfiniteDuration) { | 785 if (duration != kInfiniteDuration) { |
786 buffered_data_source_host_.AddBufferedTimeRanges( | 786 buffered_data_source_host_.AddBufferedTimeRanges(&buffered_time_ranges, |
787 &buffered_time_ranges, duration); | 787 duration); |
788 } | 788 } |
789 return ConvertToWebTimeRanges(buffered_time_ranges); | 789 return ConvertToWebTimeRanges(buffered_time_ranges); |
790 } | 790 } |
791 | 791 |
792 blink::WebTimeRanges WebMediaPlayerImpl::seekable() const { | 792 blink::WebTimeRanges WebMediaPlayerImpl::seekable() const { |
793 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 793 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
794 | 794 |
795 if (ready_state_ < WebMediaPlayer::ReadyStateHaveMetadata) | 795 if (ready_state_ < WebMediaPlayer::ReadyStateHaveMetadata) |
796 return blink::WebTimeRanges(); | 796 return blink::WebTimeRanges(); |
797 | 797 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 | 831 |
832 base::TimeDelta preroll_attempt_duration = | 832 base::TimeDelta preroll_attempt_duration = |
833 tick_clock_->NowTicks() - preroll_attempt_start_time_; | 833 tick_clock_->NowTicks() - preroll_attempt_start_time_; |
834 return preroll_attempt_duration < kPrerollAttemptTimeout; | 834 return preroll_attempt_duration < kPrerollAttemptTimeout; |
835 } | 835 } |
836 | 836 |
837 bool WebMediaPlayerImpl::didLoadingProgress() { | 837 bool WebMediaPlayerImpl::didLoadingProgress() { |
838 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 838 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
839 | 839 |
840 // Note: Separate variables used to ensure both methods are called every time. | 840 // Note: Separate variables used to ensure both methods are called every time. |
841 const bool pipeline_progress = pipeline_.DidLoadingProgress(); | 841 const bool pipeline_progress = pipeline_controller_.DidLoadingProgress(); |
842 const bool data_progress = buffered_data_source_host_.DidLoadingProgress(); | 842 const bool data_progress = buffered_data_source_host_.DidLoadingProgress(); |
843 const bool did_loading_progress = pipeline_progress || data_progress; | 843 const bool did_loading_progress = pipeline_progress || data_progress; |
844 | 844 |
845 if (did_loading_progress && | 845 if (did_loading_progress && |
846 highest_ready_state_ < ReadyState::ReadyStateHaveFutureData) { | 846 highest_ready_state_ < ReadyState::ReadyStateHaveFutureData) { |
847 // Reset the preroll attempt clock. | 847 // Reset the preroll attempt clock. |
848 preroll_attempt_pending_ = true; | 848 preroll_attempt_pending_ = true; |
849 preroll_attempt_start_time_ = base::TimeTicks(); | 849 preroll_attempt_start_time_ = base::TimeTicks(); |
850 | 850 |
851 // Clear any 'stale' flag and give the pipeline a chance to resume. If we | 851 // Clear any 'stale' flag and give the pipeline a chance to resume. If we |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1054 OnCdmAttached(false); | 1054 OnCdmAttached(false); |
1055 return; | 1055 return; |
1056 } | 1056 } |
1057 | 1057 |
1058 if (observer_) | 1058 if (observer_) |
1059 observer_->OnSetCdm(cdm_context); | 1059 observer_->OnSetCdm(cdm_context); |
1060 | 1060 |
1061 // Keep the reference to the CDM, as it shouldn't be destroyed until | 1061 // Keep the reference to the CDM, as it shouldn't be destroyed until |
1062 // after the pipeline is done with the |cdm_context|. | 1062 // after the pipeline is done with the |cdm_context|. |
1063 pending_cdm_ = std::move(cdm_reference); | 1063 pending_cdm_ = std::move(cdm_reference); |
1064 pipeline_.SetCdm(cdm_context, | 1064 pipeline_controller_.SetCdm( |
1065 base::Bind(&WebMediaPlayerImpl::OnCdmAttached, AsWeakPtr())); | 1065 cdm_context, base::Bind(&WebMediaPlayerImpl::OnCdmAttached, AsWeakPtr())); |
1066 } | 1066 } |
1067 | 1067 |
1068 void WebMediaPlayerImpl::OnCdmAttached(bool success) { | 1068 void WebMediaPlayerImpl::OnCdmAttached(bool success) { |
1069 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1069 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1070 DCHECK(pending_cdm_); | 1070 DCHECK(pending_cdm_); |
1071 | 1071 |
1072 // If the CDM is set from the constructor there is no promise | 1072 // If the CDM is set from the constructor there is no promise |
1073 // (|set_cdm_result_|) to fulfill. | 1073 // (|set_cdm_result_|) to fulfill. |
1074 if (success) { | 1074 if (success) { |
1075 // This will release the previously attached CDM (if any). | 1075 // This will release the previously attached CDM (if any). |
(...skipping 17 matching lines...) Expand all Loading... |
1093 | 1093 |
1094 void WebMediaPlayerImpl::OnPipelineSeeked(bool time_updated) { | 1094 void WebMediaPlayerImpl::OnPipelineSeeked(bool time_updated) { |
1095 seeking_ = false; | 1095 seeking_ = false; |
1096 seek_time_ = base::TimeDelta(); | 1096 seek_time_ = base::TimeDelta(); |
1097 | 1097 |
1098 if (paused_) { | 1098 if (paused_) { |
1099 #if defined(OS_ANDROID) // WMPI_CAST | 1099 #if defined(OS_ANDROID) // WMPI_CAST |
1100 if (isRemote()) { | 1100 if (isRemote()) { |
1101 paused_time_ = base::TimeDelta::FromSecondsD(cast_impl_.currentTime()); | 1101 paused_time_ = base::TimeDelta::FromSecondsD(cast_impl_.currentTime()); |
1102 } else { | 1102 } else { |
1103 paused_time_ = pipeline_.GetMediaTime(); | 1103 paused_time_ = pipeline_controller_.GetMediaTime(); |
1104 } | 1104 } |
1105 #else | 1105 #else |
1106 paused_time_ = pipeline_.GetMediaTime(); | 1106 paused_time_ = pipeline_controller_.GetMediaTime(); |
1107 #endif | 1107 #endif |
1108 } else { | 1108 } else { |
1109 DCHECK(watch_time_reporter_); | 1109 DCHECK(watch_time_reporter_); |
1110 watch_time_reporter_->OnPlaying(); | 1110 watch_time_reporter_->OnPlaying(); |
1111 } | 1111 } |
1112 if (time_updated) | 1112 if (time_updated) |
1113 should_notify_time_changed_ = true; | 1113 should_notify_time_changed_ = true; |
1114 | 1114 |
1115 // Reset underflow duration upon seek; this prevents looping videos and user | 1115 // Reset underflow duration upon seek; this prevents looping videos and user |
1116 // actions from artificially inflating the duration. | 1116 // actions from artificially inflating the duration. |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1346 | 1346 |
1347 client_->durationChanged(); | 1347 client_->durationChanged(); |
1348 } | 1348 } |
1349 | 1349 |
1350 void WebMediaPlayerImpl::OnAddTextTrack(const TextTrackConfig& config, | 1350 void WebMediaPlayerImpl::OnAddTextTrack(const TextTrackConfig& config, |
1351 const AddTextTrackDoneCB& done_cb) { | 1351 const AddTextTrackDoneCB& done_cb) { |
1352 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1352 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1353 | 1353 |
1354 const WebInbandTextTrackImpl::Kind web_kind = | 1354 const WebInbandTextTrackImpl::Kind web_kind = |
1355 static_cast<WebInbandTextTrackImpl::Kind>(config.kind()); | 1355 static_cast<WebInbandTextTrackImpl::Kind>(config.kind()); |
1356 const blink::WebString web_label = | 1356 const blink::WebString web_label = blink::WebString::fromUTF8(config.label()); |
1357 blink::WebString::fromUTF8(config.label()); | |
1358 const blink::WebString web_language = | 1357 const blink::WebString web_language = |
1359 blink::WebString::fromUTF8(config.language()); | 1358 blink::WebString::fromUTF8(config.language()); |
1360 const blink::WebString web_id = | 1359 const blink::WebString web_id = blink::WebString::fromUTF8(config.id()); |
1361 blink::WebString::fromUTF8(config.id()); | |
1362 | 1360 |
1363 std::unique_ptr<WebInbandTextTrackImpl> web_inband_text_track( | 1361 std::unique_ptr<WebInbandTextTrackImpl> web_inband_text_track( |
1364 new WebInbandTextTrackImpl(web_kind, web_label, web_language, web_id)); | 1362 new WebInbandTextTrackImpl(web_kind, web_label, web_language, web_id)); |
1365 | 1363 |
1366 std::unique_ptr<media::TextTrack> text_track(new TextTrackImpl( | 1364 std::unique_ptr<media::TextTrack> text_track(new TextTrackImpl( |
1367 main_task_runner_, client_, std::move(web_inband_text_track))); | 1365 main_task_runner_, client_, std::move(web_inband_text_track))); |
1368 | 1366 |
1369 done_cb.Run(std::move(text_track)); | 1367 done_cb.Run(std::move(text_track)); |
1370 } | 1368 } |
1371 | 1369 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1510 client_->playbackStateChanged(); | 1508 client_->playbackStateChanged(); |
1511 } | 1509 } |
1512 | 1510 |
1513 void WebMediaPlayerImpl::OnVolumeMultiplierUpdate(double multiplier) { | 1511 void WebMediaPlayerImpl::OnVolumeMultiplierUpdate(double multiplier) { |
1514 volume_multiplier_ = multiplier; | 1512 volume_multiplier_ = multiplier; |
1515 setVolume(volume_); | 1513 setVolume(volume_); |
1516 } | 1514 } |
1517 | 1515 |
1518 void WebMediaPlayerImpl::ScheduleRestart() { | 1516 void WebMediaPlayerImpl::ScheduleRestart() { |
1519 // TODO(watk): All restart logic should be moved into PipelineController. | 1517 // TODO(watk): All restart logic should be moved into PipelineController. |
1520 if (pipeline_.IsRunning() && !pipeline_controller_.IsPipelineSuspended()) { | 1518 if (pipeline_controller_.IsPipelineRunning() && |
| 1519 !pipeline_controller_.IsPipelineSuspended()) { |
1521 pending_suspend_resume_cycle_ = true; | 1520 pending_suspend_resume_cycle_ = true; |
1522 UpdatePlayState(); | 1521 UpdatePlayState(); |
1523 } | 1522 } |
1524 } | 1523 } |
1525 | 1524 |
1526 void WebMediaPlayerImpl::requestRemotePlaybackDisabled(bool disabled) { | 1525 void WebMediaPlayerImpl::requestRemotePlaybackDisabled(bool disabled) { |
1527 if (observer_) | 1526 if (observer_) |
1528 observer_->OnRemotePlaybackDisabled(disabled); | 1527 observer_->OnRemotePlaybackDisabled(disabled); |
1529 } | 1528 } |
1530 | 1529 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1638 StartPipeline(); | 1637 StartPipeline(); |
1639 } | 1638 } |
1640 | 1639 |
1641 void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { | 1640 void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { |
1642 DVLOG(1) << __func__; | 1641 DVLOG(1) << __func__; |
1643 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading) | 1642 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading) |
1644 SetNetworkState(WebMediaPlayer::NetworkStateIdle); | 1643 SetNetworkState(WebMediaPlayer::NetworkStateIdle); |
1645 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) | 1644 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) |
1646 SetNetworkState(WebMediaPlayer::NetworkStateLoading); | 1645 SetNetworkState(WebMediaPlayer::NetworkStateLoading); |
1647 media_log_->AddEvent( | 1646 media_log_->AddEvent( |
1648 media_log_->CreateBooleanEvent( | 1647 media_log_->CreateBooleanEvent(MediaLogEvent::NETWORK_ACTIVITY_SET, |
1649 MediaLogEvent::NETWORK_ACTIVITY_SET, | 1648 "is_downloading_data", is_downloading)); |
1650 "is_downloading_data", is_downloading)); | |
1651 } | 1649 } |
1652 | 1650 |
1653 void WebMediaPlayerImpl::OnSurfaceCreated(int surface_id) { | 1651 void WebMediaPlayerImpl::OnSurfaceCreated(int surface_id) { |
1654 overlay_surface_id_ = surface_id; | 1652 overlay_surface_id_ = surface_id; |
1655 if (!set_surface_cb_.is_null()) { | 1653 if (!set_surface_cb_.is_null()) { |
1656 // If restart is required, the callback is one-shot only. | 1654 // If restart is required, the callback is one-shot only. |
1657 if (decoder_requires_restart_for_overlay_) | 1655 if (decoder_requires_restart_for_overlay_) |
1658 base::ResetAndReturn(&set_surface_cb_).Run(surface_id); | 1656 base::ResetAndReturn(&set_surface_cb_).Run(surface_id); |
1659 else | 1657 else |
1660 set_surface_cb_.Run(surface_id); | 1658 set_surface_cb_.Run(surface_id); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1792 highest_ready_state_ = std::max(highest_ready_state_, ready_state_); | 1790 highest_ready_state_ = std::max(highest_ready_state_, ready_state_); |
1793 | 1791 |
1794 // Always notify to ensure client has the latest value. | 1792 // Always notify to ensure client has the latest value. |
1795 client_->readyStateChanged(); | 1793 client_->readyStateChanged(); |
1796 } | 1794 } |
1797 | 1795 |
1798 blink::WebAudioSourceProvider* WebMediaPlayerImpl::getAudioSourceProvider() { | 1796 blink::WebAudioSourceProvider* WebMediaPlayerImpl::getAudioSourceProvider() { |
1799 return audio_source_provider_.get(); | 1797 return audio_source_provider_.get(); |
1800 } | 1798 } |
1801 | 1799 |
1802 static void GetCurrentFrameAndSignal( | 1800 static void GetCurrentFrameAndSignal(VideoFrameCompositor* compositor, |
1803 VideoFrameCompositor* compositor, | 1801 scoped_refptr<VideoFrame>* video_frame_out, |
1804 scoped_refptr<VideoFrame>* video_frame_out, | 1802 base::WaitableEvent* event) { |
1805 base::WaitableEvent* event) { | |
1806 TRACE_EVENT0("media", "GetCurrentFrameAndSignal"); | 1803 TRACE_EVENT0("media", "GetCurrentFrameAndSignal"); |
1807 *video_frame_out = compositor->GetCurrentFrameAndUpdateIfStale(); | 1804 *video_frame_out = compositor->GetCurrentFrameAndUpdateIfStale(); |
1808 event->Signal(); | 1805 event->Signal(); |
1809 } | 1806 } |
1810 | 1807 |
1811 scoped_refptr<VideoFrame> | 1808 scoped_refptr<VideoFrame> WebMediaPlayerImpl::GetCurrentFrameFromCompositor() { |
1812 WebMediaPlayerImpl::GetCurrentFrameFromCompositor() { | |
1813 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1809 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1814 TRACE_EVENT0("media", "WebMediaPlayerImpl::GetCurrentFrameFromCompositor"); | 1810 TRACE_EVENT0("media", "WebMediaPlayerImpl::GetCurrentFrameFromCompositor"); |
1815 | 1811 |
1816 // Needed when the |main_task_runner_| and |compositor_task_runner_| are the | 1812 // Needed when the |main_task_runner_| and |compositor_task_runner_| are the |
1817 // same to avoid deadlock in the Wait() below. | 1813 // same to avoid deadlock in the Wait() below. |
1818 if (compositor_task_runner_->BelongsToCurrentThread()) | 1814 if (compositor_task_runner_->BelongsToCurrentThread()) |
1819 return compositor_->GetCurrentFrameAndUpdateIfStale(); | 1815 return compositor_->GetCurrentFrameAndUpdateIfStale(); |
1820 | 1816 |
1821 // Use a posted task and waitable event instead of a lock otherwise | 1817 // Use a posted task and waitable event instead of a lock otherwise |
1822 // WebGL/Canvas can see different content than what the compositor is seeing. | 1818 // WebGL/Canvas can see different content than what the compositor is seeing. |
1823 scoped_refptr<VideoFrame> video_frame; | 1819 scoped_refptr<VideoFrame> video_frame; |
1824 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC, | 1820 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
1825 base::WaitableEvent::InitialState::NOT_SIGNALED); | 1821 base::WaitableEvent::InitialState::NOT_SIGNALED); |
1826 compositor_task_runner_->PostTask(FROM_HERE, | 1822 compositor_task_runner_->PostTask( |
1827 base::Bind(&GetCurrentFrameAndSignal, | 1823 FROM_HERE, |
1828 base::Unretained(compositor_), | 1824 base::Bind(&GetCurrentFrameAndSignal, base::Unretained(compositor_), |
1829 &video_frame, | 1825 &video_frame, &event)); |
1830 &event)); | |
1831 event.Wait(); | 1826 event.Wait(); |
1832 return video_frame; | 1827 return video_frame; |
1833 } | 1828 } |
1834 | 1829 |
1835 void WebMediaPlayerImpl::UpdatePlayState() { | 1830 void WebMediaPlayerImpl::UpdatePlayState() { |
1836 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1831 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1837 | 1832 |
1838 #if defined(OS_ANDROID) // WMPI_CAST | 1833 #if defined(OS_ANDROID) // WMPI_CAST |
1839 bool is_remote = isRemote(); | 1834 bool is_remote = isRemote(); |
1840 bool can_auto_suspend = true; | 1835 bool can_auto_suspend = true; |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2208 } else { | 2203 } else { |
2209 EnableVideoTrackIfNeeded(); | 2204 EnableVideoTrackIfNeeded(); |
2210 } | 2205 } |
2211 } | 2206 } |
2212 | 2207 |
2213 void WebMediaPlayerImpl::PauseVideoIfNeeded() { | 2208 void WebMediaPlayerImpl::PauseVideoIfNeeded() { |
2214 DCHECK(IsHidden()); | 2209 DCHECK(IsHidden()); |
2215 | 2210 |
2216 // Don't pause video while the pipeline is stopped, resuming or seeking. | 2211 // Don't pause video while the pipeline is stopped, resuming or seeking. |
2217 // Also if the video is paused already. | 2212 // Also if the video is paused already. |
2218 if (!pipeline_.IsRunning() || is_pipeline_resuming_ || seeking_ || paused_) | 2213 if (!pipeline_controller_.IsPipelineRunning() || is_pipeline_resuming_ || |
| 2214 seeking_ || paused_) |
2219 return; | 2215 return; |
2220 | 2216 |
2221 // OnPause() will set |paused_when_hidden_| to false and call | 2217 // OnPause() will set |paused_when_hidden_| to false and call |
2222 // UpdatePlayState(), so set the flag to true after and then return. | 2218 // UpdatePlayState(), so set the flag to true after and then return. |
2223 OnPause(); | 2219 OnPause(); |
2224 paused_when_hidden_ = true; | 2220 paused_when_hidden_ = true; |
2225 } | 2221 } |
2226 | 2222 |
2227 void WebMediaPlayerImpl::EnableVideoTrackIfNeeded() { | 2223 void WebMediaPlayerImpl::EnableVideoTrackIfNeeded() { |
2228 // Don't change video track while the pipeline is stopped, resuming or | 2224 // Don't change video track while the pipeline is stopped, resuming or |
2229 // seeking. | 2225 // seeking. |
2230 if (!pipeline_.IsRunning() || is_pipeline_resuming_ || seeking_) | 2226 if (!pipeline_controller_.IsPipelineRunning() || is_pipeline_resuming_ || |
| 2227 seeking_) |
2231 return; | 2228 return; |
2232 | 2229 |
2233 if (video_track_disabled_) { | 2230 if (video_track_disabled_) { |
2234 video_track_disabled_ = false; | 2231 video_track_disabled_ = false; |
2235 if (client_->hasSelectedVideoTrack()) { | 2232 if (client_->hasSelectedVideoTrack()) { |
2236 WebMediaPlayer::TrackId trackId = client_->getSelectedVideoTrackId(); | 2233 WebMediaPlayer::TrackId trackId = client_->getSelectedVideoTrackId(); |
2237 selectedVideoTrackChanged(&trackId); | 2234 selectedVideoTrackChanged(&trackId); |
2238 } | 2235 } |
2239 } | 2236 } |
2240 } | 2237 } |
(...skipping 12 matching lines...) Expand all Loading... |
2253 } | 2250 } |
2254 | 2251 |
2255 void WebMediaPlayerImpl::SetPipelineStatisticsForTest( | 2252 void WebMediaPlayerImpl::SetPipelineStatisticsForTest( |
2256 const PipelineStatistics& stats) { | 2253 const PipelineStatistics& stats) { |
2257 pipeline_statistics_for_test_ = base::make_optional(stats); | 2254 pipeline_statistics_for_test_ = base::make_optional(stats); |
2258 } | 2255 } |
2259 | 2256 |
2260 PipelineStatistics WebMediaPlayerImpl::GetPipelineStatistics() const { | 2257 PipelineStatistics WebMediaPlayerImpl::GetPipelineStatistics() const { |
2261 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 2258 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
2262 | 2259 |
2263 return pipeline_statistics_for_test_.value_or(pipeline_.GetStatistics()); | 2260 return pipeline_statistics_for_test_.value_or( |
| 2261 pipeline_controller_.GetStatistics()); |
2264 } | 2262 } |
2265 | 2263 |
2266 void WebMediaPlayerImpl::SetPipelineMediaDurationForTest( | 2264 void WebMediaPlayerImpl::SetPipelineMediaDurationForTest( |
2267 base::TimeDelta duration) { | 2265 base::TimeDelta duration) { |
2268 pipeline_media_duration_for_test_ = base::make_optional(duration); | 2266 pipeline_media_duration_for_test_ = base::make_optional(duration); |
2269 } | 2267 } |
2270 | 2268 |
2271 base::TimeDelta WebMediaPlayerImpl::GetPipelineMediaDuration() const { | 2269 base::TimeDelta WebMediaPlayerImpl::GetPipelineMediaDuration() const { |
2272 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 2270 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
2273 | 2271 |
2274 return pipeline_media_duration_for_test_.value_or( | 2272 return pipeline_media_duration_for_test_.value_or( |
2275 pipeline_.GetMediaDuration()); | 2273 pipeline_controller_.GetMediaDuration()); |
2276 } | 2274 } |
2277 | 2275 |
2278 void WebMediaPlayerImpl::ReportTimeFromForegroundToFirstFrame( | 2276 void WebMediaPlayerImpl::ReportTimeFromForegroundToFirstFrame( |
2279 base::TimeTicks foreground_time, | 2277 base::TimeTicks foreground_time, |
2280 base::TimeTicks new_frame_time) { | 2278 base::TimeTicks new_frame_time) { |
2281 base::TimeDelta time_to_first_frame = new_frame_time - foreground_time; | 2279 base::TimeDelta time_to_first_frame = new_frame_time - foreground_time; |
2282 if (hasAudio()) { | 2280 if (hasAudio()) { |
2283 UMA_HISTOGRAM_TIMES( | 2281 UMA_HISTOGRAM_TIMES( |
2284 "Media.Video.TimeFromForegroundToFirstFrame.DisableTrack", | 2282 "Media.Video.TimeFromForegroundToFirstFrame.DisableTrack", |
2285 time_to_first_frame); | 2283 time_to_first_frame); |
(...skipping 11 matching lines...) Expand all Loading... |
2297 | 2295 |
2298 void WebMediaPlayerImpl::RecordUnderflowDuration(base::TimeDelta duration) { | 2296 void WebMediaPlayerImpl::RecordUnderflowDuration(base::TimeDelta duration) { |
2299 DCHECK(data_source_ || chunk_demuxer_); | 2297 DCHECK(data_source_ || chunk_demuxer_); |
2300 if (data_source_) | 2298 if (data_source_) |
2301 UMA_HISTOGRAM_TIMES("Media.UnderflowDuration", duration); | 2299 UMA_HISTOGRAM_TIMES("Media.UnderflowDuration", duration); |
2302 else | 2300 else |
2303 UMA_HISTOGRAM_TIMES("Media.UnderflowDuration.MSE", duration); | 2301 UMA_HISTOGRAM_TIMES("Media.UnderflowDuration.MSE", duration); |
2304 } | 2302 } |
2305 | 2303 |
2306 } // namespace media | 2304 } // namespace media |
OLD | NEW |