mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 14:20:45 +01:00

This can be better used to determine the length of test calls, rather than using the interval metric. Bug: webrtc:11017 Change-Id: I69f66fa750b061a7d010d591a718555e2b5b34b7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156087 Commit-Queue: Evan Shrubsole <eshr@google.com> Reviewed-by: Sebastian Jansson <srte@webrtc.org> Cr-Commit-Position: refs/heads/master@{#29413}
179 lines
5.3 KiB
C++
179 lines
5.3 KiB
C++
/*
|
|
* Copyright 2019 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
#ifndef TEST_SCENARIO_PERFORMANCE_STATS_H_
|
|
#define TEST_SCENARIO_PERFORMANCE_STATS_H_
|
|
|
|
#include "api/units/data_rate.h"
|
|
#include "api/units/time_delta.h"
|
|
#include "api/units/timestamp.h"
|
|
#include "api/video/video_frame_buffer.h"
|
|
#include "rtc_base/numerics/samples_stats_counter.h"
|
|
|
|
namespace webrtc {
|
|
namespace test {
|
|
|
|
struct VideoFramePair {
|
|
rtc::scoped_refptr<VideoFrameBuffer> captured;
|
|
rtc::scoped_refptr<VideoFrameBuffer> decoded;
|
|
Timestamp capture_time = Timestamp::MinusInfinity();
|
|
Timestamp decoded_time = Timestamp::PlusInfinity();
|
|
Timestamp render_time = Timestamp::PlusInfinity();
|
|
// A unique identifier for the spatial/temporal layer the decoded frame
|
|
// belongs to. Note that this does not reflect the id as defined by the
|
|
// underlying layer setup.
|
|
int layer_id = 0;
|
|
int capture_id = 0;
|
|
int decode_id = 0;
|
|
// Indicates the repeat count for the decoded frame. Meaning that the same
|
|
// decoded frame has matched differend captured frames.
|
|
int repeated = 0;
|
|
};
|
|
|
|
template <typename T>
|
|
class SampleStats;
|
|
|
|
template <>
|
|
class SampleStats<double> : public SamplesStatsCounter {
|
|
public:
|
|
double Max();
|
|
double Mean();
|
|
double Median();
|
|
double Quantile(double quantile);
|
|
double Min();
|
|
double Variance();
|
|
double StandardDeviation();
|
|
int Count();
|
|
};
|
|
|
|
template <>
|
|
class SampleStats<TimeDelta> {
|
|
public:
|
|
void AddSample(TimeDelta delta);
|
|
void AddSampleMs(double delta_ms);
|
|
void AddSamples(const SampleStats<TimeDelta>& other);
|
|
bool IsEmpty();
|
|
TimeDelta Max();
|
|
TimeDelta Mean();
|
|
TimeDelta Median();
|
|
TimeDelta Quantile(double quantile);
|
|
TimeDelta Min();
|
|
TimeDelta Variance();
|
|
TimeDelta StandardDeviation();
|
|
int Count();
|
|
|
|
private:
|
|
SampleStats<double> stats_;
|
|
};
|
|
|
|
template <>
|
|
class SampleStats<DataRate> {
|
|
public:
|
|
void AddSample(DataRate rate);
|
|
void AddSampleBps(double rate_bps);
|
|
void AddSamples(const SampleStats<DataRate>& other);
|
|
bool IsEmpty();
|
|
DataRate Max();
|
|
DataRate Mean();
|
|
DataRate Median();
|
|
DataRate Quantile(double quantile);
|
|
DataRate Min();
|
|
DataRate Variance();
|
|
DataRate StandardDeviation();
|
|
int Count();
|
|
|
|
private:
|
|
SampleStats<double> stats_;
|
|
};
|
|
|
|
class EventRateCounter {
|
|
public:
|
|
void AddEvent(Timestamp event_time);
|
|
void AddEvents(EventRateCounter other);
|
|
bool IsEmpty() const;
|
|
double Rate() const;
|
|
SampleStats<TimeDelta>& interval() { return interval_; }
|
|
TimeDelta TotalDuration() const;
|
|
int Count() const { return event_count_; }
|
|
|
|
private:
|
|
Timestamp first_time_ = Timestamp::PlusInfinity();
|
|
Timestamp last_time_ = Timestamp::MinusInfinity();
|
|
int64_t event_count_ = 0;
|
|
SampleStats<TimeDelta> interval_;
|
|
};
|
|
|
|
struct VideoFramesStats {
|
|
int count = 0;
|
|
SampleStats<double> pixels;
|
|
SampleStats<double> resolution;
|
|
EventRateCounter frames;
|
|
void AddFrameInfo(const VideoFrameBuffer& frame, Timestamp at_time);
|
|
void AddStats(const VideoFramesStats& other);
|
|
};
|
|
|
|
struct VideoQualityStats {
|
|
int lost_count = 0;
|
|
int freeze_count = 0;
|
|
VideoFramesStats capture;
|
|
VideoFramesStats render;
|
|
// Time from frame was captured on device to time frame was delivered from
|
|
// decoder.
|
|
SampleStats<TimeDelta> capture_to_decoded_delay;
|
|
// Time from frame was captured on device to time frame was displayed on
|
|
// device.
|
|
SampleStats<TimeDelta> end_to_end_delay;
|
|
// PSNR for delivered frames. Note that this might go up for a worse
|
|
// connection due to frame dropping.
|
|
SampleStats<double> psnr;
|
|
// PSNR for all frames, dropped or lost frames are compared to the last
|
|
// successfully delivered frame
|
|
SampleStats<double> psnr_with_freeze;
|
|
// Frames skipped between two nearest.
|
|
SampleStats<double> skipped_between_rendered;
|
|
// In the next 2 metrics freeze is a pause that is longer, than maximum:
|
|
// 1. 150ms
|
|
// 2. 3 * average time between two sequential frames.
|
|
// Item 1 will cover high fps video and is a duration, that is noticeable by
|
|
// human eye. Item 2 will cover low fps video like screen sharing.
|
|
SampleStats<TimeDelta> freeze_duration;
|
|
// Mean time between one freeze end and next freeze start.
|
|
SampleStats<TimeDelta> time_between_freezes;
|
|
void AddStats(const VideoQualityStats& other);
|
|
};
|
|
|
|
struct CollectedCallStats {
|
|
SampleStats<DataRate> target_rate;
|
|
SampleStats<TimeDelta> pacer_delay;
|
|
SampleStats<TimeDelta> round_trip_time;
|
|
SampleStats<double> memory_usage;
|
|
};
|
|
|
|
struct CollectedAudioReceiveStats {
|
|
SampleStats<double> expand_rate;
|
|
SampleStats<double> accelerate_rate;
|
|
SampleStats<TimeDelta> jitter_buffer;
|
|
};
|
|
struct CollectedVideoSendStats {
|
|
SampleStats<double> encode_frame_rate;
|
|
SampleStats<TimeDelta> encode_time;
|
|
SampleStats<double> encode_usage;
|
|
SampleStats<DataRate> media_bitrate;
|
|
SampleStats<DataRate> fec_bitrate;
|
|
};
|
|
struct CollectedVideoReceiveStats {
|
|
SampleStats<TimeDelta> decode_time;
|
|
SampleStats<TimeDelta> decode_time_max;
|
|
SampleStats<double> decode_pixels;
|
|
SampleStats<double> resolution;
|
|
};
|
|
|
|
} // namespace test
|
|
} // namespace webrtc
|
|
#endif // TEST_SCENARIO_PERFORMANCE_STATS_H_
|