xref: /aosp_15_r20/external/libvpx/vpx_ports/vpx_timer.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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