1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /*
- * Copyright (c) 2014 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 MODULES_AUDIO_PROCESSING_RMS_LEVEL_H_
- #define MODULES_AUDIO_PROCESSING_RMS_LEVEL_H_
- #include <stddef.h>
- #include <stdint.h>
- #include "absl/types/optional.h"
- #include "api/array_view.h"
- namespace webrtc {
- // Computes the root mean square (RMS) level in dBFs (decibels from digital
- // full-scale) of audio data. The computation follows RFC 6465:
- // https://tools.ietf.org/html/rfc6465
- // with the intent that it can provide the RTP audio level indication.
- //
- // The expected approach is to provide constant-sized chunks of audio to
- // Analyze(). When enough chunks have been accumulated to form a packet, call
- // Average() to get the audio level indicator for the RTP header.
- class RmsLevel {
- public:
- struct Levels {
- int average;
- int peak;
- };
- enum : int { kMinLevelDb = 127 };
- RmsLevel();
- ~RmsLevel();
- // Can be called to reset internal states, but is not required during normal
- // operation.
- void Reset();
- // Pass each chunk of audio to Analyze() to accumulate the level.
- void Analyze(rtc::ArrayView<const int16_t> data);
- void Analyze(rtc::ArrayView<const float> data);
- // If all samples with the given |length| have a magnitude of zero, this is
- // a shortcut to avoid some computation.
- void AnalyzeMuted(size_t length);
- // Computes the RMS level over all data passed to Analyze() since the last
- // call to Average(). The returned value is positive but should be interpreted
- // as negative as per the RFC. It is constrained to [0, 127]. Resets the
- // internal state to start a new measurement period.
- int Average();
- // Like Average() above, but also returns the RMS peak value. Resets the
- // internal state to start a new measurement period.
- Levels AverageAndPeak();
- private:
- // Compares |block_size| with |block_size_|. If they are different, calls
- // Reset() and stores the new size.
- void CheckBlockSize(size_t block_size);
- float sum_square_;
- size_t sample_count_;
- float max_sum_square_;
- absl::optional<size_t> block_size_;
- };
- } // namespace webrtc
- #endif // MODULES_AUDIO_PROCESSING_RMS_LEVEL_H_
|