view osdep/timer-win.c @ 10252:d275152390ee

I've found some time to implement the encoding support for the new DivX API. Now it's possible to play and encode movies with the latest DivX release. One thing that doesn't work is the new Video Buffer Verifier (VBV) multipass encoding. The encoder segfaults. Maybe it just isn't supported with the standard profile of the released binary encoder. Andreas Hess <jaska@gmx.net>
author arpi
date Fri, 06 Jun 2003 19:57:37 +0000
parents 2d703cd325ee
children
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <mmsystem.h>
#include <sys/time.h>

static LARGE_INTEGER qwTimerFrequency;
static LARGE_INTEGER qwTimerStart;
static LARGE_INTEGER m_lStartTime;
static float m_fuSecsPerTick;
static unsigned long RelativeTime = 0;

int usec_sleep(int usec_delay)
{
    LARGE_INTEGER qwStartTicks, qwCurrTicks;
    double dResult;
    long lTick;
    double fuSecDelay = ((float) usec_delay) / 1000000.0;

    QueryPerformanceCounter(&qwStartTicks);
    do {
	QueryPerformanceCounter(&qwCurrTicks);
	dResult =
	    ((double) (qwCurrTicks.QuadPart - qwStartTicks.QuadPart)) /
	    ((double) (qwTimerFrequency.QuadPart));
    } while (dResult < fuSecDelay);
}

// Returns current time in microseconds
unsigned long GetTimer()
{
    LARGE_INTEGER qwTime;
    FLOAT fTime;
    UINT64 uiQuadPart;

    QueryPerformanceCounter(&qwTime);
    qwTime.QuadPart -= m_lStartTime.QuadPart;
    uiQuadPart = (UINT64) qwTime.QuadPart;
    uiQuadPart /= ((UINT64) 10);	// prevent overflow after 4294.1 secs, now overflows after 42941 secs
    fTime = ((FLOAT) (uiQuadPart)) / m_fuSecsPerTick;
    return (unsigned long) fTime;
}

// Returns current time in microseconds
float GetRelativeTime()
{
    unsigned long t, r;

    t = GetTimer();
    r = t - RelativeTime;
    RelativeTime = t;
    return (float) r *0.000001F;
}

// Returns current time in milliseconds
unsigned int GetTimerMS()
{
    return GetTimer() / 1000;
}

void InitTimer()
{
    FLOAT t;

    QueryPerformanceFrequency(&qwTimerFrequency);	// ticks/sec
    m_fuSecsPerTick = (FLOAT) (((FLOAT) (qwTimerFrequency.QuadPart)) / 1000.0);	// tics/msec
    m_fuSecsPerTick = (FLOAT) (m_fuSecsPerTick / 1000.0);	// ticks/usec
    m_fuSecsPerTick /= 10.0;
    QueryPerformanceCounter(&m_lStartTime);
    t = GetRelativeTime();
}