1 /* 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 11 #ifndef WEBRTC_MODULES_AUDIO_CODING_NETEQ_STATISTICS_CALCULATOR_H_ 12 #define WEBRTC_MODULES_AUDIO_CODING_NETEQ_STATISTICS_CALCULATOR_H_ 13 14 #include <deque> 15 #include <string> 16 17 #include "webrtc/base/constructormagic.h" 18 #include "webrtc/modules/audio_coding/neteq/include/neteq.h" 19 #include "webrtc/typedefs.h" 20 21 namespace webrtc { 22 23 // Forward declarations. 24 class DecisionLogic; 25 class DelayManager; 26 27 // This class handles various network statistics in NetEq. 28 class StatisticsCalculator { 29 public: 30 StatisticsCalculator(); 31 32 virtual ~StatisticsCalculator(); 33 34 // Resets most of the counters. 35 void Reset(); 36 37 // Resets the counters that are not handled by Reset(). 38 void ResetMcu(); 39 40 // Reports that |num_samples| samples were produced through expansion, and 41 // that the expansion produced other than just noise samples. 42 void ExpandedVoiceSamples(size_t num_samples); 43 44 // Reports that |num_samples| samples were produced through expansion, and 45 // that the expansion produced only noise samples. 46 void ExpandedNoiseSamples(size_t num_samples); 47 48 // Reports that |num_samples| samples were produced through preemptive 49 // expansion. 50 void PreemptiveExpandedSamples(size_t num_samples); 51 52 // Reports that |num_samples| samples were removed through accelerate. 53 void AcceleratedSamples(size_t num_samples); 54 55 // Reports that |num_samples| zeros were inserted into the output. 56 void AddZeros(size_t num_samples); 57 58 // Reports that |num_packets| packets were discarded. 59 void PacketsDiscarded(size_t num_packets); 60 61 // Reports that |num_samples| were lost. 62 void LostSamples(size_t num_samples); 63 64 // Increases the report interval counter with |num_samples| at a sample rate 65 // of |fs_hz|. This is how the StatisticsCalculator gets notified that current 66 // time is increasing. 67 void IncreaseCounter(size_t num_samples, int fs_hz); 68 69 // Stores new packet waiting time in waiting time statistics. 70 void StoreWaitingTime(int waiting_time_ms); 71 72 // Reports that |num_samples| samples were decoded from secondary packets. 73 void SecondaryDecodedSamples(int num_samples); 74 75 // Logs a delayed packet outage event of |outage_duration_ms|. A delayed 76 // packet outage event is defined as an expand period caused not by an actual 77 // packet loss, but by a delayed packet. 78 virtual void LogDelayedPacketOutageEvent(int outage_duration_ms); 79 80 // Returns the current network statistics in |stats|. The current sample rate 81 // is |fs_hz|, the total number of samples in packet buffer and sync buffer 82 // yet to play out is |num_samples_in_buffers|, and the number of samples per 83 // packet is |samples_per_packet|. 84 void GetNetworkStatistics(int fs_hz, 85 size_t num_samples_in_buffers, 86 size_t samples_per_packet, 87 const DelayManager& delay_manager, 88 const DecisionLogic& decision_logic, 89 NetEqNetworkStatistics *stats); 90 91 private: 92 static const int kMaxReportPeriod = 60; // Seconds before auto-reset. 93 static const size_t kLenWaitingTimes = 100; 94 95 class PeriodicUmaLogger { 96 public: 97 PeriodicUmaLogger(const std::string& uma_name, 98 int report_interval_ms, 99 int max_value); 100 virtual ~PeriodicUmaLogger(); 101 void AdvanceClock(int step_ms); 102 103 protected: 104 void LogToUma(int value) const; 105 virtual int Metric() const = 0; 106 virtual void Reset() = 0; 107 108 const std::string uma_name_; 109 const int report_interval_ms_; 110 const int max_value_; 111 int timer_ = 0; 112 }; 113 114 class PeriodicUmaCount final : public PeriodicUmaLogger { 115 public: 116 PeriodicUmaCount(const std::string& uma_name, 117 int report_interval_ms, 118 int max_value); 119 ~PeriodicUmaCount() override; 120 void RegisterSample(); 121 122 protected: 123 int Metric() const override; 124 void Reset() override; 125 126 private: 127 int counter_ = 0; 128 }; 129 130 class PeriodicUmaAverage final : public PeriodicUmaLogger { 131 public: 132 PeriodicUmaAverage(const std::string& uma_name, 133 int report_interval_ms, 134 int max_value); 135 ~PeriodicUmaAverage() override; 136 void RegisterSample(int value); 137 138 protected: 139 int Metric() const override; 140 void Reset() override; 141 142 private: 143 double sum_ = 0.0; 144 int counter_ = 0; 145 }; 146 147 // Calculates numerator / denominator, and returns the value in Q14. 148 static uint16_t CalculateQ14Ratio(size_t numerator, uint32_t denominator); 149 150 size_t preemptive_samples_; 151 size_t accelerate_samples_; 152 size_t added_zero_samples_; 153 size_t expanded_speech_samples_; 154 size_t expanded_noise_samples_; 155 size_t discarded_packets_; 156 size_t lost_timestamps_; 157 uint32_t timestamps_since_last_report_; 158 std::deque<int> waiting_times_; 159 uint32_t secondary_decoded_samples_; 160 PeriodicUmaCount delayed_packet_outage_counter_; 161 PeriodicUmaAverage excess_buffer_delay_; 162 163 RTC_DISALLOW_COPY_AND_ASSIGN(StatisticsCalculator); 164 }; 165 166 } // namespace webrtc 167 #endif // WEBRTC_MODULES_AUDIO_CODING_NETEQ_STATISTICS_CALCULATOR_H_ 168