1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VPX_PORTS_VPX_TIMER_H_
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VPX_PORTS_VPX_TIMER_H_
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_integer.h"
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_OS_SUPPORT
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(_WIN32)
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Win32 specific includes
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef WIN32_LEAN_AND_MEAN
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define WIN32_LEAN_AND_MEAN
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <windows.h>
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan * POSIX specific includes
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <sys/time.h>
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* timersub is not provided by msys at this time. */
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef timersub
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define timersub(a, b, result) \
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan  do { \
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan    (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if ((result)->tv_usec < 0) { \
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan      --(result)->tv_sec; \
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (result)->tv_usec += 1000000; \
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } \
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } while (0)
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan
47233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct vpx_usec_timer {
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(_WIN32)
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan  LARGE_INTEGER  begin, end;
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan  struct timeval begin, end;
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan
56233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void
57233d2500723e5594f3e7c70896ffeeef32b9c950ywanvpx_usec_timer_start(struct vpx_usec_timer *t) {
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(_WIN32)
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan  QueryPerformanceCounter(&t->begin);
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan  gettimeofday(&t->begin, NULL);
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan
66233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void
67233d2500723e5594f3e7c70896ffeeef32b9c950ywanvpx_usec_timer_mark(struct vpx_usec_timer *t) {
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(_WIN32)
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan  QueryPerformanceCounter(&t->end);
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan  gettimeofday(&t->end, NULL);
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan
76233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int64_t
77233d2500723e5594f3e7c70896ffeeef32b9c950ywanvpx_usec_timer_elapsed(struct vpx_usec_timer *t) {
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(_WIN32)
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan  LARGE_INTEGER freq, diff;
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan  diff.QuadPart = t->end.QuadPart - t->begin.QuadPart;
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan  QueryPerformanceFrequency(&freq);
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return diff.QuadPart * 1000000 / freq.QuadPart;
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan  struct timeval diff;
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan  timersub(&t->end, &t->begin, &diff);
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return diff.tv_sec * 1000000 + diff.tv_usec;
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else /* CONFIG_OS_SUPPORT = 0*/
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Empty timer functions if CONFIG_OS_SUPPORT = 0 */
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef timersub
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define timersub(a, b, result)
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan
100233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct vpx_usec_timer {
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void *dummy;
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan
104233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void
105233d2500723e5594f3e7c70896ffeeef32b9c950ywanvpx_usec_timer_start(struct vpx_usec_timer *t) { }
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan
107233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void
108233d2500723e5594f3e7c70896ffeeef32b9c950ywanvpx_usec_timer_mark(struct vpx_usec_timer *t) { }
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan
110233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic long
111233d2500723e5594f3e7c70896ffeeef32b9c950ywanvpx_usec_timer_elapsed(struct vpx_usec_timer *t) {
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return 0;
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif /* CONFIG_OS_SUPPORT */
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // VPX_PORTS_VPX_TIMER_H_
118