| 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 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 std::unique_ptr<RendererFactory> renderer_factory, | 167 std::unique_ptr<RendererFactory> renderer_factory, |
| 168 linked_ptr<UrlIndex> url_index, | 168 linked_ptr<UrlIndex> url_index, |
| 169 const WebMediaPlayerParams& params) | 169 const WebMediaPlayerParams& params) |
| 170 : frame_(frame), | 170 : frame_(frame), |
| 171 delegate_state_(DelegateState::GONE), | 171 delegate_state_(DelegateState::GONE), |
| 172 is_idle_(false), | 172 is_idle_(false), |
| 173 must_suspend_(false), | 173 must_suspend_(false), |
| 174 network_state_(WebMediaPlayer::NetworkStateEmpty), | 174 network_state_(WebMediaPlayer::NetworkStateEmpty), |
| 175 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 175 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
| 176 highest_ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 176 highest_ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
| 177 preload_(BufferedDataSource::AUTO), | 177 preload_(MultibufferDataSource::AUTO), |
| 178 buffering_strategy_( | 178 buffering_strategy_(MultibufferDataSource::BUFFERING_STRATEGY_NORMAL), |
| 179 BufferedDataSourceInterface::BUFFERING_STRATEGY_NORMAL), | |
| 180 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 179 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 181 media_task_runner_(params.media_task_runner()), | 180 media_task_runner_(params.media_task_runner()), |
| 182 worker_task_runner_(params.worker_task_runner()), | 181 worker_task_runner_(params.worker_task_runner()), |
| 183 media_log_(params.media_log()), | 182 media_log_(params.media_log()), |
| 184 pipeline_(media_task_runner_, media_log_.get()), | 183 pipeline_(media_task_runner_, media_log_.get()), |
| 185 pipeline_controller_( | 184 pipeline_controller_( |
| 186 &pipeline_, | 185 &pipeline_, |
| 187 base::Bind(&WebMediaPlayerImpl::CreateRenderer, | 186 base::Bind(&WebMediaPlayerImpl::CreateRenderer, |
| 188 base::Unretained(this)), | 187 base::Unretained(this)), |
| 189 base::Bind(&WebMediaPlayerImpl::OnPipelineSeeked, AsWeakPtr()), | 188 base::Bind(&WebMediaPlayerImpl::OnPipelineSeeked, AsWeakPtr()), |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 | 355 |
| 357 SetNetworkState(WebMediaPlayer::NetworkStateLoading); | 356 SetNetworkState(WebMediaPlayer::NetworkStateLoading); |
| 358 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); | 357 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); |
| 359 media_log_->AddEvent(media_log_->CreateLoadEvent(url.string().utf8())); | 358 media_log_->AddEvent(media_log_->CreateLoadEvent(url.string().utf8())); |
| 360 | 359 |
| 361 // Media source pipelines can start immediately. | 360 // Media source pipelines can start immediately. |
| 362 if (load_type == LoadTypeMediaSource) { | 361 if (load_type == LoadTypeMediaSource) { |
| 363 supports_save_ = false; | 362 supports_save_ = false; |
| 364 StartPipeline(); | 363 StartPipeline(); |
| 365 } else { | 364 } else { |
| 366 // TODO(hubbe): This experiment is temporary and should be removed once | 365 data_source_.reset(new MultibufferDataSource( |
| 367 // we have enough data to support the primacy of the new media cache. | 366 url, static_cast<UrlData::CORSMode>(cors_mode), main_task_runner_, |
| 368 // See http://crbug.com/514719 for details. | 367 url_index_, frame_, media_log_.get(), &buffered_data_source_host_, |
| 369 // Otherwise it's a regular request which requires resolving the URL first. | 368 base::Bind(&WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr()))); |
| 370 if (base::FeatureList::IsEnabled(kUseNewMediaCache)) { | |
| 371 // Remove this when MultiBufferDataSource becomes default. | |
| 372 LOG(WARNING) << "Using MultibufferDataSource"; | |
| 373 data_source_.reset(new MultibufferDataSource( | |
| 374 url, static_cast<UrlData::CORSMode>(cors_mode), main_task_runner_, | |
| 375 url_index_, frame_, media_log_.get(), &buffered_data_source_host_, | |
| 376 base::Bind(&WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr()))); | |
| 377 } else { | |
| 378 data_source_.reset(new BufferedDataSource( | |
| 379 url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode), | |
| 380 main_task_runner_, frame_, media_log_.get(), | |
| 381 &buffered_data_source_host_, | |
| 382 base::Bind(&WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr()))); | |
| 383 } | |
| 384 data_source_->SetPreload(preload_); | 369 data_source_->SetPreload(preload_); |
| 385 data_source_->SetBufferingStrategy(buffering_strategy_); | 370 data_source_->SetBufferingStrategy(buffering_strategy_); |
| 386 data_source_->Initialize( | 371 data_source_->Initialize( |
| 387 base::Bind(&WebMediaPlayerImpl::DataSourceInitialized, AsWeakPtr())); | 372 base::Bind(&WebMediaPlayerImpl::DataSourceInitialized, AsWeakPtr())); |
| 388 } | 373 } |
| 389 | 374 |
| 390 #if defined(OS_ANDROID) // WMPI_CAST | 375 #if defined(OS_ANDROID) // WMPI_CAST |
| 391 cast_impl_.Initialize(url, frame_, delegate_id_); | 376 cast_impl_.Initialize(url, frame_, delegate_id_); |
| 392 #endif | 377 #endif |
| 393 } | 378 } |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 | 541 |
| 557 media::OutputDeviceStatusCB callback = | 542 media::OutputDeviceStatusCB callback = |
| 558 media::ConvertToOutputDeviceStatusCB(web_callback); | 543 media::ConvertToOutputDeviceStatusCB(web_callback); |
| 559 media_task_runner_->PostTask( | 544 media_task_runner_->PostTask( |
| 560 FROM_HERE, | 545 FROM_HERE, |
| 561 base::Bind(&SetSinkIdOnMediaThread, audio_source_provider_, | 546 base::Bind(&SetSinkIdOnMediaThread, audio_source_provider_, |
| 562 sink_id.utf8(), static_cast<url::Origin>(security_origin), | 547 sink_id.utf8(), static_cast<url::Origin>(security_origin), |
| 563 callback)); | 548 callback)); |
| 564 } | 549 } |
| 565 | 550 |
| 566 STATIC_ASSERT_ENUM(WebMediaPlayer::PreloadNone, BufferedDataSource::NONE); | 551 STATIC_ASSERT_ENUM(WebMediaPlayer::PreloadNone, MultibufferDataSource::NONE); |
| 567 STATIC_ASSERT_ENUM(WebMediaPlayer::PreloadMetaData, | 552 STATIC_ASSERT_ENUM(WebMediaPlayer::PreloadMetaData, |
| 568 BufferedDataSource::METADATA); | 553 MultibufferDataSource::METADATA); |
| 569 STATIC_ASSERT_ENUM(WebMediaPlayer::PreloadAuto, BufferedDataSource::AUTO); | 554 STATIC_ASSERT_ENUM(WebMediaPlayer::PreloadAuto, MultibufferDataSource::AUTO); |
| 570 | 555 |
| 571 void WebMediaPlayerImpl::setPreload(WebMediaPlayer::Preload preload) { | 556 void WebMediaPlayerImpl::setPreload(WebMediaPlayer::Preload preload) { |
| 572 DVLOG(1) << __func__ << "(" << preload << ")"; | 557 DVLOG(1) << __func__ << "(" << preload << ")"; |
| 573 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 558 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 574 | 559 |
| 575 preload_ = static_cast<BufferedDataSource::Preload>(preload); | 560 preload_ = static_cast<MultibufferDataSource::Preload>(preload); |
| 576 if (data_source_) | 561 if (data_source_) |
| 577 data_source_->SetPreload(preload_); | 562 data_source_->SetPreload(preload_); |
| 578 } | 563 } |
| 579 | 564 |
| 580 STATIC_ASSERT_ENUM(WebMediaPlayer::BufferingStrategy::Normal, | 565 STATIC_ASSERT_ENUM(WebMediaPlayer::BufferingStrategy::Normal, |
| 581 BufferedDataSource::BUFFERING_STRATEGY_NORMAL); | 566 MultibufferDataSource::BUFFERING_STRATEGY_NORMAL); |
| 582 STATIC_ASSERT_ENUM(WebMediaPlayer::BufferingStrategy::Aggressive, | 567 STATIC_ASSERT_ENUM(WebMediaPlayer::BufferingStrategy::Aggressive, |
| 583 BufferedDataSource::BUFFERING_STRATEGY_AGGRESSIVE); | 568 MultibufferDataSource::BUFFERING_STRATEGY_AGGRESSIVE); |
| 584 | 569 |
| 585 void WebMediaPlayerImpl::setBufferingStrategy( | 570 void WebMediaPlayerImpl::setBufferingStrategy( |
| 586 WebMediaPlayer::BufferingStrategy buffering_strategy) { | 571 WebMediaPlayer::BufferingStrategy buffering_strategy) { |
| 587 DVLOG(1) << __func__; | 572 DVLOG(1) << __func__; |
| 588 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 573 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 589 | 574 |
| 590 #if defined(OS_ANDROID) | 575 #if defined(OS_ANDROID) |
| 591 // We disallow aggressive buffering on Android since it matches the behavior | 576 // We disallow aggressive buffering on Android since it matches the behavior |
| 592 // of the platform media player and may have data usage penalties. | 577 // of the platform media player and may have data usage penalties. |
| 593 // TODO(dalecurtis, hubbe): We should probably stop using "pause-and-buffer" | 578 // TODO(dalecurtis, hubbe): We should probably stop using "pause-and-buffer" |
| 594 // everywhere. See http://crbug.com/594669 for more details. | 579 // everywhere. See http://crbug.com/594669 for more details. |
| 595 buffering_strategy_ = BufferedDataSource::BUFFERING_STRATEGY_NORMAL; | 580 buffering_strategy_ = MultibufferDataSource::BUFFERING_STRATEGY_NORMAL; |
| 596 #else | 581 #else |
| 597 buffering_strategy_ = | 582 buffering_strategy_ = |
| 598 static_cast<BufferedDataSource::BufferingStrategy>(buffering_strategy); | 583 static_cast<MultibufferDataSource::BufferingStrategy>(buffering_strategy); |
| 599 #endif | 584 #endif |
| 600 | 585 |
| 601 if (data_source_) | 586 if (data_source_) |
| 602 data_source_->SetBufferingStrategy(buffering_strategy_); | 587 data_source_->SetBufferingStrategy(buffering_strategy_); |
| 603 } | 588 } |
| 604 | 589 |
| 605 bool WebMediaPlayerImpl::hasVideo() const { | 590 bool WebMediaPlayerImpl::hasVideo() const { |
| 606 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 591 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 607 | 592 |
| 608 return pipeline_metadata_.has_video; | 593 return pipeline_metadata_.has_video; |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 if (isRemote()) { | 978 if (isRemote()) { |
| 994 scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner(); | 979 scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner(); |
| 995 if (frame) | 980 if (frame) |
| 996 compositor_->PaintSingleFrame(frame); | 981 compositor_->PaintSingleFrame(frame); |
| 997 } | 982 } |
| 998 #endif | 983 #endif |
| 999 | 984 |
| 1000 // If we're not in an aggressive buffering state, tell the data source we have | 985 // If we're not in an aggressive buffering state, tell the data source we have |
| 1001 // enough data so that it may release the connection. | 986 // enough data so that it may release the connection. |
| 1002 if (buffering_strategy_ != | 987 if (buffering_strategy_ != |
| 1003 BufferedDataSource::BUFFERING_STRATEGY_AGGRESSIVE) { | 988 MultibufferDataSource::BUFFERING_STRATEGY_AGGRESSIVE) { |
| 1004 if (data_source_) | 989 if (data_source_) |
| 1005 data_source_->OnBufferingHaveEnough(true); | 990 data_source_->OnBufferingHaveEnough(true); |
| 1006 } | 991 } |
| 1007 | 992 |
| 1008 ReportMemoryUsage(); | 993 ReportMemoryUsage(); |
| 1009 | 994 |
| 1010 if (pending_suspend_resume_cycle_) { | 995 if (pending_suspend_resume_cycle_) { |
| 1011 pending_suspend_resume_cycle_ = false; | 996 pending_suspend_resume_cycle_ = false; |
| 1012 UpdatePlayState(); | 997 UpdatePlayState(); |
| 1013 } | 998 } |
| (...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1805 pipeline_metadata_.natural_size, | 1790 pipeline_metadata_.natural_size, |
| 1806 base::Bind(&GetCurrentTimeInternal, this))); | 1791 base::Bind(&GetCurrentTimeInternal, this))); |
| 1807 watch_time_reporter_->OnVolumeChange(volume_); | 1792 watch_time_reporter_->OnVolumeChange(volume_); |
| 1808 if (delegate_ && delegate_->IsHidden()) | 1793 if (delegate_ && delegate_->IsHidden()) |
| 1809 watch_time_reporter_->OnHidden(); | 1794 watch_time_reporter_->OnHidden(); |
| 1810 else | 1795 else |
| 1811 watch_time_reporter_->OnShown(); | 1796 watch_time_reporter_->OnShown(); |
| 1812 } | 1797 } |
| 1813 | 1798 |
| 1814 } // namespace media | 1799 } // namespace media |
| OLD | NEW |