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

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: 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 defer_load_cb_(params.defer_load_cb()), 166 defer_load_cb_(params.defer_load_cb()),
164 context_3d_cb_(params.context_3d_cb()), 167 context_3d_cb_(params.context_3d_cb()),
165 adjust_allocated_memory_cb_(params.adjust_allocated_memory_cb()), 168 adjust_allocated_memory_cb_(params.adjust_allocated_memory_cb()),
166 last_reported_memory_usage_(0), 169 last_reported_memory_usage_(0),
167 supports_save_(true), 170 supports_save_(true),
168 chunk_demuxer_(NULL), 171 chunk_demuxer_(NULL),
169 url_index_(url_index), 172 url_index_(url_index),
170 // Threaded compositing isn't enabled universally yet. 173 // Threaded compositing isn't enabled universally yet.
171 compositor_task_runner_( 174 compositor_task_runner_(
172 params.compositor_task_runner() 175 params.compositor_task_runner()
173 ? params.compositor_task_runner() 176 ? params.compositor_task_runner()
174 : base::MessageLoop::current()->task_runner()), 177 : base::MessageLoop::current()->task_runner()),
175 compositor_(new VideoFrameCompositor( 178 compositor_(new VideoFrameCompositor(
176 compositor_task_runner_, 179 compositor_task_runner_,
177 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), 180 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged),
178 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), 181 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))),
179 encrypted_media_support_(cdm_factory, 182 encrypted_media_support_(cdm_factory,
180 encrypted_client, 183 encrypted_client,
181 params.media_permission(), 184 params.media_permission(),
182 base::Bind(&WebMediaPlayerImpl::SetCdm, 185 base::Bind(&WebMediaPlayerImpl::SetCdm,
183 AsWeakPtr(), 186 AsWeakPtr(),
184 base::Bind(&IgnoreCdmAttached))), 187 base::Bind(&IgnoreCdmAttached))),
185 is_cdm_attached_(false), 188 is_cdm_attached_(false),
186 #if defined(OS_ANDROID) // WMPI_CAST 189 #if defined(OS_ANDROID) // WMPI_CAST
187 cast_impl_(this, client_, params.context_3d_cb(), delegate), 190 cast_impl_(this, client_, params.context_3d_cb(), delegate),
188 #endif 191 #endif
189 renderer_factory_(std::move(renderer_factory)) { 192 renderer_factory_(std::move(renderer_factory)),
193 surface_manager_(params.surface_manager()) {
190 DCHECK(!adjust_allocated_memory_cb_.is_null()); 194 DCHECK(!adjust_allocated_memory_cb_.is_null());
191 DCHECK(renderer_factory_); 195 DCHECK(renderer_factory_);
192 196
193 if (delegate) 197 if (delegate)
194 delegate->AddObserver(this); 198 delegate->AddObserver(this);
195 199
196 media_log_->AddEvent( 200 media_log_->AddEvent(
197 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 201 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED));
198 202
199 if (params.initial_cdm()) { 203 if (params.initial_cdm()) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 DVLOG(1) << __FUNCTION__ << "(" << load_type << ", " << url << ", " 257 DVLOG(1) << __FUNCTION__ << "(" << load_type << ", " << url << ", "
254 << cors_mode << ")"; 258 << cors_mode << ")";
255 if (!defer_load_cb_.is_null()) { 259 if (!defer_load_cb_.is_null()) {
256 defer_load_cb_.Run(base::Bind( 260 defer_load_cb_.Run(base::Bind(
257 &WebMediaPlayerImpl::DoLoad, AsWeakPtr(), load_type, url, cors_mode)); 261 &WebMediaPlayerImpl::DoLoad, AsWeakPtr(), load_type, url, cors_mode));
258 return; 262 return;
259 } 263 }
260 DoLoad(load_type, url, cors_mode); 264 DoLoad(load_type, url, cors_mode);
261 } 265 }
262 266
267 void WebMediaPlayerImpl::enterFullscreen() {
268 fullscreen_ = true;
269 if (decoder_requires_restart_for_fullscreen_)
270 ScheduleRestart();
271 }
272
273 void WebMediaPlayerImpl::exitedFullscreen() {
274 fullscreen_ = false;
275 if (decoder_requires_restart_for_fullscreen_)
276 ScheduleRestart();
277 }
278
263 void WebMediaPlayerImpl::DoLoad(LoadType load_type, 279 void WebMediaPlayerImpl::DoLoad(LoadType load_type,
264 const blink::WebURL& url, 280 const blink::WebURL& url,
265 CORSMode cors_mode) { 281 CORSMode cors_mode) {
266 DVLOG(1) << __FUNCTION__; 282 DVLOG(1) << __FUNCTION__;
267 DCHECK(main_task_runner_->BelongsToCurrentThread()); 283 DCHECK(main_task_runner_->BelongsToCurrentThread());
268 284
269 GURL gurl(url); 285 GURL gurl(url);
270 ReportMetrics( 286 ReportMetrics(
271 load_type, gurl, 287 load_type, gurl,
272 blink::WebStringToGURL(frame_->document().securityOrigin().toString())); 288 blink::WebStringToGURL(frame_->document().securityOrigin().toString()));
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 978
963 #if defined(OS_ANDROID) 979 #if defined(OS_ANDROID)
964 if (isRemote()) { 980 if (isRemote()) {
965 scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner(); 981 scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner();
966 if (frame) { 982 if (frame) {
967 compositor_->PaintFrameUsingOldRenderingPath(frame); 983 compositor_->PaintFrameUsingOldRenderingPath(frame);
968 } 984 }
969 } 985 }
970 #endif 986 #endif
971 987
972 if (pending_resume_) { 988 if (pending_resume_ || pending_suspend_resume_cycle_) {
973 pending_resume_ = false; 989 pending_resume_ = false;
990 pending_suspend_resume_cycle_ = false;
974 Resume(); 991 Resume();
975 return; 992 return;
976 } 993 }
977 } 994 }
978 995
979 void WebMediaPlayerImpl::OnPipelineEnded() { 996 void WebMediaPlayerImpl::OnPipelineEnded() {
980 DVLOG(1) << __FUNCTION__; 997 DVLOG(1) << __FUNCTION__;
981 DCHECK(main_task_runner_->BelongsToCurrentThread()); 998 DCHECK(main_task_runner_->BelongsToCurrentThread());
982 999
983 // Ignore state changes until we've completed all outstanding seeks. 1000 // Ignore state changes until we've completed all outstanding seeks.
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 1231
1215 if (chunk_demuxer_) 1232 if (chunk_demuxer_)
1216 chunk_demuxer_->StartWaitingForSeek(seek_time_); 1233 chunk_demuxer_->StartWaitingForSeek(seek_time_);
1217 1234
1218 resuming_ = true; 1235 resuming_ = true;
1219 pipeline_.Resume(CreateRenderer(), seek_time_, 1236 pipeline_.Resume(CreateRenderer(), seek_time_,
1220 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, 1237 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked,
1221 time_changed)); 1238 time_changed));
1222 } 1239 }
1223 1240
1241 void WebMediaPlayerImpl::ScheduleRestart() {
1242 pending_suspend_resume_cycle_ = true;
DaleCurtis 2016/02/02 01:01:33 Why not just use |pending_resume| ?
watk 2016/02/02 20:38:14 I wish I wrote a comment because I've already forg
watk 2016/02/05 03:42:30 Added some comments for this.
1243 ScheduleSuspend();
1244 }
1245
1224 #if defined(OS_ANDROID) // WMPI_CAST 1246 #if defined(OS_ANDROID) // WMPI_CAST
1225 1247
1226 bool WebMediaPlayerImpl::isRemote() const { 1248 bool WebMediaPlayerImpl::isRemote() const {
1227 return cast_impl_.isRemote(); 1249 return cast_impl_.isRemote();
1228 } 1250 }
1229 1251
1230 void WebMediaPlayerImpl::SetMediaPlayerManager( 1252 void WebMediaPlayerImpl::SetMediaPlayerManager(
1231 RendererMediaPlayerManagerInterface* media_player_manager) { 1253 RendererMediaPlayerManagerInterface* media_player_manager) {
1232 cast_impl_.SetMediaPlayerManager(media_player_manager); 1254 cast_impl_.SetMediaPlayerManager(media_player_manager);
1233 } 1255 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading) 1324 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading)
1303 SetNetworkState(WebMediaPlayer::NetworkStateIdle); 1325 SetNetworkState(WebMediaPlayer::NetworkStateIdle);
1304 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) 1326 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle)
1305 SetNetworkState(WebMediaPlayer::NetworkStateLoading); 1327 SetNetworkState(WebMediaPlayer::NetworkStateLoading);
1306 media_log_->AddEvent( 1328 media_log_->AddEvent(
1307 media_log_->CreateBooleanEvent( 1329 media_log_->CreateBooleanEvent(
1308 MediaLogEvent::NETWORK_ACTIVITY_SET, 1330 MediaLogEvent::NETWORK_ACTIVITY_SET,
1309 "is_downloading_data", is_downloading)); 1331 "is_downloading_data", is_downloading));
1310 } 1332 }
1311 1333
1334 void WebMediaPlayerImpl::OnSurfaceRequested(
1335 const SurfaceCreatedCB& surface_created_cb) {
1336 DCHECK(main_task_runner_->BelongsToCurrentThread());
1337 DCHECK(surface_manager_);
1338
1339 // A null callback indicates that the decoder is going away.
1340 if (surface_created_cb.is_null()) {
1341 decoder_requires_restart_for_fullscreen_ = false;
1342 return;
1343 }
1344
1345 decoder_requires_restart_for_fullscreen_ = true;
liberato (no reviews please) 2016/02/02 22:46:57 is this being set unconditionally so that EnterFul
watk 2016/02/05 03:42:30 Yep, your assessment was correct. I tried to comme
1346 if (fullscreen_)
1347 surface_manager_->CreateFullscreenSurface(surface_created_cb);
1348 else
1349 surface_created_cb.Run(SurfaceManager::kNoSurfaceID);
1350 }
1351
1312 scoped_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() { 1352 scoped_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() {
1313 return renderer_factory_->CreateRenderer( 1353 return renderer_factory_->CreateRenderer(
1314 media_task_runner_, worker_task_runner_, audio_source_provider_.get(), 1354 media_task_runner_, worker_task_runner_, audio_source_provider_.get(),
1315 compositor_); 1355 compositor_,
1356 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnSurfaceRequested));
liberato (no reviews please) 2016/02/02 22:46:57 should this be #if android? otherwise, it looks l
watk 2016/02/05 03:42:30 Done.
1316 } 1357 }
1317 1358
1318 void WebMediaPlayerImpl::StartPipeline() { 1359 void WebMediaPlayerImpl::StartPipeline() {
1319 DCHECK(main_task_runner_->BelongsToCurrentThread()); 1360 DCHECK(main_task_runner_->BelongsToCurrentThread());
1320 1361
1321 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = 1362 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb =
1322 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnEncryptedMediaInitData); 1363 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnEncryptedMediaInitData);
1323 1364
1324 // Figure out which demuxer to use. 1365 // Figure out which demuxer to use.
1325 if (load_type_ != LoadTypeMediaSource) { 1366 if (load_type_ != LoadTypeMediaSource) {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1523 << ", Video: " << stats.video_memory_usage << ", DataSource: " 1564 << ", Video: " << stats.video_memory_usage << ", DataSource: "
1524 << (data_source_ ? data_source_->GetMemoryUsage() : 0) 1565 << (data_source_ ? data_source_->GetMemoryUsage() : 0)
1525 << ", Demuxer: " << demuxer_memory_usage; 1566 << ", Demuxer: " << demuxer_memory_usage;
1526 1567
1527 const int64_t delta = current_memory_usage - last_reported_memory_usage_; 1568 const int64_t delta = current_memory_usage - last_reported_memory_usage_;
1528 last_reported_memory_usage_ = current_memory_usage; 1569 last_reported_memory_usage_ = current_memory_usage;
1529 adjust_allocated_memory_cb_.Run(delta); 1570 adjust_allocated_memory_cb_.Run(delta);
1530 } 1571 }
1531 1572
1532 } // namespace media 1573 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698