Index: webrtc/video/stats_counter.h |
diff --git a/webrtc/video/stats_counter.h b/webrtc/video/stats_counter.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..780a41c670a2981d497b282b2e18380caea61c12 |
--- /dev/null |
+++ b/webrtc/video/stats_counter.h |
@@ -0,0 +1,171 @@ |
+/* |
+ * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#ifndef WEBRTC_VIDEO_STATS_COUNTER_H_ |
+#define WEBRTC_VIDEO_STATS_COUNTER_H_ |
+ |
+#include <memory> |
+ |
+#include "webrtc/base/constructormagic.h" |
+#include "webrtc/typedefs.h" |
+ |
+namespace webrtc { |
+ |
+class Clock; |
+ |
+// |StatsCounterObserver| is called periodically when a metric is updated. |
+class StatsCounterObserver { |
+ public: |
+ virtual void OnMetricUpdated(int sample) = 0; |
+ |
+ virtual ~StatsCounterObserver() {} |
+}; |
+ |
+class StatsCounter { |
+ public: |
+ virtual ~StatsCounter() {} |
+ |
+ virtual bool GetMetric(int* metric) const = 0; |
+ |
+ // Class holding periodically computed metrics. |
+ class AggStats { |
mflodman
2016/05/06 07:33:29
What does 'Agg' stand for? Can you write the whole
åsapersson
2016/05/09 14:36:50
Have moved the nested classes and renamed classes.
|
+ public: |
+ AggStats(); |
+ ~AggStats() {} |
+ |
+ struct Stats { |
+ Stats(); |
+ int64_t num_samples; |
mflodman
2016/05/06 07:33:29
You can set default values here instead of using a
åsapersson
2016/05/09 14:36:50
Done.
|
+ int min; |
+ int max; |
+ int average; |
+ // TODO(asapersson): Consider adding median/percentiles. |
+ }; |
+ |
+ void Add(int sample); |
+ // Computes and returns |stats_|. |
stefan-webrtc
2016/05/06 11:10:17
Empty line above.
åsapersson
2016/05/09 14:36:50
Done.
|
+ Stats ComputeStats(); |
+ |
+ private: |
+ void Compute(); |
+ int64_t sum_; |
+ Stats stats_; |
+ }; |
+ |
+ // Returns stats from |agg_stats_|. |
+ AggStats::Stats GetStats(); |
+ |
+ protected: |
+ StatsCounter(Clock* clock, |
+ bool include_empty_intervals, |
+ StatsCounterObserver* observer); |
+ |
+ void Add(int sample); |
mflodman
2016/05/06 07:33:29
It would be good to add a comment for these two me
åsapersson
2016/05/09 14:36:50
Added more comments and examples.
|
+ void Set(int sample); |
+ |
+ int64_t sum_; |
+ int64_t num_samples_; |
+ int64_t last_sum_; |
+ |
+ private: |
+ bool TimeToProcess(); |
+ void Process(); |
+ |
+ Clock* const clock_; |
+ const bool include_empty_intervals_; |
+ const std::unique_ptr<StatsCounterObserver> observer_; |
+ int64_t last_process_time_ms_; |
+ AggStats agg_stats_; |
+}; |
+ |
+// Classes which periodically computes a metric. |
+// |
+// During a period, |kProcessIntervalMs|, different metrics can be computed: |
+// - |AvgCounter|: average of samples |
+// - |PercentCounter|: percentage of samples |
+// - |PermilleCounter|: permille of samples |
+// - |RateCounter|: units per second (sums added |sample|) |
+// - |AccRateCounter|: units per second (uses differences of set |sample|, to be |
+// used for counters) |
+// |
+// Each periodic metric can be either: |
+// - reported to an |observer| each period |
+// - aggregated during the call (e.g. min, max, average) |
+// |
+// Note: takes ownership of |observer|. |
+ |
+class AvgCounter : public StatsCounter { |
+ public: |
+ AvgCounter(Clock* clock, StatsCounterObserver* observer); |
+ ~AvgCounter() override {} |
+ |
+ void Add(int sample); |
+ |
+ private: |
+ bool GetMetric(int* metric) const override; |
+ |
+ RTC_DISALLOW_COPY_AND_ASSIGN(AvgCounter); |
+}; |
+ |
+class PercentCounter : public StatsCounter { |
+ public: |
+ PercentCounter(Clock* clock, StatsCounterObserver* observer); |
+ ~PercentCounter() override {} |
+ |
+ void Add(bool sample); |
+ |
+ private: |
+ bool GetMetric(int* metric) const override; |
+ |
+ RTC_DISALLOW_COPY_AND_ASSIGN(PercentCounter); |
+}; |
+ |
+class PermilleCounter : public StatsCounter { |
+ public: |
+ PermilleCounter(Clock* clock, StatsCounterObserver* observer); |
+ ~PermilleCounter() override {} |
+ |
+ void Add(bool sample); |
+ |
+ private: |
+ bool GetMetric(int* metric) const override; |
+ |
+ RTC_DISALLOW_COPY_AND_ASSIGN(PermilleCounter); |
+}; |
+ |
+class RateCounter : public StatsCounter { |
+ public: |
+ RateCounter(Clock* clock, StatsCounterObserver* observer); |
+ ~RateCounter() override {} |
+ |
+ void Add(int sample); |
+ |
+ private: |
+ bool GetMetric(int* metric) const override; |
+ |
+ RTC_DISALLOW_COPY_AND_ASSIGN(RateCounter); |
+}; |
+ |
+class RateAccCounter : public StatsCounter { |
mflodman
2016/05/06 07:33:29
It would be good with a class description for thes
åsapersson
2016/05/09 14:36:50
Done.
|
+ public: |
+ RateAccCounter(Clock* clock, StatsCounterObserver* observer); |
+ ~RateAccCounter() override {} |
+ |
+ void Set(int sample); |
+ |
+ private: |
+ bool GetMetric(int* metric) const override; |
+ |
+ RTC_DISALLOW_COPY_AND_ASSIGN(RateAccCounter); |
+}; |
+ |
+} // namespace webrtc |
+ |
+#endif // WEBRTC_VIDEO_STATS_COUNTER_H_ |