117 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| // 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__ */
 | |
| 
 |