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 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
172 base::Bind(&WebMediaPlayerImpl::OnPipelineSuspended, AsWeakPtr()), | 172 base::Bind(&WebMediaPlayerImpl::OnPipelineSuspended, AsWeakPtr()), |
173 base::Bind(&WebMediaPlayerImpl::OnError, AsWeakPtr())), | 173 base::Bind(&WebMediaPlayerImpl::OnError, AsWeakPtr())), |
174 load_type_(LoadTypeURL), | 174 load_type_(LoadTypeURL), |
175 opaque_(false), | 175 opaque_(false), |
176 playback_rate_(0.0), | 176 playback_rate_(0.0), |
177 paused_(true), | 177 paused_(true), |
178 seeking_(false), | 178 seeking_(false), |
179 pending_suspend_resume_cycle_(false), | 179 pending_suspend_resume_cycle_(false), |
180 ended_(false), | 180 ended_(false), |
181 should_notify_time_changed_(false), | 181 should_notify_time_changed_(false), |
182 fullscreen_(false), | 182 overlay_enabled_(false), |
183 decoder_requires_restart_for_fullscreen_(false), | 183 decoder_requires_restart_for_fullscreen_(false), |
184 client_(client), | 184 client_(client), |
185 encrypted_client_(encrypted_client), | 185 encrypted_client_(encrypted_client), |
186 delegate_(delegate), | 186 delegate_(delegate), |
187 delegate_id_(0), | 187 delegate_id_(0), |
188 defer_load_cb_(params.defer_load_cb()), | 188 defer_load_cb_(params.defer_load_cb()), |
189 context_3d_cb_(params.context_3d_cb()), | 189 context_3d_cb_(params.context_3d_cb()), |
190 adjust_allocated_memory_cb_(params.adjust_allocated_memory_cb()), | 190 adjust_allocated_memory_cb_(params.adjust_allocated_memory_cb()), |
191 last_reported_memory_usage_(0), | 191 last_reported_memory_usage_(0), |
192 supports_save_(true), | 192 supports_save_(true), |
193 chunk_demuxer_(NULL), | 193 chunk_demuxer_(NULL), |
194 url_index_(url_index), | 194 url_index_(url_index), |
195 // Threaded compositing isn't enabled universally yet. | 195 // Threaded compositing isn't enabled universally yet. |
196 compositor_task_runner_(params.compositor_task_runner() | 196 compositor_task_runner_(params.compositor_task_runner() |
197 ? params.compositor_task_runner() | 197 ? params.compositor_task_runner() |
198 : base::ThreadTaskRunnerHandle::Get()), | 198 : base::ThreadTaskRunnerHandle::Get()), |
199 compositor_(new VideoFrameCompositor(compositor_task_runner_)), | 199 compositor_(new VideoFrameCompositor(compositor_task_runner_)), |
200 is_cdm_attached_(false), | 200 is_cdm_attached_(false), |
201 #if defined(OS_ANDROID) // WMPI_CAST | 201 #if defined(OS_ANDROID) // WMPI_CAST |
202 cast_impl_(this, client_, params.context_3d_cb()), | 202 cast_impl_(this, client_, params.context_3d_cb()), |
203 #endif | 203 #endif |
204 volume_(1.0), | 204 volume_(1.0), |
205 volume_multiplier_(1.0), | 205 volume_multiplier_(1.0), |
206 renderer_factory_(std::move(renderer_factory)), | 206 renderer_factory_(std::move(renderer_factory)), |
207 surface_manager_(params.surface_manager()), | 207 surface_manager_(params.surface_manager()), |
208 fullscreen_surface_id_(SurfaceManager::kNoSurfaceID), | 208 overlay_surface_id_(SurfaceManager::kNoSurfaceID), |
209 suppress_destruction_errors_(false), | 209 suppress_destruction_errors_(false), |
210 can_suspend_state_(CanSuspendState::UNKNOWN) { | 210 can_suspend_state_(CanSuspendState::UNKNOWN) { |
211 DCHECK(!adjust_allocated_memory_cb_.is_null()); | 211 DCHECK(!adjust_allocated_memory_cb_.is_null()); |
212 DCHECK(renderer_factory_); | 212 DCHECK(renderer_factory_); |
213 DCHECK(client_); | 213 DCHECK(client_); |
214 | 214 |
215 use_overlay_only_ = base::CommandLine::ForCurrentProcess()->HasSwitch( | |
216 switches::kForceMediaPlayerUsingOverlay); | |
217 | |
215 if (delegate_) | 218 if (delegate_) |
216 delegate_id_ = delegate_->AddObserver(this); | 219 delegate_id_ = delegate_->AddObserver(this); |
217 | 220 |
218 media_log_->AddEvent( | 221 media_log_->AddEvent( |
219 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 222 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
220 | 223 |
221 if (params.initial_cdm()) { | 224 if (params.initial_cdm()) { |
222 SetCdm(base::Bind(&IgnoreCdmAttached), | 225 SetCdm(base::Bind(&IgnoreCdmAttached), |
223 ToWebContentDecryptionModuleImpl(params.initial_cdm()) | 226 ToWebContentDecryptionModuleImpl(params.initial_cdm()) |
224 ->GetCdmContext()); | 227 ->GetCdmContext()); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
276 } | 279 } |
277 | 280 |
278 bool WebMediaPlayerImpl::supportsOverlayFullscreenVideo() { | 281 bool WebMediaPlayerImpl::supportsOverlayFullscreenVideo() { |
279 #if defined(OS_ANDROID) | 282 #if defined(OS_ANDROID) |
280 return true; | 283 return true; |
281 #else | 284 #else |
282 return false; | 285 return false; |
283 #endif | 286 #endif |
284 } | 287 } |
285 | 288 |
286 void WebMediaPlayerImpl::enteredFullscreen() { | 289 void WebMediaPlayerImpl::EnableOverlay() { |
287 fullscreen_ = true; | 290 overlay_enabled_ = true; |
288 if (surface_manager_) { | 291 if (surface_manager_) { |
289 surface_created_cb_.Reset( | 292 surface_created_cb_.Reset( |
290 base::Bind(&WebMediaPlayerImpl::OnSurfaceCreated, AsWeakPtr())); | 293 base::Bind(&WebMediaPlayerImpl::OnSurfaceCreated, AsWeakPtr())); |
291 surface_manager_->CreateFullscreenSurface(pipeline_metadata_.natural_size, | 294 surface_manager_->CreateFullscreenSurface(pipeline_metadata_.natural_size, |
292 surface_created_cb_.callback()); | 295 surface_created_cb_.callback()); |
293 } | 296 } |
297 } | |
298 | |
299 void WebMediaPlayerImpl::DisableOverlay() { | |
liberato (no reviews please)
2016/07/18 20:19:58
DCHECK(overlay_enabled_)
AndyWu
2016/07/18 22:21:49
Done, thanks.
| |
300 overlay_enabled_ = false; | |
301 surface_created_cb_.Cancel(); | |
302 overlay_surface_id_ = SurfaceManager::kNoSurfaceID; | |
303 } | |
304 | |
305 void WebMediaPlayerImpl::enteredFullscreen() { | |
306 if (use_overlay_only_) | |
307 return; | |
308 | |
309 EnableOverlay(); | |
294 if (decoder_requires_restart_for_fullscreen_) | 310 if (decoder_requires_restart_for_fullscreen_) |
295 ScheduleRestart(); | 311 ScheduleRestart(); |
296 } | 312 } |
297 | 313 |
298 void WebMediaPlayerImpl::exitedFullscreen() { | 314 void WebMediaPlayerImpl::exitedFullscreen() { |
299 fullscreen_ = false; | 315 if (use_overlay_only_) |
300 surface_created_cb_.Cancel(); | 316 return; |
301 fullscreen_surface_id_ = SurfaceManager::kNoSurfaceID; | 317 |
318 DisableOverlay(); | |
302 if (decoder_requires_restart_for_fullscreen_) | 319 if (decoder_requires_restart_for_fullscreen_) |
303 ScheduleRestart(); | 320 ScheduleRestart(); |
304 } | 321 } |
305 | 322 |
306 void WebMediaPlayerImpl::DoLoad(LoadType load_type, | 323 void WebMediaPlayerImpl::DoLoad(LoadType load_type, |
307 const blink::WebURL& url, | 324 const blink::WebURL& url, |
308 CORSMode cors_mode) { | 325 CORSMode cors_mode) { |
309 DVLOG(1) << __FUNCTION__; | 326 DVLOG(1) << __FUNCTION__; |
310 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 327 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
311 | 328 |
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1005 VIDEO_ROTATION_MAX + 1); | 1022 VIDEO_ROTATION_MAX + 1); |
1006 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 1023 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
1007 | 1024 |
1008 if (hasVideo()) { | 1025 if (hasVideo()) { |
1009 if (pipeline_metadata_.video_rotation == VIDEO_ROTATION_90 || | 1026 if (pipeline_metadata_.video_rotation == VIDEO_ROTATION_90 || |
1010 pipeline_metadata_.video_rotation == VIDEO_ROTATION_270) { | 1027 pipeline_metadata_.video_rotation == VIDEO_ROTATION_270) { |
1011 gfx::Size size = pipeline_metadata_.natural_size; | 1028 gfx::Size size = pipeline_metadata_.natural_size; |
1012 pipeline_metadata_.natural_size = gfx::Size(size.height(), size.width()); | 1029 pipeline_metadata_.natural_size = gfx::Size(size.height(), size.width()); |
1013 } | 1030 } |
1014 | 1031 |
1015 if (fullscreen_ && surface_manager_) | 1032 if (overlay_enabled_ && surface_manager_) |
1016 surface_manager_->NaturalSizeChanged(pipeline_metadata_.natural_size); | 1033 surface_manager_->NaturalSizeChanged(pipeline_metadata_.natural_size); |
1017 | 1034 |
1018 DCHECK(!video_weblayer_); | 1035 DCHECK(!video_weblayer_); |
1019 video_weblayer_.reset(new cc_blink::WebLayerImpl(cc::VideoLayer::Create( | 1036 video_weblayer_.reset(new cc_blink::WebLayerImpl(cc::VideoLayer::Create( |
1020 compositor_, pipeline_metadata_.video_rotation))); | 1037 compositor_, pipeline_metadata_.video_rotation))); |
1021 video_weblayer_->layer()->SetContentsOpaque(opaque_); | 1038 video_weblayer_->layer()->SetContentsOpaque(opaque_); |
1022 video_weblayer_->SetContentsOpaqueIsFixed(true); | 1039 video_weblayer_->SetContentsOpaqueIsFixed(true); |
1023 client_->setWebLayer(video_weblayer_.get()); | 1040 client_->setWebLayer(video_weblayer_.get()); |
1024 } | 1041 } |
1025 | 1042 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1103 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1120 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1104 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); | 1121 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); |
1105 | 1122 |
1106 if (size == pipeline_metadata_.natural_size) | 1123 if (size == pipeline_metadata_.natural_size) |
1107 return; | 1124 return; |
1108 | 1125 |
1109 TRACE_EVENT0("media", "WebMediaPlayerImpl::OnNaturalSizeChanged"); | 1126 TRACE_EVENT0("media", "WebMediaPlayerImpl::OnNaturalSizeChanged"); |
1110 media_log_->AddEvent( | 1127 media_log_->AddEvent( |
1111 media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); | 1128 media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); |
1112 | 1129 |
1113 if (fullscreen_ && surface_manager_) | 1130 if (overlay_enabled_ && surface_manager_) |
1114 surface_manager_->NaturalSizeChanged(size); | 1131 surface_manager_->NaturalSizeChanged(size); |
1115 | 1132 |
1116 pipeline_metadata_.natural_size = size; | 1133 pipeline_metadata_.natural_size = size; |
1117 client_->sizeChanged(); | 1134 client_->sizeChanged(); |
1118 } | 1135 } |
1119 | 1136 |
1120 void WebMediaPlayerImpl::OnVideoOpacityChange(bool opaque) { | 1137 void WebMediaPlayerImpl::OnVideoOpacityChange(bool opaque) { |
1121 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1138 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1122 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); | 1139 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); |
1123 | 1140 |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1283 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading) | 1300 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading) |
1284 SetNetworkState(WebMediaPlayer::NetworkStateIdle); | 1301 SetNetworkState(WebMediaPlayer::NetworkStateIdle); |
1285 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) | 1302 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) |
1286 SetNetworkState(WebMediaPlayer::NetworkStateLoading); | 1303 SetNetworkState(WebMediaPlayer::NetworkStateLoading); |
1287 media_log_->AddEvent( | 1304 media_log_->AddEvent( |
1288 media_log_->CreateBooleanEvent( | 1305 media_log_->CreateBooleanEvent( |
1289 MediaLogEvent::NETWORK_ACTIVITY_SET, | 1306 MediaLogEvent::NETWORK_ACTIVITY_SET, |
1290 "is_downloading_data", is_downloading)); | 1307 "is_downloading_data", is_downloading)); |
1291 } | 1308 } |
1292 | 1309 |
1293 void WebMediaPlayerImpl::OnSurfaceCreated(int surface_id) { | 1310 void WebMediaPlayerImpl::OnSurfaceCreated(int surface_id) { |
liberato (no reviews please)
2016/07/18 20:19:58
you might want to handle error cases here. what i
AndyWu
2016/07/18 22:21:49
If the content is DRM protected, it will failed wh
| |
1294 fullscreen_surface_id_ = surface_id; | 1311 overlay_surface_id_ = surface_id; |
1295 if (!pending_surface_request_cb_.is_null()) | 1312 if (!pending_surface_request_cb_.is_null()) |
1296 base::ResetAndReturn(&pending_surface_request_cb_).Run(surface_id); | 1313 base::ResetAndReturn(&pending_surface_request_cb_).Run(surface_id); |
1297 } | 1314 } |
1298 | 1315 |
1299 // TODO(watk): Move this state management out of WMPI. | 1316 // TODO(watk): Move this state management out of WMPI. |
1300 void WebMediaPlayerImpl::OnSurfaceRequested( | 1317 void WebMediaPlayerImpl::OnSurfaceRequested( |
1301 const SurfaceCreatedCB& surface_created_cb) { | 1318 const SurfaceCreatedCB& surface_created_cb) { |
1302 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1319 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1303 DCHECK(surface_manager_); | 1320 DCHECK(surface_manager_); |
1304 | 1321 |
1305 // A null callback indicates that the decoder is going away. | 1322 // A null callback indicates that the decoder is going away. |
1306 if (surface_created_cb.is_null()) { | 1323 if (surface_created_cb.is_null()) { |
1307 decoder_requires_restart_for_fullscreen_ = false; | 1324 decoder_requires_restart_for_fullscreen_ = false; |
1308 pending_surface_request_cb_.Reset(); | 1325 pending_surface_request_cb_.Reset(); |
1309 return; | 1326 return; |
1310 } | 1327 } |
1311 | 1328 |
1312 // If we're getting a surface request it means GVD is initializing, so until | 1329 // If we're getting a surface request it means GVD is initializing, so until |
1313 // we get a null surface request, GVD is the active decoder. While that's the | 1330 // we get a null surface request, GVD is the active decoder. While that's the |
1314 // case we should restart the pipeline on fullscreen transitions so that when | 1331 // case we should restart the pipeline on fullscreen transitions so that when |
1315 // we create a new GVD it will request a surface again and get the right kind | 1332 // we create a new GVD it will request a surface again and get the right kind |
1316 // of surface for the fullscreen state. | 1333 // of surface for the fullscreen state. |
1317 // TODO(watk): Don't require a pipeline restart to switch surfaces for | 1334 // TODO(watk): Don't require a pipeline restart to switch surfaces for |
1318 // cases where it isn't necessary. | 1335 // cases where it isn't necessary. |
1319 decoder_requires_restart_for_fullscreen_ = true; | 1336 decoder_requires_restart_for_fullscreen_ = true; |
1320 if (fullscreen_) { | 1337 if (overlay_enabled_) { |
1321 if (fullscreen_surface_id_ != SurfaceManager::kNoSurfaceID) | 1338 if (overlay_surface_id_ != SurfaceManager::kNoSurfaceID) |
1322 surface_created_cb.Run(fullscreen_surface_id_); | 1339 surface_created_cb.Run(overlay_surface_id_); |
1323 else | 1340 else |
1324 pending_surface_request_cb_ = surface_created_cb; | 1341 pending_surface_request_cb_ = surface_created_cb; |
1325 } else { | 1342 } else { |
1326 // Tell the decoder to create its own surface. | 1343 // Tell the decoder to create its own surface. |
1327 surface_created_cb.Run(SurfaceManager::kNoSurfaceID); | 1344 surface_created_cb.Run(SurfaceManager::kNoSurfaceID); |
1328 } | 1345 } |
1329 } | 1346 } |
1330 | 1347 |
1331 std::unique_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { | 1348 std::unique_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { |
1349 if (use_overlay_only_) | |
1350 EnableOverlay(); | |
watk
2016/07/18 20:03:02
Is it possible for there to be more than one media
AndyWu
2016/07/18 22:21:49
In Cast for ATV, there is only one media player.
W
| |
1351 | |
1332 RequestSurfaceCB request_surface_cb; | 1352 RequestSurfaceCB request_surface_cb; |
1333 #if defined(OS_ANDROID) | 1353 #if defined(OS_ANDROID) |
1334 request_surface_cb = | 1354 request_surface_cb = |
1335 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnSurfaceRequested); | 1355 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnSurfaceRequested); |
1336 #endif | 1356 #endif |
1337 return renderer_factory_->CreateRenderer( | 1357 return renderer_factory_->CreateRenderer( |
1338 media_task_runner_, worker_task_runner_, audio_source_provider_.get(), | 1358 media_task_runner_, worker_task_runner_, audio_source_provider_.get(), |
1339 compositor_, request_surface_cb); | 1359 compositor_, request_surface_cb); |
1340 } | 1360 } |
1341 | 1361 |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1612 // correctly configure the session. | 1632 // correctly configure the session. |
1613 // | 1633 // |
1614 // TODO(sandersd): If Blink told us the paused state sooner, we could create | 1634 // TODO(sandersd): If Blink told us the paused state sooner, we could create |
1615 // the media session sooner. | 1635 // the media session sooner. |
1616 bool can_play = !has_error && !is_remote && have_future_data; | 1636 bool can_play = !has_error && !is_remote && have_future_data; |
1617 bool has_session = can_play && !must_suspend_ && !background_suspended; | 1637 bool has_session = can_play && !must_suspend_ && !background_suspended; |
1618 | 1638 |
1619 if (!has_session) { | 1639 if (!has_session) { |
1620 result.delegate_state = DelegateState::GONE; | 1640 result.delegate_state = DelegateState::GONE; |
1621 } else if (paused_) { | 1641 } else if (paused_) { |
1622 if (seeking() || fullscreen_) { | 1642 if (seeking() || overlay_enabled_) { |
1623 result.delegate_state = DelegateState::PAUSED_BUT_NOT_IDLE; | 1643 result.delegate_state = DelegateState::PAUSED_BUT_NOT_IDLE; |
1624 } else if (ended_) { | 1644 } else if (ended_) { |
1625 result.delegate_state = DelegateState::ENDED; | 1645 result.delegate_state = DelegateState::ENDED; |
1626 } else { | 1646 } else { |
1627 result.delegate_state = DelegateState::PAUSED; | 1647 result.delegate_state = DelegateState::PAUSED; |
1628 } | 1648 } |
1629 } else { | 1649 } else { |
1630 result.delegate_state = DelegateState::PLAYING; | 1650 result.delegate_state = DelegateState::PLAYING; |
1631 } | 1651 } |
1632 | 1652 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1690 if (isRemote()) | 1710 if (isRemote()) |
1691 return; | 1711 return; |
1692 #endif | 1712 #endif |
1693 | 1713 |
1694 // Idle timeout chosen arbitrarily. | 1714 // Idle timeout chosen arbitrarily. |
1695 background_pause_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(5), | 1715 background_pause_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(5), |
1696 this, &WebMediaPlayerImpl::OnPause); | 1716 this, &WebMediaPlayerImpl::OnPause); |
1697 } | 1717 } |
1698 | 1718 |
1699 } // namespace media | 1719 } // namespace media |
OLD | NEW |