Remove deprecated AudioProcessing::GetStatistics function

Additionally, AudioProcessing::GetStatistics(bool) is made pure
virtual and the default implementation in AudioProcessing is removed.

Deprecation PSA:
https://groups.google.com/forum/#!msg/discuss-webrtc/NgqEPvkNuDE/7HtwnMmADgAJ

Bug: webrtc:9947, webrtc:8572
Change-Id: I123402bf7d6c49f3613154c469b818109d8fad43
Reviewed-on: https://webrtc-review.googlesource.com/c/108783
Commit-Queue: Sam Zackrisson <saza@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Ivo Creusen <ivoc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25463}
This commit is contained in:
Sam Zackrisson
2018-11-01 11:37:15 +01:00
committed by Commit Bot
parent 4e93329839
commit 281276301c
10 changed files with 23 additions and 218 deletions

View File

@ -17,34 +17,6 @@ namespace webrtc {
const char MediaStreamTrackInterface::kVideoKind[] = "video";
const char MediaStreamTrackInterface::kAudioKind[] = "audio";
void AudioProcessorInterface::GetStats(AudioProcessorStats* /*stats*/) {
RTC_NOTREACHED() << "Old-style GetStats() is called but it has no "
<< "implementation.";
RTC_LOG(LS_ERROR) << "Old-style GetStats() is called but it has no "
<< "implementation.";
}
// TODO(ivoc): Remove this when the function becomes pure virtual.
AudioProcessorInterface::AudioProcessorStatistics
AudioProcessorInterface::GetStats(bool /*has_remote_tracks*/) {
AudioProcessorStats stats;
GetStats(&stats);
AudioProcessorStatistics new_stats;
new_stats.apm_statistics.divergent_filter_fraction =
stats.aec_divergent_filter_fraction;
new_stats.apm_statistics.delay_median_ms = stats.echo_delay_median_ms;
new_stats.apm_statistics.delay_standard_deviation_ms =
stats.echo_delay_std_ms;
new_stats.apm_statistics.echo_return_loss = stats.echo_return_loss;
new_stats.apm_statistics.echo_return_loss_enhancement =
stats.echo_return_loss_enhancement;
new_stats.apm_statistics.residual_echo_likelihood =
stats.residual_echo_likelihood;
new_stats.apm_statistics.residual_echo_likelihood_recent_max =
stats.residual_echo_likelihood_recent_max;
return new_stats;
}
VideoTrackInterface::ContentHint VideoTrackInterface::content_hint() const {
return ContentHint::kNone;
}

View File

@ -213,47 +213,17 @@ class AudioSourceInterface : public MediaSourceInterface {
// statistics.
class AudioProcessorInterface : public rtc::RefCountInterface {
public:
// Deprecated, use AudioProcessorStatistics instead.
// TODO(ivoc): Remove this when all implementations have switched to the new
// GetStats function. See b/67926135.
struct AudioProcessorStats {
AudioProcessorStats()
: typing_noise_detected(false),
echo_return_loss(0),
echo_return_loss_enhancement(0),
echo_delay_median_ms(0),
echo_delay_std_ms(0),
residual_echo_likelihood(0.0f),
residual_echo_likelihood_recent_max(0.0f),
aec_divergent_filter_fraction(0.0) {}
~AudioProcessorStats() {}
bool typing_noise_detected;
int echo_return_loss;
int echo_return_loss_enhancement;
int echo_delay_median_ms;
int echo_delay_std_ms;
float residual_echo_likelihood;
float residual_echo_likelihood_recent_max;
float aec_divergent_filter_fraction;
};
// This struct maintains the optionality of the stats, and will replace the
// regular stats struct when all users have been updated.
struct AudioProcessorStatistics {
bool typing_noise_detected = false;
AudioProcessingStats apm_statistics;
};
// Get audio processor statistics.
virtual void GetStats(AudioProcessorStats* stats);
// Get audio processor statistics. The |has_remote_tracks| argument should be
// set if there are active remote tracks (this would usually be true during
// a call). If there are no remote tracks some of the stats will not be set by
// the AudioProcessor, because they only make sense if there is at least one
// remote track.
// TODO(ivoc): Make pure virtual when all implementions are updated.
virtual AudioProcessorStatistics GetStats(bool has_remote_tracks);
virtual AudioProcessorStatistics GetStats(bool has_remote_tracks) = 0;
protected:
~AudioProcessorInterface() override = default;

View File

@ -1589,63 +1589,6 @@ void AudioProcessingImpl::DetachPlayoutAudioGenerator() {
// Delete audio generator, if one is attached.
}
AudioProcessing::AudioProcessingStatistics::AudioProcessingStatistics() {
residual_echo_return_loss.Set(-100.0f, -100.0f, -100.0f, -100.0f);
echo_return_loss.Set(-100.0f, -100.0f, -100.0f, -100.0f);
echo_return_loss_enhancement.Set(-100.0f, -100.0f, -100.0f, -100.0f);
a_nlp.Set(-100.0f, -100.0f, -100.0f, -100.0f);
}
AudioProcessing::AudioProcessingStatistics::AudioProcessingStatistics(
const AudioProcessingStatistics& other) = default;
AudioProcessing::AudioProcessingStatistics::~AudioProcessingStatistics() =
default;
// TODO(ivoc): Remove this when GetStatistics() becomes pure virtual.
AudioProcessing::AudioProcessingStatistics AudioProcessing::GetStatistics()
const {
return AudioProcessingStatistics();
}
// TODO(ivoc): Remove this when GetStatistics() becomes pure virtual.
AudioProcessingStats AudioProcessing::GetStatistics(
bool has_remote_tracks) const {
return AudioProcessingStats();
}
AudioProcessing::AudioProcessingStatistics AudioProcessingImpl::GetStatistics()
const {
AudioProcessingStatistics stats;
EchoCancellationImpl::Metrics metrics;
rtc::CritScope cs_capture(&crit_capture_);
if (private_submodules_->echo_controller) {
auto ec_metrics = private_submodules_->echo_controller->GetMetrics();
float erl = static_cast<float>(ec_metrics.echo_return_loss);
float erle = static_cast<float>(ec_metrics.echo_return_loss_enhancement);
// Instant value will also be used for min, max and average.
stats.echo_return_loss.Set(erl, erl, erl, erl);
stats.echo_return_loss_enhancement.Set(erle, erle, erle, erle);
} else if (private_submodules_->echo_cancellation->GetMetrics(&metrics) ==
Error::kNoError) {
stats.a_nlp.Set(metrics.a_nlp);
stats.divergent_filter_fraction = metrics.divergent_filter_fraction;
stats.echo_return_loss.Set(metrics.echo_return_loss);
stats.echo_return_loss_enhancement.Set(
metrics.echo_return_loss_enhancement);
stats.residual_echo_return_loss.Set(metrics.residual_echo_return_loss);
}
RTC_DCHECK(private_submodules_->echo_detector);
auto ed_metrics = private_submodules_->echo_detector->GetMetrics();
stats.residual_echo_likelihood = ed_metrics.echo_likelihood;
stats.residual_echo_likelihood_recent_max =
ed_metrics.echo_likelihood_recent_max;
private_submodules_->echo_cancellation->GetDelayMetrics(
&stats.delay_median, &stats.delay_standard_deviation,
&stats.fraction_poor_delays);
return stats;
}
AudioProcessingStats AudioProcessingImpl::GetStatistics(
bool has_remote_tracks) const {
AudioProcessingStats stats;

View File

@ -109,7 +109,6 @@ class AudioProcessingImpl : public AudioProcessing {
bool was_stream_delay_set() const override
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
AudioProcessingStatistics GetStatistics() const override;
AudioProcessingStats GetStatistics(bool has_remote_tracks) const override;
// Methods returning pointers to APM submodules.

View File

@ -83,17 +83,23 @@ class EchoCancellationImpl {
// P_a: Internal signal power at the point before the AEC's non-linear
// processor.
struct Metrics {
struct Statistic {
int instant = 0; // Instantaneous value.
int average = 0; // Long-term average.
int maximum = 0; // Long-term maximum.
int minimum = 0; // Long-term minimum.
};
// RERL = ERL + ERLE
AudioProcessing::Statistic residual_echo_return_loss;
Statistic residual_echo_return_loss;
// ERL = 10log_10(P_far / P_echo)
AudioProcessing::Statistic echo_return_loss;
Statistic echo_return_loss;
// ERLE = 10log_10(P_echo / P_out)
AudioProcessing::Statistic echo_return_loss_enhancement;
Statistic echo_return_loss_enhancement;
// (Pre non-linear processing suppression) A_NLP = 10log_10(P_echo / P_a)
AudioProcessing::Statistic a_nlp;
Statistic a_nlp;
// Fraction of time that the AEC linear filter is divergent, in a 1-second
// non-overlapped aggregation window.

View File

@ -520,78 +520,12 @@ class AudioProcessing : public rtc::RefCountInterface {
// specific member variables are reset.
virtual void UpdateHistogramsOnCallEnd() = 0;
// TODO(ivoc): Remove when the calling code no longer uses the old Statistics
// API.
struct Statistic {
int instant = 0; // Instantaneous value.
int average = 0; // Long-term average.
int maximum = 0; // Long-term maximum.
int minimum = 0; // Long-term minimum.
};
struct Stat {
void Set(const Statistic& other) {
Set(other.instant, other.average, other.maximum, other.minimum);
}
void Set(float instant, float average, float maximum, float minimum) {
instant_ = instant;
average_ = average;
maximum_ = maximum;
minimum_ = minimum;
}
float instant() const { return instant_; }
float average() const { return average_; }
float maximum() const { return maximum_; }
float minimum() const { return minimum_; }
private:
float instant_ = 0.0f; // Instantaneous value.
float average_ = 0.0f; // Long-term average.
float maximum_ = 0.0f; // Long-term maximum.
float minimum_ = 0.0f; // Long-term minimum.
};
struct RTC_EXPORT AudioProcessingStatistics {
AudioProcessingStatistics();
AudioProcessingStatistics(const AudioProcessingStatistics& other);
~AudioProcessingStatistics();
// AEC Statistics.
// RERL = ERL + ERLE
Stat residual_echo_return_loss;
// ERL = 10log_10(P_far / P_echo)
Stat echo_return_loss;
// ERLE = 10log_10(P_echo / P_out)
Stat echo_return_loss_enhancement;
// (Pre non-linear processing suppression) A_NLP = 10log_10(P_echo / P_a)
Stat a_nlp;
// Fraction of time that the AEC linear filter is divergent, in a 1-second
// non-overlapped aggregation window.
float divergent_filter_fraction = -1.0f;
// 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.
int delay_median = -1;
int delay_standard_deviation = -1;
float fraction_poor_delays = -1.0f;
// Residual echo detector likelihood.
float residual_echo_likelihood = -1.0f;
// Maximum residual echo likelihood from the last time period.
float residual_echo_likelihood_recent_max = -1.0f;
};
// 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;
// Get audio processing statistics. The |has_remote_tracks| argument should be
// set if there are active remote tracks (this would usually be true during
// a call). If there are no remote tracks some of the stats will not be set by
// AudioProcessing, because they only make sense if there is at least one
// remote track.
virtual AudioProcessingStats GetStatistics(bool has_remote_tracks) const = 0;
// These provide access to the component interfaces and should never return
// NULL. The pointers will be valid for the lifetime of the APM instance.

View File

@ -172,7 +172,6 @@ class MockAudioProcessing : public testing::NiceMock<AudioProcessing> {
MOCK_METHOD0(DetachPlayoutAudioGenerator, void());
MOCK_METHOD0(UpdateHistogramsOnCallEnd, void());
MOCK_CONST_METHOD0(GetStatistics, AudioProcessingStatistics());
MOCK_CONST_METHOD1(GetStatistics, AudioProcessingStats(bool));
virtual MockGainControl* gain_control() const { return gain_control_.get(); }
virtual MockLevelEstimator* level_estimator() const {

View File

@ -209,9 +209,9 @@ void AudioProcessingSimulator::ProcessStream(bool fixed_interface) {
}
if (residual_echo_likelihood_graph_writer_.is_open()) {
auto stats = ap_->GetStatistics();
residual_echo_likelihood_graph_writer_ << stats.residual_echo_likelihood
<< ", ";
auto stats = ap_->GetStatistics(true /*has_remote_tracks*/);
residual_echo_likelihood_graph_writer_
<< stats.residual_echo_likelihood.value_or(-1.f) << ", ";
}
++num_process_stream_calls_;

View File

@ -57,14 +57,6 @@ class FakeAudioProcessor : public AudioProcessorInterface {
~FakeAudioProcessor() {}
private:
void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override {
stats->typing_noise_detected = true;
stats->echo_return_loss = 2;
stats->echo_return_loss_enhancement = 3;
stats->echo_delay_median_ms = 4;
stats->echo_delay_std_ms = 6;
}
AudioProcessorInterface::AudioProcessorStatistics GetStats(
bool has_recv_streams) override {
AudioProcessorStatistics stats;
@ -108,14 +100,6 @@ class FakeAudioProcessorWithInitValue : public AudioProcessorInterface {
~FakeAudioProcessorWithInitValue() {}
private:
void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override {
stats->typing_noise_detected = false;
stats->echo_return_loss = -100;
stats->echo_return_loss_enhancement = -100;
stats->echo_delay_median_ms = -1;
stats->echo_delay_std_ms = -1;
}
AudioProcessorInterface::AudioProcessorStatistics GetStats(
bool /*has_recv_streams*/) override {
AudioProcessorStatistics stats;
@ -1568,7 +1552,7 @@ TEST_P(StatsCollectorTrackTest, GetStatsAfterRemoveAudioStream) {
// Verifies the values in the track report, no value will be changed by the
// AudioTrackInterface::GetSignalValue() and
// AudioProcessorInterface::AudioProcessorStats::GetStats();
// AudioProcessorInterface::GetStats();
VerifyVoiceSenderInfoReport(report, voice_sender_info);
}

View File

@ -130,10 +130,8 @@ void FuzzAudioProcessing(test::FuzzDataHelper* fuzz_data,
}
}
// Make calls to stats gathering functions to cover these
// codeways.
static_cast<void>(apm->GetStatistics());
static_cast<void>(apm->GetStatistics(true));
// Cover stats gathering code paths.
static_cast<void>(apm->GetStatistics(true /*has_remote_tracks*/));
static_cast<void>(apm->UpdateHistogramsOnCallEnd());
RTC_DCHECK_NE(apm_return_code, AudioProcessing::kBadDataLengthError);