• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2022 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 API_TEST_METRICS_METRIC_H_
12 #define API_TEST_METRICS_METRIC_H_
13 
14 #include <map>
15 #include <string>
16 #include <vector>
17 
18 #include "absl/types/optional.h"
19 #include "api/units/timestamp.h"
20 
21 namespace webrtc {
22 namespace test {
23 
24 enum class Unit {
25   kMilliseconds,
26   kPercent,
27   kBytes,
28   kKilobitsPerSecond,
29   kHertz,
30   // General unitless value. Can be used either for dimensionless quantities
31   // (ex ratio) or for units not presented in this enum and too specific to add
32   // to this enum.
33   kUnitless,
34   kCount
35 };
36 
37 absl::string_view ToString(Unit unit);
38 
39 enum class ImprovementDirection {
40   kBiggerIsBetter,
41   kNeitherIsBetter,
42   kSmallerIsBetter
43 };
44 
45 absl::string_view ToString(ImprovementDirection direction);
46 
47 struct Metric {
48   struct TimeSeries {
49     struct Sample {
50       // Timestamp in microseconds associated with a sample. For example,
51       // the timestamp when the sample was collected.
52       webrtc::Timestamp timestamp;
53       double value;
54       // Metadata associated with this particular sample.
55       std::map<std::string, std::string> sample_metadata;
56     };
57 
58     // All samples collected for this metric. It can be empty if the Metric
59     // object only contains `stats`.
60     std::vector<Sample> samples;
61   };
62 
63   // Contains metric's precomputed statistics based on the `time_series` or if
64   // `time_series` is omitted (has 0 samples) contains precomputed statistics
65   // provided by the metric's calculator.
66   struct Stats {
67     // Sample mean of the metric
68     // (https://en.wikipedia.org/wiki/Sample_mean_and_covariance).
69     absl::optional<double> mean;
70     // Standard deviation (https://en.wikipedia.org/wiki/Standard_deviation).
71     // Is undefined if `time_series` contains only a single value.
72     absl::optional<double> stddev;
73     absl::optional<double> min;
74     absl::optional<double> max;
75   };
76 
77   // Metric name, for example PSNR, SSIM, decode_time, etc.
78   std::string name;
79   Unit unit;
80   ImprovementDirection improvement_direction;
81   // If the metric is generated by a test, this field can be used to specify
82   // this information.
83   std::string test_case;
84   // Metadata associated with the whole metric.
85   std::map<std::string, std::string> metric_metadata;
86   // Contains all samples of the metric collected during test execution.
87   // It can be empty if the user only stores precomputed statistics into
88   // `stats`.
89   TimeSeries time_series;
90   Stats stats;
91 };
92 
93 }  // namespace test
94 }  // namespace webrtc
95 
96 #endif  // API_TEST_METRICS_METRIC_H_
97