Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: webrtc/modules/congestion_controller/congestion_controller.cc

Issue 2752233002: Split CongestionController into send- and receive-side classes. (Closed)
Patch Set: Use variable names receive_side_cc and send_side_cc. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW
« no previous file with comments | « webrtc/modules/congestion_controller/BUILD.gn ('k') | webrtc/modules/congestion_controller/include/congestion_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698