blob: 8e777edf6d8e46d4c42df1e1a332b7d2e042a62e [file] [log] [blame]
#ifndef ANDROID_DVR_CLOCK_NS_H_
#define ANDROID_DVR_CLOCK_NS_H_
#include <stdint.h>
#include <time.h>
namespace android {
namespace dvr {
constexpr int64_t kNanosPerSecond = 1000000000ll;
// Returns the standard Dream OS monotonic system time that corresponds with all
// timestamps found in Dream OS APIs.
static inline timespec GetSystemClock() {
timespec t;
clock_gettime(CLOCK_MONOTONIC, &t);
return t;
}
static inline timespec GetSystemClockRaw() {
timespec t;
clock_gettime(CLOCK_MONOTONIC_RAW, &t);
return t;
}
static inline int64_t GetSystemClockNs() {
timespec t = GetSystemClock();
int64_t ns = kNanosPerSecond * (int64_t)t.tv_sec + (int64_t)t.tv_nsec;
return ns;
}
static inline int64_t GetSystemClockRawNs() {
timespec t = GetSystemClockRaw();
int64_t ns = kNanosPerSecond * (int64_t)t.tv_sec + (int64_t)t.tv_nsec;
return ns;
}
static inline double NsToSec(int64_t nanoseconds) {
return nanoseconds / static_cast<double>(kNanosPerSecond);
}
static inline double GetSystemClockSec() { return NsToSec(GetSystemClockNs()); }
static inline double GetSystemClockMs() { return GetSystemClockSec() * 1000.0; }
// Converts a nanosecond timestamp to a timespec. Based on the kernel function
// of the same name.
static inline timespec NsToTimespec(int64_t ns) {
timespec t;
int32_t remainder;
t.tv_sec = ns / kNanosPerSecond;
remainder = ns % kNanosPerSecond;
if (remainder < 0) {
t.tv_nsec--;
remainder += kNanosPerSecond;
}
t.tv_nsec = remainder;
return t;
}
// Timestamp comparison functions that handle wrapping values correctly.
static inline bool TimestampLT(int64_t a, int64_t b) {
return static_cast<int64_t>(static_cast<uint64_t>(a) -
static_cast<uint64_t>(b)) < 0;
}
static inline bool TimestampLE(int64_t a, int64_t b) {
return static_cast<int64_t>(static_cast<uint64_t>(a) -
static_cast<uint64_t>(b)) <= 0;
}
static inline bool TimestampGT(int64_t a, int64_t b) {
return static_cast<int64_t>(static_cast<uint64_t>(a) -
static_cast<uint64_t>(b)) > 0;
}
static inline bool TimestampGE(int64_t a, int64_t b) {
return static_cast<int64_t>(static_cast<uint64_t>(a) -
static_cast<uint64_t>(b)) >= 0;
}
} // namespace dvr
} // namespace android
#endif // ANDROID_DVR_CLOCK_NS_H_