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_overlay_(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 force_video_overlays_ = base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 216 switches::kForceVideoOverlays); |
| 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 } |
294 if (decoder_requires_restart_for_fullscreen_) | 297 |
| 298 if (decoder_requires_restart_for_overlay_) |
295 ScheduleRestart(); | 299 ScheduleRestart(); |
296 } | 300 } |
297 | 301 |
| 302 void WebMediaPlayerImpl::DisableOverlay() { |
| 303 overlay_enabled_ = false; |
| 304 surface_created_cb_.Cancel(); |
| 305 overlay_surface_id_ = SurfaceManager::kNoSurfaceID; |
| 306 |
| 307 if (decoder_requires_restart_for_overlay_) |
| 308 ScheduleRestart(); |
| 309 } |
| 310 |
| 311 void WebMediaPlayerImpl::enteredFullscreen() { |
| 312 if (!force_video_overlays_) |
| 313 EnableOverlay(); |
| 314 } |
| 315 |
298 void WebMediaPlayerImpl::exitedFullscreen() { | 316 void WebMediaPlayerImpl::exitedFullscreen() { |
299 fullscreen_ = false; | 317 if (!force_video_overlays_) |
300 surface_created_cb_.Cancel(); | 318 DisableOverlay(); |
301 fullscreen_surface_id_ = SurfaceManager::kNoSurfaceID; | |
302 if (decoder_requires_restart_for_fullscreen_) | |
303 ScheduleRestart(); | |
304 } | 319 } |
305 | 320 |
306 void WebMediaPlayerImpl::DoLoad(LoadType load_type, | 321 void WebMediaPlayerImpl::DoLoad(LoadType load_type, |
307 const blink::WebURL& url, | 322 const blink::WebURL& url, |
308 CORSMode cors_mode) { | 323 CORSMode cors_mode) { |
309 DVLOG(1) << __FUNCTION__; | 324 DVLOG(1) << __FUNCTION__; |
310 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 325 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
311 | 326 |
312 GURL gurl(url); | 327 GURL gurl(url); |
313 ReportMetrics(load_type, gurl, frame_->getSecurityOrigin()); | 328 ReportMetrics(load_type, gurl, frame_->getSecurityOrigin()); |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1005 VIDEO_ROTATION_MAX + 1); | 1020 VIDEO_ROTATION_MAX + 1); |
1006 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 1021 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
1007 | 1022 |
1008 if (hasVideo()) { | 1023 if (hasVideo()) { |
1009 if (pipeline_metadata_.video_rotation == VIDEO_ROTATION_90 || | 1024 if (pipeline_metadata_.video_rotation == VIDEO_ROTATION_90 || |
1010 pipeline_metadata_.video_rotation == VIDEO_ROTATION_270) { | 1025 pipeline_metadata_.video_rotation == VIDEO_ROTATION_270) { |
1011 gfx::Size size = pipeline_metadata_.natural_size; | 1026 gfx::Size size = pipeline_metadata_.natural_size; |
1012 pipeline_metadata_.natural_size = gfx::Size(size.height(), size.width()); | 1027 pipeline_metadata_.natural_size = gfx::Size(size.height(), size.width()); |
1013 } | 1028 } |
1014 | 1029 |
1015 if (fullscreen_ && surface_manager_) | 1030 if (overlay_enabled_ && surface_manager_) |
1016 surface_manager_->NaturalSizeChanged(pipeline_metadata_.natural_size); | 1031 surface_manager_->NaturalSizeChanged(pipeline_metadata_.natural_size); |
1017 | 1032 |
1018 DCHECK(!video_weblayer_); | 1033 DCHECK(!video_weblayer_); |
1019 video_weblayer_.reset(new cc_blink::WebLayerImpl(cc::VideoLayer::Create( | 1034 video_weblayer_.reset(new cc_blink::WebLayerImpl(cc::VideoLayer::Create( |
1020 compositor_, pipeline_metadata_.video_rotation))); | 1035 compositor_, pipeline_metadata_.video_rotation))); |
1021 video_weblayer_->layer()->SetContentsOpaque(opaque_); | 1036 video_weblayer_->layer()->SetContentsOpaque(opaque_); |
1022 video_weblayer_->SetContentsOpaqueIsFixed(true); | 1037 video_weblayer_->SetContentsOpaqueIsFixed(true); |
1023 client_->setWebLayer(video_weblayer_.get()); | 1038 client_->setWebLayer(video_weblayer_.get()); |
1024 } | 1039 } |
1025 | 1040 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1111 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1126 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1112 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); | 1127 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); |
1113 | 1128 |
1114 if (size == pipeline_metadata_.natural_size) | 1129 if (size == pipeline_metadata_.natural_size) |
1115 return; | 1130 return; |
1116 | 1131 |
1117 TRACE_EVENT0("media", "WebMediaPlayerImpl::OnNaturalSizeChanged"); | 1132 TRACE_EVENT0("media", "WebMediaPlayerImpl::OnNaturalSizeChanged"); |
1118 media_log_->AddEvent( | 1133 media_log_->AddEvent( |
1119 media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); | 1134 media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); |
1120 | 1135 |
1121 if (fullscreen_ && surface_manager_) | 1136 if (overlay_enabled_ && surface_manager_) |
1122 surface_manager_->NaturalSizeChanged(size); | 1137 surface_manager_->NaturalSizeChanged(size); |
1123 | 1138 |
1124 pipeline_metadata_.natural_size = size; | 1139 pipeline_metadata_.natural_size = size; |
1125 client_->sizeChanged(); | 1140 client_->sizeChanged(); |
1126 } | 1141 } |
1127 | 1142 |
1128 void WebMediaPlayerImpl::OnVideoOpacityChange(bool opaque) { | 1143 void WebMediaPlayerImpl::OnVideoOpacityChange(bool opaque) { |
1129 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1144 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1130 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); | 1145 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); |
1131 | 1146 |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1292 SetNetworkState(WebMediaPlayer::NetworkStateIdle); | 1307 SetNetworkState(WebMediaPlayer::NetworkStateIdle); |
1293 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) | 1308 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) |
1294 SetNetworkState(WebMediaPlayer::NetworkStateLoading); | 1309 SetNetworkState(WebMediaPlayer::NetworkStateLoading); |
1295 media_log_->AddEvent( | 1310 media_log_->AddEvent( |
1296 media_log_->CreateBooleanEvent( | 1311 media_log_->CreateBooleanEvent( |
1297 MediaLogEvent::NETWORK_ACTIVITY_SET, | 1312 MediaLogEvent::NETWORK_ACTIVITY_SET, |
1298 "is_downloading_data", is_downloading)); | 1313 "is_downloading_data", is_downloading)); |
1299 } | 1314 } |
1300 | 1315 |
1301 void WebMediaPlayerImpl::OnSurfaceCreated(int surface_id) { | 1316 void WebMediaPlayerImpl::OnSurfaceCreated(int surface_id) { |
1302 fullscreen_surface_id_ = surface_id; | 1317 if (force_video_overlays_ && surface_id == SurfaceManager::kNoSurfaceID) |
| 1318 LOG(ERROR) << "Create surface failed."; |
| 1319 |
| 1320 overlay_surface_id_ = surface_id; |
1303 if (!pending_surface_request_cb_.is_null()) | 1321 if (!pending_surface_request_cb_.is_null()) |
1304 base::ResetAndReturn(&pending_surface_request_cb_).Run(surface_id); | 1322 base::ResetAndReturn(&pending_surface_request_cb_).Run(surface_id); |
1305 } | 1323 } |
1306 | 1324 |
1307 // TODO(watk): Move this state management out of WMPI. | 1325 // TODO(watk): Move this state management out of WMPI. |
1308 void WebMediaPlayerImpl::OnSurfaceRequested( | 1326 void WebMediaPlayerImpl::OnSurfaceRequested( |
1309 const SurfaceCreatedCB& surface_created_cb) { | 1327 const SurfaceCreatedCB& surface_created_cb) { |
1310 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 1328 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
1311 DCHECK(surface_manager_); | 1329 DCHECK(surface_manager_); |
1312 | 1330 |
1313 // A null callback indicates that the decoder is going away. | 1331 // A null callback indicates that the decoder is going away. |
1314 if (surface_created_cb.is_null()) { | 1332 if (surface_created_cb.is_null()) { |
1315 decoder_requires_restart_for_fullscreen_ = false; | 1333 decoder_requires_restart_for_overlay_ = false; |
1316 pending_surface_request_cb_.Reset(); | 1334 pending_surface_request_cb_.Reset(); |
1317 return; | 1335 return; |
1318 } | 1336 } |
1319 | 1337 |
1320 // If we're getting a surface request it means GVD is initializing, so until | 1338 // If we're getting a surface request it means GVD is initializing, so until |
1321 // we get a null surface request, GVD is the active decoder. While that's the | 1339 // we get a null surface request, GVD is the active decoder. While that's the |
1322 // case we should restart the pipeline on fullscreen transitions so that when | 1340 // case we should restart the pipeline on fullscreen transitions so that when |
1323 // we create a new GVD it will request a surface again and get the right kind | 1341 // we create a new GVD it will request a surface again and get the right kind |
1324 // of surface for the fullscreen state. | 1342 // of surface for the fullscreen state. |
1325 // TODO(watk): Don't require a pipeline restart to switch surfaces for | 1343 // TODO(watk): Don't require a pipeline restart to switch surfaces for |
1326 // cases where it isn't necessary. | 1344 // cases where it isn't necessary. |
1327 decoder_requires_restart_for_fullscreen_ = true; | 1345 decoder_requires_restart_for_overlay_ = true; |
1328 if (fullscreen_) { | 1346 if (overlay_enabled_) { |
1329 if (fullscreen_surface_id_ != SurfaceManager::kNoSurfaceID) | 1347 if (overlay_surface_id_ != SurfaceManager::kNoSurfaceID) |
1330 surface_created_cb.Run(fullscreen_surface_id_); | 1348 surface_created_cb.Run(overlay_surface_id_); |
1331 else | 1349 else |
1332 pending_surface_request_cb_ = surface_created_cb; | 1350 pending_surface_request_cb_ = surface_created_cb; |
1333 } else { | 1351 } else { |
1334 // Tell the decoder to create its own surface. | 1352 // Tell the decoder to create its own surface. |
1335 surface_created_cb.Run(SurfaceManager::kNoSurfaceID); | 1353 surface_created_cb.Run(SurfaceManager::kNoSurfaceID); |
1336 } | 1354 } |
1337 } | 1355 } |
1338 | 1356 |
1339 std::unique_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { | 1357 std::unique_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { |
| 1358 if (force_video_overlays_) |
| 1359 EnableOverlay(); |
| 1360 |
1340 RequestSurfaceCB request_surface_cb; | 1361 RequestSurfaceCB request_surface_cb; |
1341 #if defined(OS_ANDROID) | 1362 #if defined(OS_ANDROID) |
1342 request_surface_cb = | 1363 request_surface_cb = |
1343 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnSurfaceRequested); | 1364 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnSurfaceRequested); |
1344 #endif | 1365 #endif |
1345 return renderer_factory_->CreateRenderer( | 1366 return renderer_factory_->CreateRenderer( |
1346 media_task_runner_, worker_task_runner_, audio_source_provider_.get(), | 1367 media_task_runner_, worker_task_runner_, audio_source_provider_.get(), |
1347 compositor_, request_surface_cb); | 1368 compositor_, request_surface_cb); |
1348 } | 1369 } |
1349 | 1370 |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1620 // correctly configure the session. | 1641 // correctly configure the session. |
1621 // | 1642 // |
1622 // TODO(sandersd): If Blink told us the paused state sooner, we could create | 1643 // TODO(sandersd): If Blink told us the paused state sooner, we could create |
1623 // the media session sooner. | 1644 // the media session sooner. |
1624 bool can_play = !has_error && !is_remote && have_future_data; | 1645 bool can_play = !has_error && !is_remote && have_future_data; |
1625 bool has_session = can_play && !must_suspend_ && !background_suspended; | 1646 bool has_session = can_play && !must_suspend_ && !background_suspended; |
1626 | 1647 |
1627 if (!has_session) { | 1648 if (!has_session) { |
1628 result.delegate_state = DelegateState::GONE; | 1649 result.delegate_state = DelegateState::GONE; |
1629 } else if (paused_) { | 1650 } else if (paused_) { |
1630 if (seeking() || fullscreen_) { | 1651 if (seeking() || overlay_enabled_) { |
1631 result.delegate_state = DelegateState::PAUSED_BUT_NOT_IDLE; | 1652 result.delegate_state = DelegateState::PAUSED_BUT_NOT_IDLE; |
1632 } else if (ended_) { | 1653 } else if (ended_) { |
1633 result.delegate_state = DelegateState::ENDED; | 1654 result.delegate_state = DelegateState::ENDED; |
1634 } else { | 1655 } else { |
1635 result.delegate_state = DelegateState::PAUSED; | 1656 result.delegate_state = DelegateState::PAUSED; |
1636 } | 1657 } |
1637 } else { | 1658 } else { |
1638 result.delegate_state = DelegateState::PLAYING; | 1659 result.delegate_state = DelegateState::PLAYING; |
1639 } | 1660 } |
1640 | 1661 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1698 if (isRemote()) | 1719 if (isRemote()) |
1699 return; | 1720 return; |
1700 #endif | 1721 #endif |
1701 | 1722 |
1702 // Idle timeout chosen arbitrarily. | 1723 // Idle timeout chosen arbitrarily. |
1703 background_pause_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(5), | 1724 background_pause_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(5), |
1704 this, &WebMediaPlayerImpl::OnPause); | 1725 this, &WebMediaPlayerImpl::OnPause); |
1705 } | 1726 } |
1706 | 1727 |
1707 } // namespace media | 1728 } // namespace media |
OLD | NEW |