Chromium Code Reviews| 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 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 228 #if defined(OS_ANDROID) // WMPI_CAST | 228 #if defined(OS_ANDROID) // WMPI_CAST |
| 229 cast_impl_(this, client_, params->context_3d_cb()), | 229 cast_impl_(this, client_, params->context_3d_cb()), |
| 230 #endif | 230 #endif |
| 231 volume_(1.0), | 231 volume_(1.0), |
| 232 volume_multiplier_(1.0), | 232 volume_multiplier_(1.0), |
| 233 renderer_factory_selector_(std::move(renderer_factory_selector)), | 233 renderer_factory_selector_(std::move(renderer_factory_selector)), |
| 234 surface_manager_(params->surface_manager()), | 234 surface_manager_(params->surface_manager()), |
| 235 overlay_surface_id_(SurfaceManager::kNoSurfaceID), | 235 overlay_surface_id_(SurfaceManager::kNoSurfaceID), |
| 236 suppress_destruction_errors_(false), | 236 suppress_destruction_errors_(false), |
| 237 suspend_enabled_(params->allow_suspend()), | 237 suspend_enabled_(params->allow_suspend()), |
| 238 use_fallback_path_(false), | |
| 239 is_encrypted_(false), | 238 is_encrypted_(false), |
| 240 preroll_attempt_pending_(false), | 239 preroll_attempt_pending_(false), |
| 241 observer_(params->media_observer()), | 240 observer_(params->media_observer()), |
| 242 max_keyframe_distance_to_disable_background_video_( | 241 max_keyframe_distance_to_disable_background_video_( |
| 243 params->max_keyframe_distance_to_disable_background_video()), | 242 params->max_keyframe_distance_to_disable_background_video()), |
| 244 max_keyframe_distance_to_disable_background_video_mse_( | 243 max_keyframe_distance_to_disable_background_video_mse_( |
| 245 params->max_keyframe_distance_to_disable_background_video_mse()), | 244 params->max_keyframe_distance_to_disable_background_video_mse()), |
| 246 enable_instant_source_buffer_gc_( | 245 enable_instant_source_buffer_gc_( |
| 247 params->enable_instant_source_buffer_gc()), | 246 params->enable_instant_source_buffer_gc()), |
| 248 embedded_media_experience_enabled_( | 247 embedded_media_experience_enabled_( |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 398 CORSMode cors_mode) { | 397 CORSMode cors_mode) { |
| 399 DVLOG(1) << __func__; | 398 DVLOG(1) << __func__; |
| 400 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 399 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 401 | 400 |
| 402 GURL gurl(url); | 401 GURL gurl(url); |
| 403 ReportMetrics(load_type, gurl, frame_->GetSecurityOrigin(), media_log_.get()); | 402 ReportMetrics(load_type, gurl, frame_->GetSecurityOrigin(), media_log_.get()); |
| 404 | 403 |
| 405 // Set subresource URL for crash reporting. | 404 // Set subresource URL for crash reporting. |
| 406 base::debug::SetCrashKeyValue("subresource_url", gurl.spec()); | 405 base::debug::SetCrashKeyValue("subresource_url", gurl.spec()); |
| 407 | 406 |
| 408 if (use_fallback_path_) | 407 // Used for HLS playback. |
| 409 fallback_url_ = gurl; | 408 loaded_url_ = gurl; |
| 410 | 409 |
| 411 load_type_ = load_type; | 410 load_type_ = load_type; |
| 412 | 411 |
| 413 SetNetworkState(WebMediaPlayer::kNetworkStateLoading); | 412 SetNetworkState(WebMediaPlayer::kNetworkStateLoading); |
| 414 SetReadyState(WebMediaPlayer::kReadyStateHaveNothing); | 413 SetReadyState(WebMediaPlayer::kReadyStateHaveNothing); |
| 415 media_log_->AddEvent(media_log_->CreateLoadEvent(url.GetString().Utf8())); | 414 media_log_->AddEvent(media_log_->CreateLoadEvent(url.GetString().Utf8())); |
| 416 | 415 |
| 417 // Media source pipelines can start immediately. | 416 // Media source pipelines can start immediately. |
| 418 if (load_type == kLoadTypeMediaSource) { | 417 if (load_type == kLoadTypeMediaSource) { |
| 419 supports_save_ = false; | 418 supports_save_ = false; |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 809 if (ready_state_ < WebMediaPlayer::kReadyStateHaveMetadata) | 808 if (ready_state_ < WebMediaPlayer::kReadyStateHaveMetadata) |
| 810 return blink::WebTimeRanges(); | 809 return blink::WebTimeRanges(); |
| 811 | 810 |
| 812 const double seekable_end = Duration(); | 811 const double seekable_end = Duration(); |
| 813 | 812 |
| 814 // Allow a special exception for seeks to zero for streaming sources with a | 813 // Allow a special exception for seeks to zero for streaming sources with a |
| 815 // finite duration; this allows looping to work. | 814 // finite duration; this allows looping to work. |
| 816 const bool is_finite_stream = data_source_ && data_source_->IsStreaming() && | 815 const bool is_finite_stream = data_source_ && data_source_->IsStreaming() && |
| 817 std::isfinite(seekable_end); | 816 std::isfinite(seekable_end); |
| 818 | 817 |
| 819 // Do not change the seekable range when using the fallback path. | 818 // Do not change the seekable range when using the MediaPlayerRenderer. It |
| 820 // The MediaPlayerRenderer will take care of dropping invalid seeks. | 819 // will take care of dropping invalid seeks. |
| 821 const bool force_seeks_to_zero = !use_fallback_path_ && is_finite_stream; | 820 const bool force_seeks_to_zero = |
| 821 !using_media_player_renderer_ && is_finite_stream; | |
| 822 | 822 |
| 823 // TODO(dalecurtis): Technically this allows seeking on media which return an | 823 // TODO(dalecurtis): Technically this allows seeking on media which return an |
| 824 // infinite duration so long as DataSource::IsStreaming() is false. While not | 824 // infinite duration so long as DataSource::IsStreaming() is false. While not |
| 825 // expected, disabling this breaks semi-live players, http://crbug.com/427412. | 825 // expected, disabling this breaks semi-live players, http://crbug.com/427412. |
| 826 const blink::WebTimeRange seekable_range( | 826 const blink::WebTimeRange seekable_range( |
| 827 0.0, force_seeks_to_zero ? 0.0 : seekable_end); | 827 0.0, force_seeks_to_zero ? 0.0 : seekable_end); |
| 828 return blink::WebTimeRanges(&seekable_range, 1); | 828 return blink::WebTimeRanges(&seekable_range, 1); |
| 829 } | 829 } |
| 830 | 830 |
| 831 bool WebMediaPlayerImpl::IsPrerollAttemptNeeded() { | 831 bool WebMediaPlayerImpl::IsPrerollAttemptNeeded() { |
| (...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1608 if (!video_weblayer_) | 1608 if (!video_weblayer_) |
| 1609 return pipeline_metadata_.natural_size; | 1609 return pipeline_metadata_.natural_size; |
| 1610 | 1610 |
| 1611 return video_weblayer_->Bounds(); | 1611 return video_weblayer_->Bounds(); |
| 1612 } | 1612 } |
| 1613 | 1613 |
| 1614 void WebMediaPlayerImpl::SetDeviceScaleFactor(float scale_factor) { | 1614 void WebMediaPlayerImpl::SetDeviceScaleFactor(float scale_factor) { |
| 1615 cast_impl_.SetDeviceScaleFactor(scale_factor); | 1615 cast_impl_.SetDeviceScaleFactor(scale_factor); |
| 1616 } | 1616 } |
| 1617 | 1617 |
| 1618 void WebMediaPlayerImpl::SetUseFallbackPath(bool use_fallback_path) { | |
| 1619 use_fallback_path_ = use_fallback_path; | |
| 1620 } | |
| 1621 | |
| 1622 void WebMediaPlayerImpl::SetPoster(const blink::WebURL& poster) { | 1618 void WebMediaPlayerImpl::SetPoster(const blink::WebURL& poster) { |
| 1623 cast_impl_.setPoster(poster); | 1619 cast_impl_.setPoster(poster); |
| 1624 } | 1620 } |
| 1625 #endif // defined(OS_ANDROID) // WMPI_CAST | 1621 #endif // defined(OS_ANDROID) // WMPI_CAST |
| 1626 | 1622 |
| 1627 void WebMediaPlayerImpl::DataSourceInitialized(bool success) { | 1623 void WebMediaPlayerImpl::DataSourceInitialized(bool success) { |
| 1628 DVLOG(1) << __func__; | 1624 DVLOG(1) << __func__; |
| 1629 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1625 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 1630 | 1626 |
| 1631 #if defined(OS_ANDROID) | 1627 #if defined(OS_ANDROID) |
| 1632 // We can't play HLS URLs with WebMediaPlayerImpl, so in cases where they are | 1628 // We can't play HLS URLs with WebMediaPlayerImpl, so in cases where they are |
| 1633 // encountered, instruct the HTML media element to create a new WebMediaPlayer | 1629 // encountered, instruct the HTML media element to use the MediaPlayerRenderer |
| 1634 // instance with the correct URL to trigger the creation of WMPI with a | 1630 // instead. |
| 1635 // MediaPlayerRendererFactory instead. | |
| 1636 // | 1631 // |
| 1637 // TODO(tguilbert): Allow 'hotswapping' renderer factories to prevent reloads | 1632 // TODO(tguilbert): Detect the presence of HLS based on demuxing results, |
| 1638 // and/or rely on demuxer extracted MediaContainerNames. See crbug.com/663503. | 1633 // rather than the URL string. See crbug.com/663503. |
| 1639 if (data_source_ && !use_fallback_path_) { | 1634 if (data_source_) { |
| 1640 const GURL url_after_redirects = data_source_->GetUrlAfterRedirects(); | 1635 const GURL url_after_redirects = data_source_->GetUrlAfterRedirects(); |
| 1641 if (MediaCodecUtil::IsHLSURL(url_after_redirects)) { | 1636 if (MediaCodecUtil::IsHLSURL(url_after_redirects)) { |
|
DaleCurtis
2017/04/25 16:36:34
A later change will switch this to also include th
tguilbert
2017/04/25 20:22:32
Yes. I already have most of the code written:
http
| |
| 1642 client_->RequestReload(url_after_redirects); | 1637 renderer_factory_selector_->SetUseMediaPlayer(true); |
|
DaleCurtis
2017/04/25 16:36:34
Probably this API can be deleted in a future CL no
tguilbert
2017/04/25 20:22:32
You are right! I opened 715244 to track the work.
| |
| 1643 // |this| may be destructed, do nothing after this. | |
| 1644 return; | |
| 1645 } | 1638 } |
| 1646 } | 1639 } |
| 1647 #endif | 1640 #endif |
| 1648 | 1641 |
| 1649 if (!success) { | 1642 if (!success) { |
| 1650 SetNetworkState(WebMediaPlayer::kNetworkStateFormatError); | 1643 SetNetworkState(WebMediaPlayer::kNetworkStateFormatError); |
| 1651 | 1644 |
| 1652 // Not really necessary, since the pipeline was never started, but it at | 1645 // Not really necessary, since the pipeline was never started, but it at |
| 1653 // least this makes sure that the error handling code is in sync. | 1646 // least this makes sure that the error handling code is in sync. |
| 1654 UpdatePlayState(); | 1647 UpdatePlayState(); |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 1680 else | 1673 else |
| 1681 set_surface_cb_.Run(surface_id); | 1674 set_surface_cb_.Run(surface_id); |
| 1682 } | 1675 } |
| 1683 } | 1676 } |
| 1684 | 1677 |
| 1685 void WebMediaPlayerImpl::OnSurfaceRequested( | 1678 void WebMediaPlayerImpl::OnSurfaceRequested( |
| 1686 bool decoder_requires_restart_for_overlay, | 1679 bool decoder_requires_restart_for_overlay, |
| 1687 const SurfaceCreatedCB& set_surface_cb) { | 1680 const SurfaceCreatedCB& set_surface_cb) { |
| 1688 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1681 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 1689 DCHECK(surface_manager_); | 1682 DCHECK(surface_manager_); |
| 1690 DCHECK(!use_fallback_path_); | |
| 1691 | 1683 |
| 1692 // A null callback indicates that the decoder is going away. | 1684 // A null callback indicates that the decoder is going away. |
| 1693 if (set_surface_cb.is_null()) { | 1685 if (set_surface_cb.is_null()) { |
| 1694 decoder_requires_restart_for_overlay_ = false; | 1686 decoder_requires_restart_for_overlay_ = false; |
| 1695 set_surface_cb_.Reset(); | 1687 set_surface_cb_.Reset(); |
| 1696 return; | 1688 return; |
| 1697 } | 1689 } |
| 1698 | 1690 |
| 1699 // If we get a surface request it means GpuVideoDecoder is initializing, so | 1691 // If we get a surface request it means GpuVideoDecoder is initializing, so |
| 1700 // until we get a null surface request, GVD is the active decoder. | 1692 // until we get a null surface request, GVD is the active decoder. |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1730 compositor_, request_surface_cb); | 1722 compositor_, request_surface_cb); |
| 1731 } | 1723 } |
| 1732 | 1724 |
| 1733 void WebMediaPlayerImpl::StartPipeline() { | 1725 void WebMediaPlayerImpl::StartPipeline() { |
| 1734 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1726 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 1735 | 1727 |
| 1736 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = | 1728 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = |
| 1737 BindToCurrentLoop(base::Bind( | 1729 BindToCurrentLoop(base::Bind( |
| 1738 &WebMediaPlayerImpl::OnEncryptedMediaInitData, AsWeakPtr())); | 1730 &WebMediaPlayerImpl::OnEncryptedMediaInitData, AsWeakPtr())); |
| 1739 | 1731 |
| 1740 if (use_fallback_path_) { | 1732 if (renderer_factory_selector_->GetCurrentFactory() |
| 1733 ->GetRequiredMediaResourceType() == MediaResource::Type::URL) { | |
| 1734 if (data_source_) { | |
|
DaleCurtis
2017/04/25 16:36:34
Drop {} from single-line if.
tguilbert
2017/04/25 20:22:32
Done.
| |
| 1735 loaded_url_ = data_source_->GetUrlAfterRedirects(); | |
| 1736 } | |
| 1737 | |
| 1738 // MediaPlayerRendererClient factory is the only factory that a | |
| 1739 // MediaResource::Type::URL for the moment. This might no longer be true | |
| 1740 // when we remove WebMediaPlayerCast. | |
| 1741 // | |
| 1742 // TODO(tguilbert/avayvod): Update this flag when removing |cast_impl_|. | |
| 1743 using_media_player_renderer_ = true; | |
| 1744 | |
| 1741 demuxer_.reset( | 1745 demuxer_.reset( |
| 1742 new MediaUrlDemuxer(media_task_runner_, fallback_url_, | 1746 new MediaUrlDemuxer(media_task_runner_, loaded_url_, |
| 1743 frame_->GetDocument().FirstPartyForCookies())); | 1747 frame_->GetDocument().FirstPartyForCookies())); |
| 1744 pipeline_controller_.Start(demuxer_.get(), this, false, false); | 1748 pipeline_controller_.Start(demuxer_.get(), this, false, false); |
| 1745 return; | 1749 return; |
| 1746 } | 1750 } |
| 1747 | 1751 |
| 1748 // Figure out which demuxer to use. | 1752 // Figure out which demuxer to use. |
| 1749 if (load_type_ != kLoadTypeMediaSource) { | 1753 if (load_type_ != kLoadTypeMediaSource) { |
| 1750 DCHECK(!chunk_demuxer_); | 1754 DCHECK(!chunk_demuxer_); |
| 1751 DCHECK(data_source_); | 1755 DCHECK(data_source_); |
| 1752 | 1756 |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2395 | 2399 |
| 2396 if (is_encrypted_) | 2400 if (is_encrypted_) |
| 2397 UMA_HISTOGRAM_VIDEO_HEIGHT("Media.VideoHeight.Initial.EME", height); | 2401 UMA_HISTOGRAM_VIDEO_HEIGHT("Media.VideoHeight.Initial.EME", height); |
| 2398 | 2402 |
| 2399 UMA_HISTOGRAM_VIDEO_HEIGHT("Media.VideoHeight.Initial.All", height); | 2403 UMA_HISTOGRAM_VIDEO_HEIGHT("Media.VideoHeight.Initial.All", height); |
| 2400 } | 2404 } |
| 2401 | 2405 |
| 2402 #undef UMA_HISTOGRAM_VIDEO_HEIGHT | 2406 #undef UMA_HISTOGRAM_VIDEO_HEIGHT |
| 2403 | 2407 |
| 2404 } // namespace media | 2408 } // namespace media |
| OLD | NEW |