Chromium Code Reviews| Index: services/media/factory_service/media_player_impl.cc |
| diff --git a/services/media/factory_service/media_player_impl.cc b/services/media/factory_service/media_player_impl.cc |
| index e174c2f90dcd219f930ab7b4d656e67b04682e2a..b7b48d40d9d7702cc0614dffe2e5763cc1b5e4fe 100644 |
| --- a/services/media/factory_service/media_player_impl.cc |
| +++ b/services/media/factory_service/media_player_impl.cc |
| @@ -83,7 +83,7 @@ MediaPlayerImpl::MediaPlayerImpl(InterfaceHandle<SeekingReader> reader, |
| callback_joiner->WhenJoined([this]() { |
| // The enabled streams are prepared. |
| factory_.reset(); |
| - state_ = State::kPaused; |
| + state_ = State::kFlushed; |
| Update(); |
| }); |
| }); |
| @@ -94,40 +94,59 @@ MediaPlayerImpl::~MediaPlayerImpl() {} |
| void MediaPlayerImpl::Update() { |
|
kulakowski
2016/06/20 23:04:08
The state in the machine here
target_position_ (2
dalesat
2016/06/21 01:09:30
I've added a bunch of comments that will hopefully
|
| while (true) { |
| switch (state_) { |
| - case State::kPaused: |
| + case State::kFlushed: |
| if (target_position_ != kUnspecifiedTime) { |
| - WhenPausedAndSeeking(); |
| + state_ = State::kWaiting; |
| + demux_->Seek(target_position_, [this]() { |
| + transform_subject_time_ = target_position_; |
| + target_position_ = kUnspecifiedTime; |
| + state_ = State::kFlushed; |
| + Update(); |
| + }); |
| break; |
| } |
| - if (target_state_ == State::kPlaying) { |
| - if (!flushed_) { |
| - SetTimelineTransform(1, 1); |
| - state_ = State::kWaiting; |
| - break; |
| - } |
| - |
| - flushed_ = false; |
| + if (target_state_ == State::kPlaying || |
| + target_state_ == State::kPrimed) { |
| state_ = State::kWaiting; |
| demux_->Prime([this]() { |
| - SetTimelineTransform(1, 1); |
| - state_ = State::kWaiting; |
| + state_ = State::kPrimed; |
| Update(); |
| }); |
| + break; |
| + } |
| + return; |
| + |
| + case State::kPrimed: |
| + if (target_position_ != kUnspecifiedTime || |
| + target_state_ == State::kFlushed) { |
| + state_ = State::kWaiting; |
| + demux_->Flush([this]() { |
| + state_ = State::kFlushed; |
| + Update(); |
| + }); |
| + break; |
| + } |
| + |
| + if (target_state_ == State::kPlaying) { |
| + SetTimelineTransform(1, 1); |
| + state_ = State::kWaiting; |
| + break; |
| } |
| return; |
| case State::kPlaying: |
| if (target_position_ != kUnspecifiedTime || |
| - target_state_ == State::kPaused) { |
| + target_state_ == State::kFlushed || |
| + target_state_ == State::kPrimed) { |
| SetTimelineTransform(1, 0); |
| state_ = State::kWaiting; |
| break; |
| } |
| if (end_of_stream_) { |
| - target_state_ = State::kPaused; |
| - state_ = State::kPaused; |
| + target_state_ = State::kPrimed; |
|
kulakowski
2016/06/20 23:04:08
e.g. A place I think this code is confusing:
Stat
dalesat
2016/06/21 01:09:29
I've changed the code so there's less looping arou
|
| + state_ = State::kPrimed; |
| break; |
| } |
| return; |
| @@ -138,29 +157,6 @@ void MediaPlayerImpl::Update() { |
| } |
| } |
| -void MediaPlayerImpl::WhenPausedAndSeeking() { |
| - if (!flushed_) { |
| - state_ = State::kWaiting; |
| - demux_->Flush([this]() { |
| - flushed_ = true; |
| - WhenFlushedAndSeeking(); |
| - }); |
| - } else { |
| - WhenFlushedAndSeeking(); |
| - } |
| -} |
| - |
| -void MediaPlayerImpl::WhenFlushedAndSeeking() { |
| - state_ = State::kWaiting; |
| - DCHECK(target_position_ != kUnspecifiedTime); |
| - demux_->Seek(target_position_, [this]() { |
| - transform_subject_time_ = target_position_; |
| - target_position_ = kUnspecifiedTime; |
| - state_ = State::kPaused; |
| - Update(); |
| - }); |
| -} |
| - |
| void MediaPlayerImpl::SetTimelineTransform(uint32_t reference_delta, |
| uint32_t subject_delta) { |
| timeline_consumer_->SetTimelineTransform( |
| @@ -170,13 +166,15 @@ void MediaPlayerImpl::SetTimelineTransform(uint32_t reference_delta, |
| RCHECK(state_ == State::kWaiting); |
| if (subject_delta == 0) { |
| - state_ = State::kPaused; |
| + state_ = State::kPrimed; |
| } else { |
| state_ = State::kPlaying; |
| } |
| Update(); |
| }); |
| + |
| + transform_subject_time_ = kUnspecifiedTime; |
| } |
| void MediaPlayerImpl::GetStatus(uint64_t version_last_seen, |
| @@ -190,7 +188,7 @@ void MediaPlayerImpl::Play() { |
| } |
| void MediaPlayerImpl::Pause() { |
| - target_state_ = State::kPaused; |
| + target_state_ = State::kPrimed; |
|
kulakowski
2016/06/20 23:04:08
The name of this state feels weird. The method abo
dalesat
2016/06/21 01:09:30
The thing is, there are essentially two paused sta
|
| Update(); |
| } |