blob: 5f5b506c1f22750224b37e05df034f3236efe562 [file] [log] [blame]
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +02001/*
2 * Copyright 2019 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#include "test/scenario/performance_stats.h"
11
12#include <algorithm>
13
14namespace webrtc {
15namespace test {
16void EventRateCounter::AddEvent(Timestamp event_time) {
Sebastian Janssoneb02a762019-04-15 16:20:44 +020017 if (first_time_.IsFinite())
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +020018 interval_.AddSample(event_time - last_time_);
Sebastian Janssoneb02a762019-04-15 16:20:44 +020019 first_time_ = std::min(first_time_, event_time);
20 last_time_ = std::max(last_time_, event_time);
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +020021 event_count_++;
22}
23
24void EventRateCounter::AddEvents(EventRateCounter other) {
25 first_time_ = std::min(first_time_, other.first_time_);
26 last_time_ = std::max(last_time_, other.last_time_);
27 event_count_ += other.event_count_;
28 interval_.AddSamples(other.interval_);
29}
30
31bool EventRateCounter::IsEmpty() const {
32 return first_time_ == last_time_;
33}
34
35double EventRateCounter::Rate() const {
36 if (event_count_ == 0)
37 return 0;
38 if (event_count_ == 1)
39 return NAN;
40 return (event_count_ - 1) / (last_time_ - first_time_).seconds<double>();
41}
42
Evan Shrubsole9ddd7292019-10-09 10:37:09 +020043TimeDelta EventRateCounter::TotalDuration() const {
44 if (first_time_.IsInfinite()) {
45 return TimeDelta::Zero();
46 }
47 return last_time_ - first_time_;
48}
49
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +020050double SampleStats<double>::Max() {
51 if (IsEmpty())
52 return INFINITY;
53 return GetMax();
54}
55
56double SampleStats<double>::Mean() {
57 if (IsEmpty())
58 return 0;
59 return GetAverage();
60}
61
62double SampleStats<double>::Median() {
63 return Quantile(0.5);
64}
65
66double SampleStats<double>::Quantile(double quantile) {
67 if (IsEmpty())
68 return 0;
69 return GetPercentile(quantile);
70}
71
72double SampleStats<double>::Min() {
73 if (IsEmpty())
74 return -INFINITY;
75 return GetMin();
76}
77
78double SampleStats<double>::Variance() {
79 if (IsEmpty())
80 return 0;
81 return GetVariance();
82}
83
84double SampleStats<double>::StandardDeviation() {
85 return sqrt(Variance());
86}
87
Sebastian Janssone9cac4f2019-06-24 17:10:55 +020088int SampleStats<double>::Count() {
89 return static_cast<int>(GetSamples().size());
90}
91
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +020092void SampleStats<TimeDelta>::AddSample(TimeDelta delta) {
93 RTC_DCHECK(delta.IsFinite());
94 stats_.AddSample(delta.seconds<double>());
95}
96
97void SampleStats<TimeDelta>::AddSampleMs(double delta_ms) {
98 AddSample(TimeDelta::ms(delta_ms));
99}
100void SampleStats<TimeDelta>::AddSamples(const SampleStats<TimeDelta>& other) {
101 stats_.AddSamples(other.stats_);
102}
103
Sebastian Jansson8abcf832019-05-21 10:13:06 +0200104bool SampleStats<TimeDelta>::IsEmpty() {
105 return stats_.IsEmpty();
106}
107
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200108TimeDelta SampleStats<TimeDelta>::Max() {
109 return TimeDelta::seconds(stats_.Max());
110}
111
112TimeDelta SampleStats<TimeDelta>::Mean() {
113 return TimeDelta::seconds(stats_.Mean());
114}
115
116TimeDelta SampleStats<TimeDelta>::Median() {
117 return Quantile(0.5);
118}
119
120TimeDelta SampleStats<TimeDelta>::Quantile(double quantile) {
121 return TimeDelta::seconds(stats_.Quantile(quantile));
122}
123
124TimeDelta SampleStats<TimeDelta>::Min() {
125 return TimeDelta::seconds(stats_.Min());
126}
127
128TimeDelta SampleStats<TimeDelta>::Variance() {
129 return TimeDelta::seconds(stats_.Variance());
130}
131
132TimeDelta SampleStats<TimeDelta>::StandardDeviation() {
133 return TimeDelta::seconds(stats_.StandardDeviation());
134}
135
Sebastian Janssone9cac4f2019-06-24 17:10:55 +0200136int SampleStats<TimeDelta>::Count() {
137 return stats_.Count();
138}
139
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200140void SampleStats<DataRate>::AddSample(DataRate sample) {
141 stats_.AddSample(sample.bps<double>());
142}
143
144void SampleStats<DataRate>::AddSampleBps(double rate_bps) {
145 stats_.AddSample(rate_bps);
146}
147
148void SampleStats<DataRate>::AddSamples(const SampleStats<DataRate>& other) {
149 stats_.AddSamples(other.stats_);
150}
151
Sebastian Jansson8abcf832019-05-21 10:13:06 +0200152bool SampleStats<DataRate>::IsEmpty() {
153 return stats_.IsEmpty();
154}
155
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200156DataRate SampleStats<DataRate>::Max() {
157 return DataRate::bps(stats_.Max());
158}
159
160DataRate SampleStats<DataRate>::Mean() {
161 return DataRate::bps(stats_.Mean());
162}
163
164DataRate SampleStats<DataRate>::Median() {
165 return Quantile(0.5);
166}
167
168DataRate SampleStats<DataRate>::Quantile(double quantile) {
169 return DataRate::bps(stats_.Quantile(quantile));
170}
171
172DataRate SampleStats<DataRate>::Min() {
173 return DataRate::bps(stats_.Min());
174}
175
176DataRate SampleStats<DataRate>::Variance() {
177 return DataRate::bps(stats_.Variance());
178}
179
180DataRate SampleStats<DataRate>::StandardDeviation() {
181 return DataRate::bps(stats_.StandardDeviation());
182}
183
Sebastian Janssone9cac4f2019-06-24 17:10:55 +0200184int SampleStats<DataRate>::Count() {
185 return stats_.Count();
186}
187
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200188void VideoFramesStats::AddFrameInfo(const VideoFrameBuffer& frame,
189 Timestamp at_time) {
190 ++count;
191 RTC_DCHECK(at_time.IsFinite());
192 pixels.AddSample(frame.width() * frame.height());
193 resolution.AddSample(std::max(frame.width(), frame.height()));
194 frames.AddEvent(at_time);
195}
196
197void VideoFramesStats::AddStats(const VideoFramesStats& other) {
198 count += other.count;
199 pixels.AddSamples(other.pixels);
200 resolution.AddSamples(other.resolution);
201 frames.AddEvents(other.frames);
202}
203
204void VideoQualityStats::AddStats(const VideoQualityStats& other) {
205 capture.AddStats(other.capture);
206 render.AddStats(other.render);
207 lost_count += other.lost_count;
208 freeze_count += other.freeze_count;
Sebastian Janssone9cac4f2019-06-24 17:10:55 +0200209 capture_to_decoded_delay.AddSamples(other.capture_to_decoded_delay);
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200210 end_to_end_delay.AddSamples(other.end_to_end_delay);
211 psnr.AddSamples(other.psnr);
Sebastian Janssone9cac4f2019-06-24 17:10:55 +0200212 psnr_with_freeze.AddSamples(other.psnr_with_freeze);
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200213 skipped_between_rendered.AddSamples(other.skipped_between_rendered);
214 freeze_duration.AddSamples(other.freeze_duration);
215 time_between_freezes.AddSamples(other.time_between_freezes);
216}
217
218} // namespace test
219} // namespace webrtc