Index: webrtc/modules/pacing/bitrate_prober.cc |
diff --git a/webrtc/modules/pacing/bitrate_prober.cc b/webrtc/modules/pacing/bitrate_prober.cc |
index 936be3929e99b973971de11c3f09769f9f17029b..d52892bf32bcf670e6e35afe3830d83c22df8e28 100644 |
--- a/webrtc/modules/pacing/bitrate_prober.cc |
+++ b/webrtc/modules/pacing/bitrate_prober.cc |
@@ -23,17 +23,20 @@ namespace { |
// Inactivity threshold above which probing is restarted. |
constexpr int kInactivityThresholdMs = 5000; |
-int ComputeDeltaFromBitrate(size_t packet_size, uint32_t bitrate_bps) { |
+// A minimum interval between probes to allow scheduling to be feasible. |
+constexpr int kMinProbeDeltaMs = 1; |
+ |
+int ComputeDeltaFromBitrate(size_t probe_size, uint32_t bitrate_bps) { |
RTC_CHECK_GT(bitrate_bps, 0u); |
- // Compute the time delta needed to send packet_size bytes at bitrate_bps |
+ // Compute the time delta needed to send probe_size bytes at bitrate_bps |
// bps. Result is in milliseconds. |
- return static_cast<int>((1000ll * packet_size * 8) / bitrate_bps); |
+ return static_cast<int>((1000ll * probe_size * 8) / bitrate_bps); |
} |
} // namespace |
BitrateProber::BitrateProber() |
: probing_state_(ProbingState::kDisabled), |
- packet_size_last_sent_(0), |
+ probe_size_last_sent_(0), |
time_last_probe_sent_ms_(-1), |
next_cluster_id_(0) { |
SetEnabled(true); |
@@ -65,15 +68,15 @@ void BitrateProber::OnIncomingPacket(size_t packet_size) { |
} |
} |
-void BitrateProber::CreateProbeCluster(int bitrate_bps, int num_packets) { |
+void BitrateProber::CreateProbeCluster(int bitrate_bps, int num_probes) { |
RTC_DCHECK(probing_state_ != ProbingState::kDisabled); |
ProbeCluster cluster; |
- cluster.max_probe_packets = num_packets; |
+ cluster.max_probes = num_probes; |
cluster.probe_bitrate_bps = bitrate_bps; |
cluster.id = next_cluster_id_++; |
clusters_.push(cluster); |
- LOG(LS_INFO) << "Probe cluster (bitrate:packets): (" |
- << cluster.probe_bitrate_bps << ":" << cluster.max_probe_packets |
+ LOG(LS_INFO) << "Probe cluster (bitrate:probes): (" |
+ << cluster.probe_bitrate_bps << ":" << cluster.max_probes |
<< ") "; |
if (probing_state_ != ProbingState::kActive) |
probing_state_ = ProbingState::kInactive; |
@@ -81,14 +84,14 @@ void BitrateProber::CreateProbeCluster(int bitrate_bps, int num_packets) { |
void BitrateProber::ResetState() { |
time_last_probe_sent_ms_ = -1; |
- packet_size_last_sent_ = 0; |
+ probe_size_last_sent_ = 0; |
// Recreate all probing clusters. |
std::queue<ProbeCluster> clusters; |
clusters.swap(clusters_); |
while (!clusters.empty()) { |
CreateProbeCluster(clusters.front().probe_bitrate_bps, |
- clusters.front().max_probe_packets); |
+ clusters.front().max_probes); |
clusters.pop(); |
} |
// If its enabled, reset to inactive. |
@@ -116,13 +119,10 @@ int BitrateProber::TimeUntilNextProbe(int64_t now_ms) { |
// 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_sent_ != 0 && probing_state_ == ProbingState::kActive) { |
+ if (probe_size_last_sent_ != 0 && probing_state_ == ProbingState::kActive) { |
int next_delta_ms = ComputeDeltaFromBitrate( |
- packet_size_last_sent_, clusters_.front().probe_bitrate_bps); |
+ probe_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. |
- const int kMinProbeDeltaMs = 1; |
// If we have waited more than 3 ms for a new packet to probe with we will |
// consider this probing session over. |
const int kMaxProbeDelayMs = 3; |
@@ -142,22 +142,24 @@ int BitrateProber::CurrentClusterId() const { |
return clusters_.front().id; |
} |
-size_t BitrateProber::RecommendedPacketSize() const { |
- return packet_size_last_sent_; |
+// Probe size is recommended based on the probe bitrate required. We choose |
+// a minimum of twice |kMinProbeDeltaMs| interval to allow scheduling to be |
+// feasible. |
+size_t BitrateProber::RecommendedProbeSize() const { |
stefan-webrtc
2016/09/16 07:42:53
Isn't this the recommended minimum size? Larger si
Irfan
2016/09/19 06:05:11
Right, updated to reflect that.
|
+ RTC_DCHECK(!clusters_.empty()); |
+ return clusters_.front().probe_bitrate_bps * 2 * kMinProbeDeltaMs / |
+ (8 * 1000); |
} |
-void BitrateProber::PacketSent(int64_t now_ms, size_t packet_size) { |
- assert(packet_size > 0); |
- if (packet_size < PacedSender::kMinProbePacketSize) |
- return; |
- packet_size_last_sent_ = packet_size; |
- if (probing_state_ != ProbingState::kActive) |
- return; |
+void BitrateProber::ProbeSent(int64_t now_ms, size_t bytes) { |
+ RTC_DCHECK(probing_state_ == ProbingState::kActive); |
stefan-webrtc
2016/09/16 07:42:53
DCHECK_EQ
Irfan
2016/09/19 06:05:11
DCHECK_EQ does not work on scoped enums
stefan-webrtc
2016/09/19 07:24:56
Acknowledged.
|
+ assert(bytes > 0); |
stefan-webrtc
2016/09/16 07:42:53
RTC_DCHECK_GT
Irfan
2016/09/19 06:05:11
This assert is actually redundant given it is an u
stefan-webrtc
2016/09/19 07:24:55
Is 0 not still possible?
Irfan
2016/09/19 18:23:30
Ah yes, added
|
+ probe_size_last_sent_ = bytes; |
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) |
+ ++cluster->sent_probes; |
+ if (cluster->sent_probes == cluster->max_probes) |
clusters_.pop(); |
if (clusters_.empty()) |
probing_state_ = ProbingState::kSuspended; |