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