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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
160 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ | 160 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ |
161 BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1))) | 161 BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1))) |
162 | 162 |
163 WebMediaPlayerImpl::WebMediaPlayerImpl( | 163 WebMediaPlayerImpl::WebMediaPlayerImpl( |
164 blink::WebLocalFrame* frame, | 164 blink::WebLocalFrame* frame, |
165 blink::WebMediaPlayerClient* client, | 165 blink::WebMediaPlayerClient* client, |
166 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, | 166 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, |
167 base::WeakPtr<WebMediaPlayerDelegate> delegate, | 167 base::WeakPtr<WebMediaPlayerDelegate> delegate, |
168 std::unique_ptr<RendererFactory> renderer_factory, | 168 std::unique_ptr<RendererFactory> renderer_factory, |
169 linked_ptr<UrlIndex> url_index, | 169 linked_ptr<UrlIndex> url_index, |
170 RendererController* renderer_controller, | |
170 const WebMediaPlayerParams& params) | 171 const WebMediaPlayerParams& params) |
171 : frame_(frame), | 172 : frame_(frame), |
172 delegate_state_(DelegateState::GONE), | 173 delegate_state_(DelegateState::GONE), |
173 is_idle_(false), | 174 is_idle_(false), |
174 must_suspend_(false), | 175 must_suspend_(false), |
175 network_state_(WebMediaPlayer::NetworkStateEmpty), | 176 network_state_(WebMediaPlayer::NetworkStateEmpty), |
176 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 177 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
177 highest_ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 178 highest_ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
178 preload_(MultibufferDataSource::AUTO), | 179 preload_(MultibufferDataSource::AUTO), |
179 buffering_strategy_(MultibufferDataSource::BUFFERING_STRATEGY_NORMAL), | 180 buffering_strategy_(MultibufferDataSource::BUFFERING_STRATEGY_NORMAL), |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
220 cast_impl_(this, client_, params.context_3d_cb()), | 221 cast_impl_(this, client_, params.context_3d_cb()), |
221 #endif | 222 #endif |
222 volume_(1.0), | 223 volume_(1.0), |
223 volume_multiplier_(1.0), | 224 volume_multiplier_(1.0), |
224 renderer_factory_(std::move(renderer_factory)), | 225 renderer_factory_(std::move(renderer_factory)), |
225 surface_manager_(params.surface_manager()), | 226 surface_manager_(params.surface_manager()), |
226 overlay_surface_id_(SurfaceManager::kNoSurfaceID), | 227 overlay_surface_id_(SurfaceManager::kNoSurfaceID), |
227 suppress_destruction_errors_(false), | 228 suppress_destruction_errors_(false), |
228 can_suspend_state_(CanSuspendState::UNKNOWN), | 229 can_suspend_state_(CanSuspendState::UNKNOWN), |
229 is_encrypted_(false), | 230 is_encrypted_(false), |
230 underflow_count_(0) { | 231 underflow_count_(0), |
232 renderer_controller_(renderer_controller) { | |
231 DCHECK(!adjust_allocated_memory_cb_.is_null()); | 233 DCHECK(!adjust_allocated_memory_cb_.is_null()); |
232 DCHECK(renderer_factory_); | 234 DCHECK(renderer_factory_); |
233 DCHECK(client_); | 235 DCHECK(client_); |
234 | 236 |
235 force_video_overlays_ = base::CommandLine::ForCurrentProcess()->HasSwitch( | 237 force_video_overlays_ = base::CommandLine::ForCurrentProcess()->HasSwitch( |
236 switches::kForceVideoOverlays); | 238 switches::kForceVideoOverlays); |
237 | 239 |
238 disable_fullscreen_video_overlays_ = | 240 disable_fullscreen_video_overlays_ = |
239 !base::FeatureList::IsEnabled(media::kOverlayFullscreenVideo); | 241 !base::FeatureList::IsEnabled(media::kOverlayFullscreenVideo); |
240 | 242 |
(...skipping 10 matching lines...) Expand all Loading... | |
251 } | 253 } |
252 | 254 |
253 // TODO(xhwang): When we use an external Renderer, many methods won't work, | 255 // TODO(xhwang): When we use an external Renderer, many methods won't work, |
254 // e.g. GetCurrentFrameFromCompositor(). See http://crbug.com/434861 | 256 // e.g. GetCurrentFrameFromCompositor(). See http://crbug.com/434861 |
255 | 257 |
256 // Use the null sink if no sink was provided. | 258 // Use the null sink if no sink was provided. |
257 audio_source_provider_ = new WebAudioSourceProviderImpl( | 259 audio_source_provider_ = new WebAudioSourceProviderImpl( |
258 params.audio_renderer_sink().get() | 260 params.audio_renderer_sink().get() |
259 ? params.audio_renderer_sink() | 261 ? params.audio_renderer_sink() |
260 : new NullAudioSink(media_task_runner_)); | 262 : new NullAudioSink(media_task_runner_)); |
263 | |
264 if (renderer_controller_) | |
265 renderer_controller_->SetSwitchRenderCallback( | |
266 base::Bind(&WebMediaPlayerImpl::ScheduleRestart, AsWeakPtr())); | |
261 } | 267 } |
262 | 268 |
263 WebMediaPlayerImpl::~WebMediaPlayerImpl() { | 269 WebMediaPlayerImpl::~WebMediaPlayerImpl() { |
264 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 270 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
265 | 271 |
272 renderer_controller_ = nullptr; | |
miu
2016/09/28 01:33:31
Along the lines of other comments: Call controller
xjz
2016/09/29 22:54:21
Removed this line.
| |
273 | |
266 suppress_destruction_errors_ = true; | 274 suppress_destruction_errors_ = true; |
267 if (delegate_) { | 275 if (delegate_) { |
268 delegate_->PlayerGone(delegate_id_); | 276 delegate_->PlayerGone(delegate_id_); |
269 delegate_->RemoveObserver(delegate_id_); | 277 delegate_->RemoveObserver(delegate_id_); |
270 } | 278 } |
271 | 279 |
272 // Finalize any watch time metrics before destroying the pipeline. | 280 // Finalize any watch time metrics before destroying the pipeline. |
273 watch_time_reporter_.reset(); | 281 watch_time_reporter_.reset(); |
274 | 282 |
275 // Pipeline must be stopped before it is destroyed. | 283 // Pipeline must be stopped before it is destroyed. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
330 surface_created_cb_.Cancel(); | 338 surface_created_cb_.Cancel(); |
331 overlay_surface_id_ = SurfaceManager::kNoSurfaceID; | 339 overlay_surface_id_ = SurfaceManager::kNoSurfaceID; |
332 | 340 |
333 if (decoder_requires_restart_for_overlay_) | 341 if (decoder_requires_restart_for_overlay_) |
334 ScheduleRestart(); | 342 ScheduleRestart(); |
335 } | 343 } |
336 | 344 |
337 void WebMediaPlayerImpl::enteredFullscreen() { | 345 void WebMediaPlayerImpl::enteredFullscreen() { |
338 if (!force_video_overlays_ && !disable_fullscreen_video_overlays_) | 346 if (!force_video_overlays_ && !disable_fullscreen_video_overlays_) |
339 EnableOverlay(); | 347 EnableOverlay(); |
348 if (renderer_controller_) | |
349 renderer_controller_->OnEnteredFullscreen(); | |
340 } | 350 } |
341 | 351 |
342 void WebMediaPlayerImpl::exitedFullscreen() { | 352 void WebMediaPlayerImpl::exitedFullscreen() { |
343 if (!force_video_overlays_ && !disable_fullscreen_video_overlays_) | 353 if (!force_video_overlays_ && !disable_fullscreen_video_overlays_) |
344 DisableOverlay(); | 354 DisableOverlay(); |
355 if (renderer_controller_) | |
356 renderer_controller_->OnExitedFullscreen(); | |
345 } | 357 } |
346 | 358 |
347 void WebMediaPlayerImpl::DoLoad(LoadType load_type, | 359 void WebMediaPlayerImpl::DoLoad(LoadType load_type, |
348 const blink::WebURL& url, | 360 const blink::WebURL& url, |
349 CORSMode cors_mode) { | 361 CORSMode cors_mode) { |
350 DVLOG(1) << __func__; | 362 DVLOG(1) << __func__; |
351 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 363 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
352 | 364 |
353 GURL gurl(url); | 365 GURL gurl(url); |
354 ReportMetrics(load_type, gurl, frame_->getSecurityOrigin()); | 366 ReportMetrics(load_type, gurl, frame_->getSecurityOrigin()); |
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
946 } | 958 } |
947 } | 959 } |
948 | 960 |
949 void WebMediaPlayerImpl::SetCdm(const CdmAttachedCB& cdm_attached_cb, | 961 void WebMediaPlayerImpl::SetCdm(const CdmAttachedCB& cdm_attached_cb, |
950 CdmContext* cdm_context) { | 962 CdmContext* cdm_context) { |
951 if (!cdm_context) { | 963 if (!cdm_context) { |
952 cdm_attached_cb.Run(false); | 964 cdm_attached_cb.Run(false); |
953 return; | 965 return; |
954 } | 966 } |
955 | 967 |
968 if (renderer_controller_) | |
969 renderer_controller_->OnSetCdm(cdm_context); | |
970 | |
956 // If CDM initialization succeeded, tell the pipeline about it. | 971 // If CDM initialization succeeded, tell the pipeline about it. |
957 pipeline_.SetCdm(cdm_context, cdm_attached_cb); | 972 pipeline_.SetCdm(cdm_context, cdm_attached_cb); |
958 } | 973 } |
959 | 974 |
960 void WebMediaPlayerImpl::OnCdmAttached(bool success) { | 975 void WebMediaPlayerImpl::OnCdmAttached(bool success) { |
961 if (success) { | 976 if (success) { |
962 set_cdm_result_->complete(); | 977 set_cdm_result_->complete(); |
963 set_cdm_result_.reset(); | 978 set_cdm_result_.reset(); |
964 is_cdm_attached_ = true; | 979 is_cdm_attached_ = true; |
965 return; | 980 return; |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1082 | 1097 |
1083 if (overlay_enabled_ && surface_manager_) | 1098 if (overlay_enabled_ && surface_manager_) |
1084 surface_manager_->NaturalSizeChanged(pipeline_metadata_.natural_size); | 1099 surface_manager_->NaturalSizeChanged(pipeline_metadata_.natural_size); |
1085 | 1100 |
1086 DCHECK(!video_weblayer_); | 1101 DCHECK(!video_weblayer_); |
1087 video_weblayer_.reset(new cc_blink::WebLayerImpl(cc::VideoLayer::Create( | 1102 video_weblayer_.reset(new cc_blink::WebLayerImpl(cc::VideoLayer::Create( |
1088 compositor_, pipeline_metadata_.video_rotation))); | 1103 compositor_, pipeline_metadata_.video_rotation))); |
1089 video_weblayer_->layer()->SetContentsOpaque(opaque_); | 1104 video_weblayer_->layer()->SetContentsOpaque(opaque_); |
1090 video_weblayer_->SetContentsOpaqueIsFixed(true); | 1105 video_weblayer_->SetContentsOpaqueIsFixed(true); |
1091 client_->setWebLayer(video_weblayer_.get()); | 1106 client_->setWebLayer(video_weblayer_.get()); |
1107 if (renderer_controller_) | |
1108 renderer_controller_->OnSetDecoderConfig( | |
miu
2016/09/28 01:33:31
naming nit: If this could be called multiple times
xjz
2016/09/29 22:54:21
Done.
| |
1109 pipeline_metadata_.audio_decoder_config, | |
1110 pipeline_metadata_.video_decoder_config); | |
1092 } | 1111 } |
1093 | 1112 |
1094 CreateWatchTimeReporter(); | 1113 CreateWatchTimeReporter(); |
1095 UpdatePlayState(); | 1114 UpdatePlayState(); |
1096 } | 1115 } |
1097 | 1116 |
1098 void WebMediaPlayerImpl::OnBufferingStateChange(BufferingState state) { | 1117 void WebMediaPlayerImpl::OnBufferingStateChange(BufferingState state) { |
1099 DVLOG(1) << __func__ << "(" << state << ")"; | 1118 DVLOG(1) << __func__ << "(" << state << ")"; |
1100 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1119 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1101 | 1120 |
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1814 hasAudio(), hasVideo(), !!chunk_demuxer_, is_encrypted_, media_log_, | 1833 hasAudio(), hasVideo(), !!chunk_demuxer_, is_encrypted_, media_log_, |
1815 pipeline_metadata_.natural_size, | 1834 pipeline_metadata_.natural_size, |
1816 base::Bind(&GetCurrentTimeInternal, this))); | 1835 base::Bind(&GetCurrentTimeInternal, this))); |
1817 watch_time_reporter_->OnVolumeChange(volume_); | 1836 watch_time_reporter_->OnVolumeChange(volume_); |
1818 if (delegate_ && delegate_->IsHidden()) | 1837 if (delegate_ && delegate_->IsHidden()) |
1819 watch_time_reporter_->OnHidden(); | 1838 watch_time_reporter_->OnHidden(); |
1820 else | 1839 else |
1821 watch_time_reporter_->OnShown(); | 1840 watch_time_reporter_->OnShown(); |
1822 } | 1841 } |
1823 | 1842 |
1843 void WebMediaPlayerImpl::ancestorEnteredFullscreen() { | |
1844 if (renderer_controller_) | |
1845 renderer_controller_->OnEnteredFullscreen(); | |
1846 } | |
1847 | |
1848 void WebMediaPlayerImpl::ancestorExitedFullscreen() { | |
1849 if (renderer_controller_) | |
1850 renderer_controller_->OnExitedFullscreen(); | |
1851 } | |
1852 | |
1824 } // namespace media | 1853 } // namespace media |
OLD | NEW |