Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Unified Diff: webrtc/video/stats_counter.h

Issue 1640053003: Add class which periodically computes statistics. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..4541d2374cea888065ace2f79b85d5f6db8ea6c8
--- /dev/null
+++ b/webrtc/video/stats_counter.h
@@ -0,0 +1,179 @@
+/*
+ * 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 <map>
+
+#include "webrtc/base/scoped_ptr.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 Histogram {
+ public:
+ Histogram(size_t bucket_count, size_t bucket_max);
+ ~Histogram() {}
+
+ void Add(int sample);
+
+ struct Stats {
+ Stats();
+ int64_t num_samples;
+ int min;
+ int max;
+ int average;
+ int percentile10;
+ int percentile50;
+ int percentile90;
+ };
+
+ // Computes and returns |stats_|.
+ Stats stats();
stefan-webrtc 2016/01/29 15:22:46 ComputeStats() or ComputeAndGetStats()? Should pro
+
+ private:
+ void InitializeBuckets();
+ void AddToBucket(size_t sample);
+ void Compute();
+
+ // Number of samples per bucket mapped by start of bucket.
+ std::map<size_t, size_t> buckets_;
+ const size_t bucket_count_;
+ const size_t bucket_max_;
+ const bool bucket_size1_;
stefan-webrtc 2016/01/29 15:22:46 bucket_size_?
+ int64_t sum_;
+ Stats stats_;
+ };
+
+ // Returns stats from |histogram_|.
+ Histogram::Stats GetStats();
+
+ protected:
+ StatsCounter(Clock* clock,
+ size_t bucket_count,
+ size_t bucket_max,
+ bool include_empty_intervals,
+ StatsCounterObserver* observer);
+
+ // Adds/sets sample. Periodically calls GetMetric and adds it to |histogram_|.
+ void Add(int sample);
+ 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 rtc::scoped_ptr<StatsCounterObserver> observer_;
+ int64_t last_process_time_ms_;
+ Histogram histogram_;
+};
stefan-webrtc 2016/01/29 15:22:46 You probably want to disable the copy constructor
+
+// Classes which periodically computes a metric (based on added samples in
+// the interval) and adds it to a histogram.
+//
+// |bucket_count| == |bucket_max|: => linear histogram (bucket size:1)
+// |bucket_count| < |bucket_max|: => exponential histogram
+//
+// Note: takes ownership of |observer|.
+
+class AvgCounter : public StatsCounter {
+ public:
+ AvgCounter(Clock* clock,
+ size_t bucket_count,
+ size_t bucket_max,
+ StatsCounterObserver* observer);
+ ~AvgCounter() override {}
+
+ void Add(int sample);
+
+ private:
+ bool GetMetric(int* metric) const override;
+};
+
+class PercentCounter : public StatsCounter {
+ public:
+ PercentCounter(Clock* clock, StatsCounterObserver* observer);
+ ~PercentCounter() override {}
+
+ void Add(bool sample);
+
+ private:
+ bool GetMetric(int* metric) const override;
+};
+
+class PermilleCounter : public StatsCounter {
+ public:
+ PermilleCounter(Clock* clock,
+ size_t bucket_count,
+ StatsCounterObserver* observer);
+ ~PermilleCounter() override {}
+
+ void Add(bool sample);
+
+ private:
+ bool GetMetric(int* metric) const override;
+};
+
+class RateCounter : public StatsCounter {
+ public:
+ RateCounter(Clock* clock,
+ size_t bucket_count,
+ size_t bucket_max,
+ bool include_empty_intervals,
+ StatsCounterObserver* observer);
+ ~RateCounter() override {}
+
+ void Add(int sample);
+
+ private:
+ bool GetMetric(int* metric) const override;
+};
+
+class RateAccCounter : public StatsCounter {
+ public:
+ RateAccCounter(Clock* clock,
+ size_t bucket_count,
+ size_t bucket_max,
+ bool include_empty_intervals,
+ StatsCounterObserver* observer);
+ ~RateAccCounter() override {}
+
+ void Set(int sample);
+
+ private:
+ bool GetMetric(int* metric) const override;
+};
+
+} // namespace webrtc
+
+#endif // WEBRTC_VIDEO_STATS_COUNTER_H_

Powered by Google App Engine
This is Rietveld 408576698