Include duration of pauses into sum of squared frames duration.
Bug: webrtc:10502
Change-Id: Ie905c0c9e8ca8fe07be585ce5a0d75e9eed6e865
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/130499
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27435}
diff --git a/video/video_quality_observer.cc b/video/video_quality_observer.cc
index 2f1bb1b..df7d52f 100644
--- a/video/video_quality_observer.cc
+++ b/video/video_quality_observer.cc
@@ -146,35 +146,42 @@
auto blocky_frame_it = blocky_frames_.find(frame.timestamp());
- if (!is_paused_ && num_frames_rendered_ > 0) {
+ if (num_frames_rendered_ > 0) {
// Process inter-frame delay.
const int64_t interframe_delay_ms = now_ms - last_frame_rendered_ms_;
const double interframe_delays_secs = interframe_delay_ms / 1000.0;
+
+ // Sum of squared inter frame intervals is used to calculate the harmonic
+ // frame rate metric. The metric aims to reflect overall experience related
+ // to smoothness of video playback and includes both freezes and pauses.
sum_squared_interframe_delays_secs_ +=
interframe_delays_secs * interframe_delays_secs;
- render_interframe_delays_.AddSample(interframe_delay_ms);
- bool was_freeze = false;
- if (render_interframe_delays_.Size() >= kMinFrameSamplesToDetectFreeze) {
- const absl::optional<int64_t> avg_interframe_delay =
- render_interframe_delays_.GetAverageRoundedDown();
- RTC_DCHECK(avg_interframe_delay);
- was_freeze = interframe_delay_ms >=
- std::max(3 * *avg_interframe_delay,
- *avg_interframe_delay + kMinIncreaseForFreezeMs);
- }
+ if (!is_paused_) {
+ render_interframe_delays_.AddSample(interframe_delay_ms);
- if (was_freeze) {
- freezes_durations_.Add(interframe_delay_ms);
- smooth_playback_durations_.Add(last_frame_rendered_ms_ -
- last_unfreeze_time_ms_);
- last_unfreeze_time_ms_ = now_ms;
- } else {
- // Count spatial metrics if there were no freeze.
- time_in_resolution_ms_[current_resolution_] += interframe_delay_ms;
+ bool was_freeze = false;
+ if (render_interframe_delays_.Size() >= kMinFrameSamplesToDetectFreeze) {
+ const absl::optional<int64_t> avg_interframe_delay =
+ render_interframe_delays_.GetAverageRoundedDown();
+ RTC_DCHECK(avg_interframe_delay);
+ was_freeze = interframe_delay_ms >=
+ std::max(3 * *avg_interframe_delay,
+ *avg_interframe_delay + kMinIncreaseForFreezeMs);
+ }
- if (is_last_frame_blocky_) {
- time_in_blocky_video_ms_ += interframe_delay_ms;
+ if (was_freeze) {
+ freezes_durations_.Add(interframe_delay_ms);
+ smooth_playback_durations_.Add(last_frame_rendered_ms_ -
+ last_unfreeze_time_ms_);
+ last_unfreeze_time_ms_ = now_ms;
+ } else {
+ // Count spatial metrics if there were no freeze.
+ time_in_resolution_ms_[current_resolution_] += interframe_delay_ms;
+
+ if (is_last_frame_blocky_) {
+ time_in_blocky_video_ms_ += interframe_delay_ms;
+ }
}
}
}