OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 133 matching lines...) Loading... | |
144 packet_router_(new PacketRouter()), | 144 packet_router_(new PacketRouter()), |
145 pacer_(new PacedSender(clock_, | 145 pacer_(new PacedSender(clock_, |
146 packet_router_.get(), | 146 packet_router_.get(), |
147 BitrateController::kDefaultStartBitratebps)), | 147 BitrateController::kDefaultStartBitratebps)), |
148 remote_bitrate_estimator_( | 148 remote_bitrate_estimator_( |
149 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), | 149 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), |
150 bitrate_controller_(BitrateController::CreateBitrateController(clock_)), | 150 bitrate_controller_(BitrateController::CreateBitrateController(clock_)), |
151 remote_estimator_proxy_(clock_, packet_router_.get()), | 151 remote_estimator_proxy_(clock_, packet_router_.get()), |
152 transport_feedback_adapter_(bitrate_controller_.get(), clock_), | 152 transport_feedback_adapter_(bitrate_controller_.get(), clock_), |
153 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), | 153 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), |
154 send_queue_is_full_(false) { | 154 send_queue_is_full_(false), |
155 network_state_(kNetworkUp), | |
156 network_state_changed_(false) { | |
155 Init(); | 157 Init(); |
156 } | 158 } |
157 | 159 |
158 CongestionController::CongestionController( | 160 CongestionController::CongestionController( |
159 Clock* clock, | 161 Clock* clock, |
160 Observer* observer, | 162 Observer* observer, |
161 RemoteBitrateObserver* remote_bitrate_observer, | 163 RemoteBitrateObserver* remote_bitrate_observer, |
162 std::unique_ptr<PacketRouter> packet_router, | 164 std::unique_ptr<PacketRouter> packet_router, |
163 std::unique_ptr<PacedSender> pacer) | 165 std::unique_ptr<PacedSender> pacer) |
164 : clock_(clock), | 166 : clock_(clock), |
165 observer_(observer), | 167 observer_(observer), |
166 packet_router_(std::move(packet_router)), | 168 packet_router_(std::move(packet_router)), |
167 pacer_(std::move(pacer)), | 169 pacer_(std::move(pacer)), |
168 remote_bitrate_estimator_( | 170 remote_bitrate_estimator_( |
169 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), | 171 new WrappingBitrateEstimator(remote_bitrate_observer, clock_)), |
170 // Constructed last as this object calls the provided callback on | 172 // Constructed last as this object calls the provided callback on |
171 // construction. | 173 // construction. |
172 bitrate_controller_(BitrateController::CreateBitrateController(clock_)), | 174 bitrate_controller_(BitrateController::CreateBitrateController(clock_)), |
173 remote_estimator_proxy_(clock_, packet_router_.get()), | 175 remote_estimator_proxy_(clock_, packet_router_.get()), |
174 transport_feedback_adapter_(bitrate_controller_.get(), clock_), | 176 transport_feedback_adapter_(bitrate_controller_.get(), clock_), |
175 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), | 177 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps), |
176 send_queue_is_full_(false) { | 178 send_queue_is_full_(false), |
179 network_state_(kNetworkUp), | |
180 network_state_changed_(false) { | |
177 Init(); | 181 Init(); |
178 } | 182 } |
179 | 183 |
180 CongestionController::~CongestionController() {} | 184 CongestionController::~CongestionController() {} |
181 | 185 |
182 void CongestionController::Init() { | 186 void CongestionController::Init() { |
183 transport_feedback_adapter_.SetBitrateEstimator( | 187 transport_feedback_adapter_.SetBitrateEstimator( |
184 new RemoteBitrateEstimatorAbsSendTime(&transport_feedback_adapter_)); | 188 new RemoteBitrateEstimatorAbsSendTime(&transport_feedback_adapter_)); |
185 transport_feedback_adapter_.GetBitrateEstimator()->SetMinBitrate( | 189 transport_feedback_adapter_.GetBitrateEstimator()->SetMinBitrate( |
186 min_bitrate_bps_); | 190 min_bitrate_bps_); |
(...skipping 57 matching lines...) Loading... | |
244 int64_t CongestionController::GetPacerQueuingDelayMs() const { | 248 int64_t CongestionController::GetPacerQueuingDelayMs() const { |
245 return pacer_->QueueInMs(); | 249 return pacer_->QueueInMs(); |
246 } | 250 } |
247 | 251 |
248 void CongestionController::SignalNetworkState(NetworkState state) { | 252 void CongestionController::SignalNetworkState(NetworkState state) { |
249 if (state == kNetworkUp) { | 253 if (state == kNetworkUp) { |
250 pacer_->Resume(); | 254 pacer_->Resume(); |
251 } else { | 255 } else { |
252 pacer_->Pause(); | 256 pacer_->Pause(); |
253 } | 257 } |
258 rtc::CritScope cs(&critsect_); | |
259 network_state_ = state; | |
260 network_state_changed_ = true; | |
254 } | 261 } |
255 | 262 |
256 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { | 263 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { |
257 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, | 264 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, |
258 sent_packet.send_time_ms); | 265 sent_packet.send_time_ms); |
259 } | 266 } |
260 | 267 |
261 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { | 268 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
262 remote_bitrate_estimator_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 269 remote_bitrate_estimator_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
263 transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 270 transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
264 } | 271 } |
265 | 272 |
266 int64_t CongestionController::TimeUntilNextProcess() { | 273 int64_t CongestionController::TimeUntilNextProcess() { |
267 return std::min(bitrate_controller_->TimeUntilNextProcess(), | 274 return std::min(bitrate_controller_->TimeUntilNextProcess(), |
268 remote_bitrate_estimator_->TimeUntilNextProcess()); | 275 remote_bitrate_estimator_->TimeUntilNextProcess()); |
269 } | 276 } |
270 | 277 |
271 void CongestionController::Process() { | 278 void CongestionController::Process() { |
272 bitrate_controller_->Process(); | 279 bitrate_controller_->Process(); |
273 remote_bitrate_estimator_->Process(); | 280 remote_bitrate_estimator_->Process(); |
274 MaybeTriggerOnNetworkChanged(); | 281 MaybeTriggerOnNetworkChanged(); |
275 } | 282 } |
276 | 283 |
277 void CongestionController::MaybeTriggerOnNetworkChanged() { | 284 void CongestionController::MaybeTriggerOnNetworkChanged() { |
278 uint32_t bitrate_bps; | 285 uint32_t bitrate_bps; |
279 uint8_t fraction_loss; | 286 uint8_t fraction_loss; |
280 int64_t rtt; | 287 int64_t rtt; |
281 bool network_changed = bitrate_controller_->GetNetworkParameters( | 288 bool estimate_changed = bitrate_controller_->GetNetworkParameters( |
282 &bitrate_bps, &fraction_loss, &rtt); | 289 &bitrate_bps, &fraction_loss, &rtt); |
283 if (network_changed) | 290 if (estimate_changed) |
284 pacer_->SetEstimatedBitrate(bitrate_bps); | 291 pacer_->SetEstimatedBitrate(bitrate_bps); |
285 bool send_queue_is_full = | 292 bool send_queue_is_full = |
286 pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; | 293 pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; |
287 bitrate_bps = send_queue_is_full ? 0 : bitrate_bps; | 294 |
288 if ((network_changed && !send_queue_is_full) || | 295 bool network_state_changed = false; |
296 bitrate_bps = IsNetworkDown(&network_state_changed) || send_queue_is_full | |
297 ? 0 | |
298 : bitrate_bps; | |
299 | |
300 if ((estimate_changed && !send_queue_is_full) || network_state_changed || | |
289 UpdateSendQueueStatus(send_queue_is_full)) { | 301 UpdateSendQueueStatus(send_queue_is_full)) { |
stefan-webrtc
2016/05/04 07:28:58
I don't like this if statement. Can we do somethin
perkj_webrtc
2016/05/04 10:00:15
I agree - and its not even 100% correct. PTAL
| |
290 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt); | 302 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt); |
291 } | 303 } |
292 } | 304 } |
293 | 305 |
294 bool CongestionController::UpdateSendQueueStatus(bool send_queue_is_full) { | 306 bool CongestionController::UpdateSendQueueStatus(bool send_queue_is_full) { |
295 rtc::CritScope cs(&critsect_); | 307 rtc::CritScope cs(&critsect_); |
296 bool result = send_queue_is_full_ != send_queue_is_full; | 308 bool result = send_queue_is_full_ != send_queue_is_full; |
297 send_queue_is_full_ = send_queue_is_full; | 309 send_queue_is_full_ = send_queue_is_full; |
298 return result; | 310 return result; |
299 } | 311 } |
300 | 312 |
313 bool CongestionController::IsNetworkDown(bool* changed) { | |
314 rtc::CritScope cs(&critsect_); | |
315 *changed = network_state_changed_; | |
316 network_state_changed_ = false; | |
317 return network_state_ == kNetworkDown; | |
318 } | |
319 | |
301 } // namespace webrtc | 320 } // namespace webrtc |
OLD | NEW |