Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |