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), | |
164 packet_router_(packet_router), | 163 packet_router_(packet_router), |
165 pacer_(std::move(pacer)), | 164 pacer_(std::move(pacer)), |
166 bitrate_controller_( | 165 bitrate_controller_( |
167 BitrateController::CreateBitrateController(clock_, event_log)), | 166 BitrateController::CreateBitrateController(clock_, event_log)), |
168 probe_controller_(new ProbeController(pacer_.get(), clock_)), | 167 probe_controller_(new ProbeController(pacer_.get(), clock_)), |
169 retransmission_rate_limiter_( | 168 retransmission_rate_limiter_( |
170 new RateLimiter(clock, kRetransmitWindowSizeMs)), | 169 new RateLimiter(clock, kRetransmitWindowSizeMs)), |
171 remote_bitrate_estimator_(remote_bitrate_observer, clock_), | 170 remote_bitrate_estimator_(remote_bitrate_observer, clock_), |
172 remote_estimator_proxy_(clock_, packet_router_), | 171 remote_estimator_proxy_(clock_, packet_router_), |
173 transport_feedback_adapter_(clock_), | 172 transport_feedback_adapter_(event_log, clock_, bitrate_controller_.get()), |
174 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), | 173 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), |
175 max_bitrate_bps_(0), | 174 max_bitrate_bps_(0), |
176 last_reported_bitrate_bps_(0), | 175 last_reported_bitrate_bps_(0), |
177 last_reported_fraction_loss_(0), | 176 last_reported_fraction_loss_(0), |
178 last_reported_rtt_(0), | 177 last_reported_rtt_(0), |
179 network_state_(kNetworkUp), | 178 network_state_(kNetworkUp) { |
180 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)) { | 179 transport_feedback_adapter_.InitBwe(); |
181 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); | 180 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_); |
182 worker_thread_checker_.DetachFromThread(); | |
183 } | 181 } |
184 | 182 |
185 CongestionController::~CongestionController() {} | 183 CongestionController::~CongestionController() {} |
186 | 184 |
187 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, | 185 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, |
188 size_t payload_size, | 186 size_t payload_size, |
189 const RTPHeader& header) { | 187 const RTPHeader& header) { |
190 // Send-side BWE. | 188 // Send-side BWE. |
191 if (header.extension.hasTransportSequenceNumber) { | 189 if (header.extension.hasTransportSequenceNumber) { |
192 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, | 190 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, |
(...skipping 12 matching lines...) Expand all Loading... |
205 bitrate_controller_->SetBitrates(start_bitrate_bps, | 203 bitrate_controller_->SetBitrates(start_bitrate_bps, |
206 min_bitrate_bps, | 204 min_bitrate_bps, |
207 max_bitrate_bps); | 205 max_bitrate_bps); |
208 | 206 |
209 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps, | 207 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps, |
210 max_bitrate_bps); | 208 max_bitrate_bps); |
211 max_bitrate_bps_ = max_bitrate_bps; | 209 max_bitrate_bps_ = max_bitrate_bps; |
212 | 210 |
213 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); | 211 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); |
214 min_bitrate_bps_ = min_bitrate_bps; | 212 min_bitrate_bps_ = min_bitrate_bps; |
215 { | 213 if (start_bitrate_bps > 0) |
216 rtc::CritScope cs(&bwe_lock_); | 214 transport_feedback_adapter_.SetStartBitrate(start_bitrate_bps); |
217 if (start_bitrate_bps > 0) | 215 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_); |
218 delay_based_bwe_->SetStartBitrate(start_bitrate_bps); | |
219 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); | |
220 } | |
221 MaybeTriggerOnNetworkChanged(); | 216 MaybeTriggerOnNetworkChanged(); |
222 } | 217 } |
223 | 218 |
224 void CongestionController::ResetBweAndBitrates(int bitrate_bps, | 219 void CongestionController::ResetBweAndBitrates(int bitrate_bps, |
225 int min_bitrate_bps, | 220 int min_bitrate_bps, |
226 int max_bitrate_bps) { | 221 int max_bitrate_bps) { |
227 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); | 222 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); |
228 // TODO(honghaiz): Recreate this object once the bitrate controller is | 223 // TODO(honghaiz): Recreate this object once the bitrate controller is |
229 // no longer exposed outside CongestionController. | 224 // no longer exposed outside CongestionController. |
230 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, | 225 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, |
231 max_bitrate_bps); | 226 max_bitrate_bps); |
232 min_bitrate_bps_ = min_bitrate_bps; | 227 min_bitrate_bps_ = min_bitrate_bps; |
233 max_bitrate_bps_ = max_bitrate_bps; | 228 max_bitrate_bps_ = max_bitrate_bps; |
234 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is | 229 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is |
235 // no longer exposed outside CongestionController. | 230 // no longer exposed outside CongestionController. |
236 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); | 231 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); |
237 | 232 |
238 transport_feedback_adapter_.ClearSendTimeHistory(); | 233 transport_feedback_adapter_.ClearSendTimeHistory(); |
239 { | 234 transport_feedback_adapter_.InitBwe(); |
240 rtc::CritScope cs(&bwe_lock_); | 235 transport_feedback_adapter_.SetStartBitrate(bitrate_bps); |
241 delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_)); | 236 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps); |
242 delay_based_bwe_->SetStartBitrate(bitrate_bps); | |
243 delay_based_bwe_->SetMinBitrate(min_bitrate_bps); | |
244 } | |
245 | 237 |
246 probe_controller_->Reset(); | 238 probe_controller_->Reset(); |
247 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); | 239 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); |
248 | 240 |
249 MaybeTriggerOnNetworkChanged(); | 241 MaybeTriggerOnNetworkChanged(); |
250 } | 242 } |
251 | 243 |
252 BitrateController* CongestionController::GetBitrateController() const { | 244 BitrateController* CongestionController::GetBitrateController() const { |
253 return bitrate_controller_.get(); | 245 return bitrate_controller_.get(); |
254 } | 246 } |
255 | 247 |
256 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( | 248 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( |
257 bool send_side_bwe) { | 249 bool send_side_bwe) { |
258 if (send_side_bwe) { | 250 if (send_side_bwe) { |
259 return &remote_estimator_proxy_; | 251 return &remote_estimator_proxy_; |
260 } else { | 252 } else { |
261 return &remote_bitrate_estimator_; | 253 return &remote_bitrate_estimator_; |
262 } | 254 } |
263 } | 255 } |
264 | 256 |
| 257 TransportFeedbackObserver* |
| 258 CongestionController::GetTransportFeedbackObserver() { |
| 259 return &transport_feedback_adapter_; |
| 260 } |
| 261 |
265 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { | 262 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { |
266 return retransmission_rate_limiter_.get(); | 263 return retransmission_rate_limiter_.get(); |
267 } | 264 } |
268 | 265 |
269 void CongestionController::EnablePeriodicAlrProbing(bool enable) { | 266 void CongestionController::EnablePeriodicAlrProbing(bool enable) { |
270 probe_controller_->EnablePeriodicAlrProbing(enable); | 267 probe_controller_->EnablePeriodicAlrProbing(enable); |
271 } | 268 } |
272 | 269 |
273 void CongestionController::SetAllocatedSendBitrateLimits( | 270 void CongestionController::SetAllocatedSendBitrateLimits( |
274 int min_send_bitrate_bps, | 271 int min_send_bitrate_bps, |
275 int max_padding_bitrate_bps) { | 272 int max_padding_bitrate_bps) { |
276 pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps); | 273 pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps); |
277 } | 274 } |
278 | 275 |
279 int64_t CongestionController::GetPacerQueuingDelayMs() const { | 276 int64_t CongestionController::GetPacerQueuingDelayMs() const { |
280 return IsNetworkDown() ? 0 : pacer_->QueueInMs(); | 277 return IsNetworkDown() ? 0 : pacer_->QueueInMs(); |
281 } | 278 } |
282 | 279 |
283 void CongestionController::SignalNetworkState(NetworkState state) { | 280 void CongestionController::SignalNetworkState(NetworkState state) { |
284 LOG(LS_INFO) << "SignalNetworkState " | 281 LOG(LS_INFO) << "SignalNetworkState " |
285 << (state == kNetworkUp ? "Up" : "Down"); | 282 << (state == kNetworkUp ? "Up" : "Down"); |
286 if (state == kNetworkUp) { | 283 if (state == kNetworkUp) { |
287 pacer_->Resume(); | 284 pacer_->Resume(); |
288 } else { | 285 } else { |
289 pacer_->Pause(); | 286 pacer_->Pause(); |
290 } | 287 } |
291 { | 288 { |
292 rtc::CritScope cs(&network_state_lock_); | 289 rtc::CritScope cs(&critsect_); |
293 network_state_ = state; | 290 network_state_ = state; |
294 } | 291 } |
295 probe_controller_->OnNetworkStateChanged(state); | 292 probe_controller_->OnNetworkStateChanged(state); |
296 MaybeTriggerOnNetworkChanged(); | 293 MaybeTriggerOnNetworkChanged(); |
297 } | 294 } |
298 | 295 |
299 void CongestionController::SetTransportOverhead( | 296 void CongestionController::SetTransportOverhead( |
300 size_t transport_overhead_bytes_per_packet) { | 297 size_t transport_overhead_bytes_per_packet) { |
301 transport_feedback_adapter_.SetTransportOverhead( | 298 transport_feedback_adapter_.SetTransportOverhead( |
302 transport_overhead_bytes_per_packet); | 299 transport_overhead_bytes_per_packet); |
303 } | 300 } |
304 | 301 |
305 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { | 302 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { |
306 // We're not interested in packets without an id, which may be stun packets, | 303 // We're not interested in packets without an id, which may be stun packets, |
307 // etc, sent on the same transport. | 304 // etc, sent on the same transport. |
308 if (sent_packet.packet_id == -1) | 305 if (sent_packet.packet_id == -1) |
309 return; | 306 return; |
310 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, | 307 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, |
311 sent_packet.send_time_ms); | 308 sent_packet.send_time_ms); |
312 } | 309 } |
313 | 310 |
314 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { | 311 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
315 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 312 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
316 { | 313 transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
317 rtc::CritScope cs(&bwe_lock_); | |
318 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); | |
319 } | |
320 } | 314 } |
321 | 315 |
322 int64_t CongestionController::TimeUntilNextProcess() { | 316 int64_t CongestionController::TimeUntilNextProcess() { |
323 return std::min(bitrate_controller_->TimeUntilNextProcess(), | 317 return std::min(bitrate_controller_->TimeUntilNextProcess(), |
324 remote_bitrate_estimator_.TimeUntilNextProcess()); | 318 remote_bitrate_estimator_.TimeUntilNextProcess()); |
325 } | 319 } |
326 | 320 |
327 void CongestionController::Process() { | 321 void CongestionController::Process() { |
328 bitrate_controller_->Process(); | 322 bitrate_controller_->Process(); |
329 remote_bitrate_estimator_.Process(); | 323 remote_bitrate_estimator_.Process(); |
330 probe_controller_->Process(); | 324 probe_controller_->Process(); |
331 MaybeTriggerOnNetworkChanged(); | 325 MaybeTriggerOnNetworkChanged(); |
332 } | 326 } |
333 | 327 |
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 | |
360 void CongestionController::MaybeTriggerOnNetworkChanged() { | 328 void CongestionController::MaybeTriggerOnNetworkChanged() { |
361 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a | 329 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a |
362 // BitrateObserver is used. Remove this check once the ctor is removed. | 330 // BitrateObserver is used. Remove this check once the ctor is removed. |
363 if (!observer_) | 331 if (!observer_) |
364 return; | 332 return; |
365 | 333 |
366 uint32_t bitrate_bps; | 334 uint32_t bitrate_bps; |
367 uint8_t fraction_loss; | 335 uint8_t fraction_loss; |
368 int64_t rtt; | 336 int64_t rtt; |
369 bool estimate_changed = bitrate_controller_->GetNetworkParameters( | 337 bool estimate_changed = bitrate_controller_->GetNetworkParameters( |
370 &bitrate_bps, &fraction_loss, &rtt); | 338 &bitrate_bps, &fraction_loss, &rtt); |
371 if (estimate_changed) { | 339 if (estimate_changed) { |
372 pacer_->SetEstimatedBitrate(bitrate_bps); | 340 pacer_->SetEstimatedBitrate(bitrate_bps); |
373 probe_controller_->SetEstimatedBitrate(bitrate_bps); | 341 probe_controller_->SetEstimatedBitrate(bitrate_bps); |
374 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); | 342 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); |
375 } | 343 } |
376 | 344 |
377 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; | 345 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; |
378 | 346 |
379 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { | 347 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { |
380 int64_t probing_interval_ms; | 348 observer_->OnNetworkChanged( |
381 { | 349 bitrate_bps, fraction_loss, rtt, |
382 rtc::CritScope cs(&bwe_lock_); | 350 transport_feedback_adapter_.GetProbingIntervalMs()); |
383 probing_interval_ms = delay_based_bwe_->GetProbingIntervalMs(); | |
384 } | |
385 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt, | |
386 probing_interval_ms); | |
387 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); | 351 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); |
388 } | 352 } |
389 } | 353 } |
390 | 354 |
391 bool CongestionController::HasNetworkParametersToReportChanged( | 355 bool CongestionController::HasNetworkParametersToReportChanged( |
392 uint32_t bitrate_bps, | 356 uint32_t bitrate_bps, |
393 uint8_t fraction_loss, | 357 uint8_t fraction_loss, |
394 int64_t rtt) { | 358 int64_t rtt) { |
395 rtc::CritScope cs(&network_state_lock_); | 359 rtc::CritScope cs(&critsect_); |
396 bool changed = | 360 bool changed = |
397 last_reported_bitrate_bps_ != bitrate_bps || | 361 last_reported_bitrate_bps_ != bitrate_bps || |
398 (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss || | 362 (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss || |
399 last_reported_rtt_ != rtt)); | 363 last_reported_rtt_ != rtt)); |
400 if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) { | 364 if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) { |
401 LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps | 365 LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps |
402 << " bps."; | 366 << " bps."; |
403 } | 367 } |
404 last_reported_bitrate_bps_ = bitrate_bps; | 368 last_reported_bitrate_bps_ = bitrate_bps; |
405 last_reported_fraction_loss_ = fraction_loss; | 369 last_reported_fraction_loss_ = fraction_loss; |
406 last_reported_rtt_ = rtt; | 370 last_reported_rtt_ = rtt; |
407 return changed; | 371 return changed; |
408 } | 372 } |
409 | 373 |
410 bool CongestionController::IsSendQueueFull() const { | 374 bool CongestionController::IsSendQueueFull() const { |
411 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; | 375 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; |
412 } | 376 } |
413 | 377 |
414 bool CongestionController::IsNetworkDown() const { | 378 bool CongestionController::IsNetworkDown() const { |
415 rtc::CritScope cs(&network_state_lock_); | 379 rtc::CritScope cs(&critsect_); |
416 return network_state_ == kNetworkDown; | 380 return network_state_ == kNetworkDown; |
417 } | 381 } |
418 | 382 |
419 } // namespace webrtc | 383 } // namespace webrtc |
OLD | NEW |