12 using std::chrono::duration_cast;
13 using namespace std::chrono_literals;
22 #if __cplusplus <= 201703L
25 using days = duration<CHRONO_TYPE, ratio<86400>>;
26 using weeks = duration<CHRONO_TYPE, ratio<604800>>;
27 using months = duration<CHRONO_TYPE, ratio<2629746>>;
28 using years = duration<CHRONO_TYPE, ratio<31556952>>;
40 using floatmsecs = std::chrono::duration<double, std::milli>;
41 using floatusecs = std::chrono::duration<double, std::micro>;
45 #if defined AV_TIME_BASE
46 using av_duration = std::chrono::duration<int64_t,std::ratio<1,AV_TIME_BASE>>;
55 using pts = std::chrono::duration<CHRONO_TYPE, std::ratio<1, 90000>>;
57 namespace chrono_literals
79 typename std::enable_if_t<std::is_floating_point_v<T>, std::chrono::seconds>
82 return std::chrono::seconds(
static_cast<int64_t
>(value));
90 typename std::enable_if_t<std::is_floating_point_v<T>, std::chrono::milliseconds>
93 return std::chrono::milliseconds(
static_cast<int64_t
>(value));
100 template <
typename T>
101 typename std::enable_if_t<std::is_floating_point_v<T>, std::chrono::microseconds>
104 return std::chrono::microseconds(
static_cast<int64_t
>(value));
110 int seconds = 0,
int milliseconds = 0)
112 return std::chrono::hours(hours)
113 + std::chrono::minutes(minutes)
114 + std::chrono::seconds(seconds)
115 + std::chrono::milliseconds(milliseconds);
125 template <
typename T>
128 std::chrono::microseconds value = std::chrono::seconds(
t.tv_sec) +
129 std::chrono::microseconds(
t.tv_usec);
130 if constexpr (std::is_same_v<T,std::chrono::microseconds>)
132 return duration_cast<T>(value);
142 template <
typename T>
145 auto usec_a = durationFromTimeval<std::chrono::microseconds>(a);
146 auto usec_b = durationFromTimeval<std::chrono::microseconds>(b);
147 if constexpr (std::is_same_v<T,std::chrono::microseconds>)
148 return usec_a - usec_b;
149 return duration_cast<T>(usec_a - usec_b);
159 template <
typename T>
162 std::chrono::nanoseconds nsec = std::chrono::seconds(time.tv_sec)
163 + std::chrono::nanoseconds(time.tv_nsec);
164 if constexpr (std::is_same_v<T,std::chrono::nanoseconds>)
166 return duration_cast<T>(nsec);
182 template <
typename T>
185 struct timeval now {};
186 struct timezone tz {};
187 gettimeofday(&now, &tz);
189 auto usecs = durationFromTimeval<std::chrono::microseconds>(now);
191 usecs -= std::chrono::minutes(tz.tz_minuteswest);
192 if constexpr (std::is_same_v<T,std::chrono::microseconds>)
194 return duration_cast<T>(usecs);
198 template <
typename T>
201 return T(std::llround(duration.count() * f));
204 template <
typename T>
207 return T(std::llround(duration.count() / f));
210 #endif // MYTHCHRONO_H