| Index: media/base/pipeline_impl.cc
|
| diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
|
| index 9b482f858532332c0c058c41705b8a13f34de599..e5f1c0c41141cf2dec82b37dce1d90896ea1ae7b 100644
|
| --- a/media/base/pipeline_impl.cc
|
| +++ b/media/base/pipeline_impl.cc
|
| @@ -73,6 +73,7 @@ void DecrementCounter(Lock* lock, ConditionVariable* cond_var, int* count) {
|
|
|
| PipelineImpl::PipelineImpl(MessageLoop* message_loop)
|
| : message_loop_(message_loop),
|
| + clock_(&base::Time::Now),
|
| state_(kCreated),
|
| remaining_transitions_(0) {
|
| ResetState();
|
| @@ -201,7 +202,7 @@ void PipelineImpl::SetVolume(float volume) {
|
|
|
| base::TimeDelta PipelineImpl::GetCurrentTime() const {
|
| AutoLock auto_lock(lock_);
|
| - return time_;
|
| + return clock_.Elapsed();
|
| }
|
|
|
| base::TimeDelta PipelineImpl::GetBufferedTime() const {
|
| @@ -239,9 +240,10 @@ PipelineError PipelineImpl::GetError() const {
|
|
|
| void PipelineImpl::ResetState() {
|
| AutoLock auto_lock(lock_);
|
| + const base::TimeDelta kZero;
|
| running_ = false;
|
| - duration_ = base::TimeDelta();
|
| - buffered_time_ = base::TimeDelta();
|
| + duration_ = kZero;
|
| + buffered_time_ = kZero;
|
| buffered_bytes_ = 0;
|
| total_bytes_ = 0;
|
| video_width_ = 0;
|
| @@ -249,7 +251,7 @@ void PipelineImpl::ResetState() {
|
| volume_ = 1.0f;
|
| playback_rate_ = 0.0f;
|
| error_ = PIPELINE_OK;
|
| - time_ = base::TimeDelta();
|
| + clock_.SetTime(kZero);
|
| rendered_mime_types_.clear();
|
| }
|
|
|
| @@ -303,7 +305,7 @@ base::TimeDelta PipelineImpl::GetTime() const {
|
| void PipelineImpl::SetTime(base::TimeDelta time) {
|
| DCHECK(IsRunning());
|
| AutoLock auto_lock(lock_);
|
| - time_ = time;
|
| + clock_.SetTime(time);
|
| }
|
|
|
| void PipelineImpl::SetDuration(base::TimeDelta duration) {
|
| @@ -537,6 +539,7 @@ void PipelineImpl::ErrorChangedTask(PipelineError error) {
|
|
|
| void PipelineImpl::PlaybackRateChangedTask(float playback_rate) {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| + clock_.SetPlaybackRate(playback_rate);
|
| for (FilterVector::iterator iter = filters_.begin();
|
| iter != filters_.end();
|
| ++iter) {
|
| @@ -581,6 +584,7 @@ void PipelineImpl::SeekTask(base::TimeDelta time,
|
| remaining_transitions_ = filters_.size();
|
|
|
| // Kick off seeking!
|
| + clock_.Pause();
|
| filters_.front()->Pause(
|
| NewCallback(this, &PipelineImpl::OnFilterStateTransition));
|
| }
|
| @@ -600,6 +604,12 @@ void PipelineImpl::FilterStateTransitionTask() {
|
| CHECK(remaining_transitions_ > 0u);
|
| if (--remaining_transitions_ == 0) {
|
| state_ = FindNextState(state_);
|
| + if (state_ == kSeeking) {
|
| + clock_.SetTime(seek_timestamp_);
|
| + } else if (state_ == kStarting) {
|
| + clock_.Play();
|
| + }
|
| +
|
| if (StateTransitionsToStarted(state_)) {
|
| remaining_transitions_ = filters_.size();
|
| }
|
| @@ -619,9 +629,6 @@ void PipelineImpl::FilterStateTransitionTask() {
|
| NOTREACHED();
|
| }
|
| } else if (state_ == kStarted) {
|
| - // We've completed the seek, update the time.
|
| - SetTime(seek_timestamp_);
|
| -
|
| // Execute the seek callback, if present. Note that this might be the
|
| // initial callback passed into Start().
|
| if (seek_callback_.get()) {
|
|
|