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