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