diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn index e6c4ed5b5c..876ac457f6 100644 --- a/modules/video_coding/BUILD.gn +++ b/modules/video_coding/BUILD.gn @@ -183,26 +183,6 @@ rtc_library("timing") { absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] } -rtc_library("jitter_estimator") { - sources = [ - "jitter_estimator.cc", - "jitter_estimator.h", - ] - deps = [ - "../../api:field_trials_view", - "../../api/units:data_size", - "../../api/units:frequency", - "../../api/units:time_delta", - "../../api/units:timestamp", - "../../rtc_base", - "../../rtc_base:safe_conversions", - "../../rtc_base/experiments:jitter_upper_bound_experiment", - "../../system_wrappers", - "timing:rtt_filter", - ] - absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] -} - rtc_library("video_coding") { visibility = [ "*" ] sources = [ @@ -250,7 +230,6 @@ rtc_library("video_coding") { ":codec_globals_headers", ":encoded_frame", ":frame_helpers", - ":jitter_estimator", ":timing", ":video_codec_interface", ":video_coding_utility", @@ -318,6 +297,7 @@ rtc_library("video_coding") { "codecs/av1:av1_svc_config", "svc:scalability_mode_util", "timing:inter_frame_delay", + "timing:jitter_estimator", "timing:rtt_filter", ] absl_deps = [ @@ -375,7 +355,6 @@ rtc_library("video_coding_legacy") { deps = [ ":codec_globals_headers", ":encoded_frame", - ":jitter_estimator", ":timing", ":video_codec_interface", ":video_coding", @@ -409,6 +388,7 @@ rtc_library("video_coding_legacy") { "../rtp_rtcp:rtp_video_header", "../utility", "timing:inter_frame_delay", + "timing:jitter_estimator", ] absl_deps = [ "//third_party/abseil-cpp/absl/memory", @@ -1131,7 +1111,6 @@ if (rtc_include_tests) { "h264_sps_pps_tracker_unittest.cc", "histogram_unittest.cc", "jitter_buffer_unittest.cc", - "jitter_estimator_tests.cc", "loss_notification_controller_unittest.cc", "nack_module_unittest.cc", "nack_requester_unittest.cc", @@ -1171,7 +1150,6 @@ if (rtc_include_tests) { ":encoded_frame", ":frame_dependencies_calculator", ":h264_packet_buffer", - ":jitter_estimator", ":nack_requester", ":packet_buffer", ":simulcast_test_fixture_impl", @@ -1257,6 +1235,7 @@ if (rtc_include_tests) { "deprecated:nack_module", "svc:scalability_structure_tests", "svc:svc_rate_allocator_tests", + "timing:jitter_estimator", ] absl_deps = [ "//third_party/abseil-cpp/absl/memory", diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc index 421da753b8..536dc9d616 100644 --- a/modules/video_coding/frame_buffer2.cc +++ b/modules/video_coding/frame_buffer2.cc @@ -25,8 +25,8 @@ #include "api/video/video_timing.h" #include "modules/video_coding/frame_helpers.h" #include "modules/video_coding/include/video_coding_defines.h" -#include "modules/video_coding/jitter_estimator.h" #include "modules/video_coding/timing.h" +#include "modules/video_coding/timing/jitter_estimator.h" #include "rtc_base/checks.h" #include "rtc_base/experiments/rtt_mult_experiment.h" #include "rtc_base/logging.h" diff --git a/modules/video_coding/frame_buffer2.h b/modules/video_coding/frame_buffer2.h index 9b74d65733..1315d2f254 100644 --- a/modules/video_coding/frame_buffer2.h +++ b/modules/video_coding/frame_buffer2.h @@ -22,8 +22,8 @@ #include "api/sequence_checker.h" #include "api/video/encoded_frame.h" #include "modules/video_coding/include/video_coding_defines.h" -#include "modules/video_coding/jitter_estimator.h" #include "modules/video_coding/timing/inter_frame_delay.h" +#include "modules/video_coding/timing/jitter_estimator.h" #include "modules/video_coding/utility/decoded_frames_history.h" #include "rtc_base/event.h" #include "rtc_base/experiments/field_trial_parser.h" @@ -39,7 +39,7 @@ namespace webrtc { class Clock; class VCMReceiveStatisticsCallback; -class VCMJitterEstimator; +class JitterEstimator; class VCMTiming; namespace video_coding { @@ -172,7 +172,7 @@ class FrameBuffer { int64_t latest_return_time_ms_ RTC_GUARDED_BY(mutex_); bool keyframe_required_ RTC_GUARDED_BY(mutex_); - VCMJitterEstimator jitter_estimator_ RTC_GUARDED_BY(mutex_); + JitterEstimator jitter_estimator_ RTC_GUARDED_BY(mutex_); VCMTiming* const timing_ RTC_GUARDED_BY(mutex_); InterFrameDelay inter_frame_delay_ RTC_GUARDED_BY(mutex_); absl::optional last_continuous_frame_ RTC_GUARDED_BY(mutex_); diff --git a/modules/video_coding/frame_buffer2_unittest.cc b/modules/video_coding/frame_buffer2_unittest.cc index def2e2219e..92d9b94144 100644 --- a/modules/video_coding/frame_buffer2_unittest.cc +++ b/modules/video_coding/frame_buffer2_unittest.cc @@ -19,8 +19,8 @@ #include "api/units/time_delta.h" #include "api/units/timestamp.h" #include "modules/video_coding/frame_object.h" -#include "modules/video_coding/jitter_estimator.h" #include "modules/video_coding/timing.h" +#include "modules/video_coding/timing/jitter_estimator.h" #include "rtc_base/numerics/sequence_number_util.h" #include "rtc_base/platform_thread.h" #include "rtc_base/random.h" diff --git a/modules/video_coding/jitter_buffer.cc b/modules/video_coding/jitter_buffer.cc index e138a99c94..a1866fac51 100644 --- a/modules/video_coding/jitter_buffer.cc +++ b/modules/video_coding/jitter_buffer.cc @@ -18,9 +18,9 @@ #include "modules/video_coding/include/video_coding.h" #include "modules/video_coding/internal_defines.h" #include "modules/video_coding/jitter_buffer_common.h" -#include "modules/video_coding/jitter_estimator.h" #include "modules/video_coding/packet.h" #include "modules/video_coding/timing/inter_frame_delay.h" +#include "modules/video_coding/timing/jitter_estimator.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "system_wrappers/include/clock.h" diff --git a/modules/video_coding/jitter_buffer.h b/modules/video_coding/jitter_buffer.h index e31c775743..7ca8953428 100644 --- a/modules/video_coding/jitter_buffer.h +++ b/modules/video_coding/jitter_buffer.h @@ -25,8 +25,8 @@ #include "modules/video_coding/include/video_coding.h" #include "modules/video_coding/include/video_coding_defines.h" #include "modules/video_coding/jitter_buffer_common.h" -#include "modules/video_coding/jitter_estimator.h" #include "modules/video_coding/timing/inter_frame_delay.h" +#include "modules/video_coding/timing/jitter_estimator.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/thread_annotations.h" @@ -252,7 +252,7 @@ class VCMJitterBuffer { // Jitter estimation. // Filter for estimating jitter. - VCMJitterEstimator jitter_estimate_; + JitterEstimator jitter_estimate_; // Calculates network delays used for jitter calculations. InterFrameDelay inter_frame_delay_; VCMJitterSample waiting_for_completion_; diff --git a/modules/video_coding/timing/BUILD.gn b/modules/video_coding/timing/BUILD.gn index 0f7317d8b3..851374fd9c 100644 --- a/modules/video_coding/timing/BUILD.gn +++ b/modules/video_coding/timing/BUILD.gn @@ -30,6 +30,26 @@ rtc_library("inter_frame_delay") { absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] } +rtc_library("jitter_estimator") { + sources = [ + "jitter_estimator.cc", + "jitter_estimator.h", + ] + deps = [ + ":rtt_filter", + "../../../api:field_trials_view", + "../../../api/units:data_size", + "../../../api/units:frequency", + "../../../api/units:time_delta", + "../../../api/units:timestamp", + "../../../rtc_base", + "../../../rtc_base:safe_conversions", + "../../../rtc_base/experiments:jitter_upper_bound_experiment", + "../../../system_wrappers", + ] + absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] +} + rtc_library("rtt_filter") { sources = [ "rtt_filter.cc", @@ -46,15 +66,24 @@ rtc_library("timing_unittests") { testonly = true sources = [ "inter_frame_delay_unittest.cc", + "jitter_estimator_unittest.cc", "rtt_filter_unittest.cc", ] deps = [ ":inter_frame_delay", + ":jitter_estimator", ":rtt_filter", + "../../../api:array_view", + "../../../api/units:data_size", "../../../api/units:frequency", "../../../api/units:time_delta", "../../../api/units:timestamp", + "../../../rtc_base:histogram_percentile_counter", + "../../../rtc_base:stringutils", + "../../../rtc_base:timeutils", + "../../../rtc_base/experiments:jitter_upper_bound_experiment", "../../../system_wrappers:system_wrappers", + "../../../test:scoped_key_value_config", "../../../test:test_support", ] absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] diff --git a/modules/video_coding/jitter_estimator.cc b/modules/video_coding/timing/jitter_estimator.cc similarity index 92% rename from modules/video_coding/jitter_estimator.cc rename to modules/video_coding/timing/jitter_estimator.cc index 393d42d004..8cc7d2b54c 100644 --- a/modules/video_coding/jitter_estimator.cc +++ b/modules/video_coding/timing/jitter_estimator.cc @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "modules/video_coding/jitter_estimator.h" +#include "modules/video_coding/timing/jitter_estimator.h" #include #include @@ -49,8 +49,8 @@ constexpr double kNoiseStdDevOffset = 30.0; } // namespace -VCMJitterEstimator::VCMJitterEstimator(Clock* clock, - const FieldTrialsView& field_trials) +JitterEstimator::JitterEstimator(Clock* clock, + const FieldTrialsView& field_trials) : fps_counter_(30), // TODO(sprang): Use an estimator with limit based on // time, rather than number of samples. time_deviation_upper_bound_( @@ -62,10 +62,10 @@ VCMJitterEstimator::VCMJitterEstimator(Clock* clock, Reset(); } -VCMJitterEstimator::~VCMJitterEstimator() = default; +JitterEstimator::~JitterEstimator() = default; // Resets the JitterEstimate. -void VCMJitterEstimator::Reset() { +void JitterEstimator::Reset() { theta_[0] = 1 / (512e3 / 8); theta_[1] = 0; var_noise_ = 4.0; @@ -95,9 +95,9 @@ void VCMJitterEstimator::Reset() { } // Updates the estimates with the new measurements. -void VCMJitterEstimator::UpdateEstimate(TimeDelta frame_delay, - DataSize frame_size, - bool incomplete_frame /* = false */) { +void JitterEstimator::UpdateEstimate(TimeDelta frame_delay, + DataSize frame_size, + bool incomplete_frame /* = false */) { if (frame_size.IsZero()) { return; } @@ -178,7 +178,7 @@ void VCMJitterEstimator::UpdateEstimate(TimeDelta frame_delay, } // Updates the nack/packet ratio. -void VCMJitterEstimator::FrameNacked() { +void JitterEstimator::FrameNacked() { if (nack_count_ < kNackLimit) { nack_count_++; } @@ -187,8 +187,8 @@ void VCMJitterEstimator::FrameNacked() { // Updates Kalman estimate of the channel. // The caller is expected to sanity check the inputs. -void VCMJitterEstimator::KalmanEstimateChannel(TimeDelta frame_delay, - double delta_frame_size_bytes) { +void JitterEstimator::KalmanEstimateChannel(TimeDelta frame_delay, + double delta_frame_size_bytes) { double Mh[2]; double hMh_sigma; double kalmanGain[2]; @@ -265,7 +265,7 @@ void VCMJitterEstimator::KalmanEstimateChannel(TimeDelta frame_delay, // Calculate difference in delay between a sample and the expected delay // estimated by the Kalman filter -double VCMJitterEstimator::DeviationFromExpectedDelay( +double JitterEstimator::DeviationFromExpectedDelay( TimeDelta frame_delay, double delta_frame_size_bytes) const { return frame_delay.ms() - (theta_[0] * delta_frame_size_bytes + theta_[1]); @@ -273,8 +273,7 @@ double VCMJitterEstimator::DeviationFromExpectedDelay( // Estimates the random jitter by calculating the variance of the sample // distance from the line given by theta. -void VCMJitterEstimator::EstimateRandomJitter(double d_dT, - bool incomplete_frame) { +void JitterEstimator::EstimateRandomJitter(double d_dT, bool incomplete_frame) { Timestamp now = clock_->CurrentTime(); if (last_update_time_.has_value()) { fps_counter_.AddSample((now - *last_update_time_).us()); @@ -322,7 +321,7 @@ void VCMJitterEstimator::EstimateRandomJitter(double d_dT, } } -double VCMJitterEstimator::NoiseThreshold() const { +double JitterEstimator::NoiseThreshold() const { double noiseThreshold = kNoiseStdDevs * sqrt(var_noise_) - kNoiseStdDevOffset; if (noiseThreshold < 1.0) { noiseThreshold = 1.0; @@ -331,7 +330,7 @@ double VCMJitterEstimator::NoiseThreshold() const { } // Calculates the current jitter estimate from the filtered estimates. -TimeDelta VCMJitterEstimator::CalculateEstimate() { +TimeDelta JitterEstimator::CalculateEstimate() { double retMs = theta_[0] * (max_frame_size_.bytes() - avg_frame_size_.bytes()) + NoiseThreshold(); @@ -355,17 +354,17 @@ TimeDelta VCMJitterEstimator::CalculateEstimate() { return ret; } -void VCMJitterEstimator::PostProcessEstimate() { +void JitterEstimator::PostProcessEstimate() { filter_jitter_estimate_ = CalculateEstimate(); } -void VCMJitterEstimator::UpdateRtt(TimeDelta rtt) { +void JitterEstimator::UpdateRtt(TimeDelta rtt) { rtt_filter_.Update(rtt); } // Returns the current filtered estimate if available, // otherwise tries to calculate an estimate. -TimeDelta VCMJitterEstimator::GetJitterEstimate( +TimeDelta JitterEstimator::GetJitterEstimate( double rtt_multiplier, absl::optional rtt_mult_add_cap) { TimeDelta jitter = CalculateEstimate() + OPERATING_SYSTEM_JITTER; @@ -408,7 +407,7 @@ TimeDelta VCMJitterEstimator::GetJitterEstimate( return std::max(TimeDelta::Zero(), jitter); } -Frequency VCMJitterEstimator::GetFrameRate() const { +Frequency JitterEstimator::GetFrameRate() const { TimeDelta mean_frame_period = TimeDelta::Micros(fps_counter_.ComputeMean()); if (mean_frame_period <= TimeDelta::Zero()) return Frequency::Zero(); diff --git a/modules/video_coding/jitter_estimator.h b/modules/video_coding/timing/jitter_estimator.h similarity index 92% rename from modules/video_coding/jitter_estimator.h rename to modules/video_coding/timing/jitter_estimator.h index 90a27530a1..5e5a566c82 100644 --- a/modules/video_coding/jitter_estimator.h +++ b/modules/video_coding/timing/jitter_estimator.h @@ -8,8 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef MODULES_VIDEO_CODING_JITTER_ESTIMATOR_H_ -#define MODULES_VIDEO_CODING_JITTER_ESTIMATOR_H_ +#ifndef MODULES_VIDEO_CODING_TIMING_JITTER_ESTIMATOR_H_ +#define MODULES_VIDEO_CODING_TIMING_JITTER_ESTIMATOR_H_ #include "absl/types/optional.h" #include "api/field_trials_view.h" @@ -24,13 +24,12 @@ namespace webrtc { class Clock; -class VCMJitterEstimator { +class JitterEstimator { public: - explicit VCMJitterEstimator(Clock* clock, - const FieldTrialsView& field_trials); - virtual ~VCMJitterEstimator(); - VCMJitterEstimator(const VCMJitterEstimator&) = delete; - VCMJitterEstimator& operator=(const VCMJitterEstimator&) = delete; + explicit JitterEstimator(Clock* clock, const FieldTrialsView& field_trials); + virtual ~JitterEstimator(); + JitterEstimator(const JitterEstimator&) = delete; + JitterEstimator& operator=(const JitterEstimator&) = delete; // Resets the estimate to the initial state. void Reset(); @@ -163,4 +162,4 @@ class VCMJitterEstimator { } // namespace webrtc -#endif // MODULES_VIDEO_CODING_JITTER_ESTIMATOR_H_ +#endif // MODULES_VIDEO_CODING_TIMING_JITTER_ESTIMATOR_H_ diff --git a/modules/video_coding/jitter_estimator_tests.cc b/modules/video_coding/timing/jitter_estimator_unittest.cc similarity index 90% rename from modules/video_coding/jitter_estimator_tests.cc rename to modules/video_coding/timing/jitter_estimator_unittest.cc index b1df95bc74..29098cdf45 100644 --- a/modules/video_coding/jitter_estimator_tests.cc +++ b/modules/video_coding/timing/jitter_estimator_unittest.cc @@ -7,6 +7,8 @@ * be found in the AUTHORS file in the root of the source tree. */ +#include "modules/video_coding/timing/jitter_estimator.h" + #include #include @@ -17,7 +19,6 @@ #include "api/units/data_size.h" #include "api/units/frequency.h" #include "api/units/time_delta.h" -#include "modules/video_coding/jitter_estimator.h" #include "rtc_base/experiments/jitter_upper_bound_experiment.h" #include "rtc_base/numerics/histogram_percentile_counter.h" #include "rtc_base/strings/string_builder.h" @@ -28,18 +29,17 @@ namespace webrtc { -class TestVCMJitterEstimator : public ::testing::Test { +class TestJitterEstimator : public ::testing::Test { protected: - TestVCMJitterEstimator() : fake_clock_(0) {} + TestJitterEstimator() : fake_clock_(0) {} virtual void SetUp() { - estimator_ = - std::make_unique(&fake_clock_, field_trials_); + estimator_ = std::make_unique(&fake_clock_, field_trials_); } SimulatedClock fake_clock_; test::ScopedKeyValueConfig field_trials_; - std::unique_ptr estimator_; + std::unique_ptr estimator_; }; // Generates some simple test data in the form of a sawtooth wave. @@ -66,7 +66,7 @@ class ValueGenerator { }; // 5 fps, disable jitter delay altogether. -TEST_F(TestVCMJitterEstimator, TestLowRate) { +TEST_F(TestJitterEstimator, TestLowRate) { ValueGenerator gen(10); TimeDelta time_delta = 1 / Frequency::Hertz(5); for (int i = 0; i < 60; ++i) { @@ -79,7 +79,7 @@ TEST_F(TestVCMJitterEstimator, TestLowRate) { } } -TEST_F(TestVCMJitterEstimator, TestLowRateDisabled) { +TEST_F(TestJitterEstimator, TestLowRateDisabled) { test::ScopedKeyValueConfig field_trials( field_trials_, "WebRTC-ReducedJitterDelayKillSwitch/Enabled/"); SetUp(); @@ -96,7 +96,7 @@ TEST_F(TestVCMJitterEstimator, TestLowRateDisabled) { } } -TEST_F(TestVCMJitterEstimator, TestUpperBound) { +TEST_F(TestJitterEstimator, TestUpperBound) { struct TestContext { TestContext() : upper_bound(0.0), @@ -143,8 +143,8 @@ TEST_F(TestVCMJitterEstimator, TestUpperBound) { for (int i = 0; i < 100; ++i) { estimator_->UpdateEstimate(gen.Delay(), gen.FrameSize()); fake_clock_.AdvanceTime(time_delta); - estimator_->FrameNacked(); // To test rtt_mult. - estimator_->UpdateRtt(kRtt); // To test rtt_mult. + estimator_->FrameNacked(); // To test rtt_mult. + estimator_->UpdateRtt(kRtt); // To test rtt_mult. context.percentiles.Add( estimator_ ->GetJitterEstimate(context.rtt_mult, context.rtt_mult_add_cap_ms) diff --git a/video/BUILD.gn b/video/BUILD.gn index aaf97cfd4a..178ac77fd5 100644 --- a/video/BUILD.gn +++ b/video/BUILD.gn @@ -103,7 +103,6 @@ rtc_library("video") { "../modules/video_coding", "../modules/video_coding:codec_globals_headers", "../modules/video_coding:frame_helpers", - "../modules/video_coding:jitter_estimator", "../modules/video_coding:nack_requester", "../modules/video_coding:packet_buffer", "../modules/video_coding:timing", @@ -353,6 +352,7 @@ rtc_library("frame_buffer_proxy") { "../modules/video_coding:timing", "../modules/video_coding:video_codec_interface", "../modules/video_coding/timing:inter_frame_delay", + "../modules/video_coding/timing:jitter_estimator", "../rtc_base:checks", "../rtc_base:logging", "../rtc_base:macromagic", diff --git a/video/frame_buffer_proxy.cc b/video/frame_buffer_proxy.cc index fb8d173328..85ad274f92 100644 --- a/video/frame_buffer_proxy.cc +++ b/video/frame_buffer_proxy.cc @@ -24,6 +24,7 @@ #include "modules/video_coding/frame_buffer2.h" #include "modules/video_coding/frame_helpers.h" #include "modules/video_coding/timing/inter_frame_delay.h" +#include "modules/video_coding/timing/jitter_estimator.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/thread_annotations.h" @@ -500,8 +501,7 @@ class FrameBuffer3Proxy : public FrameBufferProxy { const std::unique_ptr frame_decode_scheduler_ RTC_GUARDED_BY(&worker_sequence_checker_); - VCMJitterEstimator jitter_estimator_ - RTC_GUARDED_BY(&worker_sequence_checker_); + JitterEstimator jitter_estimator_ RTC_GUARDED_BY(&worker_sequence_checker_); InterFrameDelay inter_frame_delay_ RTC_GUARDED_BY(&worker_sequence_checker_); bool keyframe_required_ RTC_GUARDED_BY(&worker_sequence_checker_) = false; std::unique_ptr buffer_ diff --git a/video/video_receive_stream2.cc b/video/video_receive_stream2.cc index 4610bb5831..1bec357965 100644 --- a/video/video_receive_stream2.cc +++ b/video/video_receive_stream2.cc @@ -46,7 +46,6 @@ #include "modules/video_coding/include/video_codec_interface.h" #include "modules/video_coding/include/video_coding_defines.h" #include "modules/video_coding/include/video_error_codes.h" -#include "modules/video_coding/jitter_estimator.h" #include "modules/video_coding/timing.h" #include "modules/video_coding/utility/vp8_header_parser.h" #include "rtc_base/checks.h"