diff --git a/BUILD.gn b/BUILD.gn index 7b07ebe07d..d3e8f36896 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -532,6 +532,7 @@ if (rtc_include_tests) { "api:rtc_api_unittests", "api/audio/test:audio_api_unittests", "api/audio_codecs/test:audio_codecs_api_unittests", + "api/numerics:numerics_unittests", "api/transport:stun_unittest", "api/video/test:rtc_api_video_unittests", "api/video_codecs/test:video_codecs_api_unittests", diff --git a/api/numerics/BUILD.gn b/api/numerics/BUILD.gn new file mode 100644 index 0000000000..408dc5b9f1 --- /dev/null +++ b/api/numerics/BUILD.gn @@ -0,0 +1,41 @@ +# Copyright (c) 2020 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. + +import("../../webrtc.gni") + +rtc_library("numerics") { + visibility = [ "*" ] + + sources = [ + "samples_stats_counter.cc", + "samples_stats_counter.h", + ] + deps = [ + "..:array_view", + "../../rtc_base:checks", + "../../rtc_base:rtc_numerics", + "../../rtc_base:timeutils", + "../units:timestamp", + ] + absl_deps = [ "//third_party/abseil-cpp/absl/algorithm:container" ] +} + +if (rtc_include_tests) { + rtc_library("numerics_unittests") { + visibility = [ "*" ] + testonly = true + + sources = [ "samples_stats_counter_unittest.cc" ] + + deps = [ + ":numerics", + "../../test:test_support", + ] + absl_deps = [ "//third_party/abseil-cpp/absl/algorithm:container" ] + } +} diff --git a/api/numerics/DEPS b/api/numerics/DEPS new file mode 100644 index 0000000000..2d89d57557 --- /dev/null +++ b/api/numerics/DEPS @@ -0,0 +1,6 @@ +specific_include_rules = { + # Some internal headers are allowed even in API headers: + "samples_stats_counter\.h": [ + "+rtc_base/numerics/running_statistics.h", + ] +} diff --git a/rtc_base/numerics/samples_stats_counter.cc b/api/numerics/samples_stats_counter.cc similarity index 97% rename from rtc_base/numerics/samples_stats_counter.cc rename to api/numerics/samples_stats_counter.cc index 9b98a3181d..36871a6713 100644 --- a/rtc_base/numerics/samples_stats_counter.cc +++ b/api/numerics/samples_stats_counter.cc @@ -8,8 +8,9 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "rtc_base/numerics/samples_stats_counter.h" +#include "api/numerics/samples_stats_counter.h" +#include #include #include "absl/algorithm/container.h" diff --git a/rtc_base/numerics/samples_stats_counter.h b/api/numerics/samples_stats_counter.h similarity index 95% rename from rtc_base/numerics/samples_stats_counter.h rename to api/numerics/samples_stats_counter.h index a4ec443d31..9387e6be9b 100644 --- a/rtc_base/numerics/samples_stats_counter.h +++ b/api/numerics/samples_stats_counter.h @@ -8,8 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef RTC_BASE_NUMERICS_SAMPLES_STATS_COUNTER_H_ -#define RTC_BASE_NUMERICS_SAMPLES_STATS_COUNTER_H_ +#ifndef API_NUMERICS_SAMPLES_STATS_COUNTER_H_ +#define API_NUMERICS_SAMPLES_STATS_COUNTER_H_ #include @@ -98,7 +98,7 @@ class SamplesStatsCounter { } private: - RunningStatistics stats_; + webrtc_impl::RunningStatistics stats_; std::vector samples_; bool sorted_ = false; }; @@ -116,4 +116,4 @@ SamplesStatsCounter operator/(const SamplesStatsCounter& counter, double value); } // namespace webrtc -#endif // RTC_BASE_NUMERICS_SAMPLES_STATS_COUNTER_H_ +#endif // API_NUMERICS_SAMPLES_STATS_COUNTER_H_ diff --git a/rtc_base/numerics/samples_stats_counter_unittest.cc b/api/numerics/samples_stats_counter_unittest.cc similarity index 99% rename from rtc_base/numerics/samples_stats_counter_unittest.cc rename to api/numerics/samples_stats_counter_unittest.cc index 1221e9b2a5..1f9cabfb29 100644 --- a/rtc_base/numerics/samples_stats_counter_unittest.cc +++ b/api/numerics/samples_stats_counter_unittest.cc @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "rtc_base/numerics/samples_stats_counter.h" +#include "api/numerics/samples_stats_counter.h" #include diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn index e98200a943..a4c2f089d6 100644 --- a/modules/video_coding/BUILD.gn +++ b/modules/video_coding/BUILD.gn @@ -789,6 +789,7 @@ if (rtc_include_tests) { ] deps = [ "../../api:videocodec_test_fixture_api", + "../../api/numerics", "../../rtc_base:checks", "../../rtc_base:rtc_numerics", "../../rtc_base:stringutils", diff --git a/modules/video_coding/codecs/test/videocodec_test_stats_impl.cc b/modules/video_coding/codecs/test/videocodec_test_stats_impl.cc index e5d6d2aaad..7290d29bf6 100644 --- a/modules/video_coding/codecs/test/videocodec_test_stats_impl.cc +++ b/modules/video_coding/codecs/test/videocodec_test_stats_impl.cc @@ -179,20 +179,20 @@ VideoStatistics VideoCodecTestStatsImpl::SliceAndCalcVideoStatistic( VideoStatistics video_stat; float buffer_level_bits = 0.0f; - RunningStatistics buffer_level_sec; + webrtc_impl::RunningStatistics buffer_level_sec; - RunningStatistics key_frame_size_bytes; - RunningStatistics delta_frame_size_bytes; + webrtc_impl::RunningStatistics key_frame_size_bytes; + webrtc_impl::RunningStatistics delta_frame_size_bytes; - RunningStatistics frame_encoding_time_us; - RunningStatistics frame_decoding_time_us; + webrtc_impl::RunningStatistics frame_encoding_time_us; + webrtc_impl::RunningStatistics frame_decoding_time_us; - RunningStatistics psnr_y; - RunningStatistics psnr_u; - RunningStatistics psnr_v; - RunningStatistics psnr; - RunningStatistics ssim; - RunningStatistics qp; + webrtc_impl::RunningStatistics psnr_y; + webrtc_impl::RunningStatistics psnr_u; + webrtc_impl::RunningStatistics psnr_v; + webrtc_impl::RunningStatistics psnr; + webrtc_impl::RunningStatistics ssim; + webrtc_impl::RunningStatistics qp; size_t rtp_timestamp_first_frame = 0; size_t rtp_timestamp_prev_frame = 0; @@ -329,10 +329,10 @@ VideoStatistics VideoCodecTestStatsImpl::SliceAndCalcVideoStatistic( ? 1000000.0f / mean_decode_time_us : std::numeric_limits::max(); - auto MaxDelaySec = - [target_bitrate_kbps](const RunningStatistics& stats) { - return 8 * stats.GetMax().value_or(0) / 1000 / target_bitrate_kbps; - }; + auto MaxDelaySec = [target_bitrate_kbps]( + const webrtc_impl::RunningStatistics& stats) { + return 8 * stats.GetMax().value_or(0) / 1000 / target_bitrate_kbps; + }; video_stat.avg_delay_sec = buffer_level_sec.GetMean().value_or(0); video_stat.max_key_frame_delay_sec = MaxDelaySec(key_frame_size_bytes); diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 7347e0ddd7..d72bca3504 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -204,8 +204,8 @@ rtc_library("platform_thread") { visibility = [ ":rtc_base_approved", ":rtc_task_queue_libevent", - ":rtc_task_queue_win", ":rtc_task_queue_stdlib", + ":rtc_task_queue_win", "synchronization:mutex", "synchronization:sequence_checker", ] @@ -587,8 +587,6 @@ rtc_library("rtc_numerics") { sources = [ "numerics/event_based_exponential_moving_average.cc", "numerics/event_based_exponential_moving_average.h", - "numerics/event_rate_counter.cc", - "numerics/event_rate_counter.h", "numerics/exp_filter.cc", "numerics/exp_filter.h", "numerics/math_utils.h", @@ -597,25 +595,30 @@ rtc_library("rtc_numerics") { "numerics/moving_median_filter.h", "numerics/percentile_filter.h", "numerics/running_statistics.h", - "numerics/sample_stats.cc", - "numerics/sample_stats.h", - "numerics/samples_stats_counter.cc", - "numerics/samples_stats_counter.h", "numerics/sequence_number_util.h", ] deps = [ ":checks", + ":macromagic", ":rtc_base_approved", - ":safe_compare", - "../api:array_view", + ] + absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] +} + +rtc_library("rtc_stats_counters") { + sources = [ + "numerics/event_rate_counter.cc", + "numerics/event_rate_counter.h", + "numerics/sample_stats.cc", + "numerics/sample_stats.h", + ] + deps = [ + "../api/numerics", "../api/units:data_rate", "../api/units:time_delta", "../api/units:timestamp", ] - absl_deps = [ - "//third_party/abseil-cpp/absl/algorithm:container", - "//third_party/abseil-cpp/absl/types:optional", - ] + absl_deps = [] } config("rtc_json_suppressions") { @@ -804,6 +807,7 @@ rtc_library("rtc_base") { "../api:array_view", "../api:function_view", "../api:scoped_refptr", + "../api/numerics", "../api/task_queue", "../system_wrappers:field_trial", "network:sent_packet", @@ -942,7 +946,6 @@ rtc_library("rtc_base") { "callback.h", "log_sinks.cc", "log_sinks.h", - "numerics/math_utils.h", "rolling_accumulator.h", "ssl_roots.h", ] @@ -1270,6 +1273,7 @@ if (rtc_include_tests) { ":rtc_base", ":rtc_base_approved", ":rtc_base_tests_utils", + ":rtc_numerics", ":rtc_task_queue", ":safe_compare", ":safe_minmax", @@ -1278,6 +1282,7 @@ if (rtc_include_tests) { ":testclient", "../api:array_view", "../api:scoped_refptr", + "../api/numerics", "../api/units:time_delta", "../system_wrappers", "../test:fileutils", @@ -1351,7 +1356,6 @@ if (rtc_include_tests) { "numerics/moving_median_filter_unittest.cc", "numerics/percentile_filter_unittest.cc", "numerics/running_statistics_unittest.cc", - "numerics/samples_stats_counter_unittest.cc", "numerics/sequence_number_util_unittest.cc", ] deps = [ diff --git a/rtc_base/numerics/math_utils.h b/rtc_base/numerics/math_utils.h index 4bf48e22bb..0f1d51b090 100644 --- a/rtc_base/numerics/math_utils.h +++ b/rtc_base/numerics/math_utils.h @@ -8,14 +8,16 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef RTC_BASE_NUMERICS_MATH_UTILS_H_ -#define RTC_BASE_NUMERICS_MATH_UTILS_H_ +#ifndef API_NUMERICS_MATH_UTILS_H_ +#define API_NUMERICS_MATH_UTILS_H_ #include #include #include "rtc_base/checks.h" +namespace webrtc { +namespace webrtc_impl { // Given two numbers |x| and |y| such that x >= y, computes the difference // x - y without causing undefined behavior due to signed overflow. template @@ -67,4 +69,7 @@ constexpr T minus_infinity_or_min() { return std::numeric_limits::min(); } -#endif // RTC_BASE_NUMERICS_MATH_UTILS_H_ +} // namespace webrtc_impl +} // namespace webrtc + +#endif // API_NUMERICS_MATH_UTILS_H_ diff --git a/rtc_base/numerics/running_statistics.h b/rtc_base/numerics/running_statistics.h index 4a3516d3f6..bbcc7e2a73 100644 --- a/rtc_base/numerics/running_statistics.h +++ b/rtc_base/numerics/running_statistics.h @@ -8,8 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef RTC_BASE_NUMERICS_RUNNING_STATISTICS_H_ -#define RTC_BASE_NUMERICS_RUNNING_STATISTICS_H_ +#ifndef API_NUMERICS_RUNNING_STATISTICS_H_ +#define API_NUMERICS_RUNNING_STATISTICS_H_ #include #include @@ -20,6 +20,7 @@ #include "rtc_base/numerics/math_utils.h" namespace webrtc { +namespace webrtc_impl { // tl;dr: Robust and efficient online computation of statistics, // using Welford's method for variance. [1] @@ -154,6 +155,7 @@ class RunningStatistics { double cumul_ = 0; // Variance * size_, sometimes noted m2. }; +} // namespace webrtc_impl } // namespace webrtc -#endif // RTC_BASE_NUMERICS_RUNNING_STATISTICS_H_ +#endif // API_NUMERICS_RUNNING_STATISTICS_H_ diff --git a/rtc_base/numerics/running_statistics_unittest.cc b/rtc_base/numerics/running_statistics_unittest.cc index 26dc7133e0..d593f3fc5a 100644 --- a/rtc_base/numerics/running_statistics_unittest.cc +++ b/rtc_base/numerics/running_statistics_unittest.cc @@ -21,6 +21,7 @@ // Tests were copied from samples_stats_counter_unittest.cc. namespace webrtc { +namespace webrtc_impl { namespace { RunningStatistics CreateStatsFilledWithIntsFrom1ToN(int n) { @@ -55,8 +56,6 @@ class RunningStatisticsTest : public ::testing::TestWithParam {}; constexpr int SIZE_FOR_MERGE = 5; -} // namespace - TEST(RunningStatistics, FullSimpleTest) { auto stats = CreateStatsFilledWithIntsFrom1ToN(100); @@ -192,4 +191,6 @@ INSTANTIATE_TEST_SUITE_P(RunningStatisticsTests, RunningStatisticsTest, ::testing::Range(0, SIZE_FOR_MERGE + 1)); +} // namespace +} // namespace webrtc_impl } // namespace webrtc diff --git a/rtc_base/numerics/sample_stats.h b/rtc_base/numerics/sample_stats.h index f6347414b0..39af1c6a37 100644 --- a/rtc_base/numerics/sample_stats.h +++ b/rtc_base/numerics/sample_stats.h @@ -10,10 +10,10 @@ #ifndef RTC_BASE_NUMERICS_SAMPLE_STATS_H_ #define RTC_BASE_NUMERICS_SAMPLE_STATS_H_ +#include "api/numerics/samples_stats_counter.h" #include "api/units/data_rate.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" -#include "rtc_base/numerics/samples_stats_counter.h" namespace webrtc { template diff --git a/rtc_base/random_unittest.cc b/rtc_base/random_unittest.cc index f94b0c13fe..4eb6f754eb 100644 --- a/rtc_base/random_unittest.cc +++ b/rtc_base/random_unittest.cc @@ -120,7 +120,7 @@ void BucketTestSignedInterval(unsigned int bucket_count, ASSERT_GE(high, low); ASSERT_GE(bucket_count, 2u); - uint32_t interval = unsigned_difference(high, low) + 1; + uint32_t interval = webrtc_impl::unsigned_difference(high, low) + 1; uint32_t numbers_per_bucket; if (interval == 0) { // The computation high - low + 1 should be 2^32 but overflowed @@ -136,7 +136,8 @@ void BucketTestSignedInterval(unsigned int bucket_count, int32_t sample = prng->Rand(low, high); EXPECT_LE(low, sample); EXPECT_GE(high, sample); - buckets[unsigned_difference(sample, low) / numbers_per_bucket]++; + buckets[webrtc_impl::unsigned_difference(sample, low) / + numbers_per_bucket]++; } for (unsigned int i = 0; i < bucket_count; i++) { diff --git a/rtc_base/rolling_accumulator.h b/rtc_base/rolling_accumulator.h index 015229b04c..241bd72a11 100644 --- a/rtc_base/rolling_accumulator.h +++ b/rtc_base/rolling_accumulator.h @@ -40,7 +40,7 @@ class RollingAccumulator { size_t count() const { return static_cast(stats_.Size()); } void Reset() { - stats_ = webrtc::RunningStatistics(); + stats_ = webrtc::webrtc_impl::RunningStatistics(); next_index_ = 0U; max_ = T(); max_stale_ = false; @@ -129,7 +129,7 @@ class RollingAccumulator { double ComputeVariance() const { return stats_.GetVariance().value_or(0); } private: - webrtc::RunningStatistics stats_; + webrtc::webrtc_impl::RunningStatistics stats_; size_t next_index_; mutable T max_; mutable bool max_stale_; diff --git a/test/BUILD.gn b/test/BUILD.gn index 549596f8d7..9cf54228a0 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -35,8 +35,8 @@ group("test") { rtc_library("frame_generator_impl") { visibility = [ - "../api:create_frame_generator", ":*", + "../api:create_frame_generator", ] testonly = true sources = [ @@ -246,6 +246,7 @@ rtc_library("perf_test") { ] deps = [ "../api:array_view", + "../api/numerics", "../rtc_base:checks", "../rtc_base:criticalsection", "../rtc_base:logging", diff --git a/test/pc/e2e/BUILD.gn b/test/pc/e2e/BUILD.gn index fbcaa35db8..83f7ac6193 100644 --- a/test/pc/e2e/BUILD.gn +++ b/test/pc/e2e/BUILD.gn @@ -567,6 +567,7 @@ if (!build_with_chromium) { "../../../api:rtc_stats_api", "../../../api:stats_observer_interface", "../../../api:track_id_stream_info_map", + "../../../api/numerics", "../../../api/units:time_delta", "../../../api/units:timestamp", "../../../rtc_base:criticalsection", @@ -610,6 +611,7 @@ if (!build_with_chromium) { "../../../api:peer_connection_quality_test_fixture_api", "../../../api:rtc_stats_api", "../../../api:track_id_stream_info_map", + "../../../api/numerics", "../../../api/units:data_rate", "../../../api/units:data_size", "../../../api/units:time_delta", @@ -635,6 +637,7 @@ if (!build_with_chromium) { "../..:perf_test", "../../../api:array_view", "../../../api:video_quality_analyzer_api", + "../../../api/numerics", "../../../api/units:time_delta", "../../../api/units:timestamp", "../../../api/video:encoded_image", @@ -717,6 +720,7 @@ if (!build_with_chromium) { "../../../api:peer_connection_quality_test_fixture_api", "../../../api:rtc_stats_api", "../../../api:track_id_stream_info_map", + "../../../api/numerics", "../../../api/units:timestamp", "../../../rtc_base:criticalsection", "../../../rtc_base:rtc_event", diff --git a/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.h b/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.h index dd6280ecfe..4ad0dd3da2 100644 --- a/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.h +++ b/test/pc/e2e/analyzer/audio/default_audio_quality_analyzer.h @@ -15,10 +15,10 @@ #include #include "absl/strings/string_view.h" +#include "api/numerics/samples_stats_counter.h" #include "api/test/audio_quality_analyzer_interface.h" #include "api/test/track_id_stream_info_map.h" #include "api/units/time_delta.h" -#include "rtc_base/numerics/samples_stats_counter.h" #include "rtc_base/synchronization/mutex.h" #include "test/testsupport/perf_test.h" diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h index db17ced72a..08fc466bed 100644 --- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h +++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.h @@ -20,12 +20,12 @@ #include #include "api/array_view.h" +#include "api/numerics/samples_stats_counter.h" #include "api/test/video_quality_analyzer_interface.h" #include "api/units/timestamp.h" #include "api/video/encoded_image.h" #include "api/video/video_frame.h" #include "rtc_base/event.h" -#include "rtc_base/numerics/samples_stats_counter.h" #include "rtc_base/platform_thread.h" #include "rtc_base/synchronization/mutex.h" #include "system_wrappers/include/clock.h" diff --git a/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h b/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h index 188aa42ef1..ff195a450e 100644 --- a/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h +++ b/test/pc/e2e/analyzer/video/video_quality_metrics_reporter.h @@ -15,11 +15,11 @@ #include #include "absl/strings/string_view.h" +#include "api/numerics/samples_stats_counter.h" #include "api/test/peerconnection_quality_test_fixture.h" #include "api/test/track_id_stream_info_map.h" #include "api/units/data_size.h" #include "api/units/timestamp.h" -#include "rtc_base/numerics/samples_stats_counter.h" #include "rtc_base/synchronization/mutex.h" #include "test/testsupport/perf_test.h" diff --git a/test/pc/e2e/cross_media_metrics_reporter.h b/test/pc/e2e/cross_media_metrics_reporter.h index af2a62e77a..6ddc994d1f 100644 --- a/test/pc/e2e/cross_media_metrics_reporter.h +++ b/test/pc/e2e/cross_media_metrics_reporter.h @@ -16,10 +16,10 @@ #include "absl/strings/string_view.h" #include "absl/types/optional.h" +#include "api/numerics/samples_stats_counter.h" #include "api/test/peerconnection_quality_test_fixture.h" #include "api/test/track_id_stream_info_map.h" #include "api/units/timestamp.h" -#include "rtc_base/numerics/samples_stats_counter.h" #include "rtc_base/synchronization/mutex.h" #include "test/testsupport/perf_test.h" diff --git a/test/scenario/BUILD.gn b/test/scenario/BUILD.gn index 3ae13367cd..32ce3942c0 100644 --- a/test/scenario/BUILD.gn +++ b/test/scenario/BUILD.gn @@ -130,6 +130,7 @@ if (rtc_include_tests) { "../../rtc_base:rtc_base_approved", "../../rtc_base:rtc_base_tests_utils", "../../rtc_base:rtc_numerics", + "../../rtc_base:rtc_stats_counters", "../../rtc_base:rtc_task_queue", "../../rtc_base:safe_minmax", "../../rtc_base:task_queue_for_test", diff --git a/test/testsupport/perf_test.h b/test/testsupport/perf_test.h index 4bb6773336..25535bce82 100644 --- a/test/testsupport/perf_test.h +++ b/test/testsupport/perf_test.h @@ -16,7 +16,7 @@ #include #include "api/array_view.h" -#include "rtc_base/numerics/samples_stats_counter.h" +#include "api/numerics/samples_stats_counter.h" namespace webrtc { namespace test { diff --git a/video/BUILD.gn b/video/BUILD.gn index 039429d190..bcec102487 100644 --- a/video/BUILD.gn +++ b/video/BUILD.gn @@ -298,6 +298,7 @@ if (rtc_include_tests) { "../api:rtc_event_log_output_file", "../api:test_dependency_factory", "../api:video_quality_test_fixture_api", + "../api/numerics", "../api/rtc_event_log:rtc_event_log_factory", "../api/task_queue", "../api/task_queue:default_task_queue_factory", diff --git a/video/video_analyzer.h b/video/video_analyzer.h index c2401d2828..18bacc16fc 100644 --- a/video/video_analyzer.h +++ b/video/video_analyzer.h @@ -35,7 +35,7 @@ class VideoAnalyzer : public PacketReceiver, public Transport, public rtc::VideoSinkInterface { public: - using Statistics = RunningStatistics; + using Statistics = webrtc_impl::RunningStatistics; VideoAnalyzer(test::LayerFilteringTransport* transport, const std::string& test_label,