blob: 0bbf86dc614eaf9647ea67d9ffab61df04d8f424 [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
43double SampleStats<double>::Max() {
44 if (IsEmpty())
45 return INFINITY;
46 return GetMax();
47}
48
49double SampleStats<double>::Mean() {
50 if (IsEmpty())
51 return 0;
52 return GetAverage();
53}
54
55double SampleStats<double>::Median() {
56 return Quantile(0.5);
57}
58
59double SampleStats<double>::Quantile(double quantile) {
60 if (IsEmpty())
61 return 0;
62 return GetPercentile(quantile);
63}
64
65double SampleStats<double>::Min() {
66 if (IsEmpty())
67 return -INFINITY;
68 return GetMin();
69}
70
71double SampleStats<double>::Variance() {
72 if (IsEmpty())
73 return 0;
74 return GetVariance();
75}
76
77double SampleStats<double>::StandardDeviation() {
78 return sqrt(Variance());
79}
80
Sebastian Janssone9cac4f2019-06-24 17:10:55 +020081int SampleStats<double>::Count() {
82 return static_cast<int>(GetSamples().size());
83}
84
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +020085void SampleStats<TimeDelta>::AddSample(TimeDelta delta) {
86 RTC_DCHECK(delta.IsFinite());
87 stats_.AddSample(delta.seconds<double>());
88}
89
90void SampleStats<TimeDelta>::AddSampleMs(double delta_ms) {
91 AddSample(TimeDelta::ms(delta_ms));
92}
93void SampleStats<TimeDelta>::AddSamples(const SampleStats<TimeDelta>& other) {
94 stats_.AddSamples(other.stats_);
95}
96
Sebastian Jansson8abcf832019-05-21 10:13:06 +020097bool SampleStats<TimeDelta>::IsEmpty() {
98 return stats_.IsEmpty();
99}
100
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200101TimeDelta SampleStats<TimeDelta>::Max() {
102 return TimeDelta::seconds(stats_.Max());
103}
104
105TimeDelta SampleStats<TimeDelta>::Mean() {
106 return TimeDelta::seconds(stats_.Mean());
107}
108
109TimeDelta SampleStats<TimeDelta>::Median() {
110 return Quantile(0.5);
111}
112
113TimeDelta SampleStats<TimeDelta>::Quantile(double quantile) {
114 return TimeDelta::seconds(stats_.Quantile(quantile));
115}
116
117TimeDelta SampleStats<TimeDelta>::Min() {
118 return TimeDelta::seconds(stats_.Min());
119}
120
121TimeDelta SampleStats<TimeDelta>::Variance() {
122 return TimeDelta::seconds(stats_.Variance());
123}
124
125TimeDelta SampleStats<TimeDelta>::StandardDeviation() {
126 return TimeDelta::seconds(stats_.StandardDeviation());
127}
128
Sebastian Janssone9cac4f2019-06-24 17:10:55 +0200129int SampleStats<TimeDelta>::Count() {
130 return stats_.Count();
131}
132
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200133void SampleStats<DataRate>::AddSample(DataRate sample) {
134 stats_.AddSample(sample.bps<double>());
135}
136
137void SampleStats<DataRate>::AddSampleBps(double rate_bps) {
138 stats_.AddSample(rate_bps);
139}
140
141void SampleStats<DataRate>::AddSamples(const SampleStats<DataRate>& other) {
142 stats_.AddSamples(other.stats_);
143}
144
Sebastian Jansson8abcf832019-05-21 10:13:06 +0200145bool SampleStats<DataRate>::IsEmpty() {
146 return stats_.IsEmpty();
147}
148
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200149DataRate SampleStats<DataRate>::Max() {
150 return DataRate::bps(stats_.Max());
151}
152
153DataRate SampleStats<DataRate>::Mean() {
154 return DataRate::bps(stats_.Mean());
155}
156
157DataRate SampleStats<DataRate>::Median() {
158 return Quantile(0.5);
159}
160
161DataRate SampleStats<DataRate>::Quantile(double quantile) {
162 return DataRate::bps(stats_.Quantile(quantile));
163}
164
165DataRate SampleStats<DataRate>::Min() {
166 return DataRate::bps(stats_.Min());
167}
168
169DataRate SampleStats<DataRate>::Variance() {
170 return DataRate::bps(stats_.Variance());
171}
172
173DataRate SampleStats<DataRate>::StandardDeviation() {
174 return DataRate::bps(stats_.StandardDeviation());
175}
176
Sebastian Janssone9cac4f2019-06-24 17:10:55 +0200177int SampleStats<DataRate>::Count() {
178 return stats_.Count();
179}
180
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200181void VideoFramesStats::AddFrameInfo(const VideoFrameBuffer& frame,
182 Timestamp at_time) {
183 ++count;
184 RTC_DCHECK(at_time.IsFinite());
185 pixels.AddSample(frame.width() * frame.height());
186 resolution.AddSample(std::max(frame.width(), frame.height()));
187 frames.AddEvent(at_time);
188}
189
190void VideoFramesStats::AddStats(const VideoFramesStats& other) {
191 count += other.count;
192 pixels.AddSamples(other.pixels);
193 resolution.AddSamples(other.resolution);
194 frames.AddEvents(other.frames);
195}
196
197void VideoQualityStats::AddStats(const VideoQualityStats& other) {
198 capture.AddStats(other.capture);
199 render.AddStats(other.render);
200 lost_count += other.lost_count;
201 freeze_count += other.freeze_count;
Sebastian Janssone9cac4f2019-06-24 17:10:55 +0200202 capture_to_decoded_delay.AddSamples(other.capture_to_decoded_delay);
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200203 end_to_end_delay.AddSamples(other.end_to_end_delay);
204 psnr.AddSamples(other.psnr);
Sebastian Janssone9cac4f2019-06-24 17:10:55 +0200205 psnr_with_freeze.AddSamples(other.psnr_with_freeze);
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200206 skipped_between_rendered.AddSamples(other.skipped_between_rendered);
207 freeze_duration.AddSamples(other.freeze_duration);
208 time_between_freezes.AddSamples(other.time_between_freezes);
209}
210
211} // namespace test
212} // namespace webrtc