Index: webrtc/modules/audio_mixer/gain_change_calculator.cc |
diff --git a/webrtc/modules/audio_mixer/gain_change_calculator.cc b/webrtc/modules/audio_mixer/gain_change_calculator.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..13017d4220b5b7c41f8f500a198204e4cd0bc879 |
--- /dev/null |
+++ b/webrtc/modules/audio_mixer/gain_change_calculator.cc |
@@ -0,0 +1,55 @@ |
+/* |
+ * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#include "webrtc/modules/audio_mixer/gain_change_calculator.h" |
+ |
+#include <math.h> |
+#include <vector> |
+ |
+namespace webrtc { |
+ |
+namespace { |
+constexpr int16_t kReliabilityThreshold = 100; |
+} // namespace |
+ |
+float GainChangeCalculator::CalculateGainChange( |
+ rtc::ArrayView<const int16_t> in, |
+ rtc::ArrayView<const int16_t> out) { |
+ RTC_DCHECK_EQ(in.size(), out.size()); |
+ |
+ std::vector<float> gain(in.size()); |
+ CalculateGain(in, out, gain); |
+ return CalculateDifferences(gain); |
+} |
+ |
+void GainChangeCalculator::CalculateGain(rtc::ArrayView<const int16_t> in, |
+ rtc::ArrayView<const int16_t> out, |
+ rtc::ArrayView<float> gain) { |
+ RTC_DCHECK_EQ(in.size(), out.size()); |
+ RTC_DCHECK_EQ(in.size(), gain.size()); |
+ |
+ for (size_t i = 0; i < in.size(); ++i) { |
+ if (std::abs(in[i]) >= kReliabilityThreshold) { |
+ last_reliable_gain_ = out[i] / static_cast<float>(in[i]); |
+ } |
+ gain[i] = last_reliable_gain_; |
+ } |
+} |
+ |
+float GainChangeCalculator::CalculateDifferences( |
+ rtc::ArrayView<const float> values) { |
+ float res = 0; |
+ for (float f : values) { |
+ res += fabs(f - last_value_); |
+ last_value_ = f; |
+ } |
+ return res; |
+} |
+} // namespace webrtc |