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 |
11 #include "webrtc/modules/congestion_controller/include/congestion_controller.h" | 11 #include "webrtc/modules/congestion_controller/include/congestion_controller.h" |
12 | 12 |
13 #include <algorithm> | 13 #include <algorithm> |
14 #include <memory> | 14 #include <memory> |
15 #include <vector> | 15 #include <vector> |
16 | 16 |
17 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
18 #include "webrtc/base/logging.h" | 18 #include "webrtc/base/logging.h" |
19 #include "webrtc/base/rate_limiter.h" | 19 #include "webrtc/base/rate_limiter.h" |
20 #include "webrtc/base/socket.h" | 20 #include "webrtc/base/socket.h" |
21 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" | 21 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
22 #include "webrtc/modules/congestion_controller/probe_controller.h" | 22 #include "webrtc/modules/congestion_controller/probe_controller.h" |
23 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h" | 23 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h" |
24 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_s
end_time.h" | 24 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_s
end_time.h" |
25 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl
e_stream.h" | 25 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl
e_stream.h" |
26 | 26 |
27 namespace webrtc { | 27 namespace webrtc { |
28 namespace { | |
29 | |
30 static const uint32_t kTimeOffsetSwitchThreshold = 30; | |
31 static const int64_t kRetransmitWindowSizeMs = 500; | |
32 | |
33 // Makes sure that the bitrate and the min, max values are in valid range. | |
34 static void ClampBitrates(int* bitrate_bps, | |
35 int* min_bitrate_bps, | |
36 int* max_bitrate_bps) { | |
37 // TODO(holmer): We should make sure the default bitrates are set to 10 kbps, | |
38 // and that we don't try to set the min bitrate to 0 from any applications. | |
39 // The congestion controller should allow a min bitrate of 0. | |
40 if (*min_bitrate_bps < congestion_controller::GetMinBitrateBps()) | |
41 *min_bitrate_bps = congestion_controller::GetMinBitrateBps(); | |
42 if (*max_bitrate_bps > 0) | |
43 *max_bitrate_bps = std::max(*min_bitrate_bps, *max_bitrate_bps); | |
44 if (*bitrate_bps > 0) | |
45 *bitrate_bps = std::max(*min_bitrate_bps, *bitrate_bps); | |
46 } | |
47 | |
48 } // namespace | |
49 | |
50 CongestionController::WrappingBitrateEstimator::WrappingBitrateEstimator( | |
51 RemoteBitrateObserver* observer, const Clock* clock) | |
52 : observer_(observer), | |
53 clock_(clock), | |
54 rbe_(new RemoteBitrateEstimatorSingleStream(observer_, clock_)), | |
55 using_absolute_send_time_(false), | |
56 packets_since_absolute_send_time_(0), | |
57 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()) {} | |
58 | |
59 void CongestionController::WrappingBitrateEstimator::IncomingPacket( | |
60 int64_t arrival_time_ms, | |
61 size_t payload_size, | |
62 const RTPHeader& header) { | |
63 rtc::CritScope cs(&crit_sect_); | |
64 PickEstimatorFromHeader(header); | |
65 rbe_->IncomingPacket(arrival_time_ms, payload_size, header); | |
66 } | |
67 | |
68 void CongestionController::WrappingBitrateEstimator::Process() { | |
69 rtc::CritScope cs(&crit_sect_); | |
70 rbe_->Process(); | |
71 } | |
72 | |
73 int64_t CongestionController::WrappingBitrateEstimator::TimeUntilNextProcess() { | |
74 rtc::CritScope cs(&crit_sect_); | |
75 return rbe_->TimeUntilNextProcess(); | |
76 } | |
77 | |
78 void CongestionController::WrappingBitrateEstimator::OnRttUpdate( | |
79 int64_t avg_rtt_ms, int64_t max_rtt_ms) { | |
80 rtc::CritScope cs(&crit_sect_); | |
81 rbe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); | |
82 } | |
83 | |
84 void CongestionController::WrappingBitrateEstimator::RemoveStream( | |
85 unsigned int ssrc) { | |
86 rtc::CritScope cs(&crit_sect_); | |
87 rbe_->RemoveStream(ssrc); | |
88 } | |
89 | |
90 bool CongestionController::WrappingBitrateEstimator::LatestEstimate( | |
91 std::vector<unsigned int>* ssrcs, | |
92 unsigned int* bitrate_bps) const { | |
93 rtc::CritScope cs(&crit_sect_); | |
94 return rbe_->LatestEstimate(ssrcs, bitrate_bps); | |
95 } | |
96 | |
97 void CongestionController::WrappingBitrateEstimator::SetMinBitrate( | |
98 int min_bitrate_bps) { | |
99 rtc::CritScope cs(&crit_sect_); | |
100 rbe_->SetMinBitrate(min_bitrate_bps); | |
101 min_bitrate_bps_ = min_bitrate_bps; | |
102 } | |
103 | |
104 void CongestionController::WrappingBitrateEstimator::PickEstimatorFromHeader( | |
105 const RTPHeader& header) { | |
106 if (header.extension.hasAbsoluteSendTime) { | |
107 // If we see AST in header, switch RBE strategy immediately. | |
108 if (!using_absolute_send_time_) { | |
109 LOG(LS_INFO) << | |
110 "WrappingBitrateEstimator: Switching to absolute send time RBE."; | |
111 using_absolute_send_time_ = true; | |
112 PickEstimator(); | |
113 } | |
114 packets_since_absolute_send_time_ = 0; | |
115 } else { | |
116 // When we don't see AST, wait for a few packets before going back to TOF. | |
117 if (using_absolute_send_time_) { | |
118 ++packets_since_absolute_send_time_; | |
119 if (packets_since_absolute_send_time_ >= kTimeOffsetSwitchThreshold) { | |
120 LOG(LS_INFO) << "WrappingBitrateEstimator: Switching to transmission " | |
121 << "time offset RBE."; | |
122 using_absolute_send_time_ = false; | |
123 PickEstimator(); | |
124 } | |
125 } | |
126 } | |
127 } | |
128 | |
129 // Instantiate RBE for Time Offset or Absolute Send Time extensions. | |
130 void CongestionController::WrappingBitrateEstimator::PickEstimator() { | |
131 if (using_absolute_send_time_) { | |
132 rbe_.reset(new RemoteBitrateEstimatorAbsSendTime(observer_, clock_)); | |
133 } else { | |
134 rbe_.reset(new RemoteBitrateEstimatorSingleStream(observer_, clock_)); | |
135 } | |
136 rbe_->SetMinBitrate(min_bitrate_bps_); | |
137 } | |
138 | |
139 CongestionController::CongestionController( | |
140 const Clock* clock, | |
141 Observer* observer, | |
142 RemoteBitrateObserver* remote_bitrate_observer, | |
143 RtcEventLog* event_log, | |
144 PacketRouter* packet_router) | |
145 : CongestionController( | |
146 clock, | |
147 observer, | |
148 remote_bitrate_observer, | |
149 event_log, | |
150 packet_router, | |
151 std::unique_ptr<PacedSender>(new PacedSender(clock, packet_router))) { | |
152 } | |
153 | |
154 CongestionController::CongestionController( | |
155 const Clock* clock, | |
156 Observer* observer, | |
157 RemoteBitrateObserver* remote_bitrate_observer, | |
158 RtcEventLog* event_log, | |
159 PacketRouter* packet_router, | |
160 std::unique_ptr<PacedSender> pacer) | |
161 : clock_(clock), | |
162 observer_(observer), | |
163 event_log_(event_log), | |
164 packet_router_(packet_router), | |
165 pacer_(std::move(pacer)), | |
166 bitrate_controller_( | |
167 BitrateController::CreateBitrateController(clock_, event_log)), | |
168 probe_controller_(new ProbeController(pacer_.get(), clock_)), | |
169 retransmission_rate_limiter_( | |
170 new RateLimiter(clock, kRetransmitWindowSizeMs)), | |
171 remote_bitrate_estimator_(remote_bitrate_observer, clock_), | |
172 remote_estimator_proxy_(clock_, packet_router_), | |
173 transport_feedback_adapter_(clock_), | |
174 last_reported_bitrate_bps_(0), | |
175 last_reported_fraction_loss_(0), | |
176 last_reported_rtt_(0), | |
177 network_state_(kNetworkUp), | |
178 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), | |
179 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)) { | |
180 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); | |
181 worker_thread_checker_.DetachFromThread(); | |
182 } | |
183 | |
184 CongestionController::~CongestionController() {} | |
185 | 28 |
186 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, | 29 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, |
187 size_t payload_size, | 30 size_t payload_size, |
188 const RTPHeader& header) { | 31 const RTPHeader& header) { |
189 // Send-side BWE. | 32 receive_side_cc_.OnReceivedPacket(arrival_time_ms, payload_size, header); |
190 if (header.extension.hasTransportSequenceNumber) { | |
191 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, | |
192 header); | |
193 } else { | |
194 // Receive-side BWE. | |
195 remote_bitrate_estimator_.IncomingPacket(arrival_time_ms, payload_size, | |
196 header); | |
197 } | |
198 } | 33 } |
199 | 34 |
200 void CongestionController::SetBweBitrates(int min_bitrate_bps, | 35 void CongestionController::SetBweBitrates(int min_bitrate_bps, |
201 int start_bitrate_bps, | 36 int start_bitrate_bps, |
202 int max_bitrate_bps) { | 37 int max_bitrate_bps) { |
203 ClampBitrates(&start_bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); | 38 send_side_cc_.SetBweBitrates(min_bitrate_bps, start_bitrate_bps, |
204 bitrate_controller_->SetBitrates(start_bitrate_bps, | 39 max_bitrate_bps); |
205 min_bitrate_bps, | |
206 max_bitrate_bps); | |
207 | |
208 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps, | |
209 max_bitrate_bps); | |
210 | |
211 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); | |
212 { | |
213 rtc::CritScope cs(&bwe_lock_); | |
214 if (start_bitrate_bps > 0) | |
215 delay_based_bwe_->SetStartBitrate(start_bitrate_bps); | |
216 min_bitrate_bps_ = min_bitrate_bps; | |
217 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); | |
218 } | |
219 MaybeTriggerOnNetworkChanged(); | |
220 } | 40 } |
221 | 41 |
222 // TODO(holmer): Split this up and use SetBweBitrates in combination with | 42 // TODO(holmer): Split this up and use SetBweBitrates in combination with |
223 // OnNetworkRouteChanged. | 43 // OnNetworkRouteChanged. |
224 void CongestionController::OnNetworkRouteChanged( | 44 void CongestionController::OnNetworkRouteChanged( |
225 const rtc::NetworkRoute& network_route, | 45 const rtc::NetworkRoute& network_route, |
226 int bitrate_bps, | 46 int bitrate_bps, |
227 int min_bitrate_bps, | 47 int min_bitrate_bps, |
228 int max_bitrate_bps) { | 48 int max_bitrate_bps) { |
229 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); | 49 send_side_cc_.OnNetworkRouteChanged(network_route, bitrate_bps, |
230 // TODO(honghaiz): Recreate this object once the bitrate controller is | 50 min_bitrate_bps, max_bitrate_bps); |
231 // no longer exposed outside CongestionController. | |
232 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, | |
233 max_bitrate_bps); | |
234 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is | |
235 // no longer exposed outside CongestionController. | |
236 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); | |
237 | |
238 transport_feedback_adapter_.SetNetworkIds(network_route.local_network_id, | |
239 network_route.remote_network_id); | |
240 { | |
241 rtc::CritScope cs(&bwe_lock_); | |
242 min_bitrate_bps_ = min_bitrate_bps; | |
243 delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_)); | |
244 delay_based_bwe_->SetStartBitrate(bitrate_bps); | |
245 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); | |
246 } | |
247 | |
248 probe_controller_->Reset(); | |
249 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); | |
250 | |
251 MaybeTriggerOnNetworkChanged(); | |
252 } | 51 } |
253 | 52 |
254 BitrateController* CongestionController::GetBitrateController() const { | 53 BitrateController* CongestionController::GetBitrateController() const { |
255 return bitrate_controller_.get(); | 54 return send_side_cc_.GetBitrateController(); |
256 } | 55 } |
257 | 56 |
258 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( | 57 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( |
259 bool send_side_bwe) { | 58 bool send_side_bwe) { |
260 if (send_side_bwe) { | 59 return receive_side_cc_.GetRemoteBitrateEstimator(send_side_bwe); |
261 return &remote_estimator_proxy_; | |
262 } else { | |
263 return &remote_bitrate_estimator_; | |
264 } | |
265 } | 60 } |
266 | 61 |
267 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { | 62 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { |
268 return retransmission_rate_limiter_.get(); | 63 return send_side_cc_.GetRetransmissionRateLimiter(); |
269 } | 64 } |
270 | 65 |
271 void CongestionController::EnablePeriodicAlrProbing(bool enable) { | 66 void CongestionController::EnablePeriodicAlrProbing(bool enable) { |
272 probe_controller_->EnablePeriodicAlrProbing(enable); | 67 send_side_cc_.EnablePeriodicAlrProbing(enable); |
273 } | 68 } |
274 | 69 |
275 void CongestionController::SetAllocatedSendBitrateLimits( | 70 void CongestionController::SetAllocatedSendBitrateLimits( |
276 int min_send_bitrate_bps, | 71 int min_send_bitrate_bps, |
277 int max_padding_bitrate_bps) { | 72 int max_padding_bitrate_bps) { |
278 pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps); | 73 send_side_cc_.SetAllocatedSendBitrateLimits(min_send_bitrate_bps, |
| 74 max_padding_bitrate_bps); |
279 } | 75 } |
280 | 76 |
281 int64_t CongestionController::GetPacerQueuingDelayMs() const { | 77 int64_t CongestionController::GetPacerQueuingDelayMs() const { |
282 return IsNetworkDown() ? 0 : pacer_->QueueInMs(); | 78 return send_side_cc_.GetPacerQueuingDelayMs(); |
283 } | 79 } |
284 | 80 |
285 void CongestionController::SignalNetworkState(NetworkState state) { | 81 void CongestionController::SignalNetworkState(NetworkState state) { |
286 LOG(LS_INFO) << "SignalNetworkState " | 82 send_side_cc_.SignalNetworkState(state); |
287 << (state == kNetworkUp ? "Up" : "Down"); | |
288 if (state == kNetworkUp) { | |
289 pacer_->Resume(); | |
290 } else { | |
291 pacer_->Pause(); | |
292 } | |
293 { | |
294 rtc::CritScope cs(&network_state_lock_); | |
295 network_state_ = state; | |
296 } | |
297 probe_controller_->OnNetworkStateChanged(state); | |
298 MaybeTriggerOnNetworkChanged(); | |
299 } | 83 } |
300 | 84 |
301 void CongestionController::SetTransportOverhead( | 85 void CongestionController::SetTransportOverhead( |
302 size_t transport_overhead_bytes_per_packet) { | 86 size_t transport_overhead_bytes_per_packet) { |
303 transport_feedback_adapter_.SetTransportOverhead( | 87 send_side_cc_.SetTransportOverhead(transport_overhead_bytes_per_packet); |
304 transport_overhead_bytes_per_packet); | |
305 } | 88 } |
306 | 89 |
307 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { | 90 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { |
308 // We're not interested in packets without an id, which may be stun packets, | 91 send_side_cc_.OnSentPacket(sent_packet); |
309 // etc, sent on the same transport. | |
310 if (sent_packet.packet_id == -1) | |
311 return; | |
312 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, | |
313 sent_packet.send_time_ms); | |
314 } | 92 } |
315 | 93 |
316 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { | 94 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
317 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); | 95 receive_side_cc_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
318 { | 96 send_side_cc_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
319 rtc::CritScope cs(&bwe_lock_); | |
320 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); | |
321 } | |
322 } | 97 } |
323 | 98 |
324 int64_t CongestionController::TimeUntilNextProcess() { | 99 int64_t CongestionController::TimeUntilNextProcess() { |
325 return std::min(bitrate_controller_->TimeUntilNextProcess(), | 100 return std::min(send_side_cc_.TimeUntilNextProcess(), |
326 remote_bitrate_estimator_.TimeUntilNextProcess()); | 101 receive_side_cc_.TimeUntilNextProcess()); |
327 } | 102 } |
328 | 103 |
329 void CongestionController::Process() { | 104 void CongestionController::Process() { |
330 bitrate_controller_->Process(); | 105 send_side_cc_.Process(); |
331 remote_bitrate_estimator_.Process(); | 106 receive_side_cc_.Process(); |
332 probe_controller_->Process(); | |
333 MaybeTriggerOnNetworkChanged(); | |
334 } | 107 } |
335 | 108 |
336 void CongestionController::AddPacket(uint16_t sequence_number, | 109 void CongestionController::AddPacket(uint16_t sequence_number, |
337 size_t length, | 110 size_t length, |
338 const PacedPacketInfo& pacing_info) { | 111 const PacedPacketInfo& pacing_info) { |
339 transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info); | 112 send_side_cc_.AddPacket(sequence_number, length, pacing_info); |
340 } | 113 } |
341 | 114 |
342 void CongestionController::OnTransportFeedback( | 115 void CongestionController::OnTransportFeedback( |
343 const rtcp::TransportFeedback& feedback) { | 116 const rtcp::TransportFeedback& feedback) { |
344 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 117 send_side_cc_.OnTransportFeedback(feedback); |
345 transport_feedback_adapter_.OnTransportFeedback(feedback); | |
346 std::vector<PacketFeedback> feedback_vector = | |
347 transport_feedback_adapter_.GetTransportFeedbackVector(); | |
348 if (feedback_vector.empty()) | |
349 return; | |
350 DelayBasedBwe::Result result; | |
351 { | |
352 rtc::CritScope cs(&bwe_lock_); | |
353 result = delay_based_bwe_->IncomingPacketFeedbackVector(feedback_vector); | |
354 } | |
355 if (result.updated) | |
356 bitrate_controller_->OnDelayBasedBweResult(result); | |
357 } | 118 } |
358 | 119 |
359 std::vector<PacketFeedback> CongestionController::GetTransportFeedbackVector() | 120 std::vector<PacketFeedback> CongestionController::GetTransportFeedbackVector() |
360 const { | 121 const { |
361 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 122 return send_side_cc_.GetTransportFeedbackVector(); |
362 return transport_feedback_adapter_.GetTransportFeedbackVector(); | |
363 } | |
364 | |
365 void CongestionController::MaybeTriggerOnNetworkChanged() { | |
366 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a | |
367 // BitrateObserver is used. Remove this check once the ctor is removed. | |
368 if (!observer_) | |
369 return; | |
370 | |
371 uint32_t bitrate_bps; | |
372 uint8_t fraction_loss; | |
373 int64_t rtt; | |
374 bool estimate_changed = bitrate_controller_->GetNetworkParameters( | |
375 &bitrate_bps, &fraction_loss, &rtt); | |
376 if (estimate_changed) { | |
377 pacer_->SetEstimatedBitrate(bitrate_bps); | |
378 probe_controller_->SetEstimatedBitrate(bitrate_bps); | |
379 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); | |
380 } | |
381 | |
382 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; | |
383 | |
384 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { | |
385 int64_t probing_interval_ms; | |
386 { | |
387 rtc::CritScope cs(&bwe_lock_); | |
388 probing_interval_ms = delay_based_bwe_->GetProbingIntervalMs(); | |
389 } | |
390 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt, | |
391 probing_interval_ms); | |
392 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); | |
393 } | |
394 } | |
395 | |
396 bool CongestionController::HasNetworkParametersToReportChanged( | |
397 uint32_t bitrate_bps, | |
398 uint8_t fraction_loss, | |
399 int64_t rtt) { | |
400 rtc::CritScope cs(&network_state_lock_); | |
401 bool changed = | |
402 last_reported_bitrate_bps_ != bitrate_bps || | |
403 (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss || | |
404 last_reported_rtt_ != rtt)); | |
405 if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) { | |
406 LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps | |
407 << " bps."; | |
408 } | |
409 last_reported_bitrate_bps_ = bitrate_bps; | |
410 last_reported_fraction_loss_ = fraction_loss; | |
411 last_reported_rtt_ = rtt; | |
412 return changed; | |
413 } | |
414 | |
415 bool CongestionController::IsSendQueueFull() const { | |
416 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; | |
417 } | |
418 | |
419 bool CongestionController::IsNetworkDown() const { | |
420 rtc::CritScope cs(&network_state_lock_); | |
421 return network_state_ == kNetworkDown; | |
422 } | 123 } |
423 | 124 |
424 } // namespace webrtc | 125 } // namespace webrtc |
OLD | NEW |