From 34589929fe7be84cc7b1bd087671dc61f2772678 Mon Sep 17 00:00:00 2001 From: Jeremy Leconte Date: Tue, 27 Jun 2023 09:49:13 +0200 Subject: [PATCH] Add audio energy metric. More details on audio energy can be found here: https://w3c.github.io/webrtc-stats/#dom-rtcaudiosourcestats-totalaudioenergy Change-Id: Ie8b543c0c3d2136f453c6731945f93de4c38218c Bug: b/272781101 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/310121 Reviewed-by: Mirko Bonadei Commit-Queue: Jeremy Leconte Cr-Commit-Position: refs/heads/main@{#40352} --- .../audio/default_audio_quality_analyzer.cc | 10 +++++++ .../audio/default_audio_quality_analyzer.h | 3 +++ ...nnection_quality_test_metric_names_test.cc | 26 +++++++++++++++++-- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.cc b/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.cc index 09fd7c8a82..bca52d9bfc 100644 --- a/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.cc +++ b/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.cc @@ -62,6 +62,9 @@ void DefaultAudioQualityAnalyzer::OnStatsReports( TimeDelta::Seconds(stat->jitter_buffer_target_delay.ValueOrDefault(0.)); sample.jitter_buffer_emitted_count = stat->jitter_buffer_emitted_count.ValueOrDefault(0ul); + sample.total_samples_duration = + stat->total_samples_duration.ValueOrDefault(0.); + sample.total_audio_energy = stat->total_audio_energy.ValueOrDefault(0.); TrackIdStreamInfoMap::StreamInfo stream_info = analyzer_helper_->GetStreamInfoFromTrackId(*stat->track_identifier); @@ -115,6 +118,9 @@ void DefaultAudioQualityAnalyzer::OnStatsReports( jitter_buffer_target_delay_diff.ms() / jitter_buffer_emitted_count_diff); } + audio_stream_stats.energy.AddSample(sqrt( + (sample.total_audio_energy - prev_sample.total_audio_energy) / + (sample.total_samples_duration - prev_sample.total_samples_duration))); last_stats_sample_[stream_info.stream_label] = sample; } @@ -161,6 +167,10 @@ void DefaultAudioQualityAnalyzer::Stop() { "preferred_buffer_size_ms", GetTestCaseName(item.first), item.second.preferred_buffer_size_ms, Unit::kMilliseconds, ImprovementDirection::kNeitherIsBetter, metric_metadata); + metrics_logger_->LogMetric("energy", GetTestCaseName(item.first), + item.second.energy, Unit::kUnitless, + ImprovementDirection::kNeitherIsBetter, + metric_metadata); } } diff --git a/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.h b/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.h index 9e427afed8..c59f727422 100644 --- a/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.h +++ b/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.h @@ -32,6 +32,7 @@ struct AudioStreamStats { SamplesStatsCounter speech_expand_rate; SamplesStatsCounter average_jitter_buffer_delay_ms; SamplesStatsCounter preferred_buffer_size_ms; + SamplesStatsCounter energy; }; class DefaultAudioQualityAnalyzer : public AudioQualityAnalyzerInterface { @@ -59,6 +60,8 @@ class DefaultAudioQualityAnalyzer : public AudioQualityAnalyzerInterface { TimeDelta jitter_buffer_delay = TimeDelta::Zero(); TimeDelta jitter_buffer_target_delay = TimeDelta::Zero(); uint64_t jitter_buffer_emitted_count = 0; + double total_samples_duration = 0.0; + double total_audio_energy = 0.0; }; std::string GetTestCaseName(const std::string& stream_label) const; diff --git a/test/pc/e2e/peer_connection_quality_test_metric_names_test.cc b/test/pc/e2e/peer_connection_quality_test_metric_names_test.cc index a2830af72d..46f7e93243 100644 --- a/test/pc/e2e/peer_connection_quality_test_metric_names_test.cc +++ b/test/pc/e2e/peer_connection_quality_test_metric_names_test.cc @@ -1090,10 +1090,32 @@ TEST(PeerConnectionE2EQualityTestMetricNamesTest, .name = "video_ahead_ms", .unit = Unit::kMilliseconds, .improvement_direction = ImprovementDirection::kSmallerIsBetter, + .metadata = + {{MetricMetadataKey::kAudioStreamMetadataKey, "bob_video"}, + {MetricMetadataKey::kPeerMetadataKey, "alice"}, + {MetricMetadataKey::kPeerSyncGroupMetadataKey, "bob"}, + {MetricMetadataKey::kReceiverMetadataKey, "alice"}, + {MetricMetadataKey::kExperimentalTestNameMetadataKey, + "test_case"}}}, + MetricValidationInfo{ + .test_case = "test_case/alice_audio", + .name = "energy", + .unit = Unit::kUnitless, + .improvement_direction = ImprovementDirection::kNeitherIsBetter, + .metadata = {{MetricMetadataKey::kAudioStreamMetadataKey, + "alice_audio"}, + {MetricMetadataKey::kPeerMetadataKey, "bob"}, + {MetricMetadataKey::kReceiverMetadataKey, "bob"}, + {MetricMetadataKey::kExperimentalTestNameMetadataKey, + "test_case"}}}, + MetricValidationInfo{ + .test_case = "test_case/bob_audio", + .name = "energy", + .unit = Unit::kUnitless, + .improvement_direction = ImprovementDirection::kNeitherIsBetter, .metadata = { - {MetricMetadataKey::kAudioStreamMetadataKey, "bob_video"}, + {MetricMetadataKey::kAudioStreamMetadataKey, "bob_audio"}, {MetricMetadataKey::kPeerMetadataKey, "alice"}, - {MetricMetadataKey::kPeerSyncGroupMetadataKey, "bob"}, {MetricMetadataKey::kReceiverMetadataKey, "alice"}, {MetricMetadataKey::kExperimentalTestNameMetadataKey, "test_case"}}}));