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

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

Issue 2752233002: Split CongestionController into send- and receive-side classes. (Closed)
Patch Set: Deleted ReceiveSideCongestionController::OnNetworkRouteChanged. 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/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 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), 74 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()),
175 max_bitrate_bps_(0), 75 max_bitrate_bps_(0),
176 last_reported_bitrate_bps_(0), 76 last_reported_bitrate_bps_(0),
177 last_reported_fraction_loss_(0), 77 last_reported_fraction_loss_(0),
178 last_reported_rtt_(0), 78 last_reported_rtt_(0),
179 network_state_(kNetworkUp), 79 network_state_(kNetworkUp),
180 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)) { 80 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)) {
181 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); 81 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
182 worker_thread_checker_.DetachFromThread(); 82 worker_thread_checker_.DetachFromThread();
183 } 83 }
184 84
185 CongestionController::~CongestionController() {} 85 SendSideCongestionController::~SendSideCongestionController() {}
186 86
187 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, 87 void SendSideCongestionController::SetBweBitrates(int min_bitrate_bps,
188 size_t payload_size, 88 int start_bitrate_bps,
189 const RTPHeader& header) { 89 int max_bitrate_bps) {
190 // Send-side BWE.
191 if (header.extension.hasTransportSequenceNumber) {
192 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size,
193 header);
194 } else {
195 // Receive-side BWE.
196 remote_bitrate_estimator_.IncomingPacket(arrival_time_ms, payload_size,
197 header);
198 }
199 }
200
201 void CongestionController::SetBweBitrates(int min_bitrate_bps,
202 int start_bitrate_bps,
203 int max_bitrate_bps) {
204 ClampBitrates(&start_bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); 90 ClampBitrates(&start_bitrate_bps, &min_bitrate_bps, &max_bitrate_bps);
205 bitrate_controller_->SetBitrates(start_bitrate_bps, 91 bitrate_controller_->SetBitrates(start_bitrate_bps, min_bitrate_bps,
206 min_bitrate_bps,
207 max_bitrate_bps); 92 max_bitrate_bps);
208 93
209 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps, 94 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps,
210 max_bitrate_bps); 95 max_bitrate_bps);
211 max_bitrate_bps_ = max_bitrate_bps; 96 max_bitrate_bps_ = max_bitrate_bps;
212 97
213 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps);
214 min_bitrate_bps_ = min_bitrate_bps; 98 min_bitrate_bps_ = min_bitrate_bps;
215 { 99 {
216 rtc::CritScope cs(&bwe_lock_); 100 rtc::CritScope cs(&bwe_lock_);
217 if (start_bitrate_bps > 0) 101 if (start_bitrate_bps > 0)
218 delay_based_bwe_->SetStartBitrate(start_bitrate_bps); 102 delay_based_bwe_->SetStartBitrate(start_bitrate_bps);
219 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); 103 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
220 } 104 }
221 MaybeTriggerOnNetworkChanged(); 105 MaybeTriggerOnNetworkChanged();
222 } 106 }
223 107
224 // TODO(holmer): Split this up and use SetBweBitrates in combination with 108 // TODO(holmer): Split this up and use SetBweBitrates in combination with
225 // OnNetworkRouteChanged. 109 // OnNetworkRouteChanged.
226 void CongestionController::OnNetworkRouteChanged( 110 void SendSideCongestionController::OnNetworkRouteChanged(
227 const rtc::NetworkRoute& network_route, 111 const rtc::NetworkRoute& network_route,
228 int bitrate_bps, 112 int bitrate_bps,
229 int min_bitrate_bps, 113 int min_bitrate_bps,
230 int max_bitrate_bps) { 114 int max_bitrate_bps) {
231 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); 115 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps);
232 // TODO(honghaiz): Recreate this object once the bitrate controller is 116 // TODO(honghaiz): Recreate this object once the bitrate controller is
233 // no longer exposed outside CongestionController. 117 // no longer exposed outside SendSideCongestionController.
234 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, 118 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps,
235 max_bitrate_bps); 119 max_bitrate_bps);
236 min_bitrate_bps_ = min_bitrate_bps; 120 min_bitrate_bps_ = min_bitrate_bps;
237 max_bitrate_bps_ = max_bitrate_bps; 121 max_bitrate_bps_ = max_bitrate_bps;
238 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is
239 // no longer exposed outside CongestionController.
240 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps);
241 122
242 transport_feedback_adapter_.SetNetworkIds(network_route.local_network_id, 123 transport_feedback_adapter_.SetNetworkIds(network_route.local_network_id,
243 network_route.remote_network_id); 124 network_route.remote_network_id);
244 { 125 {
245 rtc::CritScope cs(&bwe_lock_); 126 rtc::CritScope cs(&bwe_lock_);
246 delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_)); 127 delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_));
247 delay_based_bwe_->SetStartBitrate(bitrate_bps); 128 delay_based_bwe_->SetStartBitrate(bitrate_bps);
248 delay_based_bwe_->SetMinBitrate(min_bitrate_bps); 129 delay_based_bwe_->SetMinBitrate(min_bitrate_bps);
249 } 130 }
250 131
251 probe_controller_->Reset(); 132 probe_controller_->Reset();
252 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); 133 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps);
253 134
254 MaybeTriggerOnNetworkChanged(); 135 MaybeTriggerOnNetworkChanged();
255 } 136 }
256 137
257 BitrateController* CongestionController::GetBitrateController() const { 138 BitrateController* SendSideCongestionController::GetBitrateController() const {
258 return bitrate_controller_.get(); 139 return bitrate_controller_.get();
259 } 140 }
260 141
261 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( 142 RateLimiter* SendSideCongestionController::GetRetransmissionRateLimiter() {
262 bool send_side_bwe) {
263 if (send_side_bwe) {
264 return &remote_estimator_proxy_;
265 } else {
266 return &remote_bitrate_estimator_;
267 }
268 }
269
270 RateLimiter* CongestionController::GetRetransmissionRateLimiter() {
271 return retransmission_rate_limiter_.get(); 143 return retransmission_rate_limiter_.get();
272 } 144 }
273 145
274 void CongestionController::EnablePeriodicAlrProbing(bool enable) { 146 void SendSideCongestionController::EnablePeriodicAlrProbing(bool enable) {
275 probe_controller_->EnablePeriodicAlrProbing(enable); 147 probe_controller_->EnablePeriodicAlrProbing(enable);
276 } 148 }
277 149
278 void CongestionController::SetAllocatedSendBitrateLimits( 150 void SendSideCongestionController::SetAllocatedSendBitrateLimits(
279 int min_send_bitrate_bps, 151 int min_send_bitrate_bps,
280 int max_padding_bitrate_bps) { 152 int max_padding_bitrate_bps) {
281 pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps); 153 pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
282 } 154 }
283 155
284 int64_t CongestionController::GetPacerQueuingDelayMs() const { 156 int64_t SendSideCongestionController::GetPacerQueuingDelayMs() const {
285 return IsNetworkDown() ? 0 : pacer_->QueueInMs(); 157 return IsNetworkDown() ? 0 : pacer_->QueueInMs();
286 } 158 }
287 159
288 void CongestionController::SignalNetworkState(NetworkState state) { 160 void SendSideCongestionController::SignalNetworkState(NetworkState state) {
289 LOG(LS_INFO) << "SignalNetworkState " 161 LOG(LS_INFO) << "SignalNetworkState "
290 << (state == kNetworkUp ? "Up" : "Down"); 162 << (state == kNetworkUp ? "Up" : "Down");
291 if (state == kNetworkUp) { 163 if (state == kNetworkUp) {
292 pacer_->Resume(); 164 pacer_->Resume();
293 } else { 165 } else {
294 pacer_->Pause(); 166 pacer_->Pause();
295 } 167 }
296 { 168 {
297 rtc::CritScope cs(&network_state_lock_); 169 rtc::CritScope cs(&network_state_lock_);
298 network_state_ = state; 170 network_state_ = state;
299 } 171 }
300 probe_controller_->OnNetworkStateChanged(state); 172 probe_controller_->OnNetworkStateChanged(state);
301 MaybeTriggerOnNetworkChanged(); 173 MaybeTriggerOnNetworkChanged();
302 } 174 }
303 175
304 void CongestionController::SetTransportOverhead( 176 void SendSideCongestionController::SetTransportOverhead(
305 size_t transport_overhead_bytes_per_packet) { 177 size_t transport_overhead_bytes_per_packet) {
306 transport_feedback_adapter_.SetTransportOverhead( 178 transport_feedback_adapter_.SetTransportOverhead(
307 transport_overhead_bytes_per_packet); 179 transport_overhead_bytes_per_packet);
308 } 180 }
309 181
310 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { 182 void SendSideCongestionController::OnSentPacket(
183 const rtc::SentPacket& sent_packet) {
311 // We're not interested in packets without an id, which may be stun packets, 184 // We're not interested in packets without an id, which may be stun packets,
312 // etc, sent on the same transport. 185 // etc, sent on the same transport.
313 if (sent_packet.packet_id == -1) 186 if (sent_packet.packet_id == -1)
314 return; 187 return;
315 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, 188 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id,
316 sent_packet.send_time_ms); 189 sent_packet.send_time_ms);
317 } 190 }
318 191
319 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { 192 void SendSideCongestionController::OnRttUpdate(int64_t avg_rtt_ms,
320 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); 193 int64_t max_rtt_ms) {
321 { 194 rtc::CritScope cs(&bwe_lock_);
322 rtc::CritScope cs(&bwe_lock_); 195 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
323 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
324 }
325 } 196 }
326 197
327 int64_t CongestionController::TimeUntilNextProcess() { 198 int64_t SendSideCongestionController::TimeUntilNextProcess() {
328 return std::min(bitrate_controller_->TimeUntilNextProcess(), 199 return bitrate_controller_->TimeUntilNextProcess();
329 remote_bitrate_estimator_.TimeUntilNextProcess());
330 } 200 }
331 201
332 void CongestionController::Process() { 202 void SendSideCongestionController::Process() {
333 bitrate_controller_->Process(); 203 bitrate_controller_->Process();
334 remote_bitrate_estimator_.Process();
335 probe_controller_->Process(); 204 probe_controller_->Process();
336 MaybeTriggerOnNetworkChanged(); 205 MaybeTriggerOnNetworkChanged();
337 } 206 }
338 207
339 void CongestionController::AddPacket(uint16_t sequence_number, 208 void SendSideCongestionController::AddPacket(
340 size_t length, 209 uint16_t sequence_number,
341 const PacedPacketInfo& pacing_info) { 210 size_t length,
211 const PacedPacketInfo& pacing_info) {
342 transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info); 212 transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info);
343 } 213 }
344 214
345 void CongestionController::OnTransportFeedback( 215 void SendSideCongestionController::OnTransportFeedback(
346 const rtcp::TransportFeedback& feedback) { 216 const rtcp::TransportFeedback& feedback) {
347 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); 217 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
348 transport_feedback_adapter_.OnTransportFeedback(feedback); 218 transport_feedback_adapter_.OnTransportFeedback(feedback);
349 DelayBasedBwe::Result result; 219 DelayBasedBwe::Result result;
350 { 220 {
351 rtc::CritScope cs(&bwe_lock_); 221 rtc::CritScope cs(&bwe_lock_);
352 result = delay_based_bwe_->IncomingPacketFeedbackVector( 222 result = delay_based_bwe_->IncomingPacketFeedbackVector(
353 transport_feedback_adapter_.GetTransportFeedbackVector()); 223 transport_feedback_adapter_.GetTransportFeedbackVector());
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698