| Index: webrtc/modules/audio_coding/neteq/delay_peak_detector.cc
|
| diff --git a/webrtc/modules/audio_coding/neteq/delay_peak_detector.cc b/webrtc/modules/audio_coding/neteq/delay_peak_detector.cc
|
| index 712c7788aca50fe6862f503581279fc510bb9d95..d9a8a44588dbca235910bd266a6465b96bbb427e 100644
|
| --- a/webrtc/modules/audio_coding/neteq/delay_peak_detector.cc
|
| +++ b/webrtc/modules/audio_coding/neteq/delay_peak_detector.cc
|
| @@ -12,6 +12,9 @@
|
|
|
| #include <algorithm> // max
|
|
|
| +#include "webrtc/base/checks.h"
|
| +#include "webrtc/base/safe_conversions.h"
|
| +
|
| namespace webrtc {
|
|
|
| // The DelayPeakDetector keeps track of severe inter-arrival times, called
|
| @@ -23,14 +26,15 @@ namespace webrtc {
|
|
|
| DelayPeakDetector::~DelayPeakDetector() = default;
|
|
|
| -DelayPeakDetector::DelayPeakDetector()
|
| - : peak_found_(false),
|
| - peak_detection_threshold_(0),
|
| - peak_period_counter_ms_(-1) {
|
| +DelayPeakDetector::DelayPeakDetector(const TickTimer& tick_timer)
|
| + : peak_found_(false),
|
| + peak_detection_threshold_(0),
|
| + tick_timer_(tick_timer) {
|
| + RTC_DCHECK(!peak_period_stopwatch_);
|
| }
|
|
|
| void DelayPeakDetector::Reset() {
|
| - peak_period_counter_ms_ = -1; // Indicate that next peak is the first.
|
| + peak_period_stopwatch_.reset();
|
| peak_found_ = false;
|
| peak_history_.clear();
|
| }
|
| @@ -55,8 +59,8 @@ int DelayPeakDetector::MaxPeakHeight() const {
|
| return max_height;
|
| }
|
|
|
| -int DelayPeakDetector::MaxPeakPeriod() const {
|
| - int max_period = -1; // Returns -1 for an empty history.
|
| +uint64_t DelayPeakDetector::MaxPeakPeriod() const {
|
| + uint64_t max_period = 0; // Returns 0 for an empty history.
|
| std::list<Peak>::const_iterator it;
|
| for (it = peak_history_.begin(); it != peak_history_.end(); ++it) {
|
| max_period = std::max(max_period, it->period_ms);
|
| @@ -68,25 +72,25 @@ bool DelayPeakDetector::Update(int inter_arrival_time, int target_level) {
|
| if (inter_arrival_time > target_level + peak_detection_threshold_ ||
|
| inter_arrival_time > 2 * target_level) {
|
| // A delay peak is observed.
|
| - if (peak_period_counter_ms_ == -1) {
|
| + if (!peak_period_stopwatch_) {
|
| // This is the first peak. Reset the period counter.
|
| - peak_period_counter_ms_ = 0;
|
| - } else if (peak_period_counter_ms_ <= kMaxPeakPeriodMs) {
|
| + peak_period_stopwatch_ = tick_timer_.GetNewStopwatch();
|
| + } else if (peak_period_stopwatch_->ElapsedMs() <= kMaxPeakPeriodMs) {
|
| // This is not the first peak, and the period is valid.
|
| // Store peak data in the vector.
|
| Peak peak_data;
|
| - peak_data.period_ms = peak_period_counter_ms_;
|
| + peak_data.period_ms = peak_period_stopwatch_->ElapsedMs();
|
| peak_data.peak_height_packets = inter_arrival_time;
|
| peak_history_.push_back(peak_data);
|
| while (peak_history_.size() > kMaxNumPeaks) {
|
| // Delete the oldest data point.
|
| peak_history_.pop_front();
|
| }
|
| - peak_period_counter_ms_ = 0;
|
| - } else if (peak_period_counter_ms_ <= 2 * kMaxPeakPeriodMs) {
|
| + peak_period_stopwatch_ = tick_timer_.GetNewStopwatch();
|
| + } else if (peak_period_stopwatch_->ElapsedMs() <= 2 * kMaxPeakPeriodMs) {
|
| // Invalid peak due to too long period. Reset period counter and start
|
| // looking for next peak.
|
| - peak_period_counter_ms_ = 0;
|
| + peak_period_stopwatch_ = tick_timer_.GetNewStopwatch();
|
| } else {
|
| // More than 2 times the maximum period has elapsed since the last peak
|
| // was registered. It seams that the network conditions have changed.
|
| @@ -97,16 +101,10 @@ bool DelayPeakDetector::Update(int inter_arrival_time, int target_level) {
|
| return CheckPeakConditions();
|
| }
|
|
|
| -void DelayPeakDetector::IncrementCounter(int inc_ms) {
|
| - if (peak_period_counter_ms_ >= 0) {
|
| - peak_period_counter_ms_ += inc_ms;
|
| - }
|
| -}
|
| -
|
| bool DelayPeakDetector::CheckPeakConditions() {
|
| size_t s = peak_history_.size();
|
| if (s >= kMinPeaksToTrigger &&
|
| - peak_period_counter_ms_ <= 2 * MaxPeakPeriod()) {
|
| + peak_period_stopwatch_->ElapsedMs() <= 2 * MaxPeakPeriod()) {
|
| peak_found_ = true;
|
| } else {
|
| peak_found_ = false;
|
|
|