blob: 0b2ae9fd21306cb110bdb4a299bf72f7d660c965 [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
81void SampleStats<TimeDelta>::AddSample(TimeDelta delta) {
82 RTC_DCHECK(delta.IsFinite());
83 stats_.AddSample(delta.seconds<double>());
84}
85
86void SampleStats<TimeDelta>::AddSampleMs(double delta_ms) {
87 AddSample(TimeDelta::ms(delta_ms));
88}
89void SampleStats<TimeDelta>::AddSamples(const SampleStats<TimeDelta>& other) {
90 stats_.AddSamples(other.stats_);
91}
92
Sebastian Jansson8abcf832019-05-21 10:13:06 +020093bool SampleStats<TimeDelta>::IsEmpty() {
94 return stats_.IsEmpty();
95}
96
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +020097TimeDelta SampleStats<TimeDelta>::Max() {
98 return TimeDelta::seconds(stats_.Max());
99}
100
101TimeDelta SampleStats<TimeDelta>::Mean() {
102 return TimeDelta::seconds(stats_.Mean());
103}
104
105TimeDelta SampleStats<TimeDelta>::Median() {
106 return Quantile(0.5);
107}
108
109TimeDelta SampleStats<TimeDelta>::Quantile(double quantile) {
110 return TimeDelta::seconds(stats_.Quantile(quantile));
111}
112
113TimeDelta SampleStats<TimeDelta>::Min() {
114 return TimeDelta::seconds(stats_.Min());
115}
116
117TimeDelta SampleStats<TimeDelta>::Variance() {
118 return TimeDelta::seconds(stats_.Variance());
119}
120
121TimeDelta SampleStats<TimeDelta>::StandardDeviation() {
122 return TimeDelta::seconds(stats_.StandardDeviation());
123}
124
125void SampleStats<DataRate>::AddSample(DataRate sample) {
126 stats_.AddSample(sample.bps<double>());
127}
128
129void SampleStats<DataRate>::AddSampleBps(double rate_bps) {
130 stats_.AddSample(rate_bps);
131}
132
133void SampleStats<DataRate>::AddSamples(const SampleStats<DataRate>& other) {
134 stats_.AddSamples(other.stats_);
135}
136
Sebastian Jansson8abcf832019-05-21 10:13:06 +0200137bool SampleStats<DataRate>::IsEmpty() {
138 return stats_.IsEmpty();
139}
140
Sebastian Jansson9a2ca0a2019-04-15 13:18:19 +0200141DataRate SampleStats<DataRate>::Max() {
142 return DataRate::bps(stats_.Max());
143}
144
145DataRate SampleStats<DataRate>::Mean() {
146 return DataRate::bps(stats_.Mean());
147}
148
149DataRate SampleStats<DataRate>::Median() {
150 return Quantile(0.5);
151}
152
153DataRate SampleStats<DataRate>::Quantile(double quantile) {
154 return DataRate::bps(stats_.Quantile(quantile));
155}
156
157DataRate SampleStats<DataRate>::Min() {
158 return DataRate::bps(stats_.Min());
159}
160
161DataRate SampleStats<DataRate>::Variance() {
162 return DataRate::bps(stats_.Variance());
163}
164
165DataRate SampleStats<DataRate>::StandardDeviation() {
166 return DataRate::bps(stats_.StandardDeviation());
167}
168
169void VideoFramesStats::AddFrameInfo(const VideoFrameBuffer& frame,
170 Timestamp at_time) {
171 ++count;
172 RTC_DCHECK(at_time.IsFinite());
173 pixels.AddSample(frame.width() * frame.height());
174 resolution.AddSample(std::max(frame.width(), frame.height()));
175 frames.AddEvent(at_time);
176}
177
178void VideoFramesStats::AddStats(const VideoFramesStats& other) {
179 count += other.count;
180 pixels.AddSamples(other.pixels);
181 resolution.AddSamples(other.resolution);
182 frames.AddEvents(other.frames);
183}
184
185void VideoQualityStats::AddStats(const VideoQualityStats& other) {
186 capture.AddStats(other.capture);
187 render.AddStats(other.render);
188 lost_count += other.lost_count;
189 freeze_count += other.freeze_count;
190 end_to_end_delay.AddSamples(other.end_to_end_delay);
191 psnr.AddSamples(other.psnr);
192 skipped_between_rendered.AddSamples(other.skipped_between_rendered);
193 freeze_duration.AddSamples(other.freeze_duration);
194 time_between_freezes.AddSamples(other.time_between_freezes);
195}
196
197} // namespace test
198} // namespace webrtc