Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: media/blink/webmediaplayer_impl.cc

Issue 2141293002: [Cast for ATV] Enable UMP on Cast for ATV (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: [Cast for ATV] Enable UMP on Cast for ATV Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« media/blink/webmediaplayer_impl.h ('K') | « media/blink/webmediaplayer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698