| Index: webrtc/modules/audio_coding/neteq/statistics_calculator.cc | 
| diff --git a/webrtc/modules/audio_coding/neteq/statistics_calculator.cc b/webrtc/modules/audio_coding/neteq/statistics_calculator.cc | 
| index b4d6a6c1dec8b7c3bb3ec907e97b102376211614..336e775a79eec21edd221da335e0d5e00b125639 100644 | 
| --- a/webrtc/modules/audio_coding/neteq/statistics_calculator.cc | 
| +++ b/webrtc/modules/audio_coding/neteq/statistics_calculator.cc | 
| @@ -20,27 +20,57 @@ | 
|  | 
| namespace webrtc { | 
|  | 
| -void StatisticsCalculator::DelayedPacketOutagesPerMinuteCounter:: | 
| -    RegisterEvent() { | 
| -  ++counter_; | 
| +StatisticsCalculator::PeriodicUmaLogger::PeriodicUmaLogger( | 
| +    const std::string& uma_name, | 
| +    int report_interval_ms, | 
| +    int max_value) | 
| +    : uma_name_(uma_name), | 
| +      report_interval_ms_(report_interval_ms), | 
| +      max_value_(max_value), | 
| +      timer_(0) { | 
| } | 
|  | 
| -void StatisticsCalculator::DelayedPacketOutagesPerMinuteCounter::AdvanceClock( | 
| -    int step_ms) { | 
| +StatisticsCalculator::PeriodicUmaLogger::~PeriodicUmaLogger() = default; | 
| + | 
| +void StatisticsCalculator::PeriodicUmaLogger::AdvanceClock(int step_ms) { | 
| timer_ += step_ms; | 
| -  if (timer_ < kReportIntervalMs) { | 
| +  if (timer_ < report_interval_ms_) { | 
| return; | 
| } | 
| -  LogToUma(); | 
| -  counter_ = 0; | 
| -  timer_ -= kReportIntervalMs; | 
| +  LogToUma(Metric()); | 
| +  Reset(); | 
| +  timer_ -= report_interval_ms_; | 
| DCHECK_GE(timer_, 0); | 
| } | 
|  | 
| -void StatisticsCalculator::DelayedPacketOutagesPerMinuteCounter::LogToUma() | 
| -    const { | 
| -  RTC_HISTOGRAM_COUNTS_100("WebRTC.Audio.DelayedPacketOutageEventsPerMinute", | 
| -                           counter_); | 
| +void StatisticsCalculator::PeriodicUmaLogger::LogToUma(int value) const { | 
| +  RTC_HISTOGRAM_COUNTS(uma_name_, value, 1, max_value_, 50); | 
| +} | 
| + | 
| +StatisticsCalculator::DelayedPacketOutagesPerMinuteCounter:: | 
| +    DelayedPacketOutagesPerMinuteCounter() | 
| +    : PeriodicUmaLogger("WebRTC.Audio.DelayedPacketOutageEventsPerMinute", | 
| +                        60000,  // 60 seconds report interval. | 
| +                        100) { | 
| +} | 
| + | 
| +void StatisticsCalculator::DelayedPacketOutagesPerMinuteCounter:: | 
| +    RegisterEvent() { | 
| +  ++counter_; | 
| +} | 
| + | 
| +int StatisticsCalculator::DelayedPacketOutagesPerMinuteCounter::Metric() const { | 
| +  return counter_; | 
| +} | 
| + | 
| +void StatisticsCalculator::DelayedPacketOutagesPerMinuteCounter::Reset() { | 
| +  counter_ = 0; | 
| +} | 
| + | 
| +StatisticsCalculator::AverageExcessBufferDelayMs::AverageExcessBufferDelayMs() | 
| +    : PeriodicUmaLogger("WebRTC.Audio.AverageExcessBufferDelayMs", | 
| +                        60000,  // 60 seconds report interval. | 
| +                        1000) { | 
| } | 
|  | 
| void StatisticsCalculator::AverageExcessBufferDelayMs:: | 
| @@ -49,24 +79,13 @@ void StatisticsCalculator::AverageExcessBufferDelayMs:: | 
| ++num_packets_; | 
| } | 
|  | 
| -void StatisticsCalculator::AverageExcessBufferDelayMs::AdvanceClock( | 
| -    int step_ms) { | 
| -  timer_ += step_ms; | 
| -  if (timer_ < kReportIntervalMs) { | 
| -    return; | 
| -  } | 
| -  LogToUma(); | 
| -  sum_ = 0.0; | 
| -  num_packets_ = 0; | 
| -  timer_ -= kReportIntervalMs; | 
| -  DCHECK_GE(timer_, 0); | 
| +int StatisticsCalculator::AverageExcessBufferDelayMs::Metric() const { | 
| +  return static_cast<int>(sum_ / num_packets_); | 
| } | 
|  | 
| -void StatisticsCalculator::AverageExcessBufferDelayMs::LogToUma() { | 
| -  if (num_packets_ > 0) { | 
| -    RTC_HISTOGRAM_COUNTS_1000("WebRTC.Audio.AverageExcessBufferDelayMs", | 
| -                              static_cast<int>(sum_ / num_packets_)); | 
| -  } | 
| +void StatisticsCalculator::AverageExcessBufferDelayMs::Reset() { | 
| +  sum_ = 0.0; | 
| +  num_packets_ = 0; | 
| } | 
|  | 
| StatisticsCalculator::StatisticsCalculator() | 
|  |