Add UMA metrics for the initial (after two seconds) packet loss, round-trip time and bandwidth estimate of a WebRTC call.

BUG=crbug/425925
R=mflodman@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/31899004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7593 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
stefan@webrtc.org
2014-11-03 14:42:43 +00:00
parent 96dc685143
commit 548b228c91
2 changed files with 31 additions and 4 deletions

View File

@ -13,6 +13,7 @@
#include <cmath> #include <cmath>
#include "webrtc/system_wrappers/interface/logging.h" #include "webrtc/system_wrappers/interface/logging.h"
#include "webrtc/system_wrappers/interface/metrics.h"
namespace webrtc { namespace webrtc {
namespace { namespace {
@ -20,6 +21,7 @@ enum { kBweIncreaseIntervalMs = 1000 };
enum { kBweDecreaseIntervalMs = 300 }; enum { kBweDecreaseIntervalMs = 300 };
enum { kLimitNumPackets = 20 }; enum { kLimitNumPackets = 20 };
enum { kAvgPacketSizeBytes = 1000 }; enum { kAvgPacketSizeBytes = 1000 };
enum { kStartPhaseMs = 2000 };
// Calculate the rate that TCP-Friendly Rate Control (TFRC) would apply. // Calculate the rate that TCP-Friendly Rate Control (TFRC) would apply.
// The formula in RFC 3448, Section 3.1, is used. // The formula in RFC 3448, Section 3.1, is used.
@ -57,7 +59,9 @@ SendSideBandwidthEstimation::SendSideBandwidthEstimation()
last_round_trip_time_ms_(0), last_round_trip_time_ms_(0),
bwe_incoming_(0), bwe_incoming_(0),
time_last_decrease_ms_(0), time_last_decrease_ms_(0),
first_report_time_ms_(-1) { first_report_time_ms_(-1),
initially_lost_packets_(0),
uma_updated_(false) {
} }
SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {} SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {}
@ -97,8 +101,6 @@ void SendSideBandwidthEstimation::UpdateReceiverBlock(uint8_t fraction_loss,
uint32_t rtt, uint32_t rtt,
int number_of_packets, int number_of_packets,
uint32_t now_ms) { uint32_t now_ms) {
if (first_report_time_ms_ == -1)
first_report_time_ms_ = now_ms;
// Update RTT. // Update RTT.
last_round_trip_time_ms_ = rtt; last_round_trip_time_ms_ = rtt;
@ -125,12 +127,28 @@ void SendSideBandwidthEstimation::UpdateReceiverBlock(uint8_t fraction_loss,
} }
time_last_receiver_block_ms_ = now_ms; time_last_receiver_block_ms_ = now_ms;
UpdateEstimate(now_ms); UpdateEstimate(now_ms);
if (first_report_time_ms_ == -1) {
first_report_time_ms_ = now_ms;
} else if (IsInStartPhase(now_ms)) {
initially_lost_packets_ += (fraction_loss * number_of_packets) >> 8;
} else if (!uma_updated_) {
uma_updated_ = true;
RTC_HISTOGRAM_COUNTS(
"WebRTC.BWE.InitiallyLostPackets", initially_lost_packets_, 0, 100, 50);
RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialRtt", rtt, 0, 2000, 50);
RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialBandwidthEstimate",
(bitrate_ + 500) / 1000,
0,
2000,
50);
}
} }
void SendSideBandwidthEstimation::UpdateEstimate(uint32_t now_ms) { void SendSideBandwidthEstimation::UpdateEstimate(uint32_t now_ms) {
// We trust the REMB during the first 2 seconds if we haven't had any // We trust the REMB during the first 2 seconds if we haven't had any
// packet loss reported, to allow startup bitrate probing. // packet loss reported, to allow startup bitrate probing.
if (last_fraction_loss_ == 0 && now_ms - first_report_time_ms_ < 2000 && if (last_fraction_loss_ == 0 && IsInStartPhase(now_ms) &&
bwe_incoming_ > bitrate_) { bwe_incoming_ > bitrate_) {
bitrate_ = CapBitrateToThresholds(bwe_incoming_); bitrate_ = CapBitrateToThresholds(bwe_incoming_);
min_bitrate_history_.clear(); min_bitrate_history_.clear();
@ -187,6 +205,11 @@ void SendSideBandwidthEstimation::UpdateEstimate(uint32_t now_ms) {
bitrate_ = CapBitrateToThresholds(bitrate_); bitrate_ = CapBitrateToThresholds(bitrate_);
} }
bool SendSideBandwidthEstimation::IsInStartPhase(int64_t now_ms) const {
return first_report_time_ms_ == -1 ||
now_ms - first_report_time_ms_ < kStartPhaseMs;
}
void SendSideBandwidthEstimation::UpdateMinHistory(uint32_t now_ms) { void SendSideBandwidthEstimation::UpdateMinHistory(uint32_t now_ms) {
// Remove old data points from history. // Remove old data points from history.
// Since history precision is in ms, add one so it is able to increase // Since history precision is in ms, add one so it is able to increase

View File

@ -43,6 +43,8 @@ class SendSideBandwidthEstimation {
void SetMinBitrate(uint32_t min_bitrate); void SetMinBitrate(uint32_t min_bitrate);
private: private:
bool IsInStartPhase(int64_t now_ms) const;
// Returns the input bitrate capped to the thresholds defined by the max, // Returns the input bitrate capped to the thresholds defined by the max,
// min and incoming bandwidth. // min and incoming bandwidth.
uint32_t CapBitrateToThresholds(uint32_t bitrate); uint32_t CapBitrateToThresholds(uint32_t bitrate);
@ -69,6 +71,8 @@ class SendSideBandwidthEstimation {
uint32_t bwe_incoming_; uint32_t bwe_incoming_;
uint32_t time_last_decrease_ms_; uint32_t time_last_decrease_ms_;
int64_t first_report_time_ms_; int64_t first_report_time_ms_;
int initially_lost_packets_;
bool uma_updated_;
}; };
} // namespace webrtc } // namespace webrtc
#endif // WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_ #endif // WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_