1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
128b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#ifndef VPX_PORTS_VPX_TIMER_H_
138b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#define VPX_PORTS_VPX_TIMER_H_
145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "vpx/vpx_integer.h"
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_OS_SUPPORT
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if defined(_WIN32)
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Win32 specific includes
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifndef WIN32_LEAN_AND_MEAN
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define WIN32_LEAN_AND_MEAN
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <windows.h>
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * POSIX specific includes
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <sys/time.h>
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* timersub is not provided by msys at this time. */
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifndef timersub
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define timersub(a, b, result) \
356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  do { \
366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    if ((result)->tv_usec < 0) { \
396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      --(result)->tv_sec; \
406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      (result)->tv_usec += 1000000; \
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    } \
426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  } while (0)
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgstruct vpx_usec_timer {
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if defined(_WIN32)
496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  LARGE_INTEGER  begin, end;
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  struct timeval begin, end;
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void
576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgvpx_usec_timer_start(struct vpx_usec_timer *t) {
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if defined(_WIN32)
596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  QueryPerformanceCounter(&t->begin);
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  gettimeofday(&t->begin, NULL);
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void
676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgvpx_usec_timer_mark(struct vpx_usec_timer *t) {
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if defined(_WIN32)
696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  QueryPerformanceCounter(&t->end);
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  gettimeofday(&t->end, NULL);
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic int64_t
776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgvpx_usec_timer_elapsed(struct vpx_usec_timer *t) {
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if defined(_WIN32)
796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  LARGE_INTEGER freq, diff;
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  diff.QuadPart = t->end.QuadPart - t->begin.QuadPart;
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  QueryPerformanceFrequency(&freq);
846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return diff.QuadPart * 1000000 / freq.QuadPart;
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  struct timeval diff;
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  timersub(&t->end, &t->begin, &diff);
896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return diff.tv_sec * 1000000 + diff.tv_usec;
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else /* CONFIG_OS_SUPPORT = 0*/
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Empty timer functions if CONFIG_OS_SUPPORT = 0 */
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifndef timersub
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define timersub(a, b, result)
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgstruct vpx_usec_timer {
1016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  void *dummy;
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvpx_usec_timer_start(struct vpx_usec_timer *t) { }
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvpx_usec_timer_mark(struct vpx_usec_timer *t) { }
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic long
1116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgvpx_usec_timer_elapsed(struct vpx_usec_timer *t) {
1126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return 0;
1136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif /* CONFIG_OS_SUPPORT */
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1178b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#endif  // VPX_PORTS_VPX_TIMER_H_
118