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

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

Issue 2743553003: Revert of Move delay_based_bwe_ into CongestionController (Closed)
Patch Set: 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),
164 packet_router_(packet_router), 163 packet_router_(packet_router),
165 pacer_(std::move(pacer)), 164 pacer_(std::move(pacer)),
166 bitrate_controller_( 165 bitrate_controller_(
167 BitrateController::CreateBitrateController(clock_, event_log)), 166 BitrateController::CreateBitrateController(clock_, event_log)),
168 probe_controller_(new ProbeController(pacer_.get(), clock_)), 167 probe_controller_(new ProbeController(pacer_.get(), clock_)),
169 retransmission_rate_limiter_( 168 retransmission_rate_limiter_(
170 new RateLimiter(clock, kRetransmitWindowSizeMs)), 169 new RateLimiter(clock, kRetransmitWindowSizeMs)),
171 remote_bitrate_estimator_(remote_bitrate_observer, clock_), 170 remote_bitrate_estimator_(remote_bitrate_observer, clock_),
172 remote_estimator_proxy_(clock_, packet_router_), 171 remote_estimator_proxy_(clock_, packet_router_),
173 transport_feedback_adapter_(clock_), 172 transport_feedback_adapter_(event_log, clock_, bitrate_controller_.get()),
174 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), 173 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()),
175 max_bitrate_bps_(0), 174 max_bitrate_bps_(0),
176 last_reported_bitrate_bps_(0), 175 last_reported_bitrate_bps_(0),
177 last_reported_fraction_loss_(0), 176 last_reported_fraction_loss_(0),
178 last_reported_rtt_(0), 177 last_reported_rtt_(0),
179 network_state_(kNetworkUp), 178 network_state_(kNetworkUp) {
180 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)) { 179 transport_feedback_adapter_.InitBwe();
181 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); 180 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_);
182 worker_thread_checker_.DetachFromThread();
183 } 181 }
184 182
185 CongestionController::~CongestionController() {} 183 CongestionController::~CongestionController() {}
186 184
187 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, 185 void CongestionController::OnReceivedPacket(int64_t arrival_time_ms,
188 size_t payload_size, 186 size_t payload_size,
189 const RTPHeader& header) { 187 const RTPHeader& header) {
190 // Send-side BWE. 188 // Send-side BWE.
191 if (header.extension.hasTransportSequenceNumber) { 189 if (header.extension.hasTransportSequenceNumber) {
192 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, 190 remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size,
(...skipping 12 matching lines...) Expand all
205 bitrate_controller_->SetBitrates(start_bitrate_bps, 203 bitrate_controller_->SetBitrates(start_bitrate_bps,
206 min_bitrate_bps, 204 min_bitrate_bps,
207 max_bitrate_bps); 205 max_bitrate_bps);
208 206
209 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps, 207 probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps,
210 max_bitrate_bps); 208 max_bitrate_bps);
211 max_bitrate_bps_ = max_bitrate_bps; 209 max_bitrate_bps_ = max_bitrate_bps;
212 210
213 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); 211 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps);
214 min_bitrate_bps_ = min_bitrate_bps; 212 min_bitrate_bps_ = min_bitrate_bps;
215 { 213 if (start_bitrate_bps > 0)
216 rtc::CritScope cs(&bwe_lock_); 214 transport_feedback_adapter_.SetStartBitrate(start_bitrate_bps);
217 if (start_bitrate_bps > 0) 215 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_);
218 delay_based_bwe_->SetStartBitrate(start_bitrate_bps);
219 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
220 }
221 MaybeTriggerOnNetworkChanged(); 216 MaybeTriggerOnNetworkChanged();
222 } 217 }
223 218
224 void CongestionController::ResetBweAndBitrates(int bitrate_bps, 219 void CongestionController::ResetBweAndBitrates(int bitrate_bps,
225 int min_bitrate_bps, 220 int min_bitrate_bps,
226 int max_bitrate_bps) { 221 int max_bitrate_bps) {
227 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); 222 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps);
228 // TODO(honghaiz): Recreate this object once the bitrate controller is 223 // TODO(honghaiz): Recreate this object once the bitrate controller is
229 // no longer exposed outside CongestionController. 224 // no longer exposed outside CongestionController.
230 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, 225 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps,
231 max_bitrate_bps); 226 max_bitrate_bps);
232 min_bitrate_bps_ = min_bitrate_bps; 227 min_bitrate_bps_ = min_bitrate_bps;
233 max_bitrate_bps_ = max_bitrate_bps; 228 max_bitrate_bps_ = max_bitrate_bps;
234 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is 229 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is
235 // no longer exposed outside CongestionController. 230 // no longer exposed outside CongestionController.
236 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); 231 remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps);
237 232
238 transport_feedback_adapter_.ClearSendTimeHistory(); 233 transport_feedback_adapter_.ClearSendTimeHistory();
239 { 234 transport_feedback_adapter_.InitBwe();
240 rtc::CritScope cs(&bwe_lock_); 235 transport_feedback_adapter_.SetStartBitrate(bitrate_bps);
241 delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_)); 236 transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps);
242 delay_based_bwe_->SetStartBitrate(bitrate_bps);
243 delay_based_bwe_->SetMinBitrate(min_bitrate_bps);
244 }
245 237
246 probe_controller_->Reset(); 238 probe_controller_->Reset();
247 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); 239 probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps);
248 240
249 MaybeTriggerOnNetworkChanged(); 241 MaybeTriggerOnNetworkChanged();
250 } 242 }
251 243
252 BitrateController* CongestionController::GetBitrateController() const { 244 BitrateController* CongestionController::GetBitrateController() const {
253 return bitrate_controller_.get(); 245 return bitrate_controller_.get();
254 } 246 }
255 247
256 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( 248 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator(
257 bool send_side_bwe) { 249 bool send_side_bwe) {
258 if (send_side_bwe) { 250 if (send_side_bwe) {
259 return &remote_estimator_proxy_; 251 return &remote_estimator_proxy_;
260 } else { 252 } else {
261 return &remote_bitrate_estimator_; 253 return &remote_bitrate_estimator_;
262 } 254 }
263 } 255 }
264 256
257 TransportFeedbackObserver*
258 CongestionController::GetTransportFeedbackObserver() {
259 return &transport_feedback_adapter_;
260 }
261
265 RateLimiter* CongestionController::GetRetransmissionRateLimiter() { 262 RateLimiter* CongestionController::GetRetransmissionRateLimiter() {
266 return retransmission_rate_limiter_.get(); 263 return retransmission_rate_limiter_.get();
267 } 264 }
268 265
269 void CongestionController::EnablePeriodicAlrProbing(bool enable) { 266 void CongestionController::EnablePeriodicAlrProbing(bool enable) {
270 probe_controller_->EnablePeriodicAlrProbing(enable); 267 probe_controller_->EnablePeriodicAlrProbing(enable);
271 } 268 }
272 269
273 void CongestionController::SetAllocatedSendBitrateLimits( 270 void CongestionController::SetAllocatedSendBitrateLimits(
274 int min_send_bitrate_bps, 271 int min_send_bitrate_bps,
275 int max_padding_bitrate_bps) { 272 int max_padding_bitrate_bps) {
276 pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps); 273 pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
277 } 274 }
278 275
279 int64_t CongestionController::GetPacerQueuingDelayMs() const { 276 int64_t CongestionController::GetPacerQueuingDelayMs() const {
280 return IsNetworkDown() ? 0 : pacer_->QueueInMs(); 277 return IsNetworkDown() ? 0 : pacer_->QueueInMs();
281 } 278 }
282 279
283 void CongestionController::SignalNetworkState(NetworkState state) { 280 void CongestionController::SignalNetworkState(NetworkState state) {
284 LOG(LS_INFO) << "SignalNetworkState " 281 LOG(LS_INFO) << "SignalNetworkState "
285 << (state == kNetworkUp ? "Up" : "Down"); 282 << (state == kNetworkUp ? "Up" : "Down");
286 if (state == kNetworkUp) { 283 if (state == kNetworkUp) {
287 pacer_->Resume(); 284 pacer_->Resume();
288 } else { 285 } else {
289 pacer_->Pause(); 286 pacer_->Pause();
290 } 287 }
291 { 288 {
292 rtc::CritScope cs(&network_state_lock_); 289 rtc::CritScope cs(&critsect_);
293 network_state_ = state; 290 network_state_ = state;
294 } 291 }
295 probe_controller_->OnNetworkStateChanged(state); 292 probe_controller_->OnNetworkStateChanged(state);
296 MaybeTriggerOnNetworkChanged(); 293 MaybeTriggerOnNetworkChanged();
297 } 294 }
298 295
299 void CongestionController::SetTransportOverhead( 296 void CongestionController::SetTransportOverhead(
300 size_t transport_overhead_bytes_per_packet) { 297 size_t transport_overhead_bytes_per_packet) {
301 transport_feedback_adapter_.SetTransportOverhead( 298 transport_feedback_adapter_.SetTransportOverhead(
302 transport_overhead_bytes_per_packet); 299 transport_overhead_bytes_per_packet);
303 } 300 }
304 301
305 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { 302 void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) {
306 // We're not interested in packets without an id, which may be stun packets, 303 // We're not interested in packets without an id, which may be stun packets,
307 // etc, sent on the same transport. 304 // etc, sent on the same transport.
308 if (sent_packet.packet_id == -1) 305 if (sent_packet.packet_id == -1)
309 return; 306 return;
310 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, 307 transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id,
311 sent_packet.send_time_ms); 308 sent_packet.send_time_ms);
312 } 309 }
313 310
314 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { 311 void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
315 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); 312 remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms);
316 { 313 transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms);
317 rtc::CritScope cs(&bwe_lock_);
318 delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
319 }
320 } 314 }
321 315
322 int64_t CongestionController::TimeUntilNextProcess() { 316 int64_t CongestionController::TimeUntilNextProcess() {
323 return std::min(bitrate_controller_->TimeUntilNextProcess(), 317 return std::min(bitrate_controller_->TimeUntilNextProcess(),
324 remote_bitrate_estimator_.TimeUntilNextProcess()); 318 remote_bitrate_estimator_.TimeUntilNextProcess());
325 } 319 }
326 320
327 void CongestionController::Process() { 321 void CongestionController::Process() {
328 bitrate_controller_->Process(); 322 bitrate_controller_->Process();
329 remote_bitrate_estimator_.Process(); 323 remote_bitrate_estimator_.Process();
330 probe_controller_->Process(); 324 probe_controller_->Process();
331 MaybeTriggerOnNetworkChanged(); 325 MaybeTriggerOnNetworkChanged();
332 } 326 }
333 327
334 void CongestionController::AddPacket(uint16_t sequence_number,
335 size_t length,
336 const PacedPacketInfo& pacing_info) {
337 transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info);
338 }
339
340 void CongestionController::OnTransportFeedback(
341 const rtcp::TransportFeedback& feedback) {
342 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
343 transport_feedback_adapter_.OnTransportFeedback(feedback);
344 DelayBasedBwe::Result result;
345 {
346 rtc::CritScope cs(&bwe_lock_);
347 result = delay_based_bwe_->IncomingPacketFeedbackVector(
348 transport_feedback_adapter_.GetTransportFeedbackVector());
349 }
350 if (result.updated)
351 bitrate_controller_->OnDelayBasedBweResult(result);
352 }
353
354 std::vector<PacketFeedback> CongestionController::GetTransportFeedbackVector()
355 const {
356 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
357 return transport_feedback_adapter_.GetTransportFeedbackVector();
358 }
359
360 void CongestionController::MaybeTriggerOnNetworkChanged() { 328 void CongestionController::MaybeTriggerOnNetworkChanged() {
361 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a 329 // TODO(perkj): |observer_| can be nullptr if the ctor that accepts a
362 // BitrateObserver is used. Remove this check once the ctor is removed. 330 // BitrateObserver is used. Remove this check once the ctor is removed.
363 if (!observer_) 331 if (!observer_)
364 return; 332 return;
365 333
366 uint32_t bitrate_bps; 334 uint32_t bitrate_bps;
367 uint8_t fraction_loss; 335 uint8_t fraction_loss;
368 int64_t rtt; 336 int64_t rtt;
369 bool estimate_changed = bitrate_controller_->GetNetworkParameters( 337 bool estimate_changed = bitrate_controller_->GetNetworkParameters(
370 &bitrate_bps, &fraction_loss, &rtt); 338 &bitrate_bps, &fraction_loss, &rtt);
371 if (estimate_changed) { 339 if (estimate_changed) {
372 pacer_->SetEstimatedBitrate(bitrate_bps); 340 pacer_->SetEstimatedBitrate(bitrate_bps);
373 probe_controller_->SetEstimatedBitrate(bitrate_bps); 341 probe_controller_->SetEstimatedBitrate(bitrate_bps);
374 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); 342 retransmission_rate_limiter_->SetMaxRate(bitrate_bps);
375 } 343 }
376 344
377 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; 345 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps;
378 346
379 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { 347 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) {
380 int64_t probing_interval_ms; 348 observer_->OnNetworkChanged(
381 { 349 bitrate_bps, fraction_loss, rtt,
382 rtc::CritScope cs(&bwe_lock_); 350 transport_feedback_adapter_.GetProbingIntervalMs());
383 probing_interval_ms = delay_based_bwe_->GetProbingIntervalMs();
384 }
385 observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt,
386 probing_interval_ms);
387 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); 351 remote_estimator_proxy_.OnBitrateChanged(bitrate_bps);
388 } 352 }
389 } 353 }
390 354
391 bool CongestionController::HasNetworkParametersToReportChanged( 355 bool CongestionController::HasNetworkParametersToReportChanged(
392 uint32_t bitrate_bps, 356 uint32_t bitrate_bps,
393 uint8_t fraction_loss, 357 uint8_t fraction_loss,
394 int64_t rtt) { 358 int64_t rtt) {
395 rtc::CritScope cs(&network_state_lock_); 359 rtc::CritScope cs(&critsect_);
396 bool changed = 360 bool changed =
397 last_reported_bitrate_bps_ != bitrate_bps || 361 last_reported_bitrate_bps_ != bitrate_bps ||
398 (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss || 362 (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss ||
399 last_reported_rtt_ != rtt)); 363 last_reported_rtt_ != rtt));
400 if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) { 364 if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) {
401 LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps 365 LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps
402 << " bps."; 366 << " bps.";
403 } 367 }
404 last_reported_bitrate_bps_ = bitrate_bps; 368 last_reported_bitrate_bps_ = bitrate_bps;
405 last_reported_fraction_loss_ = fraction_loss; 369 last_reported_fraction_loss_ = fraction_loss;
406 last_reported_rtt_ = rtt; 370 last_reported_rtt_ = rtt;
407 return changed; 371 return changed;
408 } 372 }
409 373
410 bool CongestionController::IsSendQueueFull() const { 374 bool CongestionController::IsSendQueueFull() const {
411 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; 375 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs;
412 } 376 }
413 377
414 bool CongestionController::IsNetworkDown() const { 378 bool CongestionController::IsNetworkDown() const {
415 rtc::CritScope cs(&network_state_lock_); 379 rtc::CritScope cs(&critsect_);
416 return network_state_ == kNetworkDown; 380 return network_state_ == kNetworkDown;
417 } 381 }
418 382
419 } // namespace webrtc 383 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/congestion_controller/BUILD.gn ('k') | webrtc/modules/congestion_controller/congestion_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698