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 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
153 | 153 |
154 CongestionController::CongestionController( | 154 CongestionController::CongestionController( |
155 Clock* clock, | 155 Clock* clock, |
156 Observer* observer, | 156 Observer* observer, |
157 RemoteBitrateObserver* remote_bitrate_observer, | 157 RemoteBitrateObserver* remote_bitrate_observer, |
158 RtcEventLog* event_log, | 158 RtcEventLog* event_log, |
159 PacketRouter* packet_router, | 159 PacketRouter* packet_router, |
160 std::unique_ptr<PacedSender> pacer) | 160 std::unique_ptr<PacedSender> pacer) |
161 : clock_(clock), | 161 : clock_(clock), |
162 observer_(observer), | 162 observer_(observer), |
163 event_log_(event_log), | |
163 packet_router_(packet_router), | 164 packet_router_(packet_router), |
164 pacer_(std::move(pacer)), | 165 pacer_(std::move(pacer)), |
165 bitrate_controller_( | 166 bitrate_controller_( |
166 BitrateController::CreateBitrateController(clock_, event_log)), | 167 BitrateController::CreateBitrateController(clock_, event_log)), |
167 probe_controller_(new ProbeController(pacer_.get(), clock_)), | 168 probe_controller_(new ProbeController(pacer_.get(), clock_)), |
168 retransmission_rate_limiter_( | 169 retransmission_rate_limiter_( |
169 new RateLimiter(clock, kRetransmitWindowSizeMs)), | 170 new RateLimiter(clock, kRetransmitWindowSizeMs)), |
170 remote_bitrate_estimator_(remote_bitrate_observer, clock_), | 171 remote_bitrate_estimator_(remote_bitrate_observer, clock_), |
171 remote_estimator_proxy_(clock_, packet_router_), | 172 remote_estimator_proxy_(clock_, packet_router_), |
172 transport_feedback_adapter_(event_log, clock_, bitrate_controller_.get()), | 173 transport_feedback_adapter_(clock_), |
173 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), | 174 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), |
174 max_bitrate_bps_(0), | 175 max_bitrate_bps_(0), |
175 last_reported_bitrate_bps_(0), | 176 last_reported_bitrate_bps_(0), |
176 last_reported_fraction_loss_(0), | 177 last_reported_fraction_loss_(0), |
177 last_reported_rtt_(0), | 178 last_reported_rtt_(0), |
178 network_state_(kNetworkUp) { | 179 network_state_(kNetworkUp), |
179 transport_feedback_adapter_.InitBwe(); | 180 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)) { |
180 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_); | 181 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); |
181 } | 182 } |
182 | 183 |
183 CongestionController::~CongestionController() {} | 184 CongestionController::~CongestionController() {} |
184 | 185 |
185 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, | 186 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, |
186 size_t payload_size, | 187 size_t payload_size, |
187 const RTPHeader& header) { | 188 const RTPHeader& header) { |
188 // Send-side BWE. | 189 // Send-side BWE. |
189 if (header.extension.hasTransportSequenceNumber) { | 190 if (header.extension.hasTransportSequenceNumber) { |
190 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, | 191 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, |
(...skipping 12 matching lines...) Expand all Loading... | |
203 bitrate_controller_->SetBitrates(start_bitrate_bps, | 204 bitrate_controller_->SetBitrates(start_bitrate_bps, |
204 min_bitrate_bps, | 205 min_bitrate_bps, |
205 max_bitrate_bps); | 206 max_bitrate_bps); |
206 | 207 |
207 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps, | 208 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps, |
208 max_bitrate_bps); | 209 max_bitrate_bps); |
209 max_bitrate_bps_ = max_bitrate_bps; | 210 max_bitrate_bps_ = max_bitrate_bps; |
210 | 211 |
211 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); | 212 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); |
212 min_bitrate_bps_ = min_bitrate_bps; | 213 min_bitrate_bps_ = min_bitrate_bps; |
213 if (start_bitrate_bps > 0) | 214 { |
214 transport_feedback_adapter_.SetStartBitrate(start_bitrate_bps); | 215 rtc::CritScope cs(&bwe_lock_); |
215 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_); | 216 if (start_bitrate_bps > 0) |
217 delay_based_bwe_->SetStartBitrate(start_bitrate_bps); | |
218 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); | |
219 } | |
216 MaybeTriggerOnNetworkChanged(); | 220 MaybeTriggerOnNetworkChanged(); |
217 } | 221 } |
218 | 222 |
219 void CongestionController::ResetBweAndBitrates(int bitrate_bps, | 223 void CongestionController::ResetBweAndBitrates(int bitrate_bps, |
220 int min_bitrate_bps, | 224 int min_bitrate_bps, |
221 int max_bitrate_bps) { | 225 int max_bitrate_bps) { |
222 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); | 226 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); |
223 // TODO(honghaiz): Recreate this object once the bitrate controller is | 227 // TODO(honghaiz): Recreate this object once the bitrate controller is |
224 // no longer exposed outside CongestionController. | 228 // no longer exposed outside CongestionController. |
225 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, | 229 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, |
226 max_bitrate_bps); | 230 max_bitrate_bps); |
227 min_bitrate_bps_ = min_bitrate_bps; | 231 min_bitrate_bps_ = min_bitrate_bps; |
228 max_bitrate_bps_ = max_bitrate_bps; | 232 max_bitrate_bps_ = max_bitrate_bps; |
229 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is | 233 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is |
230 // no longer exposed outside CongestionController. | 234 // no longer exposed outside CongestionController. |
231 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); | 235 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); |
232 | 236 |
233 transport_feedback_adapter_.ClearSendTimeHistory(); | 237 transport_feedback_adapter_.ClearSendTimeHistory(); |
234 transport_feedback_adapter_.InitBwe(); | 238 { |
235 transport_feedback_adapter_.SetStartBitrate(bitrate_bps); | 239 rtc::CritScope cs(&bwe_lock_); |
236 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps); | 240 delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_)); |
241 delay_based_bwe_->SetStartBitrate(bitrate_bps); | |
242 delay_based_bwe_->SetMinBitrate(min_bitrate_bps); | |
243 } | |
237 | 244 |
238 probe_controller_->Reset(); | 245 probe_controller_->Reset(); |
239 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); | 246 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); |
240 | 247 |
241 MaybeTriggerOnNetworkChanged(); | 248 MaybeTriggerOnNetworkChanged(); |
242 } | 249 } |
243 | 250 |
244 BitrateController* CongestionController::GetBitrateController() const { | 251 BitrateController* CongestionController::GetBitrateController() const { |
245 return bitrate_controller_.get(); | 252 return bitrate_controller_.get(); |
246 } | 253 } |
247 | 254 |
248 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( | 255 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( |
249 bool send_side_bwe) { | 256 bool send_side_bwe) { |
250 if (send_side_bwe) { | 257 if (send_side_bwe) { |
251 return &remote_estimator_proxy_; | 258 return &remote_estimator_proxy_; |
252 } else { | 259 } else { |
253 return &remote_bitrate_estimator_; | 260 return &remote_bitrate_estimator_; |
254 } | 261 } |
255 } | 262 } |
256 | 263 |
257 TransportFeedbackObserver* | |
258 CongestionController::GetTransportFeedbackObserver() { | |
259 return &transport_feedback_adapter_; | |
260 } | |
261 | |
262 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { | 264 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { |
263 return retransmission_rate_limiter_.get(); | 265 return retransmission_rate_limiter_.get(); |
264 } | 266 } |
265 | 267 |
266 void CongestionController::EnablePeriodicAlrProbing(bool enable) { | 268 void CongestionController::EnablePeriodicAlrProbing(bool enable) { |
267 probe_controller_->EnablePeriodicAlrProbing(enable); | 269 probe_controller_->EnablePeriodicAlrProbing(enable); |
268 } | 270 } |
269 | 271 |
270 void CongestionController::SetAllocatedSendBitrateLimits( | 272 void CongestionController::SetAllocatedSendBitrateLimits( |
271 int min_send_bitrate_bps, | 273 int min_send_bitrate_bps, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
303 // We're not interested in packets without an id, which may be stun packets, | 305 // We're not interested in packets without an id, which may be stun packets, |
304 // etc, sent on the same transport. | 306 // etc, sent on the same transport. |
305 if (sent_packet.packet_id == -1) | 307 if (sent_packet.packet_id == -1) |
306 return; | 308 return; |
307 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, | 309 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, |
308 sent_packet.send_time_ms); | 310 sent_packet.send_time_ms); |
309 } | 311 } |
310 | 312 |
311 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { | 313 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
312 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 314 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
313 transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 315 { |
316 rtc::CritScope cs(&bwe_lock_); | |
317 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); | |
318 } | |
314 } | 319 } |
315 | 320 |
316 int64_t CongestionController::TimeUntilNextProcess() { | 321 int64_t CongestionController::TimeUntilNextProcess() { |
317 return std::min(bitrate_controller_->TimeUntilNextProcess(), | 322 return std::min(bitrate_controller_->TimeUntilNextProcess(), |
318 remote_bitrate_estimator_.TimeUntilNextProcess()); | 323 remote_bitrate_estimator_.TimeUntilNextProcess()); |
319 } | 324 } |
320 | 325 |
321 void CongestionController::Process() { | 326 void CongestionController::Process() { |
322 bitrate_controller_->Process(); | 327 bitrate_controller_->Process(); |
323 remote_bitrate_estimator_.Process(); | 328 remote_bitrate_estimator_.Process(); |
324 probe_controller_->Process(); | 329 probe_controller_->Process(); |
325 MaybeTriggerOnNetworkChanged(); | 330 MaybeTriggerOnNetworkChanged(); |
326 } | 331 } |
327 | 332 |
333 void CongestionController::AddPacket(uint16_t sequence_number, | |
334 size_t length, | |
335 const PacedPacketInfo& pacing_info) { | |
336 transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info); | |
337 } | |
338 | |
339 void CongestionController::OnTransportFeedback( | |
340 const rtcp::TransportFeedback& feedback) { | |
341 transport_feedback_adapter_.OnTransportFeedback(feedback); | |
342 DelayBasedBwe::Result result; | |
343 { | |
344 rtc::CritScope cs(&bwe_lock_); | |
345 result = delay_based_bwe_->IncomingPacketFeedbackVector( | |
346 transport_feedback_adapter_.GetTransportFeedbackVector()); | |
347 } | |
348 if (result.updated) | |
349 bitrate_controller_->OnDelayBasedBweResult(result); | |
350 } | |
351 | |
352 std::vector<PacketFeedback> CongestionController::GetTransportFeedbackVector() | |
353 const { | |
354 return transport_feedback_adapter_.GetTransportFeedbackVector(); | |
elad.alon_webrtc.org
2017/03/08 18:34:20
Stefan, are we worried because there's nobody maki
stefan-webrtc
2017/03/09 09:41:02
A thread checker might be good. We can start with
elad.alon_webrtc.org
2017/03/09 12:03:53
Done.
| |
355 } | |
356 | |
328 void CongestionController::MaybeTriggerOnNetworkChanged() { | 357 void CongestionController::MaybeTriggerOnNetworkChanged() { |
329 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a | 358 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a |
330 // BitrateObserver is used. Remove this check once the ctor is removed. | 359 // BitrateObserver is used. Remove this check once the ctor is removed. |
331 if (!observer_) | 360 if (!observer_) |
332 return; | 361 return; |
333 | 362 |
334 uint32_t bitrate_bps; | 363 uint32_t bitrate_bps; |
335 uint8_t fraction_loss; | 364 uint8_t fraction_loss; |
336 int64_t rtt; | 365 int64_t rtt; |
337 bool estimate_changed = bitrate_controller_->GetNetworkParameters( | 366 bool estimate_changed = bitrate_controller_->GetNetworkParameters( |
338 &bitrate_bps, &fraction_loss, &rtt); | 367 &bitrate_bps, &fraction_loss, &rtt); |
339 if (estimate_changed) { | 368 if (estimate_changed) { |
340 pacer_->SetEstimatedBitrate(bitrate_bps); | 369 pacer_->SetEstimatedBitrate(bitrate_bps); |
341 probe_controller_->SetEstimatedBitrate(bitrate_bps); | 370 probe_controller_->SetEstimatedBitrate(bitrate_bps); |
342 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); | 371 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); |
343 } | 372 } |
344 | 373 |
345 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; | 374 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; |
346 | 375 |
347 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { | 376 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { |
348 observer_->OnNetworkChanged( | 377 int64_t probing_interval_ms; |
349 bitrate_bps, fraction_loss, rtt, | 378 { |
350 transport_feedback_adapter_.GetProbingIntervalMs()); | 379 rtc::CritScope cs(&bwe_lock_); |
380 probing_interval_ms = delay_based_bwe_->GetProbingIntervalMs(); | |
381 } | |
382 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt, | |
383 probing_interval_ms); | |
351 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); | 384 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); |
352 } | 385 } |
353 } | 386 } |
354 | 387 |
355 bool CongestionController::HasNetworkParametersToReportChanged( | 388 bool CongestionController::HasNetworkParametersToReportChanged( |
356 uint32_t bitrate_bps, | 389 uint32_t bitrate_bps, |
357 uint8_t fraction_loss, | 390 uint8_t fraction_loss, |
358 int64_t rtt) { | 391 int64_t rtt) { |
359 rtc::CritScope cs(&critsect_); | 392 rtc::CritScope cs(&critsect_); |
360 bool changed = | 393 bool changed = |
(...skipping 13 matching lines...) Expand all Loading... | |
374 bool CongestionController::IsSendQueueFull() const { | 407 bool CongestionController::IsSendQueueFull() const { |
375 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; | 408 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; |
376 } | 409 } |
377 | 410 |
378 bool CongestionController::IsNetworkDown() const { | 411 bool CongestionController::IsNetworkDown() const { |
379 rtc::CritScope cs(&critsect_); | 412 rtc::CritScope cs(&critsect_); |
380 return network_state_ == kNetworkDown; | 413 return network_state_ == kNetworkDown; |
381 } | 414 } |
382 | 415 |
383 } // namespace webrtc | 416 } // namespace webrtc |
OLD | NEW |