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 |