xref: /aosp_15_r20/external/webrtc/test/scenario/performance_stats.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2019 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker #ifndef TEST_SCENARIO_PERFORMANCE_STATS_H_
11*d9f75844SAndroid Build Coastguard Worker #define TEST_SCENARIO_PERFORMANCE_STATS_H_
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include "api/units/data_rate.h"
14*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h"
15*d9f75844SAndroid Build Coastguard Worker #include "api/units/timestamp.h"
16*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame_buffer.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/numerics/event_rate_counter.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/numerics/sample_stats.h"
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
21*d9f75844SAndroid Build Coastguard Worker namespace test {
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker struct VideoFramePair {
24*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<VideoFrameBuffer> captured;
25*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<VideoFrameBuffer> decoded;
26*d9f75844SAndroid Build Coastguard Worker   Timestamp capture_time = Timestamp::MinusInfinity();
27*d9f75844SAndroid Build Coastguard Worker   Timestamp decoded_time = Timestamp::PlusInfinity();
28*d9f75844SAndroid Build Coastguard Worker   Timestamp render_time = Timestamp::PlusInfinity();
29*d9f75844SAndroid Build Coastguard Worker   // A unique identifier for the spatial/temporal layer the decoded frame
30*d9f75844SAndroid Build Coastguard Worker   // belongs to. Note that this does not reflect the id as defined by the
31*d9f75844SAndroid Build Coastguard Worker   // underlying layer setup.
32*d9f75844SAndroid Build Coastguard Worker   int layer_id = 0;
33*d9f75844SAndroid Build Coastguard Worker   int capture_id = 0;
34*d9f75844SAndroid Build Coastguard Worker   int decode_id = 0;
35*d9f75844SAndroid Build Coastguard Worker   // Indicates the repeat count for the decoded frame. Meaning that the same
36*d9f75844SAndroid Build Coastguard Worker   // decoded frame has matched differend captured frames.
37*d9f75844SAndroid Build Coastguard Worker   int repeated = 0;
38*d9f75844SAndroid Build Coastguard Worker };
39*d9f75844SAndroid Build Coastguard Worker 
40*d9f75844SAndroid Build Coastguard Worker 
41*d9f75844SAndroid Build Coastguard Worker struct VideoFramesStats {
42*d9f75844SAndroid Build Coastguard Worker   int count = 0;
43*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> pixels;
44*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> resolution;
45*d9f75844SAndroid Build Coastguard Worker   EventRateCounter frames;
46*d9f75844SAndroid Build Coastguard Worker   void AddFrameInfo(const VideoFrameBuffer& frame, Timestamp at_time);
47*d9f75844SAndroid Build Coastguard Worker   void AddStats(const VideoFramesStats& other);
48*d9f75844SAndroid Build Coastguard Worker };
49*d9f75844SAndroid Build Coastguard Worker 
50*d9f75844SAndroid Build Coastguard Worker struct VideoQualityStats {
51*d9f75844SAndroid Build Coastguard Worker   int lost_count = 0;
52*d9f75844SAndroid Build Coastguard Worker   int freeze_count = 0;
53*d9f75844SAndroid Build Coastguard Worker   VideoFramesStats capture;
54*d9f75844SAndroid Build Coastguard Worker   VideoFramesStats render;
55*d9f75844SAndroid Build Coastguard Worker   // Time from frame was captured on device to time frame was delivered from
56*d9f75844SAndroid Build Coastguard Worker   // decoder.
57*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> capture_to_decoded_delay;
58*d9f75844SAndroid Build Coastguard Worker   // Time from frame was captured on device to time frame was displayed on
59*d9f75844SAndroid Build Coastguard Worker   // device.
60*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> end_to_end_delay;
61*d9f75844SAndroid Build Coastguard Worker   // PSNR for delivered frames. Note that this might go up for a worse
62*d9f75844SAndroid Build Coastguard Worker   // connection due to frame dropping.
63*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> psnr;
64*d9f75844SAndroid Build Coastguard Worker   // PSNR for all frames, dropped or lost frames are compared to the last
65*d9f75844SAndroid Build Coastguard Worker   // successfully delivered frame
66*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> psnr_with_freeze;
67*d9f75844SAndroid Build Coastguard Worker   // Frames skipped between two nearest.
68*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> skipped_between_rendered;
69*d9f75844SAndroid Build Coastguard Worker   // In the next 2 metrics freeze is a pause that is longer, than maximum:
70*d9f75844SAndroid Build Coastguard Worker   //  1. 150ms
71*d9f75844SAndroid Build Coastguard Worker   //  2. 3 * average time between two sequential frames.
72*d9f75844SAndroid Build Coastguard Worker   // Item 1 will cover high fps video and is a duration, that is noticeable by
73*d9f75844SAndroid Build Coastguard Worker   // human eye. Item 2 will cover low fps video like screen sharing.
74*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> freeze_duration;
75*d9f75844SAndroid Build Coastguard Worker   // Mean time between one freeze end and next freeze start.
76*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> time_between_freezes;
77*d9f75844SAndroid Build Coastguard Worker   void AddStats(const VideoQualityStats& other);
78*d9f75844SAndroid Build Coastguard Worker };
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker struct CollectedCallStats {
81*d9f75844SAndroid Build Coastguard Worker   SampleStats<DataRate> target_rate;
82*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> pacer_delay;
83*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> round_trip_time;
84*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> memory_usage;
85*d9f75844SAndroid Build Coastguard Worker };
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker struct CollectedAudioReceiveStats {
88*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> expand_rate;
89*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> accelerate_rate;
90*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> jitter_buffer;
91*d9f75844SAndroid Build Coastguard Worker };
92*d9f75844SAndroid Build Coastguard Worker struct CollectedVideoSendStats {
93*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> encode_frame_rate;
94*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> encode_time;
95*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> encode_usage;
96*d9f75844SAndroid Build Coastguard Worker   SampleStats<DataRate> media_bitrate;
97*d9f75844SAndroid Build Coastguard Worker   SampleStats<DataRate> fec_bitrate;
98*d9f75844SAndroid Build Coastguard Worker };
99*d9f75844SAndroid Build Coastguard Worker struct CollectedVideoReceiveStats {
100*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> decode_time;
101*d9f75844SAndroid Build Coastguard Worker   SampleStats<TimeDelta> decode_time_max;
102*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> decode_pixels;
103*d9f75844SAndroid Build Coastguard Worker   SampleStats<double> resolution;
104*d9f75844SAndroid Build Coastguard Worker };
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker }  // namespace test
107*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
108*d9f75844SAndroid Build Coastguard Worker #endif  // TEST_SCENARIO_PERFORMANCE_STATS_H_
109