//*@@@+++@@@@******************************************************************1//2// Copyright © Microsoft Corp.3// All rights reserved.4//5// Redistribution and use in source and binary forms, with or without6// modification, are permitted provided that the following conditions are met:7//8// • Redistributions of source code must retain the above copyright notice,9// this list of conditions and the following disclaimer.10// • Redistributions in binary form must reproduce the above copyright notice,11// this list of conditions and the following disclaimer in the documentation12// and/or other materials provided with the distribution.13//14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"15// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE18// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR19// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF20// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS21// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN22// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)23// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE24// POSSIBILITY OF SUCH DAMAGE.25//26//*@@@---@@@@******************************************************************2728#ifndef __PERFTIMER_H_29#define __PERFTIMER_H_3031//***************************************************************************32// Description33//34// Performance timer API used to measure codec performance. The underlying35// implementation of this API may vary - from ANSI-C implementation via clock,36// Win32 implementation via QueryPerformanceCounter or GetProcessTimes. At37// present we only support one implementation of this PerfTimer "object".38// You choose the implementation by choosing which one of the many files39// to compile and link with your application.40//***************************************************************************4142#ifdef DISABLE_PERF_MEASUREMENT4344#define PERFTIMER_ONLY(code)45#define PERFTIMER_NEW(fPerf, ppPerfTimer)46#define PERFTIMER_DELETE(fPerf, ppPerfTimer)47#define PERFTIMER_START(fPerf, pPerfTimer)48#define PERFTIMER_STOP(fPerf, pPerfTimer)49#define PERFTIMER_GETRESULTS(fPerf, pPerfTimer, pResults)50#define PERFTIMER_COPYSTARTTIME(fPerf, pDst, pSrc)51#define PERFTIMER_REPORT(fPerf, pCodec)5253#else // DISABLE_PERF_MEASUREMENT5455#define PERFTIMER_ONLY(code) code56#define PERFTIMER_NEW(fPerf, ppPerfTimer) if (fPerf) {Bool b = b = PerfTimerNew(ppPerfTimer); assert(b);};57#define PERFTIMER_DELETE(fPerf, pPerfTimer) if (fPerf) {PerfTimerDelete(pPerfTimer);};58#define PERFTIMER_START(fPerf, pPerfTimer) if (fPerf) {Bool b = b = PerfTimerStart(pPerfTimer); assert(b);};59#define PERFTIMER_STOP(fPerf, pPerfTimer) if (fPerf) {Bool b = b = PerfTimerStop(pPerfTimer); assert(b);};60#define PERFTIMER_GETRESULTS(fPerf, pPerfTimer, pResults) \61if (fPerf) {Bool b = b = PerfTimerGetResults((pPerfTimer), (pResults)); assert(b);};62#define PERFTIMER_COPYSTARTTIME(fPerf, pDst, pSrc) \63if (fPerf) {Bool b = b = PerfTimerCopyStartTime((pDst), (pSrc)); assert(b);};64#define PERFTIMER_REPORT(fPerf, pCodec) \65if (fPerf) {OutputPerfTimerReport(pCodec);};66#endif // DISABLE_PERF_MEASUREMENT6768//***************************************************************************69// Data Types70//***************************************************************************71typedef U64 PERFTIMERTIME;72typedef struct PERFTIMERRESULTS73{74PERFTIMERTIME iElapsedTime; // In nanoseconds or CPU cycles75PERFTIMERTIME iTicksPerSecond; // Number of ticks per second (clock frequency)76PERFTIMERTIME iZeroTimeIntervals; // Number of zero-time intervals.77// Presence of zero-time intervals may indicate insufficient clock precision78} PERFTIMERRESULTS;7980#define NANOSECONDS_PER_SECOND 1000000000818283//***************************************************************************84// Data Declarations85//***************************************************************************86typedef enum87{88CS_UNINIT,89CS_RUNNING,90CS_STOPPED,91} CLOCKSTATE;9293typedef struct PERFTIMERSTATE94{95CLOCKSTATE eState;96PERFTIMERTIME iElapsedTime;97PERFTIMERTIME iPrevStartTime;98PERFTIMERTIME iZeroTimeIntervals;99} PERFTIMERSTATE;100101102//***************************************************************************103// Functions and Macros104//***************************************************************************105Bool PerfTimerNew(PERFTIMERSTATE **ppNewPerfTimer);106void PerfTimerDelete(PERFTIMERSTATE *pThisPerfTimer);107Bool PerfTimerStart(PERFTIMERSTATE *pThisPerfTimer);108Bool PerfTimerStop(PERFTIMERSTATE *pThisPerfTimer);109Bool PerfTimerGetResults(PERFTIMERSTATE *pThisPerfTimer,110PERFTIMERRESULTS *pPerfTimerResults);111Bool PerfTimerCopyStartTime(PERFTIMERSTATE *pDestPerfTimer,112PERFTIMERSTATE *pSrcPerfTimer);113114#endif // __PERFTIMER_H_115116117