| 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..ce9133bdaed3307805373b70262df9711083ae08 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,38 +59,40 @@ int DelayPeakDetector::MaxPeakHeight() const {
|
| return max_height;
|
| }
|
|
|
| -int DelayPeakDetector::MaxPeakPeriod() const {
|
| - int max_period = -1; // Returns -1 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);
|
| +uint64_t DelayPeakDetector::MaxPeakPeriod() const {
|
| + auto max_period_element = std::max_element(
|
| + peak_history_.begin(), peak_history_.end(),
|
| + [](Peak a, Peak b) { return a.period_ms < b.period_ms; });
|
| + if (max_period_element == peak_history_.end()) {
|
| + return 0; // |peak_history_| is empty.
|
| }
|
| - return max_period;
|
| + RTC_DCHECK_GT(max_period_element->period_ms, 0u);
|
| + return max_period_element->period_ms;
|
| }
|
|
|
| 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 +103,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;
|
|
|