Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Unified Diff: services/media/factory_service/media_player_impl.cc

Issue 2085593002: Motown: Change player state machine to support preroll (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698