| Index: webrtc/modules/audio_processing/level_controller/peak_level_estimator.cc
|
| diff --git a/webrtc/modules/audio_processing/level_controller/peak_level_estimator.cc b/webrtc/modules/audio_processing/level_controller/peak_level_estimator.cc
|
| index 9175717ab7c77271732b8398c60bef13694f1825..2ba806c8ee0d15b58c366421aaa1e2b5c20d635b 100644
|
| --- a/webrtc/modules/audio_processing/level_controller/peak_level_estimator.cc
|
| +++ b/webrtc/modules/audio_processing/level_controller/peak_level_estimator.cc
|
| @@ -13,6 +13,7 @@
|
| #include <algorithm>
|
|
|
| #include "webrtc/modules/audio_processing/audio_buffer.h"
|
| +#include "webrtc/modules/audio_processing/level_controller/lc_constants.h"
|
| #include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
|
|
|
| namespace webrtc {
|
| @@ -24,29 +25,35 @@ PeakLevelEstimator::PeakLevelEstimator() {
|
| PeakLevelEstimator::~PeakLevelEstimator() {}
|
|
|
| void PeakLevelEstimator::Initialize() {
|
| - peak_level_ = 1000.f;
|
| + peak_level_ = kTargetLcPeakLevel;
|
| hold_counter_ = 0;
|
| + initialization_phase_ = true;
|
| }
|
|
|
| float PeakLevelEstimator::Analyze(SignalClassifier::SignalType signal_type,
|
| float frame_peak_level) {
|
| - if (frame_peak_level > 0) {
|
| - if (peak_level_ < frame_peak_level) {
|
| - // Smoothly update the estimate upwards when the frame peak level is
|
| - // higher than the estimate.
|
| - peak_level_ += 0.1f * (frame_peak_level - peak_level_);
|
| - hold_counter_ = 100;
|
| - } else {
|
| - hold_counter_ = std::max(0, hold_counter_ - 1);
|
| -
|
| - // When the signal is highly non-stationary, update the estimate slowly
|
| - // downwards if the estimate is lower than the frame peak level.
|
| - if (signal_type == SignalClassifier::SignalType::kHighlyNonStationary &&
|
| - hold_counter_ == 0) {
|
| - peak_level_ =
|
| - std::max(peak_level_ + 0.01f * (frame_peak_level - peak_level_),
|
| - peak_level_ * 0.995f);
|
| - }
|
| + if (frame_peak_level == 0) {
|
| + RTC_DCHECK_LE(30.f, peak_level_);
|
| + return peak_level_;
|
| + }
|
| +
|
| + if (peak_level_ < frame_peak_level) {
|
| + // Smoothly update the estimate upwards when the frame peak level is
|
| + // higher than the estimate.
|
| + peak_level_ += 0.1f * (frame_peak_level - peak_level_);
|
| + hold_counter_ = 100;
|
| + initialization_phase_ = false;
|
| + } else {
|
| + hold_counter_ = std::max(0, hold_counter_ - 1);
|
| +
|
| + // When the signal is highly non-stationary, update the estimate slowly
|
| + // downwards if the estimate is lower than the frame peak level.
|
| + if ((signal_type == SignalClassifier::SignalType::kHighlyNonStationary &&
|
| + hold_counter_ == 0) ||
|
| + initialization_phase_) {
|
| + peak_level_ =
|
| + std::max(peak_level_ + 0.01f * (frame_peak_level - peak_level_),
|
| + peak_level_ * 0.995f);
|
| }
|
| }
|
|
|
|
|