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

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: 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/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
OLDNEW
« no previous file with comments | « webrtc/modules/congestion_controller/receive_side_congestion_controller.cc ('k') | webrtc/video/video_send_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698