Add parallel stats interface with optional stats to APM.
This new parallel GetStatistics function uses Optionals to indicate if stats are valid or not, and no longer relies on default values. It also takes an argument to indicate if receive streams are present, and if not several stats will not be set.
Bug: b/67926135
Change-Id: I175de1c65c414bea6ec9ca8b0b16f07cb2308d9f
Reviewed-on: https://webrtc-review.googlesource.com/17942
Commit-Queue: Ivo Creusen <ivoc@webrtc.org>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20789}
diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h
index cdc1cb3..09fecab 100644
--- a/modules/audio_processing/include/audio_processing.h
+++ b/modules/audio_processing/include/audio_processing.h
@@ -20,6 +20,7 @@
#include <string.h>
#include <vector>
+#include "api/optional.h"
#include "modules/audio_processing/beamformer/array_util.h"
#include "modules/audio_processing/include/config.h"
#include "rtc_base/arraysize.h"
@@ -563,9 +564,45 @@
float residual_echo_likelihood_recent_max = -1.0f;
};
+ // This version of the stats uses Optionals, it will replace the regular
+ // AudioProcessingStatistics struct.
+ struct AudioProcessingStats {
+ AudioProcessingStats();
+ AudioProcessingStats(const AudioProcessingStats& other);
+ ~AudioProcessingStats();
+
+ // AEC Statistics.
+ // ERL = 10log_10(P_far / P_echo)
+ rtc::Optional<double> echo_return_loss;
+ // ERLE = 10log_10(P_echo / P_out)
+ rtc::Optional<double> echo_return_loss_enhancement;
+ // Fraction of time that the AEC linear filter is divergent, in a 1-second
+ // non-overlapped aggregation window.
+ rtc::Optional<double> divergent_filter_fraction;
+
+ // The delay metrics consists of the delay median and standard deviation. It
+ // also consists of the fraction of delay estimates that can make the echo
+ // cancellation perform poorly. The values are aggregated until the first
+ // call to |GetStatistics()| and afterwards aggregated and updated every
+ // second. Note that if there are several clients pulling metrics from
+ // |GetStatistics()| during a session the first call from any of them will
+ // change to one second aggregation window for all.
+ rtc::Optional<int32_t> delay_median_ms;
+ rtc::Optional<int32_t> delay_standard_deviation_ms;
+
+ // Residual echo detector likelihood.
+ rtc::Optional<double> residual_echo_likelihood;
+ // Maximum residual echo likelihood from the last time period.
+ rtc::Optional<double> residual_echo_likelihood_recent_max;
+ };
+
// TODO(ivoc): Make this pure virtual when all subclasses have been updated.
virtual AudioProcessingStatistics GetStatistics() const;
+ // This returns the stats as optionals and it will replace the regular
+ // GetStatistics.
+ virtual AudioProcessingStats GetStatistics(bool has_remote_tracks) const;
+
// These provide access to the component interfaces and should never return
// NULL. The pointers will be valid for the lifetime of the APM instance.
// The memory for these objects is entirely managed internally.