Index: webrtc/modules/audio_processing/rms_level.h |
diff --git a/webrtc/modules/audio_processing/rms_level.h b/webrtc/modules/audio_processing/rms_level.h |
index 12fa2125f08acdd3820971dddbcb370f3d25cdfa..8c3aa78eb71a251eed24b40391dbc79350be9918 100644 |
--- a/webrtc/modules/audio_processing/rms_level.h |
+++ b/webrtc/modules/audio_processing/rms_level.h |
@@ -11,8 +11,8 @@ |
#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_RMS_LEVEL_H_ |
#define WEBRTC_MODULES_AUDIO_PROCESSING_RMS_LEVEL_H_ |
-#include <cstddef> |
- |
+#include "webrtc/base/array_view.h" |
+#include "webrtc/base/optional.h" |
#include "webrtc/typedefs.h" |
namespace webrtc { |
@@ -23,34 +23,48 @@ namespace webrtc { |
// with the intent that it can provide the RTP audio level indication. |
// |
// The expected approach is to provide constant-sized chunks of audio to |
-// Process(). When enough chunks have been accumulated to form a packet, call |
-// RMS() to get the audio level indicator for the RTP header. |
-class RMSLevel { |
+// 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: |
- static const int kMinLevel = 127; |
+ struct Levels { |
+ int average; |
+ int peak; |
+ }; |
- RMSLevel(); |
- ~RMSLevel(); |
+ RmsLevel(); |
+ ~RmsLevel(); |
// Can be called to reset internal states, but is not required during normal |
// operation. |
void Reset(); |
- // Pass each chunk of audio to Process() to accumulate the level. |
- void Process(const int16_t* data, size_t length); |
+ // Pass each chunk of audio to Analyze() to accumulate the level. |
+ void Analyze(rtc::ArrayView<const int16_t> data); |
// If all samples with the given |length| have a magnitude of zero, this is |
// a shortcut to avoid some computation. |
- void ProcessMuted(size_t length); |
+ 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(); |
- // Computes the RMS level over all data passed to Process() since the last |
- // call to RMS(). The returned value is positive but should be interpreted as |
- // negative as per the RFC. It is constrained to [0, 127]. |
- int RMS(); |
+ // 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_; |
+ rtc::Optional<size_t> block_size_; |
}; |
} // namespace webrtc |