| 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
|
|
|