Move expand uma logger into statistics calculator.

Bug: webrtc:370424996
Change-Id: I525758eaa5430a4d1cf63cfd663de0079e7d3d68
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/364100
Commit-Queue: Jakob Ivarsson‎ <jakobi@webrtc.org>
Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43106}
This commit is contained in:
Jakob Ivarsson 2024-09-30 11:21:43 +00:00 committed by WebRTC LUCI CQ
parent f5a547aa99
commit a6e555648e
10 changed files with 75 additions and 48 deletions

View File

@ -30,7 +30,8 @@ TEST(Expand, CreateAndDestroy) {
BackgroundNoise bgn(channels);
SyncBuffer sync_buffer(1, 1000);
RandomVector random_vector;
StatisticsCalculator statistics;
TickTimer timer;
StatisticsCalculator statistics(&timer);
Expand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs, channels);
}
@ -40,7 +41,8 @@ TEST(Expand, CreateUsingFactory) {
BackgroundNoise bgn(channels);
SyncBuffer sync_buffer(1, 1000);
RandomVector random_vector;
StatisticsCalculator statistics;
TickTimer timer;
StatisticsCalculator statistics(&timer);
ExpandFactory expand_factory;
Expand* expand = expand_factory.Create(&bgn, &sync_buffer, &random_vector,
&statistics, fs, channels);
@ -51,6 +53,9 @@ TEST(Expand, CreateUsingFactory) {
namespace {
class FakeStatisticsCalculator : public StatisticsCalculator {
public:
FakeStatisticsCalculator(TickTimer* tick_timer)
: StatisticsCalculator(tick_timer) {}
void LogDelayedPacketOutageEvent(int num_samples, int fs_hz) override {
last_outage_duration_samples_ = num_samples;
}
@ -77,6 +82,7 @@ class ExpandTest : public ::testing::Test {
background_noise_(num_channels_),
sync_buffer_(num_channels_,
kNetEqSyncBufferLengthMs * test_sample_rate_hz_ / 1000),
statistics_(&tick_timer_),
expand_(&background_noise_,
&sync_buffer_,
&random_vector_,
@ -106,6 +112,7 @@ class ExpandTest : public ::testing::Test {
BackgroundNoise background_noise_;
SyncBuffer sync_buffer_;
RandomVector random_vector_;
TickTimer tick_timer_;
FakeStatisticsCalculator statistics_;
Expand expand_;
};

View File

@ -32,7 +32,8 @@ TEST(Merge, CreateAndDestroy) {
BackgroundNoise bgn(channels);
SyncBuffer sync_buffer(1, 1000);
RandomVector random_vector;
StatisticsCalculator statistics;
TickTimer timer;
StatisticsCalculator statistics(&timer);
Expand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs, channels);
Merge merge(fs, channels, &expand, &sync_buffer);
}
@ -52,6 +53,7 @@ class MergeTest : public testing::TestWithParam<size_t> {
background_noise_(num_channels_),
sync_buffer_(num_channels_,
kNetEqSyncBufferLengthMs * test_sample_rate_hz_ / 1000),
statistics_(&timer_),
expand_(&background_noise_,
&sync_buffer_,
&random_vector_,
@ -86,6 +88,7 @@ class MergeTest : public testing::TestWithParam<size_t> {
BackgroundNoise background_noise_;
SyncBuffer sync_buffer_;
RandomVector random_vector_;
TickTimer timer_;
StatisticsCalculator statistics_;
Expand expand_;
Merge merge_;

View File

@ -18,6 +18,9 @@ namespace webrtc {
class MockStatisticsCalculator : public StatisticsCalculator {
public:
MockStatisticsCalculator(TickTimer* tick_timer)
: StatisticsCalculator(tick_timer) {}
MOCK_METHOD(void, PacketsDiscarded, (size_t num_packets), (override));
MOCK_METHOD(void,
SecondaryPacketsDiscarded,

View File

@ -96,7 +96,7 @@ NetEqImpl::Dependencies::Dependencies(
const NetEqControllerFactory& controller_factory)
: env(env),
tick_timer(new TickTimer),
stats(new StatisticsCalculator),
stats(std::make_unique<StatisticsCalculator>(tick_timer.get())),
decoder_database(
std::make_unique<DecoderDatabase>(env,
std::move(decoder_factory),
@ -148,12 +148,6 @@ NetEqImpl::NetEqImpl(const NetEq::Config& config,
enable_fast_accelerate_(config.enable_fast_accelerate),
nack_enabled_(false),
enable_muted_state_(config.enable_muted_state),
expand_uma_logger_("WebRTC.Audio.ExpandRatePercent",
10, // Report once every 10 s.
tick_timer_.get()),
speech_expand_uma_logger_("WebRTC.Audio.SpeechExpandRatePercent",
10, // Report once every 10 s.
tick_timer_.get()),
no_time_stretching_(config.for_test_no_time_stretching) {
RTC_LOG(LS_INFO) << "NetEq config: " << config.ToString();
int fs = config.sample_rate_hz;
@ -740,13 +734,6 @@ int NetEqImpl::GetAudioInternal(AudioFrame* audio_frame,
last_decoded_packet_infos_.clear();
tick_timer_->Increment();
stats_->IncreaseCounter(output_size_samples_, fs_hz_);
const auto lifetime_stats = stats_->GetLifetimeStatistics();
expand_uma_logger_.UpdateSampleCounter(lifetime_stats.concealed_samples,
fs_hz_);
speech_expand_uma_logger_.UpdateSampleCounter(
lifetime_stats.concealed_samples -
lifetime_stats.silent_concealed_samples,
fs_hz_);
// Check for muted state.
if (enable_muted_state_ && expand_->Muted() && packet_buffer_->Empty()) {

View File

@ -27,7 +27,6 @@
#include "api/rtp_packet_info.h"
#include "api/units/timestamp.h"
#include "modules/audio_coding/neteq/audio_multi_vector.h"
#include "modules/audio_coding/neteq/expand_uma_logger.h"
#include "modules/audio_coding/neteq/packet.h"
#include "modules/audio_coding/neteq/packet_buffer.h"
#include "modules/audio_coding/neteq/random_vector.h"
@ -395,8 +394,6 @@ class NetEqImpl : public webrtc::NetEq {
std::unique_ptr<TickTimer::Stopwatch> generated_noise_stopwatch_
RTC_GUARDED_BY(mutex_);
std::vector<RtpPacketInfo> last_decoded_packet_infos_ RTC_GUARDED_BY(mutex_);
ExpandUmaLogger expand_uma_logger_ RTC_GUARDED_BY(mutex_);
ExpandUmaLogger speech_expand_uma_logger_ RTC_GUARDED_BY(mutex_);
bool no_time_stretching_ RTC_GUARDED_BY(mutex_); // Only used for test.
rtc::BufferT<int16_t> concealment_audio_ RTC_GUARDED_BY(mutex_);
};

View File

@ -48,7 +48,8 @@ TEST(Normal, CreateAndDestroy) {
BackgroundNoise bgn(channels);
SyncBuffer sync_buffer(1, 1000);
RandomVector random_vector;
StatisticsCalculator statistics;
TickTimer timer;
StatisticsCalculator statistics(&timer);
Expand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs, channels);
Normal normal(fs, &db, bgn, &expand, &statistics);
EXPECT_CALL(db, Die()); // Called when `db` goes out of scope.
@ -61,7 +62,8 @@ TEST(Normal, AvoidDivideByZero) {
BackgroundNoise bgn(channels);
SyncBuffer sync_buffer(1, 1000);
RandomVector random_vector;
StatisticsCalculator statistics;
TickTimer timer;
StatisticsCalculator statistics(&timer);
MockExpand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs,
channels);
Normal normal(fs, &db, bgn, &expand, &statistics);
@ -96,7 +98,8 @@ TEST(Normal, InputLengthAndChannelsDoNotMatch) {
BackgroundNoise bgn(channels);
SyncBuffer sync_buffer(channels, 1000);
RandomVector random_vector;
StatisticsCalculator statistics;
TickTimer timer;
StatisticsCalculator statistics(&timer);
MockExpand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs,
channels);
Normal normal(fs, &db, bgn, &expand, &statistics);
@ -121,7 +124,8 @@ TEST(Normal, LastModeExpand120msPacket) {
BackgroundNoise bgn(kChannels);
SyncBuffer sync_buffer(kChannels, 1000);
RandomVector random_vector;
StatisticsCalculator statistics;
TickTimer timer;
StatisticsCalculator statistics(&timer);
MockExpand expand(&bgn, &sync_buffer, &random_vector, &statistics, kFs,
kChannels);
Normal normal(kFs, &db, bgn, &expand, &statistics);

View File

@ -108,7 +108,7 @@ namespace webrtc {
TEST(PacketBuffer, CreateAndDestroy) {
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer* buffer =
new PacketBuffer(10, &tick_timer, &mock_stats); // 10 packets.
EXPECT_TRUE(buffer->Empty());
@ -117,7 +117,7 @@ TEST(PacketBuffer, CreateAndDestroy) {
TEST(PacketBuffer, InsertPacket) {
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer buffer(10, &tick_timer, &mock_stats); // 10 packets.
PacketGenerator gen(17u, 4711u, 0, 10);
MockDecoderDatabase decoder_database;
@ -141,7 +141,7 @@ TEST(PacketBuffer, InsertPacket) {
// Test to flush buffer.
TEST(PacketBuffer, FlushBuffer) {
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer buffer(10, &tick_timer, &mock_stats); // 10 packets.
PacketGenerator gen(0, 0, 0, 10);
const int payload_len = 10;
@ -166,7 +166,7 @@ TEST(PacketBuffer, FlushBuffer) {
// Test to fill the buffer over the limits, and verify that it flushes.
TEST(PacketBuffer, OverfillBuffer) {
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer buffer(10, &tick_timer, &mock_stats); // 10 packets.
PacketGenerator gen(0, 0, 0, 10);
MockDecoderDatabase decoder_database;
@ -199,7 +199,7 @@ TEST(PacketBuffer, OverfillBuffer) {
TEST(PacketBuffer, ExtractOrderRedundancy) {
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer buffer(100, &tick_timer, &mock_stats); // 100 packets.
const int kPackets = 18;
const int kFrameSize = 10;
@ -262,7 +262,7 @@ TEST(PacketBuffer, ExtractOrderRedundancy) {
TEST(PacketBuffer, DiscardPackets) {
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer buffer(100, &tick_timer, &mock_stats); // 100 packets.
const uint16_t start_seq_no = 17;
const uint32_t start_ts = 4711;
@ -327,7 +327,7 @@ TEST(PacketBuffer, DiscardPackets) {
TEST(PacketBuffer, Reordering) {
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer buffer(100, &tick_timer, &mock_stats); // 100 packets.
const uint16_t start_seq_no = 17;
const uint32_t start_ts = 4711;
@ -371,7 +371,7 @@ TEST(PacketBuffer, Failures) {
int payload_len = 100;
PacketGenerator gen(start_seq_no, start_ts, 0, ts_increment);
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer buffer(100, &tick_timer, &mock_stats); // 100 packets.
{
@ -510,7 +510,7 @@ TEST(PacketBuffer, GetSpanSamples) {
constexpr int kSampleRateHz = 48000;
constexpr bool kCountWaitingTime = false;
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer buffer(3, &tick_timer, &mock_stats);
PacketGenerator gen(0, kStartTimeStamp, 0, kFrameSizeSamples);
MockDecoderDatabase decoder_database;
@ -558,7 +558,7 @@ TEST(PacketBuffer, GetSpanSamplesCountWaitingTime) {
constexpr bool kCountWaitingTime = true;
constexpr size_t kLastDecodedSizeSamples = 0;
TickTimer tick_timer;
StrictMock<MockStatisticsCalculator> mock_stats;
StrictMock<MockStatisticsCalculator> mock_stats(&tick_timer);
PacketBuffer buffer(3, &tick_timer, &mock_stats);
PacketGenerator gen(0, kStartTimeStamp, 0, kFrameSizeSamples);
MockDecoderDatabase decoder_database;

View File

@ -112,7 +112,7 @@ void StatisticsCalculator::PeriodicUmaAverage::Reset() {
counter_ = 0;
}
StatisticsCalculator::StatisticsCalculator()
StatisticsCalculator::StatisticsCalculator(TickTimer* tick_timer)
: preemptive_samples_(0),
accelerate_samples_(0),
expanded_speech_samples_(0),
@ -129,7 +129,13 @@ StatisticsCalculator::StatisticsCalculator()
1000),
buffer_full_counter_("WebRTC.Audio.JitterBufferFullPerMinute",
60000, // 60 seconds report interval.
100) {}
100),
expand_uma_logger_("WebRTC.Audio.ExpandRatePercent",
10, // Report once every 10 s.
tick_timer),
speech_expand_uma_logger_("WebRTC.Audio.SpeechExpandRatePercent",
10, // Report once every 10 s.
tick_timer) {}
StatisticsCalculator::~StatisticsCalculator() = default;
@ -260,6 +266,12 @@ void StatisticsCalculator::IncreaseCounter(size_t num_samples, int fs_hz) {
timestamps_since_last_report_ = 0;
}
lifetime_stats_.total_samples_received += num_samples;
expand_uma_logger_.UpdateSampleCounter(lifetime_stats_.concealed_samples,
fs_hz);
speech_expand_uma_logger_.UpdateSampleCounter(
lifetime_stats_.concealed_samples -
lifetime_stats_.silent_concealed_samples,
fs_hz);
}
void StatisticsCalculator::JitterBufferDelay(size_t num_samples,

View File

@ -16,6 +16,7 @@
#include "absl/strings/string_view.h"
#include "api/neteq/neteq.h"
#include "modules/audio_coding/neteq/expand_uma_logger.h"
namespace webrtc {
@ -24,7 +25,7 @@ class DelayManager;
// This class handles various network statistics in NetEq.
class StatisticsCalculator {
public:
StatisticsCalculator();
StatisticsCalculator(TickTimer* tick_timer);
virtual ~StatisticsCalculator();
@ -205,6 +206,8 @@ class StatisticsCalculator {
PeriodicUmaAverage excess_buffer_delay_;
PeriodicUmaCount buffer_full_counter_;
bool decoded_output_played_ = false;
ExpandUmaLogger expand_uma_logger_;
ExpandUmaLogger speech_expand_uma_logger_;
};
} // namespace webrtc

View File

@ -15,7 +15,8 @@
namespace webrtc {
TEST(LifetimeStatistics, TotalSamplesReceived) {
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
for (int i = 0; i < 10; ++i) {
stats.IncreaseCounter(480, 48000); // 10 ms at 48 kHz.
}
@ -23,7 +24,8 @@ TEST(LifetimeStatistics, TotalSamplesReceived) {
}
TEST(LifetimeStatistics, SamplesConcealed) {
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
stats.ExpandedVoiceSamples(100, false);
stats.ExpandedNoiseSamples(17, false);
EXPECT_EQ(100u + 17u, stats.GetLifetimeStatistics().concealed_samples);
@ -34,7 +36,8 @@ TEST(LifetimeStatistics, SamplesConcealed) {
// would not expect the value to decrease). Instead, the correction should be
// made to future increments to the stat.
TEST(LifetimeStatistics, SamplesConcealedCorrection) {
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
stats.ExpandedVoiceSamples(100, false);
EXPECT_EQ(100u, stats.GetLifetimeStatistics().concealed_samples);
stats.ExpandedVoiceSamplesCorrection(-10);
@ -55,7 +58,8 @@ TEST(LifetimeStatistics, SamplesConcealedCorrection) {
// in a modification to concealed_samples stats. Only PLC operations (i.e.,
// "expand" and "merge") should affect the stat.
TEST(LifetimeStatistics, NoUpdateOnTimeStretch) {
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
stats.ExpandedVoiceSamples(100, false);
stats.AcceleratedSamples(4711);
stats.PreemptiveExpandedSamples(17);
@ -64,7 +68,8 @@ TEST(LifetimeStatistics, NoUpdateOnTimeStretch) {
}
TEST(StatisticsCalculator, ExpandedSamplesCorrection) {
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
NetEqNetworkStatistics stats_output;
constexpr int kSampleRateHz = 48000;
constexpr int k10MsSamples = kSampleRateHz / 100;
@ -100,7 +105,8 @@ TEST(StatisticsCalculator, ExpandedSamplesCorrection) {
}
TEST(StatisticsCalculator, RelativePacketArrivalDelay) {
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
stats.RelativePacketArrivalDelay(50);
NetEqLifetimeStatistics stats_output = stats.GetLifetimeStatistics();
@ -112,7 +118,8 @@ TEST(StatisticsCalculator, RelativePacketArrivalDelay) {
}
TEST(StatisticsCalculator, ReceivedPacket) {
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
stats.ReceivedPacket();
NetEqLifetimeStatistics stats_output = stats.GetLifetimeStatistics();
@ -126,7 +133,8 @@ TEST(StatisticsCalculator, ReceivedPacket) {
TEST(StatisticsCalculator, InterruptionCounter) {
constexpr int fs_khz = 48;
constexpr int fs_hz = fs_khz * 1000;
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
stats.DecodedOutputPlayed();
stats.EndExpandEvent(fs_hz);
auto lts = stats.GetLifetimeStatistics();
@ -160,7 +168,8 @@ TEST(StatisticsCalculator, InterruptionCounter) {
TEST(StatisticsCalculator, InterruptionCounterDoNotLogBeforeDecoding) {
constexpr int fs_khz = 48;
constexpr int fs_hz = fs_khz * 1000;
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
// Add an event that is longer than 150 ms. Should normally be logged, but we
// have not called DecodedOutputPlayed() yet, so it shouldn't this time.
@ -180,7 +189,8 @@ TEST(StatisticsCalculator, InterruptionCounterDoNotLogBeforeDecoding) {
}
TEST(StatisticsCalculator, DiscardedPackets) {
StatisticsCalculator statistics_calculator;
TickTimer timer;
StatisticsCalculator statistics_calculator(&timer);
EXPECT_EQ(0u,
statistics_calculator.GetLifetimeStatistics().packets_discarded);
@ -204,7 +214,8 @@ TEST(StatisticsCalculator, DiscardedPackets) {
}
TEST(StatisticsCalculator, JitterBufferDelay) {
StatisticsCalculator stats;
TickTimer timer;
StatisticsCalculator stats(&timer);
NetEqLifetimeStatistics lts;
lts = stats.GetLifetimeStatistics();
EXPECT_EQ(lts.total_processing_delay_us, 0ul);