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