aboutsummaryrefslogtreecommitdiff
path: root/modules/audio_processing/aec3
diff options
context:
space:
mode:
authorMirko Bonadei <mbonadei@webrtc.org>2022-10-12 13:40:44 +0000
committerWebRTC LUCI CQ <webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-10-12 13:42:31 +0000
commitb2b627701c06a695575b2cd3bb409ad2a167299e (patch)
tree2f8f839850866c4b5babf9a292298bb2d1b0f4b7 /modules/audio_processing/aec3
parentdb955f0f13671dcd7203c93c2964307c78e24ccb (diff)
downloadwebrtc-b2b627701c06a695575b2cd3bb409ad2a167299e.tar.gz
Revert "AEC3: clarify render delay controller metrics"
This reverts commit fd745d3e3c7083cfa52307b9e4fc908930ddf2d2. Reason for revert: Breaks downstream projects. Original change's description: > AEC3: clarify render delay controller metrics > > This CL: > - makes it easier to understand the (nontrivial) metric interpretation > - corrects the computation of BufferDelay to use 0 for absent delay > - deletes metric MaxSkewShiftCount, unused since https://webrtc-review.googlesource.com/c/src/+/119701 > - updates the unit test to directly test metric reporting > > Corresponding update to histograms.xml: > https://crrev.com/c/3944909 > > Bug: webrtc:8671, chromium:1349051 > Change-Id: If73b6fca4de7343bff2c53f72cedda458d36c599 > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/278782 > Commit-Queue: Sam Zackrisson <saza@webrtc.org> > Reviewed-by: Per Ã…hgren <peah@webrtc.org> > Cr-Commit-Position: refs/heads/main@{#38362} Bug: webrtc:8671, chromium:1349051 Change-Id: I1e2bd0f91acb67532e21f5d2f8526a398711a413 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/279040 Owners-Override: Mirko Bonadei <mbonadei@webrtc.org> Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com> Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org> Auto-Submit: Mirko Bonadei <mbonadei@webrtc.org> Cr-Commit-Position: refs/heads/main@{#38367}
Diffstat (limited to 'modules/audio_processing/aec3')
-rw-r--r--modules/audio_processing/aec3/render_delay_controller.cc8
-rw-r--r--modules/audio_processing/aec3/render_delay_controller_metrics.cc29
-rw-r--r--modules/audio_processing/aec3/render_delay_controller_metrics.h9
-rw-r--r--modules/audio_processing/aec3/render_delay_controller_metrics_unittest.cc43
4 files changed, 36 insertions, 53 deletions
diff --git a/modules/audio_processing/aec3/render_delay_controller.cc b/modules/audio_processing/aec3/render_delay_controller.cc
index 465e77fb7c..7fd2868c38 100644
--- a/modules/audio_processing/aec3/render_delay_controller.cc
+++ b/modules/audio_processing/aec3/render_delay_controller.cc
@@ -155,11 +155,9 @@ absl::optional<DelayEstimate> RenderDelayControllerImpl::GetDelay(
last_delay_estimate_quality_ = delay_samples_->quality;
}
- metrics_.Update(
- delay_samples_ ? absl::optional<size_t>(delay_samples_->delay)
- : absl::nullopt,
- delay_ ? absl::optional<size_t>(delay_->delay) : absl::nullopt,
- delay_estimator_.Clockdrift());
+ metrics_.Update(delay_samples_ ? absl::optional<size_t>(delay_samples_->delay)
+ : absl::nullopt,
+ delay_ ? delay_->delay : 0, 0, delay_estimator_.Clockdrift());
data_dumper_->DumpRaw("aec3_render_delay_controller_delay",
delay_samples ? delay_samples->delay : 0);
diff --git a/modules/audio_processing/aec3/render_delay_controller_metrics.cc b/modules/audio_processing/aec3/render_delay_controller_metrics.cc
index 1e0a0f443e..582e033482 100644
--- a/modules/audio_processing/aec3/render_delay_controller_metrics.cc
+++ b/modules/audio_processing/aec3/render_delay_controller_metrics.cc
@@ -37,13 +37,16 @@ enum class DelayChangesCategory {
kNumCategories
};
+constexpr int kMaxSkewShiftCount = 20;
+
} // namespace
RenderDelayControllerMetrics::RenderDelayControllerMetrics() = default;
void RenderDelayControllerMetrics::Update(
absl::optional<size_t> delay_samples,
- absl::optional<size_t> buffer_delay_blocks,
+ size_t buffer_delay_blocks,
+ absl::optional<int> skew_shift_blocks,
ClockdriftDetector::Level clockdrift) {
++call_counter_;
@@ -51,8 +54,6 @@ void RenderDelayControllerMetrics::Update(
size_t delay_blocks;
if (delay_samples) {
++reliable_delay_estimate_counter_;
- // Add an offset by 1 (metric is halved before reporting) to reserve 0 for
- // absent delay.
delay_blocks = (*delay_samples) / kBlockSize + 2;
} else {
delay_blocks = 0;
@@ -63,21 +64,21 @@ void RenderDelayControllerMetrics::Update(
delay_blocks_ = delay_blocks;
}
+ if (skew_shift_blocks) {
+ skew_shift_count_ = std::min(kMaxSkewShiftCount, skew_shift_count_);
+ }
} else if (++initial_call_counter_ == 5 * kNumBlocksPerSecond) {
initial_update = false;
}
if (call_counter_ == kMetricsReportingIntervalBlocks) {
int value_to_report = static_cast<int>(delay_blocks_);
- // Divide by 2 to compress metric range.
value_to_report = std::min(124, value_to_report >> 1);
RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.EchoCanceller.EchoPathDelay",
value_to_report, 0, 124, 125);
- // Divide by 2 to compress metric range.
- // Offset by 1 to reserve 0 for absent delay.
- value_to_report = buffer_delay_blocks ? (*buffer_delay_blocks + 2) >> 1 : 0;
- value_to_report = std::min(124, value_to_report);
+ value_to_report = static_cast<int>(buffer_delay_blocks + 2);
+ value_to_report = std::min(124, value_to_report >> 1);
RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.EchoCanceller.BufferDelay",
value_to_report, 0, 124, 125);
@@ -119,8 +120,20 @@ void RenderDelayControllerMetrics::Update(
"WebRTC.Audio.EchoCanceller.Clockdrift", static_cast<int>(clockdrift),
static_cast<int>(ClockdriftDetector::Level::kNumCategories));
+ metrics_reported_ = true;
call_counter_ = 0;
ResetMetrics();
+ } else {
+ metrics_reported_ = false;
+ }
+
+ if (!initial_update && ++skew_report_timer_ == 60 * kNumBlocksPerSecond) {
+ RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.EchoCanceller.MaxSkewShiftCount",
+ skew_shift_count_, 0, kMaxSkewShiftCount,
+ kMaxSkewShiftCount + 1);
+
+ skew_shift_count_ = 0;
+ skew_report_timer_ = 0;
}
}
diff --git a/modules/audio_processing/aec3/render_delay_controller_metrics.h b/modules/audio_processing/aec3/render_delay_controller_metrics.h
index b81833b43f..309122d80d 100644
--- a/modules/audio_processing/aec3/render_delay_controller_metrics.h
+++ b/modules/audio_processing/aec3/render_delay_controller_metrics.h
@@ -29,9 +29,13 @@ class RenderDelayControllerMetrics {
// Updates the metric with new data.
void Update(absl::optional<size_t> delay_samples,
- absl::optional<size_t> buffer_delay_blocks,
+ size_t buffer_delay_blocks,
+ absl::optional<int> skew_shift_blocks,
ClockdriftDetector::Level clockdrift);
+ // Returns true if the metrics have just been reported, otherwise false.
+ bool MetricsReported() { return metrics_reported_; }
+
private:
// Resets the metrics.
void ResetMetrics();
@@ -40,8 +44,11 @@ class RenderDelayControllerMetrics {
int reliable_delay_estimate_counter_ = 0;
int delay_change_counter_ = 0;
int call_counter_ = 0;
+ int skew_report_timer_ = 0;
int initial_call_counter_ = 0;
+ bool metrics_reported_ = false;
bool initial_update = true;
+ int skew_shift_count_ = 0;
};
} // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_delay_controller_metrics_unittest.cc b/modules/audio_processing/aec3/render_delay_controller_metrics_unittest.cc
index 2d242336f2..e7d7703433 100644
--- a/modules/audio_processing/aec3/render_delay_controller_metrics_unittest.cc
+++ b/modules/audio_processing/aec3/render_delay_controller_metrics_unittest.cc
@@ -12,7 +12,6 @@
#include "absl/types/optional.h"
#include "modules/audio_processing/aec3/aec3_common.h"
-#include "system_wrappers/include/metrics.h"
#include "test/gtest.h"
namespace webrtc {
@@ -21,49 +20,15 @@ namespace webrtc {
TEST(RenderDelayControllerMetrics, NormalUsage) {
RenderDelayControllerMetrics metrics;
- int expected_num_metric_reports = 0;
-
for (int j = 0; j < 3; ++j) {
for (int k = 0; k < kMetricsReportingIntervalBlocks - 1; ++k) {
- metrics.Update(absl::nullopt, absl::nullopt,
+ metrics.Update(absl::nullopt, 0, absl::nullopt,
ClockdriftDetector::Level::kNone);
- EXPECT_METRIC_EQ(
- metrics::NumSamples("WebRTC.Audio.EchoCanceller.EchoPathDelay"),
- expected_num_metric_reports);
- EXPECT_METRIC_EQ(
- metrics::NumSamples("WebRTC.Audio.EchoCanceller.BufferDelay"),
- expected_num_metric_reports);
- EXPECT_METRIC_EQ(metrics::NumSamples(
- "WebRTC.Audio.EchoCanceller.ReliableDelayEstimates"),
- expected_num_metric_reports);
- EXPECT_METRIC_EQ(
- metrics::NumSamples("WebRTC.Audio.EchoCanceller.DelayChanges"),
- expected_num_metric_reports);
- EXPECT_METRIC_EQ(
- metrics::NumSamples("WebRTC.Audio.EchoCanceller.Clockdrift"),
- expected_num_metric_reports);
+ EXPECT_FALSE(metrics.MetricsReported());
}
-
- // We expect metric reports every kMetricsReportingIntervalBlocks blocks.
- ++expected_num_metric_reports;
-
- metrics.Update(absl::nullopt, absl::nullopt,
+ metrics.Update(absl::nullopt, 0, absl::nullopt,
ClockdriftDetector::Level::kNone);
- EXPECT_METRIC_EQ(
- metrics::NumSamples("WebRTC.Audio.EchoCanceller.EchoPathDelay"),
- expected_num_metric_reports);
- EXPECT_METRIC_EQ(
- metrics::NumSamples("WebRTC.Audio.EchoCanceller.BufferDelay"),
- expected_num_metric_reports);
- EXPECT_METRIC_EQ(metrics::NumSamples(
- "WebRTC.Audio.EchoCanceller.ReliableDelayEstimates"),
- expected_num_metric_reports);
- EXPECT_METRIC_EQ(
- metrics::NumSamples("WebRTC.Audio.EchoCanceller.DelayChanges"),
- expected_num_metric_reports);
- EXPECT_METRIC_EQ(
- metrics::NumSamples("WebRTC.Audio.EchoCanceller.Clockdrift"),
- expected_num_metric_reports);
+ EXPECT_TRUE(metrics.MetricsReported());
}
}