| Index: webrtc/modules/pacing/bitrate_prober.cc
|
| diff --git a/webrtc/modules/pacing/bitrate_prober.cc b/webrtc/modules/pacing/bitrate_prober.cc
|
| index 19eaff7a69ad3fbce234bd3714b8f1756d87353f..c5aa983266c4c923b7189675a68fadfbff5e508d 100644
|
| --- a/webrtc/modules/pacing/bitrate_prober.cc
|
| +++ b/webrtc/modules/pacing/bitrate_prober.cc
|
| @@ -14,6 +14,7 @@
|
| #include <algorithm>
|
| #include <limits>
|
| #include <sstream>
|
| +#include <utility>
|
|
|
| #include "webrtc/base/checks.h"
|
| #include "webrtc/base/logging.h"
|
| @@ -22,35 +23,40 @@
|
| namespace webrtc {
|
|
|
| namespace {
|
| +
|
| +// Inactivity threshold above which probing is restarted.
|
| +constexpr int kInactivityThresholdMs = 5000;
|
| +
|
| int ComputeDeltaFromBitrate(size_t packet_size, uint32_t bitrate_bps) {
|
| assert(bitrate_bps > 0);
|
| // Compute the time delta needed to send packet_size bytes at bitrate_bps
|
| // bps. Result is in milliseconds.
|
| - return static_cast<int>(1000ll * static_cast<int64_t>(packet_size) * 8ll /
|
| - bitrate_bps);
|
| + return static_cast<int>((1000ll * packet_size * 8) / bitrate_bps);
|
| }
|
| } // namespace
|
|
|
| BitrateProber::BitrateProber()
|
| - : probing_state_(kDisabled),
|
| - packet_size_last_send_(0),
|
| - time_last_send_ms_(-1),
|
| - next_cluster_id_(0) {}
|
| + : probing_state_(ProbingState::kDisabled),
|
| + packet_size_last_sent_(0),
|
| + time_last_probe_sent_ms_(-1),
|
| + next_cluster_id_(0) {
|
| + SetEnabled(true);
|
| +}
|
|
|
| void BitrateProber::SetEnabled(bool enable) {
|
| if (enable) {
|
| - if (probing_state_ == kDisabled) {
|
| - probing_state_ = kAllowedToProbe;
|
| - LOG(LS_INFO) << "Initial bandwidth probing enabled";
|
| + if (probing_state_ == ProbingState::kDisabled) {
|
| + probing_state_ = ProbingState::kInactive;
|
| + LOG(LS_INFO) << "Bandwidth probing enabled, set to inactive";
|
| }
|
| } else {
|
| - probing_state_ = kDisabled;
|
| - LOG(LS_INFO) << "Initial bandwidth probing disabled";
|
| + probing_state_ = ProbingState::kDisabled;
|
| + LOG(LS_INFO) << "Bandwidth probing disabled";
|
| }
|
| }
|
|
|
| bool BitrateProber::IsProbing() const {
|
| - return probing_state_ == kProbing;
|
| + return probing_state_ == ProbingState::kActive;
|
| }
|
|
|
| void BitrateProber::OnIncomingPacket(uint32_t bitrate_bps,
|
| @@ -60,7 +66,7 @@ void BitrateProber::OnIncomingPacket(uint32_t bitrate_bps,
|
| // probing.
|
| if (packet_size < PacedSender::kMinProbePacketSize)
|
| return;
|
| - if (probing_state_ != kAllowedToProbe)
|
| + if (probing_state_ != ProbingState::kInactive)
|
| return;
|
| // Max number of packets used for probing.
|
| const int kMaxNumProbes = 2;
|
| @@ -81,36 +87,41 @@ void BitrateProber::OnIncomingPacket(uint32_t bitrate_bps,
|
| clusters_.push(cluster);
|
| }
|
| LOG(LS_INFO) << bitrate_log.str().c_str();
|
| - // Set last send time to current time so TimeUntilNextProbe doesn't short
|
| - // circuit due to inactivity.
|
| - time_last_send_ms_ = now_ms;
|
| - probing_state_ = kProbing;
|
| + probing_state_ = ProbingState::kActive;
|
| }
|
|
|
| -int BitrateProber::TimeUntilNextProbe(int64_t now_ms) {
|
| - if (probing_state_ != kDisabled && clusters_.empty()) {
|
| - probing_state_ = kWait;
|
| - }
|
| +void BitrateProber::ResetState() {
|
| + time_last_probe_sent_ms_ = -1;
|
| + packet_size_last_sent_ = 0;
|
| + clusters_ = std::queue<ProbeCluster>();
|
| + // If its enabled, reset to inactive.
|
| + if (probing_state_ != ProbingState::kDisabled)
|
| + probing_state_ = ProbingState::kInactive;
|
| +}
|
|
|
| - if (clusters_.empty() || time_last_send_ms_ == -1) {
|
| - // No probe started, probe finished, or too long since last probe packet.
|
| +int BitrateProber::TimeUntilNextProbe(int64_t now_ms) {
|
| + // Probing is not active or probing is already complete.
|
| + if (probing_state_ != ProbingState::kActive || clusters_.empty())
|
| return -1;
|
| + // time_last_probe_sent_ms_ of -1 indicates no probes have yet been sent.
|
| + int64_t elapsed_time_ms;
|
| + if (time_last_probe_sent_ms_ == -1) {
|
| + elapsed_time_ms = 0;
|
| + } else {
|
| + elapsed_time_ms = now_ms - time_last_probe_sent_ms_;
|
| }
|
| - int64_t elapsed_time_ms = now_ms - time_last_send_ms_;
|
| - // If no packets have been sent for n milliseconds, temporarily deactivate to
|
| - // not keep spinning.
|
| - static const int kInactiveSendDeltaMs = 5000;
|
| - if (elapsed_time_ms > kInactiveSendDeltaMs) {
|
| - time_last_send_ms_ = -1;
|
| - probing_state_ = kAllowedToProbe;
|
| + // If no probes have been sent for a while, abort current probing and
|
| + // reset.
|
| + if (elapsed_time_ms > kInactivityThresholdMs) {
|
| + ResetState();
|
| return -1;
|
| }
|
| // We will send the first probe packet immediately if no packet has been
|
| // sent before.
|
| int time_until_probe_ms = 0;
|
| - if (packet_size_last_send_ != 0 && probing_state_ == kProbing) {
|
| + if (packet_size_last_sent_ != 0 && probing_state_ == ProbingState::kActive) {
|
| int next_delta_ms = ComputeDeltaFromBitrate(
|
| - packet_size_last_send_, clusters_.front().probe_bitrate_bps);
|
| + packet_size_last_sent_, clusters_.front().probe_bitrate_bps);
|
| time_until_probe_ms = next_delta_ms - elapsed_time_ms;
|
| // There is no point in trying to probe with less than 1 ms between packets
|
| // as it essentially means trying to probe at infinite bandwidth.
|
| @@ -120,11 +131,8 @@ int BitrateProber::TimeUntilNextProbe(int64_t now_ms) {
|
| const int kMaxProbeDelayMs = 3;
|
| if (next_delta_ms < kMinProbeDeltaMs ||
|
| time_until_probe_ms < -kMaxProbeDelayMs) {
|
| - // We currently disable probing after the first probe, as we only want
|
| - // to probe at the beginning of a connection. We should set this to
|
| - // kWait if we later want to probe periodically.
|
| - probing_state_ = kWait;
|
| - LOG(LS_INFO) << "Next delta too small, stop probing.";
|
| + probing_state_ = ProbingState::kSuspended;
|
| + LOG(LS_INFO) << "Delta too small or missed probing accurately, suspend";
|
| time_until_probe_ms = 0;
|
| }
|
| }
|
| @@ -133,29 +141,29 @@ int BitrateProber::TimeUntilNextProbe(int64_t now_ms) {
|
|
|
| int BitrateProber::CurrentClusterId() const {
|
| RTC_DCHECK(!clusters_.empty());
|
| - RTC_DCHECK_EQ(kProbing, probing_state_);
|
| + RTC_DCHECK(ProbingState::kActive == probing_state_);
|
| return clusters_.front().id;
|
| }
|
|
|
| size_t BitrateProber::RecommendedPacketSize() const {
|
| - return packet_size_last_send_;
|
| + return packet_size_last_sent_;
|
| }
|
|
|
| void BitrateProber::PacketSent(int64_t now_ms, size_t packet_size) {
|
| assert(packet_size > 0);
|
| if (packet_size < PacedSender::kMinProbePacketSize)
|
| return;
|
| - packet_size_last_send_ = packet_size;
|
| - time_last_send_ms_ = now_ms;
|
| - if (probing_state_ != kProbing)
|
| + packet_size_last_sent_ = packet_size;
|
| + if (probing_state_ != ProbingState::kActive)
|
| return;
|
| + time_last_probe_sent_ms_ = now_ms;
|
| if (!clusters_.empty()) {
|
| ProbeCluster* cluster = &clusters_.front();
|
| ++cluster->sent_probe_packets;
|
| if (cluster->sent_probe_packets == cluster->max_probe_packets)
|
| clusters_.pop();
|
| if (clusters_.empty())
|
| - probing_state_ = kWait;
|
| + probing_state_ = ProbingState::kSuspended;
|
| }
|
| }
|
| } // namespace webrtc
|
|
|