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

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: Fix unit tests 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
« no previous file with comments | « media/blink/webmediaplayer_impl.h ('k') | media/blink/webmediaplayer_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « media/blink/webmediaplayer_impl.h ('k') | media/blink/webmediaplayer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698