Home | History | Annotate | Download | only in dvr
      1 #ifndef ANDROID_DVR_CLOCK_NS_H_
      2 #define ANDROID_DVR_CLOCK_NS_H_
      3 
      4 #include <stdint.h>
      5 #include <time.h>
      6 
      7 namespace android {
      8 namespace dvr {
      9 
     10 constexpr int64_t kNanosPerSecond = 1000000000ll;
     11 
     12 // Returns the standard Dream OS monotonic system time that corresponds with all
     13 // timestamps found in Dream OS APIs.
     14 static inline timespec GetSystemClock() {
     15   timespec t;
     16   clock_gettime(CLOCK_MONOTONIC, &t);
     17   return t;
     18 }
     19 
     20 static inline timespec GetSystemClockRaw() {
     21   timespec t;
     22   clock_gettime(CLOCK_MONOTONIC_RAW, &t);
     23   return t;
     24 }
     25 
     26 static inline int64_t GetSystemClockNs() {
     27   timespec t = GetSystemClock();
     28   int64_t ns = kNanosPerSecond * (int64_t)t.tv_sec + (int64_t)t.tv_nsec;
     29   return ns;
     30 }
     31 
     32 static inline int64_t GetSystemClockRawNs() {
     33   timespec t = GetSystemClockRaw();
     34   int64_t ns = kNanosPerSecond * (int64_t)t.tv_sec + (int64_t)t.tv_nsec;
     35   return ns;
     36 }
     37 
     38 static inline double NsToSec(int64_t nanoseconds) {
     39   return nanoseconds / static_cast<double>(kNanosPerSecond);
     40 }
     41 
     42 static inline double GetSystemClockSec() { return NsToSec(GetSystemClockNs()); }
     43 
     44 static inline double GetSystemClockMs() { return GetSystemClockSec() * 1000.0; }
     45 
     46 // Converts a nanosecond timestamp to a timespec. Based on the kernel function
     47 // of the same name.
     48 static inline timespec NsToTimespec(int64_t ns) {
     49   timespec t;
     50   int32_t remainder;
     51 
     52   t.tv_sec = ns / kNanosPerSecond;
     53   remainder = ns % kNanosPerSecond;
     54   if (remainder < 0) {
     55     t.tv_nsec--;
     56     remainder += kNanosPerSecond;
     57   }
     58   t.tv_nsec = remainder;
     59 
     60   return t;
     61 }
     62 
     63 // Timestamp comparison functions that handle wrapping values correctly.
     64 static inline bool TimestampLT(int64_t a, int64_t b) {
     65   return static_cast<int64_t>(static_cast<uint64_t>(a) -
     66                               static_cast<uint64_t>(b)) < 0;
     67 }
     68 static inline bool TimestampLE(int64_t a, int64_t b) {
     69   return static_cast<int64_t>(static_cast<uint64_t>(a) -
     70                               static_cast<uint64_t>(b)) <= 0;
     71 }
     72 static inline bool TimestampGT(int64_t a, int64_t b) {
     73   return static_cast<int64_t>(static_cast<uint64_t>(a) -
     74                               static_cast<uint64_t>(b)) > 0;
     75 }
     76 static inline bool TimestampGE(int64_t a, int64_t b) {
     77   return static_cast<int64_t>(static_cast<uint64_t>(a) -
     78                               static_cast<uint64_t>(b)) >= 0;
     79 }
     80 
     81 }  // namespace dvr
     82 }  // namespace android
     83 
     84 #endif  // ANDROID_DVR_CLOCK_NS_H_
     85