diff --git a/modules/audio_coding/neteq/expand_unittest.cc b/modules/audio_coding/neteq/expand_unittest.cc index 9355fce5e1..92bbf7d3d4 100644 --- a/modules/audio_coding/neteq/expand_unittest.cc +++ b/modules/audio_coding/neteq/expand_unittest.cc @@ -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_; }; diff --git a/modules/audio_coding/neteq/merge_unittest.cc b/modules/audio_coding/neteq/merge_unittest.cc index d5a55eb056..87740af508 100644 --- a/modules/audio_coding/neteq/merge_unittest.cc +++ b/modules/audio_coding/neteq/merge_unittest.cc @@ -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 { 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 { BackgroundNoise background_noise_; SyncBuffer sync_buffer_; RandomVector random_vector_; + TickTimer timer_; StatisticsCalculator statistics_; Expand expand_; Merge merge_; diff --git a/modules/audio_coding/neteq/mock/mock_statistics_calculator.h b/modules/audio_coding/neteq/mock/mock_statistics_calculator.h index f8812478d6..85c70beb6a 100644 --- a/modules/audio_coding/neteq/mock/mock_statistics_calculator.h +++ b/modules/audio_coding/neteq/mock/mock_statistics_calculator.h @@ -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, diff --git a/modules/audio_coding/neteq/neteq_impl.cc b/modules/audio_coding/neteq/neteq_impl.cc index 35075108a1..38cabd93c1 100644 --- a/modules/audio_coding/neteq/neteq_impl.cc +++ b/modules/audio_coding/neteq/neteq_impl.cc @@ -96,7 +96,7 @@ NetEqImpl::Dependencies::Dependencies( const NetEqControllerFactory& controller_factory) : env(env), tick_timer(new TickTimer), - stats(new StatisticsCalculator), + stats(std::make_unique(tick_timer.get())), decoder_database( std::make_unique(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()) { diff --git a/modules/audio_coding/neteq/neteq_impl.h b/modules/audio_coding/neteq/neteq_impl.h index 257192714c..86519e37a0 100644 --- a/modules/audio_coding/neteq/neteq_impl.h +++ b/modules/audio_coding/neteq/neteq_impl.h @@ -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 generated_noise_stopwatch_ RTC_GUARDED_BY(mutex_); std::vector 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 concealment_audio_ RTC_GUARDED_BY(mutex_); }; diff --git a/modules/audio_coding/neteq/normal_unittest.cc b/modules/audio_coding/neteq/normal_unittest.cc index 4554d79576..f774733b11 100644 --- a/modules/audio_coding/neteq/normal_unittest.cc +++ b/modules/audio_coding/neteq/normal_unittest.cc @@ -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); diff --git a/modules/audio_coding/neteq/packet_buffer_unittest.cc b/modules/audio_coding/neteq/packet_buffer_unittest.cc index 5bdb47d05b..a74c20b0ba 100644 --- a/modules/audio_coding/neteq/packet_buffer_unittest.cc +++ b/modules/audio_coding/neteq/packet_buffer_unittest.cc @@ -108,7 +108,7 @@ namespace webrtc { TEST(PacketBuffer, CreateAndDestroy) { TickTimer tick_timer; - StrictMock mock_stats; + StrictMock 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 mock_stats; + StrictMock 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 mock_stats; + StrictMock 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 mock_stats; + StrictMock 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 mock_stats; + StrictMock 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 mock_stats; + StrictMock 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 mock_stats; + StrictMock 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 mock_stats; + StrictMock 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 mock_stats; + StrictMock 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 mock_stats; + StrictMock mock_stats(&tick_timer); PacketBuffer buffer(3, &tick_timer, &mock_stats); PacketGenerator gen(0, kStartTimeStamp, 0, kFrameSizeSamples); MockDecoderDatabase decoder_database; diff --git a/modules/audio_coding/neteq/statistics_calculator.cc b/modules/audio_coding/neteq/statistics_calculator.cc index b4fd5e8ead..4f0f74a856 100644 --- a/modules/audio_coding/neteq/statistics_calculator.cc +++ b/modules/audio_coding/neteq/statistics_calculator.cc @@ -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, diff --git a/modules/audio_coding/neteq/statistics_calculator.h b/modules/audio_coding/neteq/statistics_calculator.h index ced3a69093..28ac613bc7 100644 --- a/modules/audio_coding/neteq/statistics_calculator.h +++ b/modules/audio_coding/neteq/statistics_calculator.h @@ -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 diff --git a/modules/audio_coding/neteq/statistics_calculator_unittest.cc b/modules/audio_coding/neteq/statistics_calculator_unittest.cc index 99ccba996b..6bb40f1230 100644 --- a/modules/audio_coding/neteq/statistics_calculator_unittest.cc +++ b/modules/audio_coding/neteq/statistics_calculator_unittest.cc @@ -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);