summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/webrtc/modules/audio_coding/neteq/background_noise.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/webrtc/modules/audio_coding/neteq/background_noise.h')
-rw-r--r--chromium/third_party/webrtc/modules/audio_coding/neteq/background_noise.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/chromium/third_party/webrtc/modules/audio_coding/neteq/background_noise.h b/chromium/third_party/webrtc/modules/audio_coding/neteq/background_noise.h
new file mode 100644
index 00000000000..8fb310ea8b6
--- /dev/null
+++ b/chromium/third_party/webrtc/modules/audio_coding/neteq/background_noise.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2012 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.
+ */
+
+#ifndef WEBRTC_MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_
+#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_
+
+#include <string.h> // size_t
+
+#include "webrtc/base/constructormagic.h"
+#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
+#include "webrtc/modules/audio_coding/neteq/interface/neteq.h"
+#include "webrtc/system_wrappers/interface/scoped_ptr.h"
+#include "webrtc/typedefs.h"
+
+namespace webrtc {
+
+// Forward declarations.
+class PostDecodeVad;
+
+// This class handles estimation of background noise parameters.
+class BackgroundNoise {
+ public:
+ // TODO(hlundin): For 48 kHz support, increase kMaxLpcOrder to 10.
+ // Will work anyway, but probably sound a little worse.
+ static const int kMaxLpcOrder = 8; // 32000 / 8000 + 4.
+
+ explicit BackgroundNoise(size_t num_channels);
+ virtual ~BackgroundNoise();
+
+ void Reset();
+
+ // Updates the parameter estimates based on the signal currently in the
+ // |sync_buffer|, and on the latest decision in |vad| if it is running.
+ void Update(const AudioMultiVector& sync_buffer,
+ const PostDecodeVad& vad);
+
+ // Returns |energy_| for |channel|.
+ int32_t Energy(size_t channel) const;
+
+ // Sets the value of |mute_factor_| for |channel| to |value|.
+ void SetMuteFactor(size_t channel, int16_t value);
+
+ // Returns |mute_factor_| for |channel|.
+ int16_t MuteFactor(size_t channel) const;
+
+ // Returns a pointer to |filter_| for |channel|.
+ const int16_t* Filter(size_t channel) const;
+
+ // Returns a pointer to |filter_state_| for |channel|.
+ const int16_t* FilterState(size_t channel) const;
+
+ // Copies |length| elements from |input| to the filter state. Will not copy
+ // more than |kMaxLpcOrder| elements.
+ void SetFilterState(size_t channel, const int16_t* input, size_t length);
+
+ // Returns |scale_| for |channel|.
+ int16_t Scale(size_t channel) const;
+
+ // Returns |scale_shift_| for |channel|.
+ int16_t ScaleShift(size_t channel) const;
+
+ // Accessors.
+ bool initialized() const { return initialized_; }
+ NetEqBackgroundNoiseMode mode() const { return mode_; }
+
+ // Sets the mode of the background noise playout for cases when there is long
+ // duration of packet loss.
+ void set_mode(NetEqBackgroundNoiseMode mode) { mode_ = mode; }
+
+ private:
+ static const int kThresholdIncrement = 229; // 0.0035 in Q16.
+ static const int kVecLen = 256;
+ static const int kLogVecLen = 8; // log2(kVecLen).
+ static const int kResidualLength = 64;
+ static const int kLogResidualLength = 6; // log2(kResidualLength)
+
+ struct ChannelParameters {
+ // Constructor.
+ ChannelParameters() {
+ Reset();
+ }
+
+ void Reset() {
+ energy = 2500;
+ max_energy = 0;
+ energy_update_threshold = 500000;
+ low_energy_update_threshold = 0;
+ memset(filter_state, 0, sizeof(filter_state));
+ memset(filter, 0, sizeof(filter));
+ filter[0] = 4096;
+ mute_factor = 0,
+ scale = 20000;
+ scale_shift = 24;
+ }
+
+ int32_t energy;
+ int32_t max_energy;
+ int32_t energy_update_threshold;
+ int32_t low_energy_update_threshold;
+ int16_t filter_state[kMaxLpcOrder];
+ int16_t filter[kMaxLpcOrder + 1];
+ int16_t mute_factor;
+ int16_t scale;
+ int16_t scale_shift;
+ };
+
+ int32_t CalculateAutoCorrelation(const int16_t* signal,
+ int length,
+ int32_t* auto_correlation) const;
+
+ // Increments the energy threshold by a factor 1 + |kThresholdIncrement|.
+ void IncrementEnergyThreshold(size_t channel, int32_t sample_energy);
+
+ // Updates the filter parameters.
+ void SaveParameters(size_t channel,
+ const int16_t* lpc_coefficients,
+ const int16_t* filter_state,
+ int32_t sample_energy,
+ int32_t residual_energy);
+
+ size_t num_channels_;
+ scoped_ptr<ChannelParameters[]> channel_parameters_;
+ bool initialized_;
+ NetEqBackgroundNoiseMode mode_;
+
+ DISALLOW_COPY_AND_ASSIGN(BackgroundNoise);
+};
+
+} // namespace webrtc
+#endif // WEBRTC_MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_