| 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 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 } // namespace | 157 } // namespace |
| 158 | 158 |
| 159 class BufferedDataSourceHostImpl; | 159 class BufferedDataSourceHostImpl; |
| 160 | 160 |
| 161 STATIC_ASSERT_ENUM(WebMediaPlayer::CORSModeUnspecified, | 161 STATIC_ASSERT_ENUM(WebMediaPlayer::CORSModeUnspecified, |
| 162 UrlData::CORS_UNSPECIFIED); | 162 UrlData::CORS_UNSPECIFIED); |
| 163 STATIC_ASSERT_ENUM(WebMediaPlayer::CORSModeAnonymous, UrlData::CORS_ANONYMOUS); | 163 STATIC_ASSERT_ENUM(WebMediaPlayer::CORSModeAnonymous, UrlData::CORS_ANONYMOUS); |
| 164 STATIC_ASSERT_ENUM(WebMediaPlayer::CORSModeUseCredentials, | 164 STATIC_ASSERT_ENUM(WebMediaPlayer::CORSModeUseCredentials, |
| 165 UrlData::CORS_USE_CREDENTIALS); | 165 UrlData::CORS_USE_CREDENTIALS); |
| 166 | 166 |
| 167 #define BIND_TO_RENDER_LOOP(function) \ | |
| 168 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ | |
| 169 BindToCurrentLoop(base::Bind(function, AsWeakPtr()))) | |
| 170 | |
| 171 #define BIND_TO_RENDER_LOOP1(function, arg1) \ | |
| 172 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ | |
| 173 BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1))) | |
| 174 | |
| 175 WebMediaPlayerImpl::WebMediaPlayerImpl( | 167 WebMediaPlayerImpl::WebMediaPlayerImpl( |
| 176 blink::WebLocalFrame* frame, | 168 blink::WebLocalFrame* frame, |
| 177 blink::WebMediaPlayerClient* client, | 169 blink::WebMediaPlayerClient* client, |
| 178 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, | 170 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, |
| 179 WebMediaPlayerDelegate* delegate, | 171 WebMediaPlayerDelegate* delegate, |
| 180 std::unique_ptr<RendererFactory> renderer_factory, | 172 std::unique_ptr<RendererFactory> renderer_factory, |
| 181 linked_ptr<UrlIndex> url_index, | 173 linked_ptr<UrlIndex> url_index, |
| 182 const WebMediaPlayerParams& params) | 174 const WebMediaPlayerParams& params) |
| 183 : frame_(frame), | 175 : frame_(frame), |
| 184 delegate_state_(DelegateState::GONE), | 176 delegate_state_(DelegateState::GONE), |
| (...skipping 1249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1434 | 1426 |
| 1435 if (watch_time_reporter_) | 1427 if (watch_time_reporter_) |
| 1436 watch_time_reporter_->OnShown(); | 1428 watch_time_reporter_->OnShown(); |
| 1437 | 1429 |
| 1438 // Only track the time to the first frame if playing or about to play because | 1430 // Only track the time to the first frame if playing or about to play because |
| 1439 // of being shown and only for videos we would optimize background playback | 1431 // of being shown and only for videos we would optimize background playback |
| 1440 // for. | 1432 // for. |
| 1441 if ((!paused_ && IsBackgroundOptimizationCandidate()) || | 1433 if ((!paused_ && IsBackgroundOptimizationCandidate()) || |
| 1442 paused_when_hidden_) { | 1434 paused_when_hidden_) { |
| 1443 VideoFrameCompositor::OnNewProcessedFrameCB new_processed_frame_cb = | 1435 VideoFrameCompositor::OnNewProcessedFrameCB new_processed_frame_cb = |
| 1444 BIND_TO_RENDER_LOOP1( | 1436 BindToCurrentLoop(base::Bind( |
| 1445 &WebMediaPlayerImpl::ReportTimeFromForegroundToFirstFrame, | 1437 &WebMediaPlayerImpl::ReportTimeFromForegroundToFirstFrame, |
| 1446 base::TimeTicks::Now()); | 1438 AsWeakPtr(), base::TimeTicks::Now())); |
| 1447 compositor_task_runner_->PostTask( | 1439 compositor_task_runner_->PostTask( |
| 1448 FROM_HERE, | 1440 FROM_HERE, |
| 1449 base::Bind(&VideoFrameCompositor::SetOnNewProcessedFrameCallback, | 1441 base::Bind(&VideoFrameCompositor::SetOnNewProcessedFrameCallback, |
| 1450 base::Unretained(compositor_), new_processed_frame_cb)); | 1442 base::Unretained(compositor_), new_processed_frame_cb)); |
| 1451 } | 1443 } |
| 1452 | 1444 |
| 1453 if (paused_when_hidden_) { | 1445 if (paused_when_hidden_) { |
| 1454 paused_when_hidden_ = false; | 1446 paused_when_hidden_ = false; |
| 1455 OnPlay(); // Calls UpdatePlayState() so return afterwards. | 1447 OnPlay(); // Calls UpdatePlayState() so return afterwards. |
| 1456 return; | 1448 return; |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1659 | 1651 |
| 1660 // If we're waiting for the surface to arrive, OnSurfaceCreated() will be | 1652 // If we're waiting for the surface to arrive, OnSurfaceCreated() will be |
| 1661 // called later when it arrives; so do nothing for now. | 1653 // called later when it arrives; so do nothing for now. |
| 1662 if (overlay_enabled_ && overlay_surface_id_ == SurfaceManager::kNoSurfaceID) | 1654 if (overlay_enabled_ && overlay_surface_id_ == SurfaceManager::kNoSurfaceID) |
| 1663 return; | 1655 return; |
| 1664 | 1656 |
| 1665 OnSurfaceCreated(overlay_surface_id_); | 1657 OnSurfaceCreated(overlay_surface_id_); |
| 1666 } | 1658 } |
| 1667 | 1659 |
| 1668 std::unique_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { | 1660 std::unique_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { |
| 1661 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 1662 |
| 1669 if (force_video_overlays_) | 1663 if (force_video_overlays_) |
| 1670 EnableOverlay(); | 1664 EnableOverlay(); |
| 1671 | 1665 |
| 1672 RequestSurfaceCB request_surface_cb; | 1666 RequestSurfaceCB request_surface_cb; |
| 1673 #if defined(OS_ANDROID) | 1667 #if defined(OS_ANDROID) |
| 1674 request_surface_cb = | 1668 request_surface_cb = BindToCurrentLoop( |
| 1675 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnSurfaceRequested); | 1669 base::Bind(&WebMediaPlayerImpl::OnSurfaceRequested, AsWeakPtr())); |
| 1676 #endif | 1670 #endif |
| 1677 return renderer_factory_->CreateRenderer( | 1671 return renderer_factory_->CreateRenderer( |
| 1678 media_task_runner_, worker_task_runner_, audio_source_provider_.get(), | 1672 media_task_runner_, worker_task_runner_, audio_source_provider_.get(), |
| 1679 compositor_, request_surface_cb); | 1673 compositor_, request_surface_cb); |
| 1680 } | 1674 } |
| 1681 | 1675 |
| 1682 void WebMediaPlayerImpl::StartPipeline() { | 1676 void WebMediaPlayerImpl::StartPipeline() { |
| 1683 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1677 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 1684 | 1678 |
| 1685 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = | 1679 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = |
| 1686 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnEncryptedMediaInitData); | 1680 BindToCurrentLoop(base::Bind( |
| 1681 &WebMediaPlayerImpl::OnEncryptedMediaInitData, AsWeakPtr())); |
| 1687 | 1682 |
| 1688 if (use_fallback_path_) { | 1683 if (use_fallback_path_) { |
| 1689 demuxer_.reset( | 1684 demuxer_.reset( |
| 1690 new MediaUrlDemuxer(media_task_runner_, fallback_url_, | 1685 new MediaUrlDemuxer(media_task_runner_, fallback_url_, |
| 1691 frame_->document().firstPartyForCookies())); | 1686 frame_->document().firstPartyForCookies())); |
| 1692 pipeline_controller_.Start(demuxer_.get(), this, false, false); | 1687 pipeline_controller_.Start(demuxer_.get(), this, false, false); |
| 1693 return; | 1688 return; |
| 1694 } | 1689 } |
| 1695 | 1690 |
| 1696 // Figure out which demuxer to use. | 1691 // Figure out which demuxer to use. |
| 1697 if (load_type_ != LoadTypeMediaSource) { | 1692 if (load_type_ != LoadTypeMediaSource) { |
| 1698 DCHECK(!chunk_demuxer_); | 1693 DCHECK(!chunk_demuxer_); |
| 1699 DCHECK(data_source_); | 1694 DCHECK(data_source_); |
| 1700 | 1695 |
| 1701 #if !defined(MEDIA_DISABLE_FFMPEG) | 1696 #if !defined(MEDIA_DISABLE_FFMPEG) |
| 1702 Demuxer::MediaTracksUpdatedCB media_tracks_updated_cb = | 1697 Demuxer::MediaTracksUpdatedCB media_tracks_updated_cb = |
| 1703 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnFFmpegMediaTracksUpdated); | 1698 BindToCurrentLoop(base::Bind( |
| 1699 &WebMediaPlayerImpl::OnFFmpegMediaTracksUpdated, AsWeakPtr())); |
| 1704 | 1700 |
| 1705 demuxer_.reset(new FFmpegDemuxer(media_task_runner_, data_source_.get(), | 1701 demuxer_.reset(new FFmpegDemuxer(media_task_runner_, data_source_.get(), |
| 1706 encrypted_media_init_data_cb, | 1702 encrypted_media_init_data_cb, |
| 1707 media_tracks_updated_cb, media_log_)); | 1703 media_tracks_updated_cb, media_log_)); |
| 1708 #else | 1704 #else |
| 1709 OnError(PipelineStatus::DEMUXER_ERROR_COULD_NOT_OPEN); | 1705 OnError(PipelineStatus::DEMUXER_ERROR_COULD_NOT_OPEN); |
| 1710 return; | 1706 return; |
| 1711 #endif | 1707 #endif |
| 1712 } else { | 1708 } else { |
| 1713 DCHECK(!chunk_demuxer_); | 1709 DCHECK(!chunk_demuxer_); |
| 1714 DCHECK(!data_source_); | 1710 DCHECK(!data_source_); |
| 1715 | 1711 |
| 1716 chunk_demuxer_ = new ChunkDemuxer( | 1712 chunk_demuxer_ = new ChunkDemuxer( |
| 1717 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), | 1713 BindToCurrentLoop( |
| 1714 base::Bind(&WebMediaPlayerImpl::OnDemuxerOpened, AsWeakPtr())), |
| 1718 encrypted_media_init_data_cb, media_log_); | 1715 encrypted_media_init_data_cb, media_log_); |
| 1719 demuxer_.reset(chunk_demuxer_); | 1716 demuxer_.reset(chunk_demuxer_); |
| 1720 } | 1717 } |
| 1721 | 1718 |
| 1722 // TODO(sandersd): FileSystem objects may also be non-static, but due to our | 1719 // TODO(sandersd): FileSystem objects may also be non-static, but due to our |
| 1723 // caching layer such situations are broken already. http://crbug.com/593159 | 1720 // caching layer such situations are broken already. http://crbug.com/593159 |
| 1724 bool is_static = !chunk_demuxer_; | 1721 bool is_static = !chunk_demuxer_; |
| 1725 bool is_streaming = IsStreaming(); | 1722 bool is_streaming = IsStreaming(); |
| 1726 UMA_HISTOGRAM_BOOLEAN("Media.IsStreaming", is_streaming); | 1723 UMA_HISTOGRAM_BOOLEAN("Media.IsStreaming", is_streaming); |
| 1727 | 1724 |
| (...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2257 UMA_HISTOGRAM_TIMES( | 2254 UMA_HISTOGRAM_TIMES( |
| 2258 "Media.Video.TimeFromForegroundToFirstFrame.DisableTrack", | 2255 "Media.Video.TimeFromForegroundToFirstFrame.DisableTrack", |
| 2259 time_to_first_frame); | 2256 time_to_first_frame); |
| 2260 } else { | 2257 } else { |
| 2261 UMA_HISTOGRAM_TIMES("Media.Video.TimeFromForegroundToFirstFrame.Paused", | 2258 UMA_HISTOGRAM_TIMES("Media.Video.TimeFromForegroundToFirstFrame.Paused", |
| 2262 time_to_first_frame); | 2259 time_to_first_frame); |
| 2263 } | 2260 } |
| 2264 } | 2261 } |
| 2265 | 2262 |
| 2266 } // namespace media | 2263 } // namespace media |
| OLD | NEW |