1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker #ifndef API_UNITS_FREQUENCY_H_ 11*d9f75844SAndroid Build Coastguard Worker #define API_UNITS_FREQUENCY_H_ 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #ifdef WEBRTC_UNIT_TEST 14*d9f75844SAndroid Build Coastguard Worker #include <ostream> // no-presubmit-check TODO(webrtc:8982) 15*d9f75844SAndroid Build Coastguard Worker #endif // WEBRTC_UNIT_TEST 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker #include <cstdlib> 18*d9f75844SAndroid Build Coastguard Worker #include <limits> 19*d9f75844SAndroid Build Coastguard Worker #include <string> 20*d9f75844SAndroid Build Coastguard Worker #include <type_traits> 21*d9f75844SAndroid Build Coastguard Worker 22*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h" 23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/units/unit_base.h" // IWYU pragma: export 24*d9f75844SAndroid Build Coastguard Worker 25*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 26*d9f75844SAndroid Build Coastguard Worker 27*d9f75844SAndroid Build Coastguard Worker class Frequency final : public rtc_units_impl::RelativeUnit<Frequency> { 28*d9f75844SAndroid Build Coastguard Worker public: 29*d9f75844SAndroid Build Coastguard Worker template <typename T> MilliHertz(T value)30*d9f75844SAndroid Build Coastguard Worker static constexpr Frequency MilliHertz(T value) { 31*d9f75844SAndroid Build Coastguard Worker static_assert(std::is_arithmetic<T>::value, ""); 32*d9f75844SAndroid Build Coastguard Worker return FromValue(value); 33*d9f75844SAndroid Build Coastguard Worker } 34*d9f75844SAndroid Build Coastguard Worker template <typename T> Hertz(T value)35*d9f75844SAndroid Build Coastguard Worker static constexpr Frequency Hertz(T value) { 36*d9f75844SAndroid Build Coastguard Worker static_assert(std::is_arithmetic<T>::value, ""); 37*d9f75844SAndroid Build Coastguard Worker return FromFraction(1'000, value); 38*d9f75844SAndroid Build Coastguard Worker } 39*d9f75844SAndroid Build Coastguard Worker template <typename T> 40*d9f75844SAndroid Build Coastguard Worker static constexpr Frequency KiloHertz(T value) { 41*d9f75844SAndroid Build Coastguard Worker static_assert(std::is_arithmetic<T>::value, ""); 42*d9f75844SAndroid Build Coastguard Worker return FromFraction(1'000'000, value); 43*d9f75844SAndroid Build Coastguard Worker } 44*d9f75844SAndroid Build Coastguard Worker 45*d9f75844SAndroid Build Coastguard Worker Frequency() = delete; 46*d9f75844SAndroid Build Coastguard Worker 47*d9f75844SAndroid Build Coastguard Worker template <typename T = int64_t> 48*d9f75844SAndroid Build Coastguard Worker constexpr T hertz() const { 49*d9f75844SAndroid Build Coastguard Worker return ToFraction<1000, T>(); 50*d9f75844SAndroid Build Coastguard Worker } 51*d9f75844SAndroid Build Coastguard Worker template <typename T = int64_t> 52*d9f75844SAndroid Build Coastguard Worker constexpr T millihertz() const { 53*d9f75844SAndroid Build Coastguard Worker return ToValue<T>(); 54*d9f75844SAndroid Build Coastguard Worker } 55*d9f75844SAndroid Build Coastguard Worker 56*d9f75844SAndroid Build Coastguard Worker private: 57*d9f75844SAndroid Build Coastguard Worker friend class rtc_units_impl::UnitBase<Frequency>; 58*d9f75844SAndroid Build Coastguard Worker using RelativeUnit::RelativeUnit; 59*d9f75844SAndroid Build Coastguard Worker static constexpr bool one_sided = true; 60*d9f75844SAndroid Build Coastguard Worker }; 61*d9f75844SAndroid Build Coastguard Worker 62*d9f75844SAndroid Build Coastguard Worker inline constexpr Frequency operator/(int64_t nominator, 63*d9f75844SAndroid Build Coastguard Worker const TimeDelta& interval) { 64*d9f75844SAndroid Build Coastguard Worker constexpr int64_t kKiloPerMicro = 1000 * 1000000; 65*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_LE(nominator, std::numeric_limits<int64_t>::max() / kKiloPerMicro); 66*d9f75844SAndroid Build Coastguard Worker RTC_CHECK(interval.IsFinite()); 67*d9f75844SAndroid Build Coastguard Worker RTC_CHECK(!interval.IsZero()); 68*d9f75844SAndroid Build Coastguard Worker return Frequency::MilliHertz(nominator * kKiloPerMicro / interval.us()); 69*d9f75844SAndroid Build Coastguard Worker } 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker inline constexpr TimeDelta operator/(int64_t nominator, 72*d9f75844SAndroid Build Coastguard Worker const Frequency& frequency) { 73*d9f75844SAndroid Build Coastguard Worker constexpr int64_t kMegaPerMilli = 1000000 * 1000; 74*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_LE(nominator, std::numeric_limits<int64_t>::max() / kMegaPerMilli); 75*d9f75844SAndroid Build Coastguard Worker RTC_CHECK(frequency.IsFinite()); 76*d9f75844SAndroid Build Coastguard Worker RTC_CHECK(!frequency.IsZero()); 77*d9f75844SAndroid Build Coastguard Worker return TimeDelta::Micros(nominator * kMegaPerMilli / frequency.millihertz()); 78*d9f75844SAndroid Build Coastguard Worker } 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Worker inline constexpr double operator*(Frequency frequency, TimeDelta time_delta) { 81*d9f75844SAndroid Build Coastguard Worker return frequency.hertz<double>() * time_delta.seconds<double>(); 82*d9f75844SAndroid Build Coastguard Worker } 83*d9f75844SAndroid Build Coastguard Worker inline constexpr double operator*(TimeDelta time_delta, Frequency frequency) { 84*d9f75844SAndroid Build Coastguard Worker return frequency * time_delta; 85*d9f75844SAndroid Build Coastguard Worker } 86*d9f75844SAndroid Build Coastguard Worker 87*d9f75844SAndroid Build Coastguard Worker std::string ToString(Frequency value); 88*d9f75844SAndroid Build Coastguard Worker inline std::string ToLogString(Frequency value) { 89*d9f75844SAndroid Build Coastguard Worker return ToString(value); 90*d9f75844SAndroid Build Coastguard Worker } 91*d9f75844SAndroid Build Coastguard Worker 92*d9f75844SAndroid Build Coastguard Worker #ifdef WEBRTC_UNIT_TEST 93*d9f75844SAndroid Build Coastguard Worker inline std::ostream& operator<<( // no-presubmit-check TODO(webrtc:8982) 94*d9f75844SAndroid Build Coastguard Worker std::ostream& stream, // no-presubmit-check TODO(webrtc:8982) 95*d9f75844SAndroid Build Coastguard Worker Frequency value) { 96*d9f75844SAndroid Build Coastguard Worker return stream << ToString(value); 97*d9f75844SAndroid Build Coastguard Worker } 98*d9f75844SAndroid Build Coastguard Worker #endif // WEBRTC_UNIT_TEST 99*d9f75844SAndroid Build Coastguard Worker 100*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 101*d9f75844SAndroid Build Coastguard Worker #endif // API_UNITS_FREQUENCY_H_ 102