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