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