30 template<
typename Duration,
31 typename =
typename Duration::period,
32 typename = std::enable_if_t<std::is_integral_v<typename Duration::rep>>>
35 using Ratio =
typename Duration::period;
37 static_assert(Ratio::num <= INT_MAX,
"To prevent precision lost, ratio numerator must be less then INT_MAX");
38 static_assert(Ratio::den <= INT_MAX,
"To prevent precision lost, ratio denominator must be less then INT_MAX");
40 m_timestamp = duration.count();
41 m_timebase =
Rational(
static_cast<int>(Ratio::num),
42 static_cast<int>(Ratio::den));
52 template<
typename Duration,
53 typename PrecisionPeriod,
54 typename =
typename Duration::period,
55 typename = std::enable_if_t<std::is_floating_point_v<typename Duration::rep>>>
56 constexpr
Timestamp(
const Duration& duration, PrecisionPeriod)
57 :
Timestamp(duration,
Rational{static_cast<int>(PrecisionPeriod::num), static_cast<int>(PrecisionPeriod::den)})
59 using Ratio =
typename Duration::period;
60 static_assert(Ratio::num <= INT_MAX,
"To prevent precision lost, ratio numerator must be less then INT_MAX");
61 static_assert(Ratio::den <= INT_MAX,
"To prevent precision lost, ratio denominator must be less then INT_MAX");
62 static_assert(PrecisionPeriod::num <= INT_MAX,
"To prevent precision lost, ratio numerator must be less then INT_MAX");
63 static_assert(PrecisionPeriod::den <= INT_MAX,
"To prevent precision lost, ratio denominator must be less then INT_MAX");
71 template<
typename Duration,
72 typename =
typename Duration::period,
73 typename = std::enable_if_t<std::is_floating_point_v<typename Duration::rep>>>
77 using ValueType =
typename Duration::rep;
78 using Ratio =
typename Duration::period;
80 static_assert(Ratio::num <= INT_MAX,
"To prevent precision lost, ratio numerator must be less then INT_MAX");
81 static_assert(Ratio::den <= INT_MAX,
"To prevent precision lost, ratio denominator must be less then INT_MAX");
85 ValueType
const b =
static_cast<ValueType
>(Ratio::num) * m_timebase.
getDenominator();
86 ValueType
const c =
static_cast<ValueType
>(Ratio::den) * m_timebase.
getNumerator();
88 m_timestamp =
static_cast<int64_t
>(duration.count() * b / c);
96 operator
bool() const noexcept;
100 operator
double() const noexcept;
101 double seconds() const noexcept;
109 template<typename Duration,
110 typename = typename Duration::period,
111 typename = typename Duration::rep>
114 using ValueType =
typename Duration::rep;
115 using Ratio =
typename Duration::period;
117 static_assert(Ratio::num <= INT_MAX,
"To prevent precision lost, ratio numerator must be less then INT_MAX");
118 static_assert(Ratio::den <= INT_MAX,
"To prevent precision lost, ratio denominator must be less then INT_MAX");
120 if constexpr (std::is_integral_v<ValueType>) {
121 Rational dstTimebase(
static_cast<int>(Ratio::num),
122 static_cast<int>(Ratio::den));
123 auto ts = m_timebase.
rescale(m_timestamp, dstTimebase);
126 namespace dt = std::chrono;
128 ValueType
const b = m_timebase.
getNumerator() *
static_cast<ValueType
>(Ratio::den);
129 ValueType
const c = m_timebase.
getDenominator() *
static_cast<ValueType
>(Ratio::num);
130 ValueType
const ts =
static_cast<ValueType
>(m_timestamp) * b / c;
153 return av_compare_ts(left.timestamp(), left.timebase(),
154 right.timestamp(), right.timebase()) > 0;
161 return av_compare_ts(left.timestamp(), left.timebase(),
162 right.timestamp(), right.timebase()) < 0;
169 return av_compare_ts(left.timestamp(), left.timebase(),
170 right.timestamp(), right.timebase()) == 0;
182 return av_compare_ts(left.timestamp(), left.timebase(),
183 right.timestamp(), right.timebase()) >= 0;
189 return av_compare_ts(left.timestamp(), left.timebase(),
190 right.timestamp(), right.timebase()) <= 0;
197 Timestamp
operator+(
const Timestamp& left,
const Timestamp &right) noexcept;
198 Timestamp
operator-(
const Timestamp& left,
const Timestamp &right) noexcept;
199 Timestamp
operator*(
const Timestamp& left,
const Timestamp &right) noexcept;
200 Timestamp
operator/(
const Timestamp& left,
const Timestamp &right) noexcept;
218 #ifdef __cpp_lib_format
222 template <
typename CharT>
223 struct std::formatter<
av::Timestamp, CharT>
225 template<
typename ParseContext>
226 constexpr
auto parse(ParseContext& ctx)
231 template<
typename ParseContext>
232 auto format(
const av::Timestamp& ts, ParseContext& ctx)
const
235 return std::format_to(ctx.out(),
"NO_PTS");
Definition: rational.h:26
int getDenominator() const noexcept
Definition: rational.h:41
int64_t rescale(int64_t srcValue, const Rational &dstBase) const noexcept
Definition: rational.cpp:36
int getNumerator() const noexcept
Definition: rational.h:40
The Timestamp class represents timestamp value and it timebase.
Definition: timestamp.h:18
bool isNoPts() const noexcept
Definition: timestamp.cpp:39
Timestamp() noexcept
Definition: timestamp.cpp:9
int64_t timestamp() const noexcept
Definition: timestamp.cpp:19
constexpr Timestamp(const Duration &duration)
Create AvCpp/FFmpeg compatible timestamp value from the std::chrono::duration/boost::chrono::duration...
Definition: timestamp.h:33
Timestamp & operator+=(const Timestamp &other)
Definition: timestamp.cpp:57
bool isValid() const noexcept
Definition: timestamp.cpp:34
constexpr Timestamp(const Duration &duration, PrecisionPeriod)
Create AvCpp/FFmpeg compatible timestamp value from the floating point std::chrono::duration/boost::c...
Definition: timestamp.h:56
double seconds() const noexcept
Definition: timestamp.cpp:49
const Rational & timebase() const noexcept
Definition: timestamp.cpp:29
constexpr Duration toDuration() const
Convert to the std::chrono::duration compatible value.
Definition: timestamp.h:112
Timestamp & operator/=(const Timestamp &other)
Definition: timestamp.cpp:78
Timestamp & operator-=(const Timestamp &other)
Definition: timestamp.cpp:64
Timestamp & operator*=(const Timestamp &other)
Definition: timestamp.cpp:71
constexpr Timestamp(const Duration &duration, const Rational &timebase)
Create AvCpp/FFmpeg compatible timestamp value from the floating point std::chrono::duration/boost::c...
Definition: timestamp.h:74
Definition: audioresampler.cpp:8
std::ostream & operator<<(std::ostream &stream, const Rational &value)
Definition: rational.h:117
bool operator<(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.h:159
Timestamp operator-(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.cpp:102
Timestamp operator+(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.cpp:90
bool operator>(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.h:151
bool operator<=(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.h:187
bool operator>=(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.h:180
Timestamp operator*(const Timestamp &left, const Timestamp &right) noexcept
Definition: timestamp.cpp:114
constexpr auto TimeBaseQ
Definition: avutils.h:38
bool operator==(const Dictionary::Entry &lhs, const Dictionary::Entry &rhs)
Definition: dictionary.cpp:382
bool operator!=(const Dictionary::Entry &lhs, const Dictionary::Entry &rhs)
Definition: dictionary.cpp:387
auto operator/(T num, Rational value) -> std::enable_if_t< std::is_floating_point_v< T >||std::is_integral_v< T >, Rational >
Definition: rational.h:104
constexpr auto NoPts
Definition: avutils.h:36