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

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

Issue 1655083002: Enable SurfaceView fullscreen video on Android with WebMediaPlayerImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@avda-sv
Patch Set: cleaned up Created 4 years, 10 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 opaque_(false), 147 opaque_(false),
148 playback_rate_(0.0), 148 playback_rate_(0.0),
149 paused_(true), 149 paused_(true),
150 seeking_(false), 150 seeking_(false),
151 pending_suspend_(false), 151 pending_suspend_(false),
152 pending_time_change_(false), 152 pending_time_change_(false),
153 pending_resume_(false), 153 pending_resume_(false),
154 suspending_(false), 154 suspending_(false),
155 suspended_(false), 155 suspended_(false),
156 resuming_(false), 156 resuming_(false),
157 pending_suspend_resume_cycle_(false),
157 ended_(false), 158 ended_(false),
158 pending_seek_(false), 159 pending_seek_(false),
159 should_notify_time_changed_(false), 160 should_notify_time_changed_(false),
161 fullscreen_(false),
162 decoder_requires_restart_for_fullscreen_(false),
160 client_(client), 163 client_(client),
161 encrypted_client_(encrypted_client), 164 encrypted_client_(encrypted_client),
162 delegate_(delegate), 165 delegate_(delegate),
163 delegate_id_(0), 166 delegate_id_(0),
164 defer_load_cb_(params.defer_load_cb()), 167 defer_load_cb_(params.defer_load_cb()),
165 context_3d_cb_(params.context_3d_cb()), 168 context_3d_cb_(params.context_3d_cb()),
166 adjust_allocated_memory_cb_(params.adjust_allocated_memory_cb()), 169 adjust_allocated_memory_cb_(params.adjust_allocated_memory_cb()),
167 last_reported_memory_usage_(0), 170 last_reported_memory_usage_(0),
168 supports_save_(true), 171 supports_save_(true),
169 chunk_demuxer_(NULL), 172 chunk_demuxer_(NULL),
170 url_index_(url_index), 173 url_index_(url_index),
171 // Threaded compositing isn't enabled universally yet. 174 // Threaded compositing isn't enabled universally yet.
172 compositor_task_runner_( 175 compositor_task_runner_(
173 params.compositor_task_runner() 176 params.compositor_task_runner()
174 ? params.compositor_task_runner() 177 ? params.compositor_task_runner()
175 : base::MessageLoop::current()->task_runner()), 178 : base::MessageLoop::current()->task_runner()),
176 compositor_(new VideoFrameCompositor( 179 compositor_(new VideoFrameCompositor(
177 compositor_task_runner_, 180 compositor_task_runner_,
178 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), 181 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged),
179 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), 182 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))),
180 encrypted_media_support_(cdm_factory, 183 encrypted_media_support_(cdm_factory,
181 encrypted_client, 184 encrypted_client,
182 params.media_permission(), 185 params.media_permission(),
183 base::Bind(&WebMediaPlayerImpl::SetCdm, 186 base::Bind(&WebMediaPlayerImpl::SetCdm,
184 AsWeakPtr(), 187 AsWeakPtr(),
185 base::Bind(&IgnoreCdmAttached))), 188 base::Bind(&IgnoreCdmAttached))),
186 is_cdm_attached_(false), 189 is_cdm_attached_(false),
187 #if defined(OS_ANDROID) // WMPI_CAST 190 #if defined(OS_ANDROID)
191 surface_manager_(nullptr),
192 // WMPI_CAST
188 cast_impl_(this, client_, params.context_3d_cb()), 193 cast_impl_(this, client_, params.context_3d_cb()),
189 #endif 194 #endif
190 volume_(1.0), 195 volume_(1.0),
191 volume_multiplier_(1.0), 196 volume_multiplier_(1.0),
192 renderer_factory_(std::move(renderer_factory)) { 197 renderer_factory_(std::move(renderer_factory)) {
193 DCHECK(!adjust_allocated_memory_cb_.is_null()); 198 DCHECK(!adjust_allocated_memory_cb_.is_null());
194 DCHECK(renderer_factory_); 199 DCHECK(renderer_factory_);
195 200
196 if (delegate_) 201 if (delegate_)
197 delegate_id_ = delegate_->AddObserver(this); 202 delegate_id_ = delegate_->AddObserver(this);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 DVLOG(1) << __FUNCTION__ << "(" << load_type << ", " << url << ", " 261 DVLOG(1) << __FUNCTION__ << "(" << load_type << ", " << url << ", "
257 << cors_mode << ")"; 262 << cors_mode << ")";
258 if (!defer_load_cb_.is_null()) { 263 if (!defer_load_cb_.is_null()) {
259 defer_load_cb_.Run(base::Bind( 264 defer_load_cb_.Run(base::Bind(
260 &WebMediaPlayerImpl::DoLoad, AsWeakPtr(), load_type, url, cors_mode)); 265 &WebMediaPlayerImpl::DoLoad, AsWeakPtr(), load_type, url, cors_mode));
261 return; 266 return;
262 } 267 }
263 DoLoad(load_type, url, cors_mode); 268 DoLoad(load_type, url, cors_mode);
264 } 269 }
265 270
271 void WebMediaPlayerImpl::enterFullscreen() {
272 fullscreen_ = true;
273 if (decoder_requires_restart_for_fullscreen_)
274 ScheduleRestart();
275 }
276
277 void WebMediaPlayerImpl::exitedFullscreen() {
278 fullscreen_ = false;
279 if (decoder_requires_restart_for_fullscreen_)
280 ScheduleRestart();
281 }
282
266 void WebMediaPlayerImpl::DoLoad(LoadType load_type, 283 void WebMediaPlayerImpl::DoLoad(LoadType load_type,
267 const blink::WebURL& url, 284 const blink::WebURL& url,
268 CORSMode cors_mode) { 285 CORSMode cors_mode) {
269 DVLOG(1) << __FUNCTION__; 286 DVLOG(1) << __FUNCTION__;
270 DCHECK(main_task_runner_->BelongsToCurrentThread()); 287 DCHECK(main_task_runner_->BelongsToCurrentThread());
271 288
272 GURL gurl(url); 289 GURL gurl(url);
273 ReportMetrics( 290 ReportMetrics(
274 load_type, gurl, 291 load_type, gurl,
275 blink::WebStringToGURL(frame_->document().securityOrigin().toString())); 292 blink::WebStringToGURL(frame_->document().securityOrigin().toString()));
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 988
972 #if defined(OS_ANDROID) 989 #if defined(OS_ANDROID)
973 if (isRemote()) { 990 if (isRemote()) {
974 scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner(); 991 scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner();
975 if (frame) { 992 if (frame) {
976 compositor_->PaintFrameUsingOldRenderingPath(frame); 993 compositor_->PaintFrameUsingOldRenderingPath(frame);
977 } 994 }
978 } 995 }
979 #endif 996 #endif
980 997
981 if (pending_resume_) { 998 if (pending_resume_ || pending_suspend_resume_cycle_) {
982 pending_resume_ = false; 999 pending_resume_ = false;
1000 pending_suspend_resume_cycle_ = false;
983 Resume(); 1001 Resume();
984 return; 1002 return;
985 } 1003 }
986 } 1004 }
987 1005
988 void WebMediaPlayerImpl::OnPipelineEnded() { 1006 void WebMediaPlayerImpl::OnPipelineEnded() {
989 DVLOG(1) << __FUNCTION__; 1007 DVLOG(1) << __FUNCTION__;
990 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1008 DCHECK(main_task_runner_->BelongsToCurrentThread());
991 1009
992 // Ignore state changes until we've completed all outstanding seeks. 1010 // Ignore state changes until we've completed all outstanding seeks.
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 1256
1239 if (chunk_demuxer_) 1257 if (chunk_demuxer_)
1240 chunk_demuxer_->StartWaitingForSeek(seek_time_); 1258 chunk_demuxer_->StartWaitingForSeek(seek_time_);
1241 1259
1242 resuming_ = true; 1260 resuming_ = true;
1243 pipeline_.Resume(CreateRenderer(), seek_time_, 1261 pipeline_.Resume(CreateRenderer(), seek_time_,
1244 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, 1262 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked,
1245 time_changed)); 1263 time_changed));
1246 } 1264 }
1247 1265
1248 #if defined(OS_ANDROID) // WMPI_CAST 1266 void WebMediaPlayerImpl::ScheduleRestart() {
1267 if (!suspended_ || resuming_) {
1268 pending_suspend_resume_cycle_ = true;
1269 ScheduleSuspend();
1270 }
1271 }
1249 1272
1273 #if defined(OS_ANDROID)
1274 // TODO(watk): Move the SurfaceManager and associated state out of WMPI.
1275 void WebMediaPlayerImpl::SetSurfaceManager(SurfaceManager* surface_manager) {
1276 surface_manager_ = surface_manager;
1277 }
1278
1279 void WebMediaPlayerImpl::OnSurfaceRequested(
1280 const SurfaceCreatedCB& surface_created_cb) {
1281 DCHECK(main_task_runner_->BelongsToCurrentThread());
1282 DCHECK(surface_manager_);
1283
1284 // A null callback indicates that the decoder is going away.
1285 if (surface_created_cb.is_null()) {
1286 decoder_requires_restart_for_fullscreen_ = false;
1287 return;
1288 }
1289
1290 // If we're getting a surface request it means GVD is initializing, so until
1291 // we get a null surface request, GVD is the active decoder. While that's the
1292 // case we should restart the pipeline on fullscreen transitions so that when
1293 // we create a new GVD it will request a surface again and use the right kind
1294 // of surface for the new fullscreen state.
1295 // TODO(watk): Don't require a pipeline restart to switch surfaces for
1296 // cases where it isn't necessary.
1297 decoder_requires_restart_for_fullscreen_ = true;
1298 if (fullscreen_) {
1299 surface_manager_->CreateFullscreenSurface(pipeline_metadata_.natural_size,
1300 surface_created_cb);
1301 } else {
1302 // Tell the decoder to create its own surface.
1303 surface_created_cb.Run(SurfaceManager::kNoSurfaceID);
1304 }
1305 }
1306
1307 // WMPI_CAST
1250 bool WebMediaPlayerImpl::isRemote() const { 1308 bool WebMediaPlayerImpl::isRemote() const {
1251 return cast_impl_.isRemote(); 1309 return cast_impl_.isRemote();
1252 } 1310 }
1253 1311
1254 void WebMediaPlayerImpl::SetMediaPlayerManager( 1312 void WebMediaPlayerImpl::SetMediaPlayerManager(
1255 RendererMediaPlayerManagerInterface* media_player_manager) { 1313 RendererMediaPlayerManagerInterface* media_player_manager) {
1256 cast_impl_.SetMediaPlayerManager(media_player_manager); 1314 cast_impl_.SetMediaPlayerManager(media_player_manager);
1257 } 1315 }
1258 1316
1259 void WebMediaPlayerImpl::requestRemotePlayback() { 1317 void WebMediaPlayerImpl::requestRemotePlayback() {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1300 gfx::Size WebMediaPlayerImpl::GetCanvasSize() const { 1358 gfx::Size WebMediaPlayerImpl::GetCanvasSize() const {
1301 if (!video_weblayer_) 1359 if (!video_weblayer_)
1302 return pipeline_metadata_.natural_size; 1360 return pipeline_metadata_.natural_size;
1303 1361
1304 return video_weblayer_->bounds(); 1362 return video_weblayer_->bounds();
1305 } 1363 }
1306 1364
1307 void WebMediaPlayerImpl::SetDeviceScaleFactor(float scale_factor) { 1365 void WebMediaPlayerImpl::SetDeviceScaleFactor(float scale_factor) {
1308 cast_impl_.SetDeviceScaleFactor(scale_factor); 1366 cast_impl_.SetDeviceScaleFactor(scale_factor);
1309 } 1367 }
1310 #endif // defined(OS_ANDROID) // WMPI_CAST 1368 #endif // defined(OS_ANDROID)
1311 1369
1312 void WebMediaPlayerImpl::DataSourceInitialized(bool success) { 1370 void WebMediaPlayerImpl::DataSourceInitialized(bool success) {
1313 DVLOG(1) << __FUNCTION__; 1371 DVLOG(1) << __FUNCTION__;
1314 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1372 DCHECK(main_task_runner_->BelongsToCurrentThread());
1315 1373
1316 if (!success) { 1374 if (!success) {
1317 SetNetworkState(WebMediaPlayer::NetworkStateFormatError); 1375 SetNetworkState(WebMediaPlayer::NetworkStateFormatError);
1318 return; 1376 return;
1319 } 1377 }
1320 1378
1321 StartPipeline(); 1379 StartPipeline();
1322 } 1380 }
1323 1381
1324 void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) { 1382 void WebMediaPlayerImpl::NotifyDownloading(bool is_downloading) {
1325 DVLOG(1) << __FUNCTION__; 1383 DVLOG(1) << __FUNCTION__;
1326 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading) 1384 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading)
1327 SetNetworkState(WebMediaPlayer::NetworkStateIdle); 1385 SetNetworkState(WebMediaPlayer::NetworkStateIdle);
1328 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) 1386 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle)
1329 SetNetworkState(WebMediaPlayer::NetworkStateLoading); 1387 SetNetworkState(WebMediaPlayer::NetworkStateLoading);
1330 media_log_->AddEvent( 1388 media_log_->AddEvent(
1331 media_log_->CreateBooleanEvent( 1389 media_log_->CreateBooleanEvent(
1332 MediaLogEvent::NETWORK_ACTIVITY_SET, 1390 MediaLogEvent::NETWORK_ACTIVITY_SET,
1333 "is_downloading_data", is_downloading)); 1391 "is_downloading_data", is_downloading));
1334 } 1392 }
1335 1393
1336 scoped_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { 1394 scoped_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() {
1395 RequestSurfaceCB request_surface_cb;
1396 #if defined(OS_ANDROID)
1397 request_surface_cb =
1398 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnSurfaceRequested);
1399 #endif
1337 return renderer_factory_->CreateRenderer( 1400 return renderer_factory_->CreateRenderer(
1338 media_task_runner_, worker_task_runner_, audio_source_provider_.get(), 1401 media_task_runner_, worker_task_runner_, audio_source_provider_.get(),
1339 compositor_); 1402 compositor_, request_surface_cb);
1340 } 1403 }
1341 1404
1342 void WebMediaPlayerImpl::StartPipeline() { 1405 void WebMediaPlayerImpl::StartPipeline() {
1343 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1406 DCHECK(main_task_runner_->BelongsToCurrentThread());
1344 1407
1345 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = 1408 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb =
1346 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnEncryptedMediaInitData); 1409 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnEncryptedMediaInitData);
1347 1410
1348 // Figure out which demuxer to use. 1411 // Figure out which demuxer to use.
1349 if (load_type_ != LoadTypeMediaSource) { 1412 if (load_type_ != LoadTypeMediaSource) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1427 client_->durationChanged(); 1490 client_->durationChanged();
1428 } 1491 }
1429 1492
1430 void WebMediaPlayerImpl::OnNaturalSizeChanged(gfx::Size size) { 1493 void WebMediaPlayerImpl::OnNaturalSizeChanged(gfx::Size size) {
1431 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1494 DCHECK(main_task_runner_->BelongsToCurrentThread());
1432 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); 1495 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing);
1433 TRACE_EVENT0("media", "WebMediaPlayerImpl::OnNaturalSizeChanged"); 1496 TRACE_EVENT0("media", "WebMediaPlayerImpl::OnNaturalSizeChanged");
1434 1497
1435 media_log_->AddEvent( 1498 media_log_->AddEvent(
1436 media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); 1499 media_log_->CreateVideoSizeSetEvent(size.width(), size.height()));
1500
1501 #if defined(OS_ANDROID)
1502 if (fullscreen_ && surface_manager_ &&
1503 pipeline_metadata_.natural_size != size) {
1504 surface_manager_->FullscreenVideoSizeChanged(size);
1505 }
1506 #endif
1507
1437 pipeline_metadata_.natural_size = size; 1508 pipeline_metadata_.natural_size = size;
1438
1439 client_->sizeChanged(); 1509 client_->sizeChanged();
1440 } 1510 }
1441 1511
1442 void WebMediaPlayerImpl::OnOpacityChanged(bool opaque) { 1512 void WebMediaPlayerImpl::OnOpacityChanged(bool opaque) {
1443 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1513 DCHECK(main_task_runner_->BelongsToCurrentThread());
1444 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); 1514 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing);
1445 1515
1446 opaque_ = opaque; 1516 opaque_ = opaque;
1447 // Modify content opaqueness of cc::Layer directly so that 1517 // Modify content opaqueness of cc::Layer directly so that
1448 // SetContentsOpaqueIsFixed is ignored. 1518 // SetContentsOpaqueIsFixed is ignored.
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1549 << ", Video: " << stats.video_memory_usage << ", DataSource: " 1619 << ", Video: " << stats.video_memory_usage << ", DataSource: "
1550 << (data_source_ ? data_source_->GetMemoryUsage() : 0) 1620 << (data_source_ ? data_source_->GetMemoryUsage() : 0)
1551 << ", Demuxer: " << demuxer_memory_usage; 1621 << ", Demuxer: " << demuxer_memory_usage;
1552 1622
1553 const int64_t delta = current_memory_usage - last_reported_memory_usage_; 1623 const int64_t delta = current_memory_usage - last_reported_memory_usage_;
1554 last_reported_memory_usage_ = current_memory_usage; 1624 last_reported_memory_usage_ = current_memory_usage;
1555 adjust_allocated_memory_cb_.Run(delta); 1625 adjust_allocated_memory_cb_.Run(delta);
1556 } 1626 }
1557 1627
1558 } // namespace media 1628 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698