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