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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "base/logging.h" 5 #include "base/logging.h"
6 #include "mojo/public/cpp/application/connect.h" 6 #include "mojo/public/cpp/application/connect.h"
7 #include "mojo/services/media/common/cpp/timeline.h" 7 #include "mojo/services/media/common/cpp/timeline.h"
8 #include "services/media/factory_service/media_player_impl.h" 8 #include "services/media/factory_service/media_player_impl.h"
9 #include "services/media/framework/parts/reader.h" 9 #include "services/media/framework/parts/reader.h"
10 #include "services/media/framework/util/callback_joiner.h" 10 #include "services/media/framework/util/callback_joiner.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 break; 76 break;
77 // TODO(dalesat): Enable other stream types. 77 // TODO(dalesat): Enable other stream types.
78 default: 78 default:
79 break; 79 break;
80 } 80 }
81 } 81 }
82 82
83 callback_joiner->WhenJoined([this]() { 83 callback_joiner->WhenJoined([this]() {
84 // The enabled streams are prepared. 84 // The enabled streams are prepared.
85 factory_.reset(); 85 factory_.reset();
86 state_ = State::kPaused; 86 state_ = State::kFlushed;
87 Update(); 87 Update();
88 }); 88 });
89 }); 89 });
90 } 90 }
91 91
92 MediaPlayerImpl::~MediaPlayerImpl() {} 92 MediaPlayerImpl::~MediaPlayerImpl() {}
93 93
94 void MediaPlayerImpl::Update() { 94 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
95 while (true) { 95 while (true) {
96 switch (state_) { 96 switch (state_) {
97 case State::kPaused: 97 case State::kFlushed:
98 if (target_position_ != kUnspecifiedTime) { 98 if (target_position_ != kUnspecifiedTime) {
99 WhenPausedAndSeeking(); 99 state_ = State::kWaiting;
100 demux_->Seek(target_position_, [this]() {
101 transform_subject_time_ = target_position_;
102 target_position_ = kUnspecifiedTime;
103 state_ = State::kFlushed;
104 Update();
105 });
106 break;
107 }
108
109 if (target_state_ == State::kPlaying ||
110 target_state_ == State::kPrimed) {
111 state_ = State::kWaiting;
112 demux_->Prime([this]() {
113 state_ = State::kPrimed;
114 Update();
115 });
116 break;
117 }
118 return;
119
120 case State::kPrimed:
121 if (target_position_ != kUnspecifiedTime ||
122 target_state_ == State::kFlushed) {
123 state_ = State::kWaiting;
124 demux_->Flush([this]() {
125 state_ = State::kFlushed;
126 Update();
127 });
100 break; 128 break;
101 } 129 }
102 130
103 if (target_state_ == State::kPlaying) { 131 if (target_state_ == State::kPlaying) {
104 if (!flushed_) { 132 SetTimelineTransform(1, 1);
105 SetTimelineTransform(1, 1);
106 state_ = State::kWaiting;
107 break;
108 }
109
110 flushed_ = false;
111 state_ = State::kWaiting; 133 state_ = State::kWaiting;
112 demux_->Prime([this]() { 134 break;
113 SetTimelineTransform(1, 1);
114 state_ = State::kWaiting;
115 Update();
116 });
117 } 135 }
118 return; 136 return;
119 137
120 case State::kPlaying: 138 case State::kPlaying:
121 if (target_position_ != kUnspecifiedTime || 139 if (target_position_ != kUnspecifiedTime ||
122 target_state_ == State::kPaused) { 140 target_state_ == State::kFlushed ||
141 target_state_ == State::kPrimed) {
123 SetTimelineTransform(1, 0); 142 SetTimelineTransform(1, 0);
124 state_ = State::kWaiting; 143 state_ = State::kWaiting;
125 break; 144 break;
126 } 145 }
127 146
128 if (end_of_stream_) { 147 if (end_of_stream_) {
129 target_state_ = State::kPaused; 148 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
130 state_ = State::kPaused; 149 state_ = State::kPrimed;
131 break; 150 break;
132 } 151 }
133 return; 152 return;
134 153
135 case State::kWaiting: 154 case State::kWaiting:
136 return; 155 return;
137 } 156 }
138 } 157 }
139 } 158 }
140 159
141 void MediaPlayerImpl::WhenPausedAndSeeking() {
142 if (!flushed_) {
143 state_ = State::kWaiting;
144 demux_->Flush([this]() {
145 flushed_ = true;
146 WhenFlushedAndSeeking();
147 });
148 } else {
149 WhenFlushedAndSeeking();
150 }
151 }
152
153 void MediaPlayerImpl::WhenFlushedAndSeeking() {
154 state_ = State::kWaiting;
155 DCHECK(target_position_ != kUnspecifiedTime);
156 demux_->Seek(target_position_, [this]() {
157 transform_subject_time_ = target_position_;
158 target_position_ = kUnspecifiedTime;
159 state_ = State::kPaused;
160 Update();
161 });
162 }
163
164 void MediaPlayerImpl::SetTimelineTransform(uint32_t reference_delta, 160 void MediaPlayerImpl::SetTimelineTransform(uint32_t reference_delta,
165 uint32_t subject_delta) { 161 uint32_t subject_delta) {
166 timeline_consumer_->SetTimelineTransform( 162 timeline_consumer_->SetTimelineTransform(
167 transform_subject_time_, reference_delta, subject_delta, 163 transform_subject_time_, reference_delta, subject_delta,
168 Timeline::local_now() + kMinimumLeadTime, kUnspecifiedTime, 164 Timeline::local_now() + kMinimumLeadTime, kUnspecifiedTime,
169 [this, subject_delta](bool completed) { 165 [this, subject_delta](bool completed) {
170 RCHECK(state_ == State::kWaiting); 166 RCHECK(state_ == State::kWaiting);
171 167
172 if (subject_delta == 0) { 168 if (subject_delta == 0) {
173 state_ = State::kPaused; 169 state_ = State::kPrimed;
174 } else { 170 } else {
175 state_ = State::kPlaying; 171 state_ = State::kPlaying;
176 } 172 }
177 173
178 Update(); 174 Update();
179 }); 175 });
176
177 transform_subject_time_ = kUnspecifiedTime;
180 } 178 }
181 179
182 void MediaPlayerImpl::GetStatus(uint64_t version_last_seen, 180 void MediaPlayerImpl::GetStatus(uint64_t version_last_seen,
183 const GetStatusCallback& callback) { 181 const GetStatusCallback& callback) {
184 status_publisher_.Get(version_last_seen, callback); 182 status_publisher_.Get(version_last_seen, callback);
185 } 183 }
186 184
187 void MediaPlayerImpl::Play() { 185 void MediaPlayerImpl::Play() {
188 target_state_ = State::kPlaying; 186 target_state_ = State::kPlaying;
189 Update(); 187 Update();
190 } 188 }
191 189
192 void MediaPlayerImpl::Pause() { 190 void MediaPlayerImpl::Pause() {
193 target_state_ = State::kPaused; 191 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
194 Update(); 192 Update();
195 } 193 }
196 194
197 void MediaPlayerImpl::Seek(int64_t position) { 195 void MediaPlayerImpl::Seek(int64_t position) {
198 target_position_ = position; 196 target_position_ = position;
199 Update(); 197 Update();
200 } 198 }
201 199
202 void MediaPlayerImpl::PrepareStream(Stream* stream, 200 void MediaPlayerImpl::PrepareStream(Stream* stream,
203 size_t index, 201 size_t index,
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 HandleTimelineControlSiteStatusUpdates(version, status.Pass()); 296 HandleTimelineControlSiteStatusUpdates(version, status.Pass());
299 }); 297 });
300 } 298 }
301 299
302 MediaPlayerImpl::Stream::Stream() {} 300 MediaPlayerImpl::Stream::Stream() {}
303 301
304 MediaPlayerImpl::Stream::~Stream() {} 302 MediaPlayerImpl::Stream::~Stream() {}
305 303
306 } // namespace media 304 } // namespace media
307 } // namespace mojo 305 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698