1 /*
2  *  Copyright (c) 2016 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 VIDEO_QUALITY_THRESHOLD_H_
12 #define VIDEO_QUALITY_THRESHOLD_H_
13 
14 #include <memory>
15 
16 #include "absl/types/optional.h"
17 
18 namespace webrtc {
19 
20 class QualityThreshold {
21  public:
22   // Both thresholds are inclusive, i.e. measurement >= high signifies a high
23   // state, while measurement <= low signifies a low state.
24   QualityThreshold(int low_threshold,
25                    int high_threshold,
26                    float fraction,
27                    int max_measurements);
28   ~QualityThreshold();
29 
30   void AddMeasurement(int measurement);
31   absl::optional<bool> IsHigh() const;
32   absl::optional<double> CalculateVariance() const;
33   absl::optional<double> FractionHigh(int min_required_samples) const;
34 
35  private:
36   const std::unique_ptr<int[]> buffer_;
37   const int max_measurements_;
38   const float fraction_;
39   const int low_threshold_;
40   const int high_threshold_;
41   int until_full_;
42   int next_index_;
43   absl::optional<bool> is_high_;
44   int sum_;
45   int count_low_;
46   int count_high_;
47   int num_high_states_;
48   int num_certain_states_;
49 };
50 
51 }  // namespace webrtc
52 
53 #endif  // VIDEO_QUALITY_THRESHOLD_H_
54