diff --git a/webrtc/modules/audio_processing/audio_processing_impl.cc b/webrtc/modules/audio_processing/audio_processing_impl.cc index 061495d9a2..2379cd1be8 100644 --- a/webrtc/modules/audio_processing/audio_processing_impl.cc +++ b/webrtc/modules/audio_processing/audio_processing_impl.cc @@ -1095,6 +1095,18 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() { AudioBuffer* capture_buffer = capture_.capture_audio.get(); // For brevity. + rms_.Analyze(rtc::ArrayView( + capture_buffer->channels_const()[0], + capture_nonlocked_.capture_processing_format.num_frames())); + if (++rms_interval_counter_ >= 1000) { + rms_interval_counter_ = 0; + RmsLevel::Levels levels = rms_.AverageAndPeak(); + RTC_HISTOGRAM_COUNTS("WebRTC.Audio.ApmCaptureInputLevelAverage", + levels.average, 1, RmsLevel::kMinLevelDb, 100); + RTC_HISTOGRAM_COUNTS("WebRTC.Audio.ApmCaptureInputLevelPeak", levels.peak, + 1, RmsLevel::kMinLevelDb, 100); + } + if (constants_.use_experimental_agc && public_submodules_->gain_control->is_enabled()) { private_submodules_->agc_manager->AnalyzePreProcess( diff --git a/webrtc/modules/audio_processing/audio_processing_impl.h b/webrtc/modules/audio_processing/audio_processing_impl.h index d171715a96..4db2272c81 100644 --- a/webrtc/modules/audio_processing/audio_processing_impl.h +++ b/webrtc/modules/audio_processing/audio_processing_impl.h @@ -25,6 +25,7 @@ #include "webrtc/modules/audio_processing/audio_buffer.h" #include "webrtc/modules/audio_processing/include/audio_processing.h" #include "webrtc/modules/audio_processing/render_queue_item_verifier.h" +#include "webrtc/modules/audio_processing/rms_level.h" #include "webrtc/system_wrappers/include/file_wrapper.h" #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP @@ -406,6 +407,9 @@ class AudioProcessingImpl : public AudioProcessing { std::vector red_render_queue_buffer_ GUARDED_BY(crit_render_); std::vector red_capture_queue_buffer_ GUARDED_BY(crit_capture_); + RmsLevel rms_ GUARDED_BY(crit_capture_); + int rms_interval_counter_ GUARDED_BY(crit_capture_) = 0; + // Lock protection not needed. std::unique_ptr, RenderQueueItemVerifier>> aec_render_signal_queue_; diff --git a/webrtc/modules/audio_processing/rms_level.cc b/webrtc/modules/audio_processing/rms_level.cc index f77357a000..8a77b3f7d9 100644 --- a/webrtc/modules/audio_processing/rms_level.cc +++ b/webrtc/modules/audio_processing/rms_level.cc @@ -19,7 +19,6 @@ namespace webrtc { namespace { static constexpr float kMaxSquaredLevel = 32768 * 32768; -static constexpr int kMinLevelDb = 127; // kMinLevel is the level corresponding to kMinLevelDb, that is 10^(-127/10). static constexpr float kMinLevel = 1.995262314968883e-13f; @@ -31,7 +30,7 @@ static constexpr float kMinLevel = 1.995262314968883e-13f; int ComputeRms(float mean_square) { if (mean_square <= kMinLevel * kMaxSquaredLevel) { // Very faint; simply return the minimum value. - return kMinLevelDb; + return RmsLevel::kMinLevelDb; } // Normalize by the max level. const float mean_square_norm = mean_square / kMaxSquaredLevel; @@ -39,7 +38,7 @@ int ComputeRms(float mean_square) { // 20log_10(x^0.5) = 10log_10(x) const float rms = 10.f * log10(mean_square_norm); RTC_DCHECK_LE(rms, 0.f); - RTC_DCHECK_GT(rms, -kMinLevelDb); + RTC_DCHECK_GT(rms, -RmsLevel::kMinLevelDb); // Return the negated value. return static_cast(-rms + 0.5f); } @@ -81,7 +80,7 @@ void RmsLevel::AnalyzeMuted(size_t length) { } int RmsLevel::Average() { - int rms = (sample_count_ == 0) ? kMinLevelDb + int rms = (sample_count_ == 0) ? RmsLevel::kMinLevelDb : ComputeRms(sum_square_ / sample_count_); Reset(); return rms; @@ -92,7 +91,7 @@ RmsLevel::Levels RmsLevel::AverageAndPeak() { // sample_count_ != 0. Also, the * operator of rtc::Optional enforces this // with a DCHECK. Levels levels = (sample_count_ == 0) - ? Levels{kMinLevelDb, kMinLevelDb} + ? Levels{RmsLevel::kMinLevelDb, RmsLevel::kMinLevelDb} : Levels{ComputeRms(sum_square_ / sample_count_), ComputeRms(max_sum_square_ / *block_size_)}; Reset(); diff --git a/webrtc/modules/audio_processing/rms_level.h b/webrtc/modules/audio_processing/rms_level.h index 8c3aa78eb7..a186bcf608 100644 --- a/webrtc/modules/audio_processing/rms_level.h +++ b/webrtc/modules/audio_processing/rms_level.h @@ -32,6 +32,8 @@ class RmsLevel { int peak; }; + static constexpr int kMinLevelDb = 127; + RmsLevel(); ~RmsLevel();