//------------------------------------------------------------------------------ // File: RefTime.h // // Desc: DirectShow base classes - defines CRefTime, a class that manages // reference times. // // Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ // // CRefTime // // Manage reference times. // Shares same data layout as REFERENCE_TIME, but adds some (nonvirtual) // functions providing simple comparison, conversion and arithmetic. // // A reference time (at the moment) is a unit of seconds represented in // 100ns units as is used in the Win32 FILETIME structure. BUT the time // a REFERENCE_TIME represents is NOT the time elapsed since 1/1/1601 it // will either be stream time or reference time depending upon context // // This class provides simple arithmetic operations on reference times // // keep non-virtual otherwise the data layout will not be the same as // REFERENCE_TIME // ----- // note that you are safe to cast a CRefTime* to a REFERENCE_TIME*, but // you will need to do so explicitly // ----- #ifndef __REFTIME__ #define __REFTIME__ const LONGLONG MILLISECONDS = (1000); // 10 ^ 3 const LONGLONG NANOSECONDS = (1000000000); // 10 ^ 9 const LONGLONG UNITS = (NANOSECONDS / 100); // 10 ^ 7 /* Unfortunately an inline function here generates a call to __allmul - even for constants! */ #define MILLISECONDS_TO_100NS_UNITS(lMs) \ Int32x32To64((lMs), (UNITS / MILLISECONDS)) class CRefTime { public: // *MUST* be the only data member so that this class is exactly // equivalent to a REFERENCE_TIME. // Also, must be *no virtual functions* REFERENCE_TIME m_time; inline CRefTime() { // default to 0 time m_time = 0; }; inline CRefTime(LONG msecs) { m_time = MILLISECONDS_TO_100NS_UNITS(msecs); }; inline CRefTime(REFERENCE_TIME rt) { m_time = rt; }; inline operator REFERENCE_TIME() const { return m_time; }; inline CRefTime& operator=(const CRefTime& rt) { m_time = rt.m_time; return *this; }; inline CRefTime& operator=(const LONGLONG ll) { m_time = ll; return *this; }; inline CRefTime& operator+=(const CRefTime& rt) { return (*this = *this + rt); }; inline CRefTime& operator-=(const CRefTime& rt) { return (*this = *this - rt); }; inline LONG Millisecs(void) { return (LONG)(m_time / (UNITS / MILLISECONDS)); }; inline LONGLONG GetUnits(void) { return m_time; }; }; const LONGLONG TimeZero = 0; #endif /* __REFTIME__ */