Home | History | Annotate | Download | only in vpx_ports
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef VPX_PORTS_VPX_TIMER_H_
     12 #define VPX_PORTS_VPX_TIMER_H_
     13 
     14 #include "./vpx_config.h"
     15 
     16 #include "vpx/vpx_integer.h"
     17 
     18 #if CONFIG_OS_SUPPORT
     19 
     20 #if defined(_WIN32)
     21 /*
     22  * Win32 specific includes
     23  */
     24 #undef NOMINMAX
     25 #define NOMINMAX
     26 #ifndef WIN32_LEAN_AND_MEAN
     27 #define WIN32_LEAN_AND_MEAN
     28 #endif
     29 #include <windows.h>
     30 #else
     31 /*
     32  * POSIX specific includes
     33  */
     34 #include <sys/time.h>
     35 
     36 /* timersub is not provided by msys at this time. */
     37 #ifndef timersub
     38 #define timersub(a, b, result)                       \
     39   do {                                               \
     40     (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;    \
     41     (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
     42     if ((result)->tv_usec < 0) {                     \
     43       --(result)->tv_sec;                            \
     44       (result)->tv_usec += 1000000;                  \
     45     }                                                \
     46   } while (0)
     47 #endif
     48 #endif
     49 
     50 struct vpx_usec_timer {
     51 #if defined(_WIN32)
     52   LARGE_INTEGER begin, end;
     53 #else
     54   struct timeval begin, end;
     55 #endif
     56 };
     57 
     58 static INLINE void vpx_usec_timer_start(struct vpx_usec_timer *t) {
     59 #if defined(_WIN32)
     60   QueryPerformanceCounter(&t->begin);
     61 #else
     62   gettimeofday(&t->begin, NULL);
     63 #endif
     64 }
     65 
     66 static INLINE void vpx_usec_timer_mark(struct vpx_usec_timer *t) {
     67 #if defined(_WIN32)
     68   QueryPerformanceCounter(&t->end);
     69 #else
     70   gettimeofday(&t->end, NULL);
     71 #endif
     72 }
     73 
     74 static INLINE int64_t vpx_usec_timer_elapsed(struct vpx_usec_timer *t) {
     75 #if defined(_WIN32)
     76   LARGE_INTEGER freq, diff;
     77 
     78   diff.QuadPart = t->end.QuadPart - t->begin.QuadPart;
     79 
     80   QueryPerformanceFrequency(&freq);
     81   return diff.QuadPart * 1000000 / freq.QuadPart;
     82 #else
     83   struct timeval diff;
     84 
     85   timersub(&t->end, &t->begin, &diff);
     86   return (int64_t)diff.tv_sec * 1000000 + diff.tv_usec;
     87 #endif
     88 }
     89 
     90 #else /* CONFIG_OS_SUPPORT = 0*/
     91 
     92 /* Empty timer functions if CONFIG_OS_SUPPORT = 0 */
     93 #ifndef timersub
     94 #define timersub(a, b, result)
     95 #endif
     96 
     97 struct vpx_usec_timer {
     98   void *dummy;
     99 };
    100 
    101 static INLINE void vpx_usec_timer_start(struct vpx_usec_timer *t) {}
    102 
    103 static INLINE void vpx_usec_timer_mark(struct vpx_usec_timer *t) {}
    104 
    105 static INLINE int vpx_usec_timer_elapsed(struct vpx_usec_timer *t) { return 0; }
    106 
    107 #endif /* CONFIG_OS_SUPPORT */
    108 
    109 #endif  // VPX_PORTS_VPX_TIMER_H_
    110