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

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

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

Powered by Google App Engine
This is Rietveld 408576698