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 12#ifndef VPX_PORTS_VPX_TIMER_H_ 13#define VPX_PORTS_VPX_TIMER_H_ 14 15#include "./vpx_config.h" 16 17#include "vpx/vpx_integer.h" 18 19#if CONFIG_OS_SUPPORT 20 21#if defined(_WIN32) 22/* 23 * Win32 specific includes 24 */ 25#ifndef WIN32_LEAN_AND_MEAN 26#define WIN32_LEAN_AND_MEAN 27#endif 28#include <windows.h> 29#else 30/* 31 * POSIX specific includes 32 */ 33#include <sys/time.h> 34 35/* timersub is not provided by msys at this time. */ 36#ifndef timersub 37#define timersub(a, b, result) \ 38 do { \ 39 (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ 40 (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ 41 if ((result)->tv_usec < 0) { \ 42 --(result)->tv_sec; \ 43 (result)->tv_usec += 1000000; \ 44 } \ 45 } while (0) 46#endif 47#endif 48 49 50struct vpx_usec_timer { 51#if defined(_WIN32) 52 LARGE_INTEGER begin, end; 53#else 54 struct timeval begin, end; 55#endif 56}; 57 58 59static INLINE void 60vpx_usec_timer_start(struct vpx_usec_timer *t) { 61#if defined(_WIN32) 62 QueryPerformanceCounter(&t->begin); 63#else 64 gettimeofday(&t->begin, NULL); 65#endif 66} 67 68 69static INLINE void 70vpx_usec_timer_mark(struct vpx_usec_timer *t) { 71#if defined(_WIN32) 72 QueryPerformanceCounter(&t->end); 73#else 74 gettimeofday(&t->end, NULL); 75#endif 76} 77 78 79static INLINE int64_t 80vpx_usec_timer_elapsed(struct vpx_usec_timer *t) { 81#if defined(_WIN32) 82 LARGE_INTEGER freq, diff; 83 84 diff.QuadPart = t->end.QuadPart - t->begin.QuadPart; 85 86 QueryPerformanceFrequency(&freq); 87 return diff.QuadPart * 1000000 / freq.QuadPart; 88#else 89 struct timeval diff; 90 91 timersub(&t->end, &t->begin, &diff); 92 return diff.tv_sec * 1000000 + diff.tv_usec; 93#endif 94} 95 96#else /* CONFIG_OS_SUPPORT = 0*/ 97 98/* Empty timer functions if CONFIG_OS_SUPPORT = 0 */ 99#ifndef timersub 100#define timersub(a, b, result) 101#endif 102 103struct vpx_usec_timer { 104 void *dummy; 105}; 106 107static INLINE void 108vpx_usec_timer_start(struct vpx_usec_timer *t) { } 109 110static INLINE void 111vpx_usec_timer_mark(struct vpx_usec_timer *t) { } 112 113static INLINE int 114vpx_usec_timer_elapsed(struct vpx_usec_timer *t) { 115 return 0; 116} 117 118#endif /* CONFIG_OS_SUPPORT */ 119 120#endif // VPX_PORTS_VPX_TIMER_H_ 121