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

Unified Diff: webrtc/modules/pacing/paced_sender.cc

Issue 2999073002: Tweaked version of BBR for WebRTC. (Closed)
Patch Set: Rebase. Created 3 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/pacing/paced_sender.cc
diff --git a/webrtc/modules/pacing/paced_sender.cc b/webrtc/modules/pacing/paced_sender.cc
index acfcd1fbffc98dcf94eddb90966fe3b353dd7c84..4196308bc28103acad861c365e092450cf0defae 100644
--- a/webrtc/modules/pacing/paced_sender.cc
+++ b/webrtc/modules/pacing/paced_sender.cc
@@ -19,7 +19,6 @@
#include "webrtc/modules/include/module_common_types.h"
#include "webrtc/modules/pacing/alr_detector.h"
#include "webrtc/modules/pacing/bitrate_prober.h"
-#include "webrtc/modules/pacing/interval_budget.h"
#include "webrtc/modules/utility/include/process_thread.h"
#include "webrtc/rtc_base/checks.h"
#include "webrtc/rtc_base/logging.h"
@@ -37,7 +36,7 @@ const int64_t kMaxIntervalTimeMs = 30;
} // namespace
-// TODO(sprang): Move at least PacketQueue out to separate
+// TODO(sprang): Move at least PacketQueue and MediaBudget out to separate
// files, so that we can more easily test them.
namespace webrtc {
@@ -231,6 +230,45 @@ class PacketQueue {
bool paused_;
};
+class IntervalBudget {
+ public:
+ explicit IntervalBudget(int initial_target_rate_kbps)
+ : target_rate_kbps_(initial_target_rate_kbps), bytes_remaining_(0) {}
+
+ void set_target_rate_kbps(int target_rate_kbps) {
+ target_rate_kbps_ = target_rate_kbps;
+ bytes_remaining_ =
+ std::max(-kWindowMs * target_rate_kbps_ / 8, bytes_remaining_);
+ }
+
+ void IncreaseBudget(int64_t delta_time_ms) {
+ int64_t bytes = target_rate_kbps_ * delta_time_ms / 8;
+ if (bytes_remaining_ < 0) {
+ // We overused last interval, compensate this interval.
+ bytes_remaining_ = bytes_remaining_ + bytes;
+ } else {
+ // If we underused last interval we can't use it this interval.
+ bytes_remaining_ = bytes;
+ }
+ }
+
+ void UseBudget(size_t bytes) {
+ bytes_remaining_ = std::max(bytes_remaining_ - static_cast<int>(bytes),
+ -kWindowMs * target_rate_kbps_ / 8);
+ }
+
+ size_t bytes_remaining() const {
+ return static_cast<size_t>(std::max(0, bytes_remaining_));
+ }
+
+ int target_rate_kbps() const { return target_rate_kbps_; }
+
+ private:
+ static const int kWindowMs = 500;
+
+ int target_rate_kbps_;
+ int bytes_remaining_;
+};
} // namespace paced_sender
const int64_t PacedSender::kMaxQueueLengthMs = 2000;
@@ -243,8 +281,8 @@ PacedSender::PacedSender(const Clock* clock,
packet_sender_(packet_sender),
alr_detector_(new AlrDetector()),
paused_(false),
- media_budget_(new IntervalBudget(0)),
- padding_budget_(new IntervalBudget(0)),
+ media_budget_(new paced_sender::IntervalBudget(0)),
+ padding_budget_(new paced_sender::IntervalBudget(0)),
prober_(new BitrateProber(event_log)),
probing_send_failure_(false),
estimated_bitrate_bps_(0),
@@ -254,9 +292,7 @@ PacedSender::PacedSender(const Clock* clock,
time_last_update_us_(clock->TimeInMicroseconds()),
first_sent_packet_ms_(-1),
packets_(new paced_sender::PacketQueue(clock)),
- packet_counter_(0),
- pacing_factor_(kDefaultPaceMultiplier),
- queue_time_limit(kMaxQueueLengthMs) {
+ packet_counter_(0) {
UpdateBudgetWithElapsedTime(kMinPacketLimitMs);
}
@@ -310,7 +346,7 @@ void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) {
std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_));
pacing_bitrate_kbps_ =
std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) *
- pacing_factor_;
+ kDefaultPaceMultiplier;
alr_detector_->SetEstimatedBitrate(bitrate_bps);
}
@@ -320,7 +356,7 @@ void PacedSender::SetSendBitrateLimits(int min_send_bitrate_bps,
min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000;
pacing_bitrate_kbps_ =
std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) *
- pacing_factor_;
+ kDefaultPaceMultiplier;
max_padding_bitrate_kbps_ = padding_bitrate / 1000;
padding_budget_->set_target_rate_kbps(
std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_));
@@ -429,7 +465,7 @@ void PacedSender::Process() {
// time constraint shall be met. Determine bitrate needed for that.
packets_->UpdateQueueTime(clock_->TimeInMilliseconds());
int64_t avg_time_left_ms = std::max<int64_t>(
- 1, queue_time_limit - packets_->AverageQueueTimeMs());
+ 1, kMaxQueueLengthMs - packets_->AverageQueueTimeMs());
int min_bitrate_needed_kbps =
static_cast<int>(queue_size_bytes * 8 / avg_time_left_ms);
if (min_bitrate_needed_kbps > target_bitrate_kbps)
@@ -489,7 +525,7 @@ void PacedSender::Process() {
if (!probing_send_failure_)
prober_->ProbeSent(clock_->TimeInMilliseconds(), bytes_sent);
}
- alr_detector_->OnBytesSent(bytes_sent, elapsed_time_ms);
+ alr_detector_->OnBytesSent(bytes_sent, now_us / 1000);
}
void PacedSender::ProcessThreadAttached(ProcessThread* process_thread) {
@@ -516,10 +552,6 @@ bool PacedSender::SendPacket(const paced_sender::Packet& packet,
// are allocating bandwidth for audio.
if (packet.priority != kHighPriority) {
// Update media bytes sent.
- // TODO(eladalon): TimeToSendPacket() can also return |true| in some
- // situations where nothing actually ended up being sent to the network,
- // and we probably don't want to update the budget in such cases.
- // https://bugs.chromium.org/p/webrtc/issues/detail?id=8052
UpdateBudgetWithBytesSent(packet.bytes);
}
}
@@ -550,15 +582,4 @@ void PacedSender::UpdateBudgetWithBytesSent(size_t bytes_sent) {
media_budget_->UseBudget(bytes_sent);
padding_budget_->UseBudget(bytes_sent);
}
-
-void PacedSender::SetPacingFactor(float pacing_factor) {
- rtc::CritScope cs(&critsect_);
- pacing_factor_ = pacing_factor;
-}
-
-void PacedSender::SetQueueTimeLimit(int limit_ms) {
- rtc::CritScope cs(&critsect_);
- queue_time_limit = limit_ms;
-}
-
} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698