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

Side by Side Diff: webrtc/modules/pacing/paced_sender.cc

Issue 2340763004: Add AlrDetector (Closed)
Patch Set: Created 4 years, 3 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/pacing/paced_sender.h" 11 #include "webrtc/modules/pacing/paced_sender.h"
12 12
13 #include <algorithm> 13 #include <algorithm>
14 #include <map> 14 #include <map>
15 #include <queue> 15 #include <queue>
16 #include <set> 16 #include <set>
17 #include <vector> 17 #include <vector>
18 18
19 #include "webrtc/base/checks.h" 19 #include "webrtc/base/checks.h"
20 #include "webrtc/base/logging.h" 20 #include "webrtc/base/logging.h"
21 #include "webrtc/modules/include/module_common_types.h" 21 #include "webrtc/modules/include/module_common_types.h"
22 #include "webrtc/modules/pacing/bitrate_prober.h" 22 #include "webrtc/modules/pacing/bitrate_prober.h"
23 #include "webrtc/modules/pacing/alr_detector.h"
23 #include "webrtc/system_wrappers/include/clock.h" 24 #include "webrtc/system_wrappers/include/clock.h"
24 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 25 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
25 #include "webrtc/system_wrappers/include/field_trial.h" 26 #include "webrtc/system_wrappers/include/field_trial.h"
26 27
27 namespace { 28 namespace {
28 // Time limit in milliseconds between packet bursts. 29 // Time limit in milliseconds between packet bursts.
29 const int64_t kMinPacketLimitMs = 5; 30 const int64_t kMinPacketLimitMs = 5;
30 31
31 // Upper cap on process interval, in case process has not been called in a long 32 // Upper cap on process interval, in case process has not been called in a long
32 // time. 33 // time.
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 static const int kWindowMs = 500; 239 static const int kWindowMs = 500;
239 240
240 int target_rate_kbps_; 241 int target_rate_kbps_;
241 int bytes_remaining_; 242 int bytes_remaining_;
242 }; 243 };
243 } // namespace paced_sender 244 } // namespace paced_sender
244 245
245 const int64_t PacedSender::kMaxQueueLengthMs = 2000; 246 const int64_t PacedSender::kMaxQueueLengthMs = 2000;
246 const float PacedSender::kDefaultPaceMultiplier = 2.5f; 247 const float PacedSender::kDefaultPaceMultiplier = 2.5f;
247 248
248 PacedSender::PacedSender(Clock* clock, PacketSender* packet_sender) 249 PacedSender::PacedSender(Clock* clock,
250 PacketSender* packet_sender,
251 AlrDetector* alr_detector)
249 : clock_(clock), 252 : clock_(clock),
250 packet_sender_(packet_sender), 253 packet_sender_(packet_sender),
254 alr_detector_(alr_detector),
251 critsect_(CriticalSectionWrapper::CreateCriticalSection()), 255 critsect_(CriticalSectionWrapper::CreateCriticalSection()),
252 paused_(false), 256 paused_(false),
253 media_budget_(new paced_sender::IntervalBudget(0)), 257 media_budget_(new paced_sender::IntervalBudget(0)),
254 padding_budget_(new paced_sender::IntervalBudget(0)), 258 padding_budget_(new paced_sender::IntervalBudget(0)),
255 prober_(new BitrateProber()), 259 prober_(new BitrateProber()),
256 estimated_bitrate_bps_(0), 260 estimated_bitrate_bps_(0),
257 min_send_bitrate_kbps_(0u), 261 min_send_bitrate_kbps_(0u),
258 max_padding_bitrate_kbps_(0u), 262 max_padding_bitrate_kbps_(0u),
259 pacing_bitrate_kbps_(0), 263 pacing_bitrate_kbps_(0),
260 time_last_update_us_(clock->TimeInMicroseconds()), 264 time_last_update_us_(clock->TimeInMicroseconds()),
261 packets_(new paced_sender::PacketQueue(clock)), 265 packets_(new paced_sender::PacketQueue(clock)),
262 packet_counter_(0) { 266 packet_counter_(0) {
263 UpdateBytesPerInterval(kMinPacketLimitMs); 267 UpdateBudgetWithElapsedTime(kMinPacketLimitMs);
264 } 268 }
265 269
266 PacedSender::~PacedSender() {} 270 PacedSender::~PacedSender() {}
267 271
268 void PacedSender::CreateProbeCluster(int bitrate_bps, int num_packets) { 272 void PacedSender::CreateProbeCluster(int bitrate_bps, int num_packets) {
269 CriticalSectionScoped cs(critsect_.get()); 273 CriticalSectionScoped cs(critsect_.get());
270 prober_->CreateProbeCluster(bitrate_bps, num_packets); 274 prober_->CreateProbeCluster(bitrate_bps, num_packets);
271 } 275 }
272 276
273 void PacedSender::Pause() { 277 void PacedSender::Pause() {
(...skipping 17 matching lines...) Expand all
291 void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) { 295 void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) {
292 if (bitrate_bps == 0) 296 if (bitrate_bps == 0)
293 LOG(LS_ERROR) << "PacedSender is not designed to handle 0 bitrate."; 297 LOG(LS_ERROR) << "PacedSender is not designed to handle 0 bitrate.";
294 CriticalSectionScoped cs(critsect_.get()); 298 CriticalSectionScoped cs(critsect_.get());
295 estimated_bitrate_bps_ = bitrate_bps; 299 estimated_bitrate_bps_ = bitrate_bps;
296 padding_budget_->set_target_rate_kbps( 300 padding_budget_->set_target_rate_kbps(
297 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_)); 301 std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_));
298 pacing_bitrate_kbps_ = 302 pacing_bitrate_kbps_ =
299 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * 303 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) *
300 kDefaultPaceMultiplier; 304 kDefaultPaceMultiplier;
305 if (alr_detector_)
306 alr_detector_->SetEstimatedBitrate(bitrate_bps);
301 } 307 }
302 308
303 void PacedSender::SetSendBitrateLimits(int min_send_bitrate_bps, 309 void PacedSender::SetSendBitrateLimits(int min_send_bitrate_bps,
304 int padding_bitrate) { 310 int padding_bitrate) {
305 CriticalSectionScoped cs(critsect_.get()); 311 CriticalSectionScoped cs(critsect_.get());
306 min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000; 312 min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000;
307 pacing_bitrate_kbps_ = 313 pacing_bitrate_kbps_ =
308 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) * 314 std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) *
309 kDefaultPaceMultiplier; 315 kDefaultPaceMultiplier;
310 max_padding_bitrate_kbps_ = padding_bitrate / 1000; 316 max_padding_bitrate_kbps_ = padding_bitrate / 1000;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 1, kMaxQueueLengthMs - packets_->AverageQueueTimeMs()); 397 1, kMaxQueueLengthMs - packets_->AverageQueueTimeMs());
392 int min_bitrate_needed_kbps = 398 int min_bitrate_needed_kbps =
393 static_cast<int>(queue_size_bytes * 8 / avg_time_left_ms); 399 static_cast<int>(queue_size_bytes * 8 / avg_time_left_ms);
394 if (min_bitrate_needed_kbps > target_bitrate_kbps) 400 if (min_bitrate_needed_kbps > target_bitrate_kbps)
395 target_bitrate_kbps = min_bitrate_needed_kbps; 401 target_bitrate_kbps = min_bitrate_needed_kbps;
396 } 402 }
397 403
398 media_budget_->set_target_rate_kbps(target_bitrate_kbps); 404 media_budget_->set_target_rate_kbps(target_bitrate_kbps);
399 405
400 int64_t delta_time_ms = std::min(kMaxIntervalTimeMs, elapsed_time_ms); 406 int64_t delta_time_ms = std::min(kMaxIntervalTimeMs, elapsed_time_ms);
401 UpdateBytesPerInterval(delta_time_ms); 407 UpdateBudgetWithElapsedTime(delta_time_ms);
402 } 408 }
403 409
404 bool is_probing = prober_->IsProbing(); 410 bool is_probing = prober_->IsProbing();
405 int probe_cluster_id = is_probing ? prober_->CurrentClusterId() 411 int probe_cluster_id = is_probing ? prober_->CurrentClusterId()
406 : PacketInfo::kNotAProbe; 412 : PacketInfo::kNotAProbe;
407 while (!packets_->Empty()) { 413 while (!packets_->Empty()) {
408 // Since we need to release the lock in order to send, we first pop the 414 // Since we need to release the lock in order to send, we first pop the
409 // element from the priority queue but keep it in storage, so that we can 415 // element from the priority queue but keep it in storage, so that we can
410 // reinsert it if send fails. 416 // reinsert it if send fails.
411 const paced_sender::Packet& packet = packets_->BeginPop(); 417 const paced_sender::Packet& packet = packets_->BeginPop();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 packet.ssrc, packet.sequence_number, packet.capture_time_ms, 462 packet.ssrc, packet.sequence_number, packet.capture_time_ms,
457 packet.retransmission, probe_cluster_id); 463 packet.retransmission, probe_cluster_id);
458 critsect_->Enter(); 464 critsect_->Enter();
459 465
460 if (success) { 466 if (success) {
461 prober_->PacketSent(clock_->TimeInMilliseconds(), packet.bytes); 467 prober_->PacketSent(clock_->TimeInMilliseconds(), packet.bytes);
462 // TODO(holmer): High priority packets should only be accounted for if we 468 // TODO(holmer): High priority packets should only be accounted for if we
463 // are allocating bandwidth for audio. 469 // are allocating bandwidth for audio.
464 if (packet.priority != kHighPriority) { 470 if (packet.priority != kHighPriority) {
465 // Update media bytes sent. 471 // Update media bytes sent.
466 media_budget_->UseBudget(packet.bytes); 472 UpdateBudgetWithBytesSent(packet.bytes);
467 padding_budget_->UseBudget(packet.bytes);
468 } 473 }
469 } 474 }
470 475
471 return success; 476 return success;
472 } 477 }
473 478
474 void PacedSender::SendPadding(size_t padding_needed, int probe_cluster_id) { 479 void PacedSender::SendPadding(size_t padding_needed, int probe_cluster_id) {
475 critsect_->Leave(); 480 critsect_->Leave();
476 size_t bytes_sent = 481 size_t bytes_sent =
477 packet_sender_->TimeToSendPadding(padding_needed, probe_cluster_id); 482 packet_sender_->TimeToSendPadding(padding_needed, probe_cluster_id);
478 critsect_->Enter(); 483 critsect_->Enter();
479 484
480 if (bytes_sent > 0) { 485 if (bytes_sent > 0) {
481 prober_->PacketSent(clock_->TimeInMilliseconds(), bytes_sent); 486 prober_->PacketSent(clock_->TimeInMilliseconds(), bytes_sent);
482 media_budget_->UseBudget(bytes_sent); 487 UpdateBudgetWithBytesSent(bytes_sent);
483 padding_budget_->UseBudget(bytes_sent);
484 } 488 }
485 } 489 }
486 490
487 void PacedSender::UpdateBytesPerInterval(int64_t delta_time_ms) { 491 void PacedSender::UpdateBudgetWithElapsedTime(int64_t delta_time_ms) {
488 media_budget_->IncreaseBudget(delta_time_ms); 492 media_budget_->IncreaseBudget(delta_time_ms);
489 padding_budget_->IncreaseBudget(delta_time_ms); 493 padding_budget_->IncreaseBudget(delta_time_ms);
494 if (alr_detector_)
495 alr_detector_->ReportElapsedTime(delta_time_ms);
496 }
497
498 void PacedSender::UpdateBudgetWithBytesSent(size_t bytes_sent) {
499 media_budget_->UseBudget(bytes_sent);
500 padding_budget_->UseBudget(bytes_sent);
501 if (alr_detector_)
502 alr_detector_->ReportBytesSent(bytes_sent);
490 } 503 }
491 } // namespace webrtc 504 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698