blob: 3471cbe0e1e9973694442ea222600b918865de17 [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
93TimeDelta SampleStats<TimeDelta>::Max() {
94 return TimeDelta::seconds(stats_.Max());
95}
96
97TimeDelta SampleStats<TimeDelta>::Mean() {
98 return TimeDelta::seconds(stats_.Mean());
99}
100
101TimeDelta SampleStats<TimeDelta>::Median() {
102 return Quantile(0.5);
103}
104
105TimeDelta SampleStats<TimeDelta>::Quantile(double quantile) {
106 return TimeDelta::seconds(stats_.Quantile(quantile));
107}
108
109TimeDelta SampleStats<TimeDelta>::Min() {
110 return TimeDelta::seconds(stats_.Min());
111}
112
113TimeDelta SampleStats<TimeDelta>::Variance() {
114 return TimeDelta::seconds(stats_.Variance());
115}
116
117TimeDelta SampleStats<TimeDelta>::StandardDeviation() {
118 return TimeDelta::seconds(stats_.StandardDeviation());
119}
120
121void SampleStats<DataRate>::AddSample(DataRate sample) {
122 stats_.AddSample(sample.bps<double>());
123}
124
125void SampleStats<DataRate>::AddSampleBps(double rate_bps) {
126 stats_.AddSample(rate_bps);
127}
128
129void SampleStats<DataRate>::AddSamples(const SampleStats<DataRate>& other) {
130 stats_.AddSamples(other.stats_);
131}
132
133DataRate SampleStats<DataRate>::Max() {
134 return DataRate::bps(stats_.Max());
135}
136
137DataRate SampleStats<DataRate>::Mean() {
138 return DataRate::bps(stats_.Mean());
139}
140
141DataRate SampleStats<DataRate>::Median() {
142 return Quantile(0.5);
143}
144
145DataRate SampleStats<DataRate>::Quantile(double quantile) {
146 return DataRate::bps(stats_.Quantile(quantile));
147}
148
149DataRate SampleStats<DataRate>::Min() {
150 return DataRate::bps(stats_.Min());
151}
152
153DataRate SampleStats<DataRate>::Variance() {
154 return DataRate::bps(stats_.Variance());
155}
156
157DataRate SampleStats<DataRate>::StandardDeviation() {
158 return DataRate::bps(stats_.StandardDeviation());
159}
160
161void VideoFramesStats::AddFrameInfo(const VideoFrameBuffer& frame,
162 Timestamp at_time) {
163 ++count;
164 RTC_DCHECK(at_time.IsFinite());
165 pixels.AddSample(frame.width() * frame.height());
166 resolution.AddSample(std::max(frame.width(), frame.height()));
167 frames.AddEvent(at_time);
168}
169
170void VideoFramesStats::AddStats(const VideoFramesStats& other) {
171 count += other.count;
172 pixels.AddSamples(other.pixels);
173 resolution.AddSamples(other.resolution);
174 frames.AddEvents(other.frames);
175}
176
177void VideoQualityStats::AddStats(const VideoQualityStats& other) {
178 capture.AddStats(other.capture);
179 render.AddStats(other.render);
180 lost_count += other.lost_count;
181 freeze_count += other.freeze_count;
182 end_to_end_delay.AddSamples(other.end_to_end_delay);
183 psnr.AddSamples(other.psnr);
184 skipped_between_rendered.AddSamples(other.skipped_between_rendered);
185 freeze_duration.AddSamples(other.freeze_duration);
186 time_between_freezes.AddSamples(other.time_between_freezes);
187}
188
189} // namespace test
190} // namespace webrtc