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 "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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 WebKit::WebMediaPlayerClient* client, | 131 WebKit::WebMediaPlayerClient* client, |
| 132 base::WeakPtr<WebMediaPlayerDelegate> delegate, | 132 base::WeakPtr<WebMediaPlayerDelegate> delegate, |
| 133 const WebMediaPlayerParams& params) | 133 const WebMediaPlayerParams& params) |
| 134 : frame_(frame), | 134 : frame_(frame), |
| 135 network_state_(WebMediaPlayer::NetworkStateEmpty), | 135 network_state_(WebMediaPlayer::NetworkStateEmpty), |
| 136 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 136 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
| 137 main_loop_(base::MessageLoopProxy::current()), | 137 main_loop_(base::MessageLoopProxy::current()), |
| 138 media_loop_(params.message_loop_proxy()), | 138 media_loop_(params.message_loop_proxy()), |
| 139 paused_(true), | 139 paused_(true), |
| 140 seeking_(false), | 140 seeking_(false), |
| 141 playback_rate_(0.0f), | 141 playback_rate_(0.0), |
| 142 pending_seek_(false), | 142 pending_seek_(false), |
| 143 pending_seek_seconds_(0.0f), | |
| 144 client_(client), | 143 client_(client), |
| 145 delegate_(delegate), | 144 delegate_(delegate), |
| 146 defer_load_cb_(params.defer_load_cb()), | 145 defer_load_cb_(params.defer_load_cb()), |
| 147 media_log_(params.media_log()), | 146 media_log_(params.media_log()), |
| 148 accelerated_compositing_reported_(false), | 147 accelerated_compositing_reported_(false), |
| 149 incremented_externally_allocated_memory_(false), | 148 incremented_externally_allocated_memory_(false), |
| 150 gpu_factories_(params.gpu_factories()), | 149 gpu_factories_(params.gpu_factories()), |
| 151 is_local_source_(false), | 150 is_local_source_(false), |
| 152 supports_save_(true), | 151 supports_save_(true), |
| 153 starting_(false), | 152 starting_(false), |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 330 } | 329 } |
| 331 | 330 |
| 332 bool WebMediaPlayerImpl::supportsSave() const { | 331 bool WebMediaPlayerImpl::supportsSave() const { |
| 333 DCHECK(main_loop_->BelongsToCurrentThread()); | 332 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 334 return supports_save_; | 333 return supports_save_; |
| 335 } | 334 } |
| 336 | 335 |
| 337 void WebMediaPlayerImpl::seek(double seconds) { | 336 void WebMediaPlayerImpl::seek(double seconds) { |
| 338 DCHECK(main_loop_->BelongsToCurrentThread()); | 337 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 339 | 338 |
| 340 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); | 339 base::TimeDelta new_seek_time = ConvertSecondsToTimestamp(seconds); |
| 340 | |
| 341 // Suppress redundant seek to same microsecond as current seek. Clear any | |
| 342 // pending seek in this case, too. For example, seek(1), seek(2), seek(1) | |
| 343 // without any intervening seek completion should result in only a current | |
| 344 // seek to (1) without any left-over pending seek. | |
| 345 if (seeking_ && new_seek_time == seek_time_) { | |
|
wolenetz
2013/10/01 19:51:49
This is incorrect; I'll need to fix this in subseq
| |
| 346 pending_seek_ = false; | |
| 347 return; | |
| 348 } | |
| 341 | 349 |
| 342 if (starting_ || seeking_) { | 350 if (starting_ || seeking_) { |
| 343 pending_seek_ = true; | 351 pending_seek_ = true; |
| 344 pending_seek_seconds_ = seconds; | 352 pending_seek_time_ = new_seek_time; |
| 345 if (chunk_demuxer_) | 353 if (chunk_demuxer_) |
| 346 chunk_demuxer_->CancelPendingSeek(seek_time); | 354 chunk_demuxer_->CancelPendingSeek(pending_seek_time_); |
| 347 return; | 355 return; |
| 348 } | 356 } |
| 349 | 357 |
| 358 seek_time_ = new_seek_time; | |
| 350 media_log_->AddEvent(media_log_->CreateSeekEvent(seconds)); | 359 media_log_->AddEvent(media_log_->CreateSeekEvent(seconds)); |
| 351 | 360 |
| 352 // Update our paused time. | 361 // Update our paused time. |
| 353 if (paused_) | 362 if (paused_) |
| 354 paused_time_ = seek_time; | 363 paused_time_ = seek_time_; |
| 355 | 364 |
| 356 seeking_ = true; | 365 seeking_ = true; |
| 357 | 366 |
| 358 if (chunk_demuxer_) | 367 if (chunk_demuxer_) |
| 359 chunk_demuxer_->StartWaitingForSeek(seek_time); | 368 chunk_demuxer_->StartWaitingForSeek(seek_time_); |
| 360 | 369 |
| 361 // Kick off the asynchronous seek! | 370 // Kick off the asynchronous seek! |
| 362 pipeline_->Seek( | 371 pipeline_->Seek( |
| 363 seek_time, | 372 seek_time_, |
| 364 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek)); | 373 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek)); |
| 365 } | 374 } |
| 366 | 375 |
| 367 void WebMediaPlayerImpl::setRate(double rate) { | 376 void WebMediaPlayerImpl::setRate(double rate) { |
| 368 DCHECK(main_loop_->BelongsToCurrentThread()); | 377 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 369 | 378 |
| 370 // TODO(kylep): Remove when support for negatives is added. Also, modify the | 379 // TODO(kylep): Remove when support for negatives is added. Also, modify the |
| 371 // following checks so rewind uses reasonable values also. | 380 // following checks so rewind uses reasonable values also. |
| 372 if (rate < 0.0) | 381 if (rate < 0.0) |
| 373 return; | 382 return; |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 831 | 840 |
| 832 GetClient()->repaint(); | 841 GetClient()->repaint(); |
| 833 } | 842 } |
| 834 | 843 |
| 835 void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) { | 844 void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) { |
| 836 DCHECK(main_loop_->BelongsToCurrentThread()); | 845 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 837 starting_ = false; | 846 starting_ = false; |
| 838 seeking_ = false; | 847 seeking_ = false; |
| 839 if (pending_seek_) { | 848 if (pending_seek_) { |
| 840 pending_seek_ = false; | 849 pending_seek_ = false; |
| 841 seek(pending_seek_seconds_); | 850 seek(pending_seek_time_.InSecondsF()); |
| 842 return; | 851 return; |
| 843 } | 852 } |
| 844 | 853 |
| 845 if (status != media::PIPELINE_OK) { | 854 if (status != media::PIPELINE_OK) { |
| 846 OnPipelineError(status); | 855 OnPipelineError(status); |
| 847 return; | 856 return; |
| 848 } | 857 } |
| 849 | 858 |
| 850 // Update our paused time. | 859 // Update our paused time. |
| 851 if (paused_) | 860 if (paused_) |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 875 | 884 |
| 876 if (error == media::PIPELINE_ERROR_DECRYPT) | 885 if (error == media::PIPELINE_ERROR_DECRYPT) |
| 877 EmeUMAHistogramCounts(current_key_system_, "DecryptError", 1); | 886 EmeUMAHistogramCounts(current_key_system_, "DecryptError", 1); |
| 878 | 887 |
| 879 // Repaint to trigger UI update. | 888 // Repaint to trigger UI update. |
| 880 Repaint(); | 889 Repaint(); |
| 881 } | 890 } |
| 882 | 891 |
| 883 void WebMediaPlayerImpl::OnPipelineBufferingState( | 892 void WebMediaPlayerImpl::OnPipelineBufferingState( |
| 884 media::Pipeline::BufferingState buffering_state) { | 893 media::Pipeline::BufferingState buffering_state) { |
| 894 DCHECK(main_loop_->BelongsToCurrentThread()); | |
| 885 DVLOG(1) << "OnPipelineBufferingState(" << buffering_state << ")"; | 895 DVLOG(1) << "OnPipelineBufferingState(" << buffering_state << ")"; |
| 886 | 896 |
| 887 switch (buffering_state) { | 897 switch (buffering_state) { |
| 888 case media::Pipeline::kHaveMetadata: | 898 case media::Pipeline::kHaveMetadata: |
| 889 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 899 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
| 890 | 900 |
| 891 if (hasVideo() && GetClient()->needsWebLayerForVideo()) { | 901 if (hasVideo() && GetClient()->needsWebLayerForVideo()) { |
| 892 DCHECK(!video_weblayer_); | 902 DCHECK(!video_weblayer_); |
| 893 video_weblayer_.reset( | 903 video_weblayer_.reset( |
| 894 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); | 904 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1237 | 1247 |
| 1238 if (pending_repaint_) | 1248 if (pending_repaint_) |
| 1239 return; | 1249 return; |
| 1240 | 1250 |
| 1241 pending_repaint_ = true; | 1251 pending_repaint_ = true; |
| 1242 main_loop_->PostTask(FROM_HERE, base::Bind( | 1252 main_loop_->PostTask(FROM_HERE, base::Bind( |
| 1243 &WebMediaPlayerImpl::Repaint, AsWeakPtr())); | 1253 &WebMediaPlayerImpl::Repaint, AsWeakPtr())); |
| 1244 } | 1254 } |
| 1245 | 1255 |
| 1246 } // namespace content | 1256 } // namespace content |
| OLD | NEW |