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

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

Issue 2725823002: Move delay_based_bwe_ into CongestionController (Closed)
Patch Set: More refactoring + UTs moved. 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
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 Observer* observer, 141 Observer* observer,
142 RemoteBitrateObserver* remote_bitrate_observer, 142 RemoteBitrateObserver* remote_bitrate_observer,
143 RtcEventLog* event_log, 143 RtcEventLog* event_log,
144 PacketRouter* packet_router) 144 PacketRouter* packet_router)
145 : CongestionController( 145 : CongestionController(
146 clock, 146 clock,
147 observer, 147 observer,
148 remote_bitrate_observer, 148 remote_bitrate_observer,
149 event_log, 149 event_log,
150 packet_router, 150 packet_router,
151 std::unique_ptr<PacedSender>(new PacedSender(clock, packet_router))) { 151 std::unique_ptr<PacedSender>(new PacedSender(clock, packet_router)),
152 } 152 std::unique_ptr<BitrateController>(
153 BitrateController::CreateBitrateController(clock, event_log))) {}
153 154
154 CongestionController::CongestionController( 155 CongestionController::CongestionController(
155 Clock* clock, 156 Clock* clock,
156 Observer* observer, 157 Observer* observer,
157 RemoteBitrateObserver* remote_bitrate_observer, 158 RemoteBitrateObserver* remote_bitrate_observer,
158 RtcEventLog* event_log, 159 RtcEventLog* event_log,
159 PacketRouter* packet_router, 160 PacketRouter* packet_router,
160 std::unique_ptr<PacedSender> pacer) 161 std::unique_ptr<PacedSender> pacer,
162 std::unique_ptr<BitrateController> bitrate_controller)
161 : clock_(clock), 163 : clock_(clock),
162 observer_(observer), 164 observer_(observer),
165 event_log_(event_log),
163 packet_router_(packet_router), 166 packet_router_(packet_router),
164 pacer_(std::move(pacer)), 167 pacer_(std::move(pacer)),
165 bitrate_controller_( 168 bitrate_controller_(std::move(bitrate_controller)),
166 BitrateController::CreateBitrateController(clock_, event_log)),
167 probe_controller_(new ProbeController(pacer_.get(), clock_)), 169 probe_controller_(new ProbeController(pacer_.get(), clock_)),
168 retransmission_rate_limiter_( 170 retransmission_rate_limiter_(
169 new RateLimiter(clock, kRetransmitWindowSizeMs)), 171 new RateLimiter(clock, kRetransmitWindowSizeMs)),
170 remote_bitrate_estimator_(remote_bitrate_observer, clock_), 172 remote_bitrate_estimator_(remote_bitrate_observer, clock_),
171 remote_estimator_proxy_(clock_, packet_router_), 173 remote_estimator_proxy_(clock_, packet_router_),
172 transport_feedback_adapter_(event_log, clock_, bitrate_controller_.get()), 174 transport_feedback_adapter_(clock_),
173 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), 175 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()),
174 max_bitrate_bps_(0), 176 max_bitrate_bps_(0),
175 last_reported_bitrate_bps_(0), 177 last_reported_bitrate_bps_(0),
176 last_reported_fraction_loss_(0), 178 last_reported_fraction_loss_(0),
177 last_reported_rtt_(0), 179 last_reported_rtt_(0),
178 network_state_(kNetworkUp) { 180 network_state_(kNetworkUp),
179 transport_feedback_adapter_.InitBwe(); 181 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)) {
180 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_); 182 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
181 } 183 }
182 184
183 CongestionController::~CongestionController() {} 185 CongestionController::~CongestionController() {}
184 186
185 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, 187 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms,
186 size_t payload_size, 188 size_t payload_size,
187 const RTPHeader& header) { 189 const RTPHeader& header) {
188 // Send-side BWE. 190 // Send-side BWE.
189 if (header.extension.hasTransportSequenceNumber) { 191 if (header.extension.hasTransportSequenceNumber) {
190 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, 192 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size,
(...skipping 12 matching lines...) Expand all
203 bitrate_controller_->SetBitrates(start_bitrate_bps, 205 bitrate_controller_->SetBitrates(start_bitrate_bps,
204 min_bitrate_bps, 206 min_bitrate_bps,
205 max_bitrate_bps); 207 max_bitrate_bps);
206 208
207 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps, 209 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps,
208 max_bitrate_bps); 210 max_bitrate_bps);
209 max_bitrate_bps_ = max_bitrate_bps; 211 max_bitrate_bps_ = max_bitrate_bps;
210 212
211 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); 213 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps);
212 min_bitrate_bps_ = min_bitrate_bps; 214 min_bitrate_bps_ = min_bitrate_bps;
213 if (start_bitrate_bps > 0) 215 {
214 transport_feedback_adapter_.SetStartBitrate(start_bitrate_bps); 216 rtc::CritScope cs(&bwe_lock_);
215 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_); 217 if (start_bitrate_bps > 0)
218 delay_based_bwe_->SetStartBitrate(start_bitrate_bps);
219 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
220 }
216 MaybeTriggerOnNetworkChanged(); 221 MaybeTriggerOnNetworkChanged();
217 } 222 }
218 223
219 void CongestionController::ResetBweAndBitrates(int bitrate_bps, 224 void CongestionController::ResetBweAndBitrates(int bitrate_bps,
220 int min_bitrate_bps, 225 int min_bitrate_bps,
221 int max_bitrate_bps) { 226 int max_bitrate_bps) {
222 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); 227 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps);
223 // TODO(honghaiz): Recreate this object once the bitrate controller is 228 // TODO(honghaiz): Recreate this object once the bitrate controller is
224 // no longer exposed outside CongestionController. 229 // no longer exposed outside CongestionController.
225 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, 230 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps,
226 max_bitrate_bps); 231 max_bitrate_bps);
227 min_bitrate_bps_ = min_bitrate_bps; 232 min_bitrate_bps_ = min_bitrate_bps;
228 max_bitrate_bps_ = max_bitrate_bps; 233 max_bitrate_bps_ = max_bitrate_bps;
229 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is 234 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is
230 // no longer exposed outside CongestionController. 235 // no longer exposed outside CongestionController.
231 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); 236 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps);
232 237
233 transport_feedback_adapter_.InitBwe(); 238 {
234 transport_feedback_adapter_.SetStartBitrate(bitrate_bps); 239 rtc::CritScope cs(&bwe_lock_);
235 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps); 240 delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_));
241 delay_based_bwe_->SetStartBitrate(bitrate_bps);
242 delay_based_bwe_->SetMinBitrate(min_bitrate_bps);
243 }
236 // TODO(holmer): Trigger a new probe once mid-call probing is implemented. 244 // TODO(holmer): Trigger a new probe once mid-call probing is implemented.
237 MaybeTriggerOnNetworkChanged(); 245 MaybeTriggerOnNetworkChanged();
238 } 246 }
239 247
240 BitrateController* CongestionController::GetBitrateController() const { 248 BitrateController* CongestionController::GetBitrateController() const {
241 return bitrate_controller_.get(); 249 return bitrate_controller_.get();
242 } 250 }
243 251
244 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( 252 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator(
245 bool send_side_bwe) { 253 bool send_side_bwe) {
246 if (send_side_bwe) { 254 if (send_side_bwe) {
247 return &remote_estimator_proxy_; 255 return &remote_estimator_proxy_;
248 } else { 256 } else {
249 return &remote_bitrate_estimator_; 257 return &remote_bitrate_estimator_;
250 } 258 }
251 } 259 }
252 260
253 TransportFeedbackObserver*
254 CongestionController::GetTransportFeedbackObserver() {
255 return &transport_feedback_adapter_;
256 }
257
258 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { 261 RateLimiter* CongestionController::GetRetransmissionRateLimiter() {
259 return retransmission_rate_limiter_.get(); 262 return retransmission_rate_limiter_.get();
260 } 263 }
261 264
262 void CongestionController::EnablePeriodicAlrProbing(bool enable) { 265 void CongestionController::EnablePeriodicAlrProbing(bool enable) {
263 probe_controller_->EnablePeriodicAlrProbing(enable); 266 probe_controller_->EnablePeriodicAlrProbing(enable);
264 } 267 }
265 268
266 void CongestionController::SetAllocatedSendBitrateLimits( 269 void CongestionController::SetAllocatedSendBitrateLimits(
267 int min_send_bitrate_bps, 270 int min_send_bitrate_bps,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 // We're not interested in packets without an id, which may be stun packets, 302 // We're not interested in packets without an id, which may be stun packets,
300 // etc, sent on the same transport. 303 // etc, sent on the same transport.
301 if (sent_packet.packet_id == -1) 304 if (sent_packet.packet_id == -1)
302 return; 305 return;
303 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, 306 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id,
304 sent_packet.send_time_ms); 307 sent_packet.send_time_ms);
305 } 308 }
306 309
307 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { 310 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
308 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); 311 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms);
309 transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); 312 {
313 rtc::CritScope cs(&bwe_lock_);
314 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
315 }
310 } 316 }
311 317
312 int64_t CongestionController::TimeUntilNextProcess() { 318 int64_t CongestionController::TimeUntilNextProcess() {
313 return std::min(bitrate_controller_->TimeUntilNextProcess(), 319 return std::min(bitrate_controller_->TimeUntilNextProcess(),
314 remote_bitrate_estimator_.TimeUntilNextProcess()); 320 remote_bitrate_estimator_.TimeUntilNextProcess());
315 } 321 }
316 322
317 void CongestionController::Process() { 323 void CongestionController::Process() {
318 bitrate_controller_->Process(); 324 bitrate_controller_->Process();
319 remote_bitrate_estimator_.Process(); 325 remote_bitrate_estimator_.Process();
320 probe_controller_->Process(); 326 probe_controller_->Process();
321 MaybeTriggerOnNetworkChanged(); 327 MaybeTriggerOnNetworkChanged();
322 } 328 }
323 329
330 void CongestionController::AddPacket(uint16_t sequence_number,
331 size_t length,
332 const PacedPacketInfo& pacing_info) {
333 transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info);
334 }
335
336 void CongestionController::OnTransportFeedback(
337 const rtcp::TransportFeedback& feedback) {
338 transport_feedback_adapter_.OnTransportFeedback(feedback);
339 DelayBasedBwe::Result result;
340 {
341 rtc::CritScope cs(&bwe_lock_);
342 result = delay_based_bwe_->IncomingPacketFeedbackVector(
343 transport_feedback_adapter_.GetTransportFeedbackVector());
344 }
345 if (result.updated)
346 bitrate_controller_->OnDelayBasedBweResult(result);
347 }
348
349 std::vector<PacketFeedback> CongestionController::GetTransportFeedbackVector()
350 const {
351 return transport_feedback_adapter_.GetTransportFeedbackVector();
352 }
353
324 void CongestionController::MaybeTriggerOnNetworkChanged() { 354 void CongestionController::MaybeTriggerOnNetworkChanged() {
325 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a 355 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a
326 // BitrateObserver is used. Remove this check once the ctor is removed. 356 // BitrateObserver is used. Remove this check once the ctor is removed.
327 if (!observer_) 357 if (!observer_)
328 return; 358 return;
329 359
330 uint32_t bitrate_bps; 360 uint32_t bitrate_bps;
331 uint8_t fraction_loss; 361 uint8_t fraction_loss;
332 int64_t rtt; 362 int64_t rtt;
333 bool estimate_changed = bitrate_controller_->GetNetworkParameters( 363 bool estimate_changed = bitrate_controller_->GetNetworkParameters(
334 &bitrate_bps, &fraction_loss, &rtt); 364 &bitrate_bps, &fraction_loss, &rtt);
335 if (estimate_changed) { 365 if (estimate_changed) {
336 pacer_->SetEstimatedBitrate(bitrate_bps); 366 pacer_->SetEstimatedBitrate(bitrate_bps);
337 probe_controller_->SetEstimatedBitrate(bitrate_bps); 367 probe_controller_->SetEstimatedBitrate(bitrate_bps);
338 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); 368 retransmission_rate_limiter_->SetMaxRate(bitrate_bps);
339 } 369 }
340 370
341 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; 371 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps;
342 372
343 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { 373 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) {
344 observer_->OnNetworkChanged( 374 int64_t probing_interval_ms;
345 bitrate_bps, fraction_loss, rtt, 375 {
346 transport_feedback_adapter_.GetProbingIntervalMs()); 376 rtc::CritScope cs(&bwe_lock_);
377 probing_interval_ms = delay_based_bwe_->GetProbingIntervalMs();
378 }
379 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt,
380 probing_interval_ms);
347 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); 381 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps);
348 } 382 }
349 } 383 }
350 384
351 bool CongestionController::HasNetworkParametersToReportChanged( 385 bool CongestionController::HasNetworkParametersToReportChanged(
352 uint32_t bitrate_bps, 386 uint32_t bitrate_bps,
353 uint8_t fraction_loss, 387 uint8_t fraction_loss,
354 int64_t rtt) { 388 int64_t rtt) {
355 rtc::CritScope cs(&critsect_); 389 rtc::CritScope cs(&critsect_);
356 bool changed = 390 bool changed =
(...skipping 13 matching lines...) Expand all
370 bool CongestionController::IsSendQueueFull() const { 404 bool CongestionController::IsSendQueueFull() const {
371 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; 405 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs;
372 } 406 }
373 407
374 bool CongestionController::IsNetworkDown() const { 408 bool CongestionController::IsNetworkDown() const {
375 rtc::CritScope cs(&critsect_); 409 rtc::CritScope cs(&critsect_);
376 return network_state_ == kNetworkDown; 410 return network_state_ == kNetworkDown;
377 } 411 }
378 412
379 } // namespace webrtc 413 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698