mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-17 07:37:51 +01:00

This class looks first and foremost on frame intervals instead of number of frames withing the averaging window. This leads to higher prevision values than the bucketized methods of RateTracker and RateStatistics. It is also design to return floating point values, for cases where we are running at low fps - such as a somewhat common 30/4 = 7.5fps. Bug: webrtc:10481 Change-Id: I41c36caaf2b7b46edf7927c8dd08e6cde3380884 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/148593 Reviewed-by: Magnus Flodman <mflodman@webrtc.org> Commit-Queue: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28857}
55 lines
1.5 KiB
C++
55 lines
1.5 KiB
C++
/*
|
|
* Copyright (c) 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.
|
|
*/
|
|
|
|
#include "common_video/frame_rate_estimator.h"
|
|
|
|
#include "rtc_base/time_utils.h"
|
|
|
|
namespace webrtc {
|
|
|
|
FrameRateEstimator::FrameRateEstimator(TimeDelta averaging_window)
|
|
: averaging_window_(averaging_window) {}
|
|
|
|
void FrameRateEstimator::OnFrame(Timestamp time) {
|
|
CullOld(time);
|
|
frame_times_.push_back(time);
|
|
}
|
|
|
|
absl::optional<double> FrameRateEstimator::GetAverageFps() const {
|
|
if (frame_times_.size() < 2) {
|
|
return absl::nullopt;
|
|
}
|
|
TimeDelta time_span = frame_times_.back() - frame_times_.front();
|
|
if (time_span < TimeDelta::us(1)) {
|
|
return absl::nullopt;
|
|
}
|
|
TimeDelta avg_frame_interval = time_span / (frame_times_.size() - 1);
|
|
|
|
return static_cast<double>(rtc::kNumMicrosecsPerSec) /
|
|
avg_frame_interval.us();
|
|
}
|
|
|
|
absl::optional<double> FrameRateEstimator::GetAverageFps(Timestamp now) {
|
|
CullOld(now);
|
|
return GetAverageFps();
|
|
}
|
|
|
|
void FrameRateEstimator::Reset() {
|
|
frame_times_.clear();
|
|
}
|
|
|
|
void FrameRateEstimator::CullOld(Timestamp now) {
|
|
while (!frame_times_.empty() &&
|
|
frame_times_.front() + averaging_window_ < now) {
|
|
frame_times_.pop_front();
|
|
}
|
|
}
|
|
|
|
} // namespace webrtc
|