Chromium Code Reviews| 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |