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 "content/renderer/media/webmediaplayer_impl.h" | 5 #include "content/renderer/media/webmediaplayer_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
429 void WebMediaPlayerImpl::setPreload(WebMediaPlayer::Preload preload) { | 429 void WebMediaPlayerImpl::setPreload(WebMediaPlayer::Preload preload) { |
430 DCHECK(main_loop_->BelongsToCurrentThread()); | 430 DCHECK(main_loop_->BelongsToCurrentThread()); |
431 | 431 |
432 if (data_source_) | 432 if (data_source_) |
433 data_source_->SetPreload(static_cast<content::Preload>(preload)); | 433 data_source_->SetPreload(static_cast<content::Preload>(preload)); |
434 } | 434 } |
435 | 435 |
436 bool WebMediaPlayerImpl::hasVideo() const { | 436 bool WebMediaPlayerImpl::hasVideo() const { |
437 DCHECK(main_loop_->BelongsToCurrentThread()); | 437 DCHECK(main_loop_->BelongsToCurrentThread()); |
438 | 438 |
439 return pipeline_.HasVideo(); | 439 return pipeline_metadata_.has_video; |
440 } | 440 } |
441 | 441 |
442 bool WebMediaPlayerImpl::hasAudio() const { | 442 bool WebMediaPlayerImpl::hasAudio() const { |
443 DCHECK(main_loop_->BelongsToCurrentThread()); | 443 DCHECK(main_loop_->BelongsToCurrentThread()); |
444 | 444 |
445 return pipeline_.HasAudio(); | 445 return pipeline_metadata_.has_audio; |
446 } | 446 } |
447 | 447 |
448 blink::WebSize WebMediaPlayerImpl::naturalSize() const { | 448 blink::WebSize WebMediaPlayerImpl::naturalSize() const { |
449 DCHECK(main_loop_->BelongsToCurrentThread()); | 449 DCHECK(main_loop_->BelongsToCurrentThread()); |
450 | 450 |
451 return blink::WebSize(natural_size_); | 451 return blink::WebSize(pipeline_metadata_.natural_size); |
452 } | 452 } |
453 | 453 |
454 bool WebMediaPlayerImpl::paused() const { | 454 bool WebMediaPlayerImpl::paused() const { |
455 DCHECK(main_loop_->BelongsToCurrentThread()); | 455 DCHECK(main_loop_->BelongsToCurrentThread()); |
456 | 456 |
457 return pipeline_.GetPlaybackRate() == 0.0f; | 457 return pipeline_.GetPlaybackRate() == 0.0f; |
458 } | 458 } |
459 | 459 |
460 bool WebMediaPlayerImpl::seeking() const { | 460 bool WebMediaPlayerImpl::seeking() const { |
461 DCHECK(main_loop_->BelongsToCurrentThread()); | 461 DCHECK(main_loop_->BelongsToCurrentThread()); |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
958 SetNetworkState(PipelineErrorToNetworkState(error)); | 958 SetNetworkState(PipelineErrorToNetworkState(error)); |
959 | 959 |
960 if (error == media::PIPELINE_ERROR_DECRYPT) | 960 if (error == media::PIPELINE_ERROR_DECRYPT) |
961 EmeUMAHistogramCounts(current_key_system_, "DecryptError", 1); | 961 EmeUMAHistogramCounts(current_key_system_, "DecryptError", 1); |
962 | 962 |
963 // TODO(scherkus): This should be handled by HTMLMediaElement and controls | 963 // TODO(scherkus): This should be handled by HTMLMediaElement and controls |
964 // should know when to invalidate themselves http://crbug.com/337015 | 964 // should know when to invalidate themselves http://crbug.com/337015 |
965 InvalidateOnMainThread(); | 965 InvalidateOnMainThread(); |
966 } | 966 } |
967 | 967 |
968 void WebMediaPlayerImpl::OnPipelineBufferingState( | 968 void WebMediaPlayerImpl::OnPipelineMetadata( |
969 media::Pipeline::BufferingState buffering_state) { | 969 media::PipelineMetadata metadata) { |
970 DVLOG(1) << "OnPipelineBufferingState(" << buffering_state << ")"; | 970 DVLOG(1) << "OnPipelineMetadata"; |
971 | 971 |
972 switch (buffering_state) { | 972 pipeline_metadata_ = metadata; |
973 case media::Pipeline::kHaveMetadata: | |
974 // TODO(scherkus): Would be better to have a metadata changed callback | |
975 // that contained the size information as well whether audio/video is | |
976 // present. Doing so would let us remove more methods off Pipeline. | |
977 natural_size_ = pipeline_.GetInitialNaturalSize(); | |
978 | 973 |
979 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 974 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
980 | 975 |
981 if (hasVideo() && client_->needsWebLayerForVideo()) { | 976 if (hasVideo() && client_->needsWebLayerForVideo()) { |
982 DCHECK(!video_weblayer_); | 977 DCHECK(!video_weblayer_); |
983 video_weblayer_.reset( | 978 video_weblayer_.reset( |
984 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); | 979 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); |
985 client_->setWebLayer(video_weblayer_.get()); | 980 client_->setWebLayer(video_weblayer_.get()); |
986 } | |
987 break; | |
988 case media::Pipeline::kPrerollCompleted: | |
989 // Only transition to ReadyStateHaveEnoughData if we don't have | |
990 // any pending seeks because the transition can cause Blink to | |
991 // report that the most recent seek has completed. | |
992 if (!pending_seek_) | |
993 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | |
994 break; | |
995 } | 981 } |
996 | 982 |
997 // TODO(scherkus): This should be handled by HTMLMediaElement and controls | 983 // TODO(scherkus): This should be handled by HTMLMediaElement and controls |
998 // should know when to invalidate themselves http://crbug.com/337015 | 984 // should know when to invalidate themselves http://crbug.com/337015 |
999 InvalidateOnMainThread(); | 985 InvalidateOnMainThread(); |
1000 } | 986 } |
1001 | 987 |
| 988 void WebMediaPlayerImpl::OnPipelinePrerollCompleted() { |
| 989 DVLOG(1) << "OnPipelinePrerollCompleted"; |
| 990 |
| 991 // Only transition to ReadyStateHaveEnoughData if we don't have |
| 992 // any pending seeks because the transition can cause Blink to |
| 993 // report that the most recent seek has completed. |
| 994 if (!pending_seek_) { |
| 995 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
| 996 |
| 997 // TODO(scherkus): This should be handled by HTMLMediaElement and controls |
| 998 // should know when to invalidate themselves http://crbug.com/337015 |
| 999 InvalidateOnMainThread(); |
| 1000 } |
| 1001 } |
| 1002 |
1002 void WebMediaPlayerImpl::OnDemuxerOpened() { | 1003 void WebMediaPlayerImpl::OnDemuxerOpened() { |
1003 DCHECK(main_loop_->BelongsToCurrentThread()); | 1004 DCHECK(main_loop_->BelongsToCurrentThread()); |
1004 client_->mediaSourceOpened(new WebMediaSourceImpl( | 1005 client_->mediaSourceOpened(new WebMediaSourceImpl( |
1005 chunk_demuxer_, base::Bind(&LogMediaSourceError, media_log_))); | 1006 chunk_demuxer_, base::Bind(&LogMediaSourceError, media_log_))); |
1006 } | 1007 } |
1007 | 1008 |
1008 void WebMediaPlayerImpl::OnKeyAdded(const std::string& session_id) { | 1009 void WebMediaPlayerImpl::OnKeyAdded(const std::string& session_id) { |
1009 DCHECK(main_loop_->BelongsToCurrentThread()); | 1010 DCHECK(main_loop_->BelongsToCurrentThread()); |
1010 EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1); | 1011 EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1); |
1011 client_->keyAdded( | 1012 client_->keyAdded( |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1210 filter_collection->SetTextRenderer(text_renderer.Pass()); | 1211 filter_collection->SetTextRenderer(text_renderer.Pass()); |
1211 } | 1212 } |
1212 | 1213 |
1213 // ... and we're ready to go! | 1214 // ... and we're ready to go! |
1214 starting_ = true; | 1215 starting_ = true; |
1215 pipeline_.Start( | 1216 pipeline_.Start( |
1216 filter_collection.Pass(), | 1217 filter_collection.Pass(), |
1217 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), | 1218 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
1218 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), | 1219 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
1219 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), | 1220 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), |
1220 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), | 1221 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), |
| 1222 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelinePrerollCompleted), |
1221 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); | 1223 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); |
1222 } | 1224 } |
1223 | 1225 |
1224 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { | 1226 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { |
1225 DCHECK(main_loop_->BelongsToCurrentThread()); | 1227 DCHECK(main_loop_->BelongsToCurrentThread()); |
1226 DVLOG(1) << "SetNetworkState: " << state; | 1228 DVLOG(1) << "SetNetworkState: " << state; |
1227 network_state_ = state; | 1229 network_state_ = state; |
1228 // Always notify to ensure client has the latest value. | 1230 // Always notify to ensure client has the latest value. |
1229 client_->networkStateChanged(); | 1231 client_->networkStateChanged(); |
1230 } | 1232 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1272 client_->durationChanged(); | 1274 client_->durationChanged(); |
1273 } | 1275 } |
1274 | 1276 |
1275 void WebMediaPlayerImpl::OnNaturalSizeChange(gfx::Size size) { | 1277 void WebMediaPlayerImpl::OnNaturalSizeChange(gfx::Size size) { |
1276 DCHECK(main_loop_->BelongsToCurrentThread()); | 1278 DCHECK(main_loop_->BelongsToCurrentThread()); |
1277 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); | 1279 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); |
1278 TRACE_EVENT0("media", "WebMediaPlayerImpl::OnNaturalSizeChanged"); | 1280 TRACE_EVENT0("media", "WebMediaPlayerImpl::OnNaturalSizeChanged"); |
1279 | 1281 |
1280 media_log_->AddEvent( | 1282 media_log_->AddEvent( |
1281 media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); | 1283 media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); |
1282 natural_size_ = size; | 1284 pipeline_metadata_.natural_size = size; |
1283 | 1285 |
1284 client_->sizeChanged(); | 1286 client_->sizeChanged(); |
1285 } | 1287 } |
1286 | 1288 |
1287 void WebMediaPlayerImpl::FrameReady( | 1289 void WebMediaPlayerImpl::FrameReady( |
1288 const scoped_refptr<media::VideoFrame>& frame) { | 1290 const scoped_refptr<media::VideoFrame>& frame) { |
1289 // TODO(scherkus): Today we always invalidate on the main thread even when | 1291 // TODO(scherkus): Today we always invalidate on the main thread even when |
1290 // compositing is available, which is less efficient and involves more | 1292 // compositing is available, which is less efficient and involves more |
1291 // thread hops. Refer to http://crbug.com/335345 for details. | 1293 // thread hops. Refer to http://crbug.com/335345 for details. |
1292 painter_.UpdateCurrentFrame(frame); | 1294 painter_.UpdateCurrentFrame(frame); |
(...skipping 27 matching lines...) Expand all Loading... |
1320 | 1322 |
1321 if (web_cdm_) { | 1323 if (web_cdm_) { |
1322 decryptor_ready_cb.Run(web_cdm_->GetDecryptor()); | 1324 decryptor_ready_cb.Run(web_cdm_->GetDecryptor()); |
1323 return; | 1325 return; |
1324 } | 1326 } |
1325 | 1327 |
1326 decryptor_ready_cb_ = decryptor_ready_cb; | 1328 decryptor_ready_cb_ = decryptor_ready_cb; |
1327 } | 1329 } |
1328 | 1330 |
1329 } // namespace content | 1331 } // namespace content |
OLD | NEW |