Index: webrtc/modules/congestion_controller/probe_bitrate_estimator.cc |
diff --git a/webrtc/modules/congestion_controller/probe_bitrate_estimator.cc b/webrtc/modules/congestion_controller/probe_bitrate_estimator.cc |
index 137829662824176ec3c4949fa449ae5a4ece1fa7..e8bcfbd984a6bdbafb98972bc7b2a059e43d7862 100644 |
--- a/webrtc/modules/congestion_controller/probe_bitrate_estimator.cc |
+++ b/webrtc/modules/congestion_controller/probe_bitrate_estimator.cc |
@@ -42,17 +42,25 @@ int ProbeBitrateEstimator::HandleProbeAndEstimateBitrate( |
EraseOldClusters(packet_info.arrival_time_ms - kMaxClusterHistoryMs); |
+ int payload_size_bits = packet_info.payload_size * 8; |
AggregatedCluster* cluster = &clusters_[packet_info.probe_cluster_id]; |
- cluster->first_send_ms = |
- std::min(cluster->first_send_ms, packet_info.send_time_ms); |
- cluster->last_send_ms = |
- std::max(cluster->last_send_ms, packet_info.send_time_ms); |
- cluster->first_receive_ms = |
- std::min(cluster->first_receive_ms, packet_info.arrival_time_ms); |
- cluster->last_receive_ms = |
- std::max(cluster->last_receive_ms, packet_info.arrival_time_ms); |
- cluster->size += packet_info.payload_size * 8; |
- ++cluster->num_probes; |
+ |
+ if (packet_info.send_time_ms < cluster->first_send_ms) { |
+ cluster->first_send_ms = packet_info.send_time_ms; |
+ } |
+ if (packet_info.send_time_ms > cluster->last_send_ms) { |
+ cluster->last_send_ms = packet_info.send_time_ms; |
+ cluster->size_last_send = payload_size_bits; |
+ } |
+ if (packet_info.arrival_time_ms < cluster->first_receive_ms) { |
+ cluster->first_receive_ms = packet_info.arrival_time_ms; |
+ cluster->size_first_receive = payload_size_bits; |
+ } |
+ if (packet_info.arrival_time_ms > cluster->last_receive_ms) { |
+ cluster->last_receive_ms = packet_info.arrival_time_ms; |
+ } |
+ cluster->size_total += payload_size_bits; |
+ cluster->num_probes += 1; |
if (cluster->num_probes < kMinNumProbesValidCluster) |
return -1; |
@@ -61,14 +69,6 @@ int ProbeBitrateEstimator::HandleProbeAndEstimateBitrate( |
float receive_interval_ms = |
cluster->last_receive_ms - cluster->first_receive_ms; |
- // Since the send/receive interval does not include the send/receive time of |
- // the last/first packet we expand the interval by the average inverval |
- // between the probing packets. |
- float interval_correction = |
- static_cast<float>(cluster->num_probes) / (cluster->num_probes - 1); |
- send_interval_ms *= interval_correction; |
- receive_interval_ms *= interval_correction; |
- |
if (send_interval_ms <= 0 || send_interval_ms > kMaxProbeIntervalMs || |
receive_interval_ms <= 0 || receive_interval_ms > kMaxProbeIntervalMs) { |
LOG(LS_INFO) << "Probing unsuccessful, invalid send/receive interval" |
@@ -77,16 +77,27 @@ int ProbeBitrateEstimator::HandleProbeAndEstimateBitrate( |
<< " [receive interval: " << receive_interval_ms << " ms]"; |
return -1; |
} |
- float send_bps = static_cast<float>(cluster->size) / send_interval_ms * 1000; |
- float receive_bps = |
- static_cast<float>(cluster->size) / receive_interval_ms * 1000; |
+ // Since the |send_interval_ms| does not include the time it takes to actually |
+ // send the last packet the size of the last sent packet should not be |
+ // included when calculating the send bitrate. |
+ RTC_DCHECK_GT(cluster->size_total, cluster->size_last_send); |
+ float send_size = cluster->size_total - cluster->size_last_send; |
+ float send_bps = send_size / send_interval_ms * 1000; |
+ |
+ // Since the |receive_interval_ms| does not include the time it takes to |
+ // actually receive the first packet the size of the first received packet |
+ // should not be included when calculating the receive bitrate. |
+ RTC_DCHECK_GT(cluster->size_total, cluster->size_first_receive); |
+ float receive_size = cluster->size_total - cluster->size_first_receive; |
+ float receive_bps = receive_size / receive_interval_ms * 1000; |
+ |
float ratio = receive_bps / send_bps; |
if (ratio > kValidRatio) { |
LOG(LS_INFO) << "Probing unsuccessful, receive/send ratio too high" |
<< " [cluster id: " << packet_info.probe_cluster_id |
- << "] [send: " << cluster->size << " bytes / " |
- << send_interval_ms << " ms = " << send_bps / 1000 << " kb/s]" |
- << " [receive: " << cluster->size << " bytes / " |
+ << "] [send: " << send_size << " bytes / " << send_interval_ms |
+ << " ms = " << send_bps / 1000 << " kb/s]" |
+ << " [receive: " << receive_size << " bytes / " |
<< receive_interval_ms << " ms = " << receive_bps / 1000 |
<< " kb/s]" |
<< " [ratio: " << receive_bps / 1000 << " / " |
@@ -96,9 +107,9 @@ int ProbeBitrateEstimator::HandleProbeAndEstimateBitrate( |
} |
LOG(LS_INFO) << "Probing successful" |
<< " [cluster id: " << packet_info.probe_cluster_id |
- << "] [send: " << cluster->size << " bytes / " |
- << send_interval_ms << " ms = " << send_bps / 1000 << " kb/s]" |
- << " [receive: " << cluster->size << " bytes / " |
+ << "] [send: " << send_size << " bytes / " << send_interval_ms |
+ << " ms = " << send_bps / 1000 << " kb/s]" |
+ << " [receive: " << receive_size << " bytes / " |
<< receive_interval_ms << " ms = " << receive_bps / 1000 |
<< " kb/s]"; |
return std::min(send_bps, receive_bps); |