| 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_); |
| 182 worker_thread_checker_.DetachFromThread(); |
| 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_.ClearSendTimeHistory(); | 238 transport_feedback_adapter_.ClearSendTimeHistory(); |
| 234 transport_feedback_adapter_.InitBwe(); | 239 { |
| 235 transport_feedback_adapter_.SetStartBitrate(bitrate_bps); | 240 rtc::CritScope cs(&bwe_lock_); |
| 236 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps); | 241 delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_)); |
| 242 delay_based_bwe_->SetStartBitrate(bitrate_bps); |
| 243 delay_based_bwe_->SetMinBitrate(min_bitrate_bps); |
| 244 } |
| 237 | 245 |
| 238 probe_controller_->Reset(); | 246 probe_controller_->Reset(); |
| 239 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); | 247 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); |
| 240 | 248 |
| 241 MaybeTriggerOnNetworkChanged(); | 249 MaybeTriggerOnNetworkChanged(); |
| 242 } | 250 } |
| 243 | 251 |
| 244 BitrateController* CongestionController::GetBitrateController() const { | 252 BitrateController* CongestionController::GetBitrateController() const { |
| 245 return bitrate_controller_.get(); | 253 return bitrate_controller_.get(); |
| 246 } | 254 } |
| 247 | 255 |
| 248 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( | 256 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( |
| 249 bool send_side_bwe) { | 257 bool send_side_bwe) { |
| 250 if (send_side_bwe) { | 258 if (send_side_bwe) { |
| 251 return &remote_estimator_proxy_; | 259 return &remote_estimator_proxy_; |
| 252 } else { | 260 } else { |
| 253 return &remote_bitrate_estimator_; | 261 return &remote_bitrate_estimator_; |
| 254 } | 262 } |
| 255 } | 263 } |
| 256 | 264 |
| 257 TransportFeedbackObserver* | |
| 258 CongestionController::GetTransportFeedbackObserver() { | |
| 259 return &transport_feedback_adapter_; | |
| 260 } | |
| 261 | |
| 262 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { | 265 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { |
| 263 return retransmission_rate_limiter_.get(); | 266 return retransmission_rate_limiter_.get(); |
| 264 } | 267 } |
| 265 | 268 |
| 266 void CongestionController::EnablePeriodicAlrProbing(bool enable) { | 269 void CongestionController::EnablePeriodicAlrProbing(bool enable) { |
| 267 probe_controller_->EnablePeriodicAlrProbing(enable); | 270 probe_controller_->EnablePeriodicAlrProbing(enable); |
| 268 } | 271 } |
| 269 | 272 |
| 270 void CongestionController::SetAllocatedSendBitrateLimits( | 273 void CongestionController::SetAllocatedSendBitrateLimits( |
| 271 int min_send_bitrate_bps, | 274 int min_send_bitrate_bps, |
| 272 int max_padding_bitrate_bps) { | 275 int max_padding_bitrate_bps) { |
| 273 pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps); | 276 pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps); |
| 274 } | 277 } |
| 275 | 278 |
| 276 int64_t CongestionController::GetPacerQueuingDelayMs() const { | 279 int64_t CongestionController::GetPacerQueuingDelayMs() const { |
| 277 return IsNetworkDown() ? 0 : pacer_->QueueInMs(); | 280 return IsNetworkDown() ? 0 : pacer_->QueueInMs(); |
| 278 } | 281 } |
| 279 | 282 |
| 280 void CongestionController::SignalNetworkState(NetworkState state) { | 283 void CongestionController::SignalNetworkState(NetworkState state) { |
| 281 LOG(LS_INFO) << "SignalNetworkState " | 284 LOG(LS_INFO) << "SignalNetworkState " |
| 282 << (state == kNetworkUp ? "Up" : "Down"); | 285 << (state == kNetworkUp ? "Up" : "Down"); |
| 283 if (state == kNetworkUp) { | 286 if (state == kNetworkUp) { |
| 284 pacer_->Resume(); | 287 pacer_->Resume(); |
| 285 } else { | 288 } else { |
| 286 pacer_->Pause(); | 289 pacer_->Pause(); |
| 287 } | 290 } |
| 288 { | 291 { |
| 289 rtc::CritScope cs(&critsect_); | 292 rtc::CritScope cs(&network_state_lock_); |
| 290 network_state_ = state; | 293 network_state_ = state; |
| 291 } | 294 } |
| 292 probe_controller_->OnNetworkStateChanged(state); | 295 probe_controller_->OnNetworkStateChanged(state); |
| 293 MaybeTriggerOnNetworkChanged(); | 296 MaybeTriggerOnNetworkChanged(); |
| 294 } | 297 } |
| 295 | 298 |
| 296 void CongestionController::SetTransportOverhead( | 299 void CongestionController::SetTransportOverhead( |
| 297 size_t transport_overhead_bytes_per_packet) { | 300 size_t transport_overhead_bytes_per_packet) { |
| 298 transport_feedback_adapter_.SetTransportOverhead( | 301 transport_feedback_adapter_.SetTransportOverhead( |
| 299 transport_overhead_bytes_per_packet); | 302 transport_overhead_bytes_per_packet); |
| 300 } | 303 } |
| 301 | 304 |
| 302 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { | 305 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { |
| 303 // We're not interested in packets without an id, which may be stun packets, | 306 // We're not interested in packets without an id, which may be stun packets, |
| 304 // etc, sent on the same transport. | 307 // etc, sent on the same transport. |
| 305 if (sent_packet.packet_id == -1) | 308 if (sent_packet.packet_id == -1) |
| 306 return; | 309 return; |
| 307 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, | 310 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, |
| 308 sent_packet.send_time_ms); | 311 sent_packet.send_time_ms); |
| 309 } | 312 } |
| 310 | 313 |
| 311 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { | 314 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
| 312 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 315 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
| 313 transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 316 { |
| 317 rtc::CritScope cs(&bwe_lock_); |
| 318 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
| 319 } |
| 314 } | 320 } |
| 315 | 321 |
| 316 int64_t CongestionController::TimeUntilNextProcess() { | 322 int64_t CongestionController::TimeUntilNextProcess() { |
| 317 return std::min(bitrate_controller_->TimeUntilNextProcess(), | 323 return std::min(bitrate_controller_->TimeUntilNextProcess(), |
| 318 remote_bitrate_estimator_.TimeUntilNextProcess()); | 324 remote_bitrate_estimator_.TimeUntilNextProcess()); |
| 319 } | 325 } |
| 320 | 326 |
| 321 void CongestionController::Process() { | 327 void CongestionController::Process() { |
| 322 bitrate_controller_->Process(); | 328 bitrate_controller_->Process(); |
| 323 remote_bitrate_estimator_.Process(); | 329 remote_bitrate_estimator_.Process(); |
| 324 probe_controller_->Process(); | 330 probe_controller_->Process(); |
| 325 MaybeTriggerOnNetworkChanged(); | 331 MaybeTriggerOnNetworkChanged(); |
| 326 } | 332 } |
| 327 | 333 |
| 334 void CongestionController::AddPacket(uint16_t sequence_number, |
| 335 size_t length, |
| 336 const PacedPacketInfo& pacing_info) { |
| 337 transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info); |
| 338 } |
| 339 |
| 340 void CongestionController::OnTransportFeedback( |
| 341 const rtcp::TransportFeedback& feedback) { |
| 342 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| 343 transport_feedback_adapter_.OnTransportFeedback(feedback); |
| 344 DelayBasedBwe::Result result; |
| 345 { |
| 346 rtc::CritScope cs(&bwe_lock_); |
| 347 result = delay_based_bwe_->IncomingPacketFeedbackVector( |
| 348 transport_feedback_adapter_.GetTransportFeedbackVector()); |
| 349 } |
| 350 if (result.updated) |
| 351 bitrate_controller_->OnDelayBasedBweResult(result); |
| 352 } |
| 353 |
| 354 std::vector<PacketFeedback> CongestionController::GetTransportFeedbackVector() |
| 355 const { |
| 356 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| 357 return transport_feedback_adapter_.GetTransportFeedbackVector(); |
| 358 } |
| 359 |
| 328 void CongestionController::MaybeTriggerOnNetworkChanged() { | 360 void CongestionController::MaybeTriggerOnNetworkChanged() { |
| 329 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a | 361 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a |
| 330 // BitrateObserver is used. Remove this check once the ctor is removed. | 362 // BitrateObserver is used. Remove this check once the ctor is removed. |
| 331 if (!observer_) | 363 if (!observer_) |
| 332 return; | 364 return; |
| 333 | 365 |
| 334 uint32_t bitrate_bps; | 366 uint32_t bitrate_bps; |
| 335 uint8_t fraction_loss; | 367 uint8_t fraction_loss; |
| 336 int64_t rtt; | 368 int64_t rtt; |
| 337 bool estimate_changed = bitrate_controller_->GetNetworkParameters( | 369 bool estimate_changed = bitrate_controller_->GetNetworkParameters( |
| 338 &bitrate_bps, &fraction_loss, &rtt); | 370 &bitrate_bps, &fraction_loss, &rtt); |
| 339 if (estimate_changed) { | 371 if (estimate_changed) { |
| 340 pacer_->SetEstimatedBitrate(bitrate_bps); | 372 pacer_->SetEstimatedBitrate(bitrate_bps); |
| 341 probe_controller_->SetEstimatedBitrate(bitrate_bps); | 373 probe_controller_->SetEstimatedBitrate(bitrate_bps); |
| 342 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); | 374 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); |
| 343 } | 375 } |
| 344 | 376 |
| 345 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; | 377 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; |
| 346 | 378 |
| 347 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { | 379 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { |
| 348 observer_->OnNetworkChanged( | 380 int64_t probing_interval_ms; |
| 349 bitrate_bps, fraction_loss, rtt, | 381 { |
| 350 transport_feedback_adapter_.GetProbingIntervalMs()); | 382 rtc::CritScope cs(&bwe_lock_); |
| 383 probing_interval_ms = delay_based_bwe_->GetProbingIntervalMs(); |
| 384 } |
| 385 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt, |
| 386 probing_interval_ms); |
| 351 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); | 387 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); |
| 352 } | 388 } |
| 353 } | 389 } |
| 354 | 390 |
| 355 bool CongestionController::HasNetworkParametersToReportChanged( | 391 bool CongestionController::HasNetworkParametersToReportChanged( |
| 356 uint32_t bitrate_bps, | 392 uint32_t bitrate_bps, |
| 357 uint8_t fraction_loss, | 393 uint8_t fraction_loss, |
| 358 int64_t rtt) { | 394 int64_t rtt) { |
| 359 rtc::CritScope cs(&critsect_); | 395 rtc::CritScope cs(&network_state_lock_); |
| 360 bool changed = | 396 bool changed = |
| 361 last_reported_bitrate_bps_ != bitrate_bps || | 397 last_reported_bitrate_bps_ != bitrate_bps || |
| 362 (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss || | 398 (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss || |
| 363 last_reported_rtt_ != rtt)); | 399 last_reported_rtt_ != rtt)); |
| 364 if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) { | 400 if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) { |
| 365 LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps | 401 LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps |
| 366 << " bps."; | 402 << " bps."; |
| 367 } | 403 } |
| 368 last_reported_bitrate_bps_ = bitrate_bps; | 404 last_reported_bitrate_bps_ = bitrate_bps; |
| 369 last_reported_fraction_loss_ = fraction_loss; | 405 last_reported_fraction_loss_ = fraction_loss; |
| 370 last_reported_rtt_ = rtt; | 406 last_reported_rtt_ = rtt; |
| 371 return changed; | 407 return changed; |
| 372 } | 408 } |
| 373 | 409 |
| 374 bool CongestionController::IsSendQueueFull() const { | 410 bool CongestionController::IsSendQueueFull() const { |
| 375 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; | 411 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; |
| 376 } | 412 } |
| 377 | 413 |
| 378 bool CongestionController::IsNetworkDown() const { | 414 bool CongestionController::IsNetworkDown() const { |
| 379 rtc::CritScope cs(&critsect_); | 415 rtc::CritScope cs(&network_state_lock_); |
| 380 return network_state_ == kNetworkDown; | 416 return network_state_ == kNetworkDown; |
| 381 } | 417 } |
| 382 | 418 |
| 383 } // namespace webrtc | 419 } // namespace webrtc |
| OLD | NEW |