Line data Source code
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 0 : static INLINE void vpx_usec_timer_start(struct vpx_usec_timer *t) {
59 : #if defined(_WIN32)
60 : QueryPerformanceCounter(&t->begin);
61 : #else
62 0 : gettimeofday(&t->begin, NULL);
63 : #endif
64 0 : }
65 :
66 0 : static INLINE void vpx_usec_timer_mark(struct vpx_usec_timer *t) {
67 : #if defined(_WIN32)
68 : QueryPerformanceCounter(&t->end);
69 : #else
70 0 : gettimeofday(&t->end, NULL);
71 : #endif
72 0 : }
73 :
74 0 : 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 0 : timersub(&t->end, &t->begin, &diff);
86 0 : return 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_
|