Use total_decode_time_ms in VideoAnalyzer
Use the newly added total_decode_time_ms to get an accurate value for the average decode time. The sparsely sampled decode_ms is sensitive to the sampling instance. Bug: chromium:980853 Change-Id: I9b63c8d1053fa95f74918807b83d1edb5cd726fb Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/147268 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Johannes Kron <kron@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28716}
This commit is contained in:

committed by
Commit Bot

parent
6acb069c2c
commit
a1b99b3c9b
@ -82,6 +82,7 @@ VideoAnalyzer::VideoAnalyzer(
|
||||
selected_stream_(selected_stream),
|
||||
selected_sl_(selected_sl),
|
||||
selected_tl_(selected_tl),
|
||||
mean_decode_time_ms_(0.0),
|
||||
freeze_count_(0),
|
||||
total_freezes_duration_ms_(0),
|
||||
total_frames_duration_ms_(0),
|
||||
@ -509,6 +510,12 @@ void VideoAnalyzer::PollStats() {
|
||||
|
||||
if (receive_stream_ != nullptr) {
|
||||
VideoReceiveStream::Stats receive_stats = receive_stream_->GetStats();
|
||||
// |total_decode_time_ms| gives a good estimate of the mean decode time,
|
||||
// |decode_ms| is used to keep track of the standard deviation.
|
||||
if (receive_stats.frames_decoded > 0)
|
||||
mean_decode_time_ms_ =
|
||||
static_cast<double>(receive_stats.total_decode_time_ms) /
|
||||
receive_stats.frames_decoded;
|
||||
if (receive_stats.decode_ms > 0)
|
||||
decode_time_ms_.AddSample(receive_stats.decode_ms);
|
||||
if (receive_stats.max_decode_ms > 0)
|
||||
@ -700,7 +707,8 @@ void VideoAnalyzer::PrintResults() {
|
||||
}
|
||||
|
||||
if (receive_stream_ != nullptr) {
|
||||
PrintResult("decode_time", decode_time_ms_, " ms");
|
||||
PrintResultWithExternalMean("decode_time", mean_decode_time_ms_,
|
||||
decode_time_ms_, " ms");
|
||||
}
|
||||
dropped_frames_ += dropped_frames_before_first_encode_ +
|
||||
dropped_frames_before_rendering_ + frames_left;
|
||||
@ -821,6 +829,21 @@ void VideoAnalyzer::PrintResult(const char* result_type,
|
||||
stats.GetStandardDeviation().value_or(0), unit, false);
|
||||
}
|
||||
|
||||
void VideoAnalyzer::PrintResultWithExternalMean(const char* result_type,
|
||||
double mean,
|
||||
Statistics stats,
|
||||
const char* unit) {
|
||||
// If the true mean is different than the sample mean, the sample variance is
|
||||
// too low. The sample variance given a known mean is obtained by adding the
|
||||
// squared error between the true mean and the sample mean.
|
||||
double compensated_variance =
|
||||
stats.Size() > 0
|
||||
? *stats.GetVariance() + pow(mean - *stats.GetMean(), 2.0)
|
||||
: 0.0;
|
||||
test::PrintResultMeanAndError(result_type, "", test_label_.c_str(), mean,
|
||||
std::sqrt(compensated_variance), unit, false);
|
||||
}
|
||||
|
||||
void VideoAnalyzer::PrintSamplesToFile() {
|
||||
FILE* out = graph_data_output_file_;
|
||||
rtc::CritScope crit(&comparison_lock_);
|
||||
|
@ -193,6 +193,10 @@ class VideoAnalyzer : public PacketReceiver,
|
||||
void PrintResults();
|
||||
void PerformFrameComparison(const FrameComparison& comparison);
|
||||
void PrintResult(const char* result_type, Statistics stats, const char* unit);
|
||||
void PrintResultWithExternalMean(const char* result_type,
|
||||
double mean,
|
||||
Statistics stats,
|
||||
const char* unit);
|
||||
void PrintSamplesToFile(void);
|
||||
double GetAverageMediaBitrateBps();
|
||||
void AddCapturedFrameForComparison(const VideoFrame& video_frame);
|
||||
@ -224,6 +228,7 @@ class VideoAnalyzer : public PacketReceiver,
|
||||
Statistics encode_frame_rate_ RTC_GUARDED_BY(comparison_lock_);
|
||||
Statistics encode_time_ms_ RTC_GUARDED_BY(comparison_lock_);
|
||||
Statistics encode_usage_percent_ RTC_GUARDED_BY(comparison_lock_);
|
||||
double mean_decode_time_ms_ RTC_GUARDED_BY(comparison_lock_);
|
||||
Statistics decode_time_ms_ RTC_GUARDED_BY(comparison_lock_);
|
||||
Statistics decode_time_max_ms_ RTC_GUARDED_BY(comparison_lock_);
|
||||
Statistics media_bitrate_bps_ RTC_GUARDED_BY(comparison_lock_);
|
||||
|
Reference in New Issue
Block a user