| 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 <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 | 429 |
| 430 return seeking_; | 430 return seeking_; |
| 431 } | 431 } |
| 432 | 432 |
| 433 double WebMediaPlayerImpl::duration() const { | 433 double WebMediaPlayerImpl::duration() const { |
| 434 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 434 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 435 | 435 |
| 436 if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) | 436 if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) |
| 437 return std::numeric_limits<double>::quiet_NaN(); | 437 return std::numeric_limits<double>::quiet_NaN(); |
| 438 | 438 |
| 439 if (ended_) |
| 440 return currentTime(); |
| 441 |
| 439 return GetPipelineDuration(); | 442 return GetPipelineDuration(); |
| 440 } | 443 } |
| 441 | 444 |
| 442 double WebMediaPlayerImpl::timelineOffset() const { | 445 double WebMediaPlayerImpl::timelineOffset() const { |
| 443 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 446 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 444 | 447 |
| 445 if (pipeline_metadata_.timeline_offset.is_null()) | 448 if (pipeline_metadata_.timeline_offset.is_null()) |
| 446 return std::numeric_limits<double>::quiet_NaN(); | 449 return std::numeric_limits<double>::quiet_NaN(); |
| 447 | 450 |
| 448 return pipeline_metadata_.timeline_offset.ToJsTime(); | 451 return pipeline_metadata_.timeline_offset.ToJsTime(); |
| 449 } | 452 } |
| 450 | 453 |
| 451 double WebMediaPlayerImpl::currentTime() const { | 454 double WebMediaPlayerImpl::currentTime() const { |
| 452 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 455 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 453 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); | 456 DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); |
| 454 | 457 |
| 455 // TODO(scherkus): Replace with an explicit ended signal to HTMLMediaElement, | |
| 456 // see http://crbug.com/409280 | |
| 457 if (ended_) | |
| 458 return duration(); | |
| 459 | |
| 460 return (paused_ ? paused_time_ : pipeline_.GetMediaTime()).InSecondsF(); | 458 return (paused_ ? paused_time_ : pipeline_.GetMediaTime()).InSecondsF(); |
| 461 } | 459 } |
| 462 | 460 |
| 463 WebMediaPlayer::NetworkState WebMediaPlayerImpl::networkState() const { | 461 WebMediaPlayer::NetworkState WebMediaPlayerImpl::networkState() const { |
| 464 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 462 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 465 return network_state_; | 463 return network_state_; |
| 466 } | 464 } |
| 467 | 465 |
| 468 WebMediaPlayer::ReadyState WebMediaPlayerImpl::readyState() const { | 466 WebMediaPlayer::ReadyState WebMediaPlayerImpl::readyState() const { |
| 469 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 467 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 | 709 |
| 712 void WebMediaPlayerImpl::OnPipelineEnded() { | 710 void WebMediaPlayerImpl::OnPipelineEnded() { |
| 713 DVLOG(1) << __FUNCTION__; | 711 DVLOG(1) << __FUNCTION__; |
| 714 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 712 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 715 | 713 |
| 716 // Ignore state changes until we've completed all outstanding seeks. | 714 // Ignore state changes until we've completed all outstanding seeks. |
| 717 if (seeking_ || pending_seek_) | 715 if (seeking_ || pending_seek_) |
| 718 return; | 716 return; |
| 719 | 717 |
| 720 ended_ = true; | 718 ended_ = true; |
| 721 client_->timeChanged(); | 719 |
| 720 // If the duration in the metadata is not correct, then actual duration should |
| 721 // be updated in blink. |
| 722 client_->durationChanged(); |
| 723 client_->mediaEnded(); |
| 722 } | 724 } |
| 723 | 725 |
| 724 void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { | 726 void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { |
| 725 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 727 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 726 DCHECK_NE(error, PIPELINE_OK); | 728 DCHECK_NE(error, PIPELINE_OK); |
| 727 | 729 |
| 728 if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) { | 730 if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) { |
| 729 // Any error that occurs before reaching ReadyStateHaveMetadata should | 731 // Any error that occurs before reaching ReadyStateHaveMetadata should |
| 730 // be considered a format error. | 732 // be considered a format error. |
| 731 SetNetworkState(WebMediaPlayer::NetworkStateFormatError); | 733 SetNetworkState(WebMediaPlayer::NetworkStateFormatError); |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1029 compositor_task_runner_->PostTask(FROM_HERE, | 1031 compositor_task_runner_->PostTask(FROM_HERE, |
| 1030 base::Bind(&GetCurrentFrameAndSignal, | 1032 base::Bind(&GetCurrentFrameAndSignal, |
| 1031 base::Unretained(compositor_), | 1033 base::Unretained(compositor_), |
| 1032 &video_frame, | 1034 &video_frame, |
| 1033 &event)); | 1035 &event)); |
| 1034 event.Wait(); | 1036 event.Wait(); |
| 1035 return video_frame; | 1037 return video_frame; |
| 1036 } | 1038 } |
| 1037 | 1039 |
| 1038 } // namespace media | 1040 } // namespace media |
| OLD | NEW |