wxutil.h.svn-base
来自「ffshow源码」· SVN-BASE 代码 · 共 534 行
SVN-BASE
534 行
//------------------------------------------------------------------------------// File: WXUtil.h//// Desc: DirectShow base classes - defines helper classes and functions for// building multimedia filters.//// Copyright (c) 1992-2002 Microsoft Corporation. All rights reserved.//------------------------------------------------------------------------------#ifndef __WXUTIL__#define __WXUTIL__// eliminate spurious "statement has no effect" warnings.#pragma warning(disable: 4705)// wrapper for whatever critical section we haveclass CCritSec { // make copy constructor and assignment operator inaccessible CCritSec(const CCritSec &refCritSec); CCritSec &operator=(const CCritSec &refCritSec); CRITICAL_SECTION m_CritSec;#ifdef DEBUGpublic: DWORD m_currentOwner; DWORD m_lockCount; BOOL m_fTrace; // Trace this onepublic: CCritSec(); ~CCritSec(); void Lock(); void Unlock();#elsepublic: CCritSec() { InitializeCriticalSection(&m_CritSec); }; ~CCritSec() { DeleteCriticalSection(&m_CritSec); }; void Lock() { EnterCriticalSection(&m_CritSec); }; void Unlock() { LeaveCriticalSection(&m_CritSec); };#endif};//// To make deadlocks easier to track it is useful to insert in the// code an assertion that says whether we own a critical section or// not. We make the routines that do the checking globals to avoid// having different numbers of member functions in the debug and// retail class implementations of CCritSec. In addition we provide// a routine that allows usage of specific critical sections to be// traced. This is NOT on by default - there are far too many.//#ifdef DEBUG BOOL WINAPI CritCheckIn(CCritSec * pcCrit); BOOL WINAPI CritCheckIn(const CCritSec * pcCrit); BOOL WINAPI CritCheckOut(CCritSec * pcCrit); BOOL WINAPI CritCheckOut(const CCritSec * pcCrit); void WINAPI DbgLockTrace(CCritSec * pcCrit, BOOL fTrace);#else #define CritCheckIn(x) TRUE #define CritCheckOut(x) TRUE #define DbgLockTrace(pc, fT)#endif// locks a critical section, and unlocks it automatically// when the lock goes out of scopeclass CAutoLock { // make copy constructor and assignment operator inaccessible CAutoLock(const CAutoLock &refAutoLock); CAutoLock &operator=(const CAutoLock &refAutoLock);protected: CCritSec * m_pLock;public: CAutoLock(CCritSec * plock) { m_pLock = plock; m_pLock->Lock(); }; ~CAutoLock() { m_pLock->Unlock(); };};// wrapper for event objectsclass CAMEvent{ // make copy constructor and assignment operator inaccessible CAMEvent(const CAMEvent &refEvent); CAMEvent &operator=(const CAMEvent &refEvent);protected: HANDLE m_hEvent;public: CAMEvent(BOOL fManualReset = FALSE); ~CAMEvent(); // Cast to HANDLE - we don't support this as an lvalue operator HANDLE () const { return m_hEvent; }; void Set() {EXECUTE_ASSERT(SetEvent(m_hEvent));}; BOOL Wait(DWORD dwTimeout = INFINITE) { return (WaitForSingleObject(m_hEvent, dwTimeout) == WAIT_OBJECT_0); }; void Reset() { ResetEvent(m_hEvent); }; BOOL Check() { return Wait(0); };};// wrapper for event objects that do message processing// This adds ONE method to the CAMEvent object to allow sent// messages to be processed while waitingclass CAMMsgEvent : public CAMEvent{public: // Allow SEND messages to be processed while waiting BOOL WaitMsg(DWORD dwTimeout = INFINITE);};// old name supported for the time being#define CTimeoutEvent CAMEvent// support for a worker thread// simple thread class supports creation of worker thread, synchronization// and communication. Can be derived to simplify parameter passingclass AM_NOVTABLE CAMThread { // make copy constructor and assignment operator inaccessible CAMThread(const CAMThread &refThread); CAMThread &operator=(const CAMThread &refThread); CAMEvent m_EventSend; CAMEvent m_EventComplete; DWORD m_dwParam; DWORD m_dwReturnVal;protected: HANDLE m_hThread; // thread will run this function on startup // must be supplied by derived class virtual DWORD ThreadProc() = 0;public: CAMThread(); virtual ~CAMThread(); CCritSec m_AccessLock; // locks access by client threads CCritSec m_WorkerLock; // locks access to shared objects // thread initially runs this. param is actually 'this'. function // just gets this and calls ThreadProc static DWORD WINAPI InitialThreadProc(LPVOID pv); // start thread running - error if already running BOOL Create(); // signal the thread, and block for a response // DWORD CallWorker(DWORD); // accessor thread calls this when done with thread (having told thread // to exit) void Close() { HANDLE hThread = (HANDLE)InterlockedExchangePointer(&m_hThread, 0); if (hThread) { WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); } }; // ThreadExists // Return TRUE if the thread exists. FALSE otherwise BOOL ThreadExists(void) const { if (m_hThread == 0) { return FALSE; } else { return TRUE; } } // wait for the next request DWORD GetRequest(); // is there a request? BOOL CheckRequest(DWORD * pParam); // reply to the request void Reply(DWORD); // If you want to do WaitForMultipleObjects you'll need to include // this handle in your wait list or you won't be responsive HANDLE GetRequestHandle() const { return m_EventSend; }; // Find out what the request was DWORD GetRequestParam() const { return m_dwParam; }; // call CoInitializeEx (COINIT_DISABLE_OLE1DDE) if // available. S_FALSE means it's not available. static HRESULT CoInitializeHelper();};// CQueue//// Implements a simple Queue ADT. The queue contains a finite number of// objects, access to which is controlled by a semaphore. The semaphore// is created with an initial count (N). Each time an object is added// a call to WaitForSingleObject is made on the semaphore's handle. When// this function returns a slot has been reserved in the queue for the new// object. If no slots are available the function blocks until one becomes// available. Each time an object is removed from the queue ReleaseSemaphore// is called on the semaphore's handle, thus freeing a slot in the queue.// If no objects are present in the queue the function blocks until an// object has been added.#define DEFAULT_QUEUESIZE 2template <class T> class CQueue {private: HANDLE hSemPut; // Semaphore controlling queue "putting" HANDLE hSemGet; // Semaphore controlling queue "getting" CRITICAL_SECTION CritSect; // Thread seriallization int nMax; // Max objects allowed in queue int iNextPut; // Array index of next "PutMsg" int iNextGet; // Array index of next "GetMsg" T *QueueObjects; // Array of objects (ptr's to void) void Initialize(int n) { iNextPut = iNextGet = 0; nMax = n; InitializeCriticalSection(&CritSect); hSemPut = CreateSemaphore(NULL, n, n, NULL); hSemGet = CreateSemaphore(NULL, 0, n, NULL); QueueObjects = new T[n]; }public: CQueue(int n) { Initialize(n); } CQueue() { Initialize(DEFAULT_QUEUESIZE); } ~CQueue() { delete [] QueueObjects; DeleteCriticalSection(&CritSect); CloseHandle(hSemPut); CloseHandle(hSemGet); } T GetQueueObject() { int iSlot; T Object; LONG lPrevious; // Wait for someone to put something on our queue, returns straight // away is there is already an object on the queue. // WaitForSingleObject(hSemGet, INFINITE); EnterCriticalSection(&CritSect); iSlot = iNextGet++ % nMax; Object = QueueObjects[iSlot]; LeaveCriticalSection(&CritSect); // Release anyone waiting to put an object onto our queue as there // is now space available in the queue. // ReleaseSemaphore(hSemPut, 1L, &lPrevious); return Object; } void PutQueueObject(T Object) { int iSlot; LONG lPrevious; // Wait for someone to get something from our queue, returns straight // away is there is already an empty slot on the queue. // WaitForSingleObject(hSemPut, INFINITE); EnterCriticalSection(&CritSect); iSlot = iNextPut++ % nMax; QueueObjects[iSlot] = Object; LeaveCriticalSection(&CritSect); // Release anyone waiting to remove an object from our queue as there // is now an object available to be removed. // ReleaseSemaphore(hSemGet, 1L, &lPrevious); }};// miscellaneous string conversion functions// NOTE: as we need to use the same binaries on Win95 as on NT this code should// be compiled WITHOUT unicode being defined. Otherwise we will not pick up// these internal routines and the binary will not run on Win95.int WINAPIV wsprintfWInternal(LPWSTR, LPCWSTR, ...);LPWSTRWINAPIlstrcpyWInternal( LPWSTR lpString1, LPCWSTR lpString2 );LPWSTRWINAPIlstrcpynWInternal( LPWSTR lpString1, LPCWSTR lpString2, int iMaxLength );intWINAPIlstrcmpWInternal( LPCWSTR lpString1, LPCWSTR lpString2 );intWINAPIlstrcmpiWInternal( LPCWSTR lpString1, LPCWSTR lpString2 );intWINAPIlstrlenWInternal( LPCWSTR lpString );#ifndef UNICODE#define wsprintfW wsprintfWInternal#define lstrcpyW lstrcpyWInternal#define lstrcpynW lstrcpynWInternal#define lstrcmpW lstrcmpWInternal#define lstrcmpiW lstrcmpiWInternal#define lstrlenW lstrlenWInternal#endifextern "C"void * __stdcall memmoveInternal(void *, const void *, size_t);inline void * __cdecl memchrInternal(const void *buf, int chr, size_t cnt){#if defined(_X86_) && !defined(__GNUC__) void *pRet = NULL; _asm { cld // make sure we get the direction right mov ecx, cnt // num of bytes to scan mov edi, buf // pointer byte stream mov eax, chr // byte to scan for repne scasb // look for the byte in the byte stream jnz exit_memchr // Z flag set if byte found dec edi // scasb always increments edi even when it // finds the required byte mov pRet, ediexit_memchr: } return pRet;#else while ( cnt && (*(unsigned char *)buf != (unsigned char)chr) ) { buf = (unsigned char *)buf + 1; cnt--; } return(cnt ? (void *)buf : NULL);#endif}void WINAPI IntToWstr(int i, LPWSTR wstr);#define WstrToInt(sz) _wtoi(sz)#define atoiW(sz) _wtoi(sz)#define atoiA(sz) atoi(sz)// These are available to help managing bitmap VIDEOINFOHEADER media structuresextern const DWORD bits555[3];extern const DWORD bits565[3];extern const DWORD bits888[3];// These help convert between VIDEOINFOHEADER and BITMAPINFO structuresSTDAPI_(const GUID) GetTrueColorType(const BITMAPINFOHEADER *pbmiHeader);STDAPI_(const GUID) GetBitmapSubtype(const BITMAPINFOHEADER *pbmiHeader);STDAPI_(WORD) GetBitCount(const GUID *pSubtype);// strmbase.lib implements this for compatibility with people who// managed to link to this directly. we don't want to advertise it.//// STDAPI_(/* T */ CHAR *) GetSubtypeName(const GUID *pSubtype);STDAPI_(CHAR *) GetSubtypeNameA(const GUID *pSubtype);STDAPI_(WCHAR *) GetSubtypeNameW(const GUID *pSubtype);#ifdef UNICODE#define GetSubtypeName GetSubtypeNameW#else#define GetSubtypeName GetSubtypeNameA#endifSTDAPI_(LONG) GetBitmapFormatSize(const BITMAPINFOHEADER *pHeader);STDAPI_(DWORD) GetBitmapSize(const BITMAPINFOHEADER *pHeader);STDAPI_(BOOL) ContainsPalette(const VIDEOINFOHEADER *pVideoInfo);STDAPI_(const RGBQUAD *) GetBitmapPalette(const VIDEOINFOHEADER *pVideoInfo);// Compares two interfaces and returns TRUE if they are on the same objectBOOL WINAPI IsEqualObject(IUnknown *pFirst, IUnknown *pSecond);// This is for comparing pins#define EqualPins(pPin1, pPin2) IsEqualObject(pPin1, pPin2)// Arithmetic helper functions// Compute (a * b + rnd) / cLONGLONG WINAPI llMulDiv(LONGLONG a, LONGLONG b, LONGLONG c, LONGLONG rnd);LONGLONG WINAPI Int64x32Div32(LONGLONG a, LONG b, LONG c, LONG rnd);// Avoids us dyna-linking to SysAllocString to copy BSTR stringsSTDAPI WriteBSTR(BSTR * pstrDest, LPCWSTR szSrc);STDAPI FreeBSTR(BSTR* pstr);// Return a wide string - allocating memory for it// Returns:// S_OK - no error// E_POINTER - ppszReturn == NULL// E_OUTOFMEMORY - can't allocate memory for returned stringSTDAPI AMGetWideString(LPCWSTR pszString, LPWSTR *ppszReturn);// Special wait for objects owning windowsDWORD WINAPI WaitDispatchingMessages( HANDLE hObject, DWORD dwWait, HWND hwnd = NULL, UINT uMsg = 0, HANDLE hEvent = NULL);// HRESULT_FROM_WIN32 converts ERROR_SUCCESS to a success code, but in// our use of HRESULT_FROM_WIN32, it typically means a function failed// to call SetLastError(), and we still want a failure code.//#define AmHresultFromWin32(x) (MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, x))// call GetLastError and return an HRESULT value that will fail the// SUCCEEDED() macro.HRESULT AmGetLastErrorToHResult(void);// duplicate of ATL's CComPtr to avoid linker conflicts.IUnknown* QzAtlComPtrAssign(IUnknown** pp, IUnknown* lp);template <class T>class QzCComPtr{public: typedef T _PtrClass; QzCComPtr() {p=NULL;} QzCComPtr(T* lp) { if ((p = lp) != NULL) p->AddRef(); } QzCComPtr(const QzCComPtr<T>& lp) { if ((p = lp.p) != NULL) p->AddRef(); } ~QzCComPtr() {if (p) p->Release();} void Release() {if (p) p->Release(); p=NULL;} operator T*() {return (T*)p;} T& operator*() {ASSERT(p!=NULL); return *p; } //The assert on operator& usually indicates a bug. If this is really //what is needed, however, take the address of the p member explicitly. T** operator&() { ASSERT(p==NULL); return &p; } T* operator->() { ASSERT(p!=NULL); return p; } T* operator=(T* lp){return (T*)QzAtlComPtrAssign((IUnknown**)&p, lp);} T* operator=(const QzCComPtr<T>& lp) { return (T*)QzAtlComPtrAssign((IUnknown**)&p, lp.p); }#if _MSC_VER>1020 bool operator!(){return (p == NULL);}#else BOOL operator!(){return (p == NULL) ? TRUE : FALSE;}#endif T* p;};MMRESULT CompatibleTimeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent );bool TimeKillSynchronousFlagAvailable( void );#endif /* __WXUTIL__ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?