190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef VPX_TIMER_H
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_TIMER_H
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1579f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_OS_SUPPORT
1679f15823c34ae1e423108295e416213200bb280fAndreas Huber
17f71323e297a928af368937089d3ed71239786f86Andreas Huber#if defined(_WIN32)
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Win32 specific includes
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef WIN32_LEAN_AND_MEAN
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define WIN32_LEAN_AND_MEAN
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <windows.h>
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * POSIX specific includes
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <sys/time.h>
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* timersub is not provided by msys at this time. */
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef timersub
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define timersub(a, b, result) \
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    do { \
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((result)->tv_usec < 0) { \
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            --(result)->tv_sec; \
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            (result)->tv_usec += 1000000; \
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        } \
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } while (0)
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstruct vpx_usec_timer
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
48f71323e297a928af368937089d3ed71239786f86Andreas Huber#if defined(_WIN32)
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    LARGE_INTEGER  begin, end;
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    struct timeval begin, end;
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56f71323e297a928af368937089d3ed71239786f86Andreas Huberstatic void
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_usec_timer_start(struct vpx_usec_timer *t)
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
59f71323e297a928af368937089d3ed71239786f86Andreas Huber#if defined(_WIN32)
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    QueryPerformanceCounter(&t->begin);
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    gettimeofday(&t->begin, NULL);
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67f71323e297a928af368937089d3ed71239786f86Andreas Huberstatic void
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_usec_timer_mark(struct vpx_usec_timer *t)
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
70f71323e297a928af368937089d3ed71239786f86Andreas Huber#if defined(_WIN32)
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    QueryPerformanceCounter(&t->end);
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    gettimeofday(&t->end, NULL);
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
78f71323e297a928af368937089d3ed71239786f86Andreas Huberstatic long
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervpx_usec_timer_elapsed(struct vpx_usec_timer *t)
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
81f71323e297a928af368937089d3ed71239786f86Andreas Huber#if defined(_WIN32)
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    LARGE_INTEGER freq, diff;
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    diff.QuadPart = t->end.QuadPart - t->begin.QuadPart;
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (QueryPerformanceFrequency(&freq) && diff.QuadPart < freq.QuadPart)
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return (long)(diff.QuadPart * 1000000 / freq.QuadPart);
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return 1000000;
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    struct timeval diff;
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    timersub(&t->end, &t->begin, &diff);
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return diff.tv_sec ? 1000000 : diff.tv_usec;
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9879f15823c34ae1e423108295e416213200bb280fAndreas Huber#else /* CONFIG_OS_SUPPORT = 0*/
9979f15823c34ae1e423108295e416213200bb280fAndreas Huber
10079f15823c34ae1e423108295e416213200bb280fAndreas Huber/* Empty timer functions if CONFIG_OS_SUPPORT = 0 */
10179f15823c34ae1e423108295e416213200bb280fAndreas Huber#ifndef timersub
10279f15823c34ae1e423108295e416213200bb280fAndreas Huber#define timersub(a, b, result)
10379f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif
10479f15823c34ae1e423108295e416213200bb280fAndreas Huber
10579f15823c34ae1e423108295e416213200bb280fAndreas Huberstruct vpx_usec_timer
10679f15823c34ae1e423108295e416213200bb280fAndreas Huber{
10779f15823c34ae1e423108295e416213200bb280fAndreas Huber    void *dummy;
10879f15823c34ae1e423108295e416213200bb280fAndreas Huber};
10979f15823c34ae1e423108295e416213200bb280fAndreas Huber
11079f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void
11179f15823c34ae1e423108295e416213200bb280fAndreas Hubervpx_usec_timer_start(struct vpx_usec_timer *t) { }
11279f15823c34ae1e423108295e416213200bb280fAndreas Huber
11379f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic void
11479f15823c34ae1e423108295e416213200bb280fAndreas Hubervpx_usec_timer_mark(struct vpx_usec_timer *t) { }
11579f15823c34ae1e423108295e416213200bb280fAndreas Huber
11679f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic long
11779f15823c34ae1e423108295e416213200bb280fAndreas Hubervpx_usec_timer_elapsed(struct vpx_usec_timer *t) { return 0; }
11879f15823c34ae1e423108295e416213200bb280fAndreas Huber
11979f15823c34ae1e423108295e416213200bb280fAndreas Huber#endif /* CONFIG_OS_SUPPORT */
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
122