blob: a56d0f5a9833cd148386478f5653e8ab75676d51 [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_AUDIO_CODING_NETEQ_STATISTICS_CALCULATOR_H_
12#define MODULES_AUDIO_CODING_NETEQ_STATISTICS_CALCULATOR_H_
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000013
Henrik Lundin1bb8cf82015-08-25 13:08:04 +020014#include <deque>
Henrik Lundin1f4ffe02015-08-19 10:46:50 +020015#include <string>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "modules/audio_coding/neteq/include/neteq.h"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "rtc_base/constructor_magic.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000019
20namespace webrtc {
21
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000022class DelayManager;
23
24// This class handles various network statistics in NetEq.
25class StatisticsCalculator {
26 public:
27 StatisticsCalculator();
28
Henrik Lundin1bb8cf82015-08-25 13:08:04 +020029 virtual ~StatisticsCalculator();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000030
31 // Resets most of the counters.
32 void Reset();
33
34 // Resets the counters that are not handled by Reset().
35 void ResetMcu();
36
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000037 // Reports that |num_samples| samples were produced through expansion, and
38 // that the expansion produced other than just noise samples.
Gustaf Ullberg9a2e9062017-09-18 09:28:20 +020039 void ExpandedVoiceSamples(size_t num_samples, bool is_new_concealment_event);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000040
41 // Reports that |num_samples| samples were produced through expansion, and
42 // that the expansion produced only noise samples.
Gustaf Ullberg9a2e9062017-09-18 09:28:20 +020043 void ExpandedNoiseSamples(size_t num_samples, bool is_new_concealment_event);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000044
henrik.lundin2979f552017-05-05 05:04:16 -070045 // Corrects the statistics for number of samples produced through non-noise
46 // expansion by adding |num_samples| (negative or positive) to the current
47 // value. The result is capped to zero to avoid negative values.
48 void ExpandedVoiceSamplesCorrection(int num_samples);
49
50 // Same as ExpandedVoiceSamplesCorrection but for noise samples.
51 void ExpandedNoiseSamplesCorrection(int num_samples);
52
Henrik Lundin2a8bd092019-04-26 09:47:07 +020053 void DecodedOutputPlayed();
54
55 // Mark end of expand event; triggers some stats to be reported.
56 void EndExpandEvent(int fs_hz);
57
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000058 // Reports that |num_samples| samples were produced through preemptive
59 // expansion.
Peter Kastingdce40cf2015-08-24 14:52:23 -070060 void PreemptiveExpandedSamples(size_t num_samples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000061
62 // Reports that |num_samples| samples were removed through accelerate.
Peter Kastingdce40cf2015-08-24 14:52:23 -070063 void AcceleratedSamples(size_t num_samples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000064
65 // Reports that |num_samples| zeros were inserted into the output.
Peter Kastingdce40cf2015-08-24 14:52:23 -070066 void AddZeros(size_t num_samples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000067
68 // Reports that |num_packets| packets were discarded.
minyue-webrtcfae474c2017-07-05 11:17:40 +020069 virtual void PacketsDiscarded(size_t num_packets);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000070
Ivo Creusenbf4a2212019-04-24 14:06:24 +020071 // Reports that |num_packets| secondary (FEC) packets were discarded.
72 virtual void SecondaryPacketsDiscarded(size_t num_packets);
73
74 // Reports that |num_packets| secondary (FEC) packets were received.
75 virtual void SecondaryPacketsReceived(size_t num_packets);
minyue-webrtc0c3ca752017-08-23 15:59:38 +020076
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000077 // Reports that |num_samples| were lost.
Peter Kastingdce40cf2015-08-24 14:52:23 -070078 void LostSamples(size_t num_samples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000079
80 // Increases the report interval counter with |num_samples| at a sample rate
Henrik Lundin1f4ffe02015-08-19 10:46:50 +020081 // of |fs_hz|. This is how the StatisticsCalculator gets notified that current
82 // time is increasing.
Peter Kastingdce40cf2015-08-24 14:52:23 -070083 void IncreaseCounter(size_t num_samples, int fs_hz);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000084
Gustaf Ullbergb0a02072017-10-02 12:00:34 +020085 // Update jitter buffer delay counter.
86 void JitterBufferDelay(size_t num_samples, uint64_t waiting_time_ms);
87
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000088 // Stores new packet waiting time in waiting time statistics.
89 void StoreWaitingTime(int waiting_time_ms);
90
minyue@webrtc.org2c1bcf22015-02-17 10:17:09 +000091 // Reports that |num_samples| samples were decoded from secondary packets.
92 void SecondaryDecodedSamples(int num_samples);
93
Jakob Ivarsson44507082019-03-05 16:59:03 +010094 // Reports that the packet buffer was flushed.
Ivo Creusendc6d5532018-09-27 11:43:42 +020095 void FlushedPacketBuffer();
96
Jakob Ivarsson44507082019-03-05 16:59:03 +010097 // Reports that the jitter buffer received a packet.
98 void ReceivedPacket();
99
100 // Reports that a received packet was delayed by |delay_ms| milliseconds.
101 virtual void RelativePacketArrivalDelay(size_t delay_ms);
102
Jakob Ivarsson352ce5c2018-11-27 12:52:16 +0100103 // Logs a delayed packet outage event of |num_samples| expanded at a sample
104 // rate of |fs_hz|. A delayed packet outage event is defined as an expand
105 // period caused not by an actual packet loss, but by a delayed packet.
106 virtual void LogDelayedPacketOutageEvent(int num_samples, int fs_hz);
Henrik Lundinbef77e22015-08-18 14:58:09 +0200107
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000108 // Returns the current network statistics in |stats|. The current sample rate
109 // is |fs_hz|, the total number of samples in packet buffer and sync buffer
110 // yet to play out is |num_samples_in_buffers|, and the number of samples per
Henrik Lundindccfc402017-09-25 12:30:58 +0200111 // packet is |samples_per_packet|. The method does not populate
112 // |preferred_buffer_size_ms|, |jitter_peaks_found| or |clockdrift_ppm|; use
113 // the PopulateDelayManagerStats method for those.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000114 void GetNetworkStatistics(int fs_hz,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700115 size_t num_samples_in_buffers,
116 size_t samples_per_packet,
Yves Gerey665174f2018-06-19 15:03:05 +0200117 NetEqNetworkStatistics* stats);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000118
Henrik Lundindccfc402017-09-25 12:30:58 +0200119 // Populates |preferred_buffer_size_ms|, |jitter_peaks_found| and
120 // |clockdrift_ppm| in |stats|. This is a convenience method, and does not
121 // strictly have to be in the StatisticsCalculator class, but it makes sense
122 // since all other stats fields are populated by that class.
123 static void PopulateDelayManagerStats(int ms_per_packet,
124 const DelayManager& delay_manager,
125 NetEqNetworkStatistics* stats);
126
Steve Anton2dbc69f2017-08-24 17:15:13 -0700127 // Returns a copy of this class's lifetime statistics. These statistics are
128 // never reset.
129 NetEqLifetimeStatistics GetLifetimeStatistics() const;
130
Ivo Creusend1c2f782018-09-13 14:39:55 +0200131 NetEqOperationsAndState GetOperationsAndState() const;
132
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000133 private:
134 static const int kMaxReportPeriod = 60; // Seconds before auto-reset.
Henrik Lundin1bb8cf82015-08-25 13:08:04 +0200135 static const size_t kLenWaitingTimes = 100;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000136
Henrik Lundin1f4ffe02015-08-19 10:46:50 +0200137 class PeriodicUmaLogger {
138 public:
139 PeriodicUmaLogger(const std::string& uma_name,
140 int report_interval_ms,
141 int max_value);
142 virtual ~PeriodicUmaLogger();
143 void AdvanceClock(int step_ms);
144
145 protected:
146 void LogToUma(int value) const;
147 virtual int Metric() const = 0;
148 virtual void Reset() = 0;
149
150 const std::string uma_name_;
151 const int report_interval_ms_;
152 const int max_value_;
153 int timer_ = 0;
154 };
155
156 class PeriodicUmaCount final : public PeriodicUmaLogger {
157 public:
158 PeriodicUmaCount(const std::string& uma_name,
159 int report_interval_ms,
160 int max_value);
161 ~PeriodicUmaCount() override;
162 void RegisterSample();
163
164 protected:
165 int Metric() const override;
166 void Reset() override;
167
168 private:
169 int counter_ = 0;
170 };
171
172 class PeriodicUmaAverage final : public PeriodicUmaLogger {
173 public:
174 PeriodicUmaAverage(const std::string& uma_name,
175 int report_interval_ms,
176 int max_value);
177 ~PeriodicUmaAverage() override;
178 void RegisterSample(int value);
179
180 protected:
181 int Metric() const override;
182 void Reset() override;
183
184 private:
185 double sum_ = 0.0;
186 int counter_ = 0;
187 };
188
Henrik Lundinac0a5032017-09-25 12:22:46 +0200189 // Corrects the concealed samples counter in lifetime_stats_. The value of
190 // num_samples_ is added directly to the stat if the correction is positive.
191 // If the correction is negative, it is cached and will be subtracted against
192 // future additions to the counter. This is meant to be called from
193 // Expanded{Voice,Noise}Samples{Correction}.
Alex Narest7ff6ca52018-02-07 18:46:33 +0100194 void ConcealedSamplesCorrection(int num_samples, bool is_voice);
Henrik Lundinac0a5032017-09-25 12:22:46 +0200195
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000196 // Calculates numerator / denominator, and returns the value in Q14.
Peter Kastingdce40cf2015-08-24 14:52:23 -0700197 static uint16_t CalculateQ14Ratio(size_t numerator, uint32_t denominator);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000198
Steve Anton2dbc69f2017-08-24 17:15:13 -0700199 NetEqLifetimeStatistics lifetime_stats_;
Ivo Creusend1c2f782018-09-13 14:39:55 +0200200 NetEqOperationsAndState operations_and_state_;
Henrik Lundinac0a5032017-09-25 12:22:46 +0200201 size_t concealed_samples_correction_ = 0;
Ivo Creusenbf4a2212019-04-24 14:06:24 +0200202 size_t silent_concealed_samples_correction_ = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700203 size_t preemptive_samples_;
204 size_t accelerate_samples_;
205 size_t added_zero_samples_;
206 size_t expanded_speech_samples_;
207 size_t expanded_noise_samples_;
Henrik Lundin2a8bd092019-04-26 09:47:07 +0200208 size_t concealed_samples_at_event_end_ = 0;
Peter Kastingdce40cf2015-08-24 14:52:23 -0700209 size_t discarded_packets_;
210 size_t lost_timestamps_;
henrik.lundin@webrtc.org5e3d7c72014-10-08 12:10:53 +0000211 uint32_t timestamps_since_last_report_;
Henrik Lundin1bb8cf82015-08-25 13:08:04 +0200212 std::deque<int> waiting_times_;
minyue@webrtc.org2c1bcf22015-02-17 10:17:09 +0000213 uint32_t secondary_decoded_samples_;
minyue-webrtc0c3ca752017-08-23 15:59:38 +0200214 size_t discarded_secondary_packets_;
Henrik Lundin1f4ffe02015-08-19 10:46:50 +0200215 PeriodicUmaCount delayed_packet_outage_counter_;
216 PeriodicUmaAverage excess_buffer_delay_;
Minyue Li34d990f2018-10-16 16:55:52 +0200217 PeriodicUmaCount buffer_full_counter_;
Henrik Lundin2a8bd092019-04-26 09:47:07 +0200218 bool decoded_output_played_ = false;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000219
henrikg3c089d72015-09-16 05:37:44 -0700220 RTC_DISALLOW_COPY_AND_ASSIGN(StatisticsCalculator);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000221};
222
223} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200224#endif // MODULES_AUDIO_CODING_NETEQ_STATISTICS_CALCULATOR_H_