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__ */
							 | 
						||
| 
								 | 
							
								
							 |