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:
Johannes Kron
2019-07-30 15:08:16 +02:00
committed by Commit Bot
parent 6acb069c2c
commit a1b99b3c9b
2 changed files with 29 additions and 1 deletions

View File

@ -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_);

View File

@ -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_);