From 86163248f427e0bda57ffa2f76e53d76bb0b5366 Mon Sep 17 00:00:00 2001 From: Rasmus Brandt Date: Wed, 15 Feb 2023 11:25:15 +0100 Subject: [PATCH] Rename CodecTimer -> DecodeTimePercentileFilter. The CodecTimer is not a codec timer, it's more like a decoder stopwatch with a percentile filter wrapped around it. Since the purpose of the class is to provide an estimate for how much decode delay to add when determining the render timestamp of a frame, let's rename this class to `DecodeTimePercentileFilter`. No functional changes are intended. Bug: webrtc:14905 Change-Id: I48c99e4f500c4f9e1a2a20b0afe72d6e76c5192d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/293462 Reviewed-by: Philip Eliasson Commit-Queue: Rasmus Brandt Cr-Commit-Position: refs/heads/main@{#39332} --- modules/video_coding/timing/BUILD.gn | 8 ++++---- ...timer.cc => decode_time_percentile_filter.cc} | 15 +++++++++------ ...c_timer.h => decode_time_percentile_filter.h} | 16 ++++++++++------ modules/video_coding/timing/timing.cc | 9 +++++---- modules/video_coding/timing/timing.h | 6 +++--- 5 files changed, 31 insertions(+), 23 deletions(-) rename modules/video_coding/timing/{codec_timer.cc => decode_time_percentile_filter.cc} (71%) rename modules/video_coding/timing/{codec_timer.h => decode_time_percentile_filter.h} (68%) diff --git a/modules/video_coding/timing/BUILD.gn b/modules/video_coding/timing/BUILD.gn index 38348e6967..7e22afac56 100644 --- a/modules/video_coding/timing/BUILD.gn +++ b/modules/video_coding/timing/BUILD.gn @@ -8,10 +8,10 @@ import("../../../webrtc.gni") -rtc_library("codec_timer") { +rtc_library("decode_time_percentile_filter") { sources = [ - "codec_timer.cc", - "codec_timer.h", + "decode_time_percentile_filter.cc", + "decode_time_percentile_filter.h", ] deps = [ "../../../rtc_base:rtc_numerics" ] } @@ -104,7 +104,7 @@ rtc_library("timing_module") { "timing.h", ] deps = [ - ":codec_timer", + ":decode_time_percentile_filter", ":timestamp_extrapolator", "../../../api:field_trials_view", "../../../api/units:time_delta", diff --git a/modules/video_coding/timing/codec_timer.cc b/modules/video_coding/timing/decode_time_percentile_filter.cc similarity index 71% rename from modules/video_coding/timing/codec_timer.cc rename to modules/video_coding/timing/decode_time_percentile_filter.cc index f57d42d40a..e40ab5c6ce 100644 --- a/modules/video_coding/timing/codec_timer.cc +++ b/modules/video_coding/timing/decode_time_percentile_filter.cc @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "modules/video_coding/timing/codec_timer.h" +#include "modules/video_coding/timing/decode_time_percentile_filter.h" #include @@ -25,10 +25,12 @@ const int64_t kTimeLimitMs = 10000; } // anonymous namespace -CodecTimer::CodecTimer() : ignored_sample_count_(0), filter_(kPercentile) {} -CodecTimer::~CodecTimer() = default; +DecodeTimePercentileFilter::DecodeTimePercentileFilter() + : ignored_sample_count_(0), filter_(kPercentile) {} +DecodeTimePercentileFilter::~DecodeTimePercentileFilter() = default; -void CodecTimer::AddTiming(int64_t decode_time_ms, int64_t now_ms) { +void DecodeTimePercentileFilter::AddTiming(int64_t decode_time_ms, + int64_t now_ms) { // Ignore the first `kIgnoredSampleCount` samples. if (ignored_sample_count_ < kIgnoredSampleCount) { ++ignored_sample_count_; @@ -48,11 +50,12 @@ void CodecTimer::AddTiming(int64_t decode_time_ms, int64_t now_ms) { } // Get the 95th percentile observed decode time within a time window. -int64_t CodecTimer::RequiredDecodeTimeMs() const { +int64_t DecodeTimePercentileFilter::RequiredDecodeTimeMs() const { return filter_.GetPercentileValue(); } -CodecTimer::Sample::Sample(int64_t decode_time_ms, int64_t sample_time_ms) +DecodeTimePercentileFilter::Sample::Sample(int64_t decode_time_ms, + int64_t sample_time_ms) : decode_time_ms(decode_time_ms), sample_time_ms(sample_time_ms) {} } // namespace webrtc diff --git a/modules/video_coding/timing/codec_timer.h b/modules/video_coding/timing/decode_time_percentile_filter.h similarity index 68% rename from modules/video_coding/timing/codec_timer.h rename to modules/video_coding/timing/decode_time_percentile_filter.h index 9f12d82e98..9a6aa5e6a4 100644 --- a/modules/video_coding/timing/codec_timer.h +++ b/modules/video_coding/timing/decode_time_percentile_filter.h @@ -8,8 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef MODULES_VIDEO_CODING_TIMING_CODEC_TIMER_H_ -#define MODULES_VIDEO_CODING_TIMING_CODEC_TIMER_H_ +#ifndef MODULES_VIDEO_CODING_TIMING_DECODE_TIME_PERCENTILE_FILTER_H_ +#define MODULES_VIDEO_CODING_TIMING_DECODE_TIME_PERCENTILE_FILTER_H_ #include @@ -17,10 +17,14 @@ namespace webrtc { -class CodecTimer { +// The `DecodeTimePercentileFilter` filters the actual per-frame decode times +// and provides an estimate for the 95th percentile of those decode times. This +// estimate can be used to determine how large the "decode delay term" should be +// when determining the render timestamp for a frame. +class DecodeTimePercentileFilter { public: - CodecTimer(); - ~CodecTimer(); + DecodeTimePercentileFilter(); + ~DecodeTimePercentileFilter(); // Add a new decode time to the filter. void AddTiming(int64_t new_decode_time_ms, int64_t now_ms); @@ -47,4 +51,4 @@ class CodecTimer { } // namespace webrtc -#endif // MODULES_VIDEO_CODING_TIMING_CODEC_TIMER_H_ +#endif // MODULES_VIDEO_CODING_TIMING_DECODE_TIME_PERCENTILE_FILTER_H_ diff --git a/modules/video_coding/timing/timing.cc b/modules/video_coding/timing/timing.cc index 0b61d5a35e..5c3fe69553 100644 --- a/modules/video_coding/timing/timing.cc +++ b/modules/video_coding/timing/timing.cc @@ -13,6 +13,7 @@ #include #include "api/units/time_delta.h" +#include "modules/video_coding/timing/decode_time_percentile_filter.h" #include "modules/video_coding/timing/timestamp_extrapolator.h" #include "rtc_base/experiments/field_trial_parser.h" #include "rtc_base/logging.h" @@ -47,7 +48,7 @@ VCMTiming::VCMTiming(Clock* clock, const FieldTrialsView& field_trials) : clock_(clock), ts_extrapolator_( std::make_unique(clock_->CurrentTime())), - codec_timer_(std::make_unique()), + decode_time_filter_(std::make_unique()), render_delay_(kDefaultRenderDelay), min_playout_delay_(TimeDelta::Zero()), max_playout_delay_(TimeDelta::Seconds(10)), @@ -65,7 +66,7 @@ VCMTiming::VCMTiming(Clock* clock, const FieldTrialsView& field_trials) void VCMTiming::Reset() { MutexLock lock(&mutex_); ts_extrapolator_->Reset(clock_->CurrentTime()); - codec_timer_ = std::make_unique(); + decode_time_filter_ = std::make_unique(); render_delay_ = kDefaultRenderDelay; min_playout_delay_ = TimeDelta::Zero(); jitter_delay_ = TimeDelta::Zero(); @@ -171,7 +172,7 @@ void VCMTiming::UpdateCurrentDelay(Timestamp render_time, void VCMTiming::StopDecodeTimer(TimeDelta decode_time, Timestamp now) { MutexLock lock(&mutex_); - codec_timer_->AddTiming(decode_time.ms(), now.ms()); + decode_time_filter_->AddTiming(decode_time.ms(), now.ms()); RTC_DCHECK_GE(decode_time, TimeDelta::Zero()); ++num_decoded_frames_; } @@ -211,7 +212,7 @@ Timestamp VCMTiming::RenderTimeInternal(uint32_t frame_timestamp, } TimeDelta VCMTiming::RequiredDecodeTime() const { - const int decode_time_ms = codec_timer_->RequiredDecodeTimeMs(); + const int decode_time_ms = decode_time_filter_->RequiredDecodeTimeMs(); RTC_DCHECK_GE(decode_time_ms, 0); return TimeDelta::Millis(decode_time_ms); } diff --git a/modules/video_coding/timing/timing.h b/modules/video_coding/timing/timing.h index 727527f009..161c8d6a64 100644 --- a/modules/video_coding/timing/timing.h +++ b/modules/video_coding/timing/timing.h @@ -18,7 +18,7 @@ #include "api/units/time_delta.h" #include "api/video/video_frame.h" #include "api/video/video_timing.h" -#include "modules/video_coding/timing/codec_timer.h" +#include "modules/video_coding/timing/decode_time_percentile_filter.h" #include "modules/video_coding/timing/timestamp_extrapolator.h" #include "rtc_base/experiments/field_trial_parser.h" #include "rtc_base/synchronization/mutex.h" @@ -129,8 +129,8 @@ class VCMTiming { Clock* const clock_; const std::unique_ptr ts_extrapolator_ RTC_PT_GUARDED_BY(mutex_); - std::unique_ptr codec_timer_ RTC_GUARDED_BY(mutex_) - RTC_PT_GUARDED_BY(mutex_); + std::unique_ptr decode_time_filter_ + RTC_GUARDED_BY(mutex_) RTC_PT_GUARDED_BY(mutex_); TimeDelta render_delay_ RTC_GUARDED_BY(mutex_); // Best-effort playout delay range for frames from capture to render. // The receiver tries to keep the delay between `min_playout_delay_ms_`