// // tmutils.cpp : Utility functions // #include "stdafx.h" #include bool IsSameObject(IUnknown *pUnk1, IUnknown *pUnk2) { if (pUnk1 == pUnk2) { return TRUE; } // // NOTE: We can't use CComQIPtr here becuase it won't do the QueryInterface! // IUnknown *pRealUnk1; IUnknown *pRealUnk2; pUnk1->QueryInterface(IID_IUnknown, (void **)&pRealUnk1); pUnk2->QueryInterface(IID_IUnknown, (void **)&pRealUnk2); pRealUnk1->Release(); pRealUnk2->Release(); return (pRealUnk1 == pRealUnk2); } STDAPI_(void) TStringFromGUID(const GUID* pguid, LPTSTR pszBuf) { wsprintf(pszBuf, TEXT("{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"), pguid->Data1, pguid->Data2, pguid->Data3, pguid->Data4[0], pguid->Data4[1], pguid->Data4[2], pguid->Data4[3], pguid->Data4[4], pguid->Data4[5], pguid->Data4[6], pguid->Data4[7]); } #ifndef UNICODE STDAPI_(void) WStringFromGUID(const GUID* pguid, LPWSTR pszBuf) { char szAnsi[40]; TStringFromGUID(pguid, szAnsi); MultiByteToWideChar(CP_ACP, 0, szAnsi, -1, pszBuf, sizeof(szAnsi)); } #endif // // Media Type helpers // void InitMediaType(AM_MEDIA_TYPE * pmt) { ZeroMemory(pmt, sizeof(*pmt)); pmt->lSampleSize = 1; pmt->bFixedSizeSamples = TRUE; } bool IsEqualMediaType(AM_MEDIA_TYPE const & mt1, AM_MEDIA_TYPE const & mt2) { return ((IsEqualGUID(mt1.majortype,mt2.majortype) == TRUE) && (IsEqualGUID(mt1.subtype,mt2.subtype) == TRUE) && (IsEqualGUID(mt1.formattype,mt2.formattype) == TRUE) && (mt1.cbFormat == mt2.cbFormat) && ( (mt1.cbFormat == 0) || ( memcmp(mt1.pbFormat, mt2.pbFormat, mt1.cbFormat) == 0))); } // // Load string for this resource. Safe with respect to string size. // the caller is responsible for freeing returned memory by calling // SysFreeString // BSTR SafeLoadString( UINT uResourceID ) { TCHAR *pszTempString = NULL; int nCurrentSizeInChars = 128; int nCharsCopied = 0; do { if ( NULL != pszTempString ) { delete pszTempString; pszTempString = NULL; } nCurrentSizeInChars *= 2; pszTempString = new TCHAR[nCurrentSizeInChars]; if (NULL == pszTempString) { return NULL; } nCharsCopied = ::LoadString( _Module.GetResourceInstance(), uResourceID, pszTempString, nCurrentSizeInChars ); if ( 0 == nCharsCopied ) { delete pszTempString; return NULL; } // // nCharsCopied does not include the null terminator // so compare it to the size of the buffer - 1 // if the buffer was filled completely, retry with a bigger buffer // } while ( (nCharsCopied >= (nCurrentSizeInChars - 1) ) ); // // allocate bstr and initialize it with the string we have // BSTR bstrReturnString = SysAllocString(pszTempString); // // no longer need this // delete pszTempString; pszTempString = NULL; return bstrReturnString; } /////////////////////////////////////////////////////////////////////////////// // // DumpAllocatorProperties // // helper function that dumps allocator properties preceeded by the argumen // string // void DumpAllocatorProperties(const char *szString, const ALLOCATOR_PROPERTIES *pAllocProps) { LOG((MSP_INFO, "%s - AllocatorProperties at [%p]\n" " cBuffers [%ld] \n" " cbBuffer [%ld] \n" " cbAlign [%ld] \n" " cbPrefix [%ld]", szString, pAllocProps, pAllocProps->cBuffers, pAllocProps->cbBuffer, pAllocProps->cbAlign, pAllocProps->cbPrefix )); } // // returns true if the media type structure is bad // BOOL IsBadMediaType(IN const AM_MEDIA_TYPE *pMediaType) { // // make sure the structure we got is good // if (IsBadReadPtr(pMediaType, sizeof(AM_MEDIA_TYPE))) { LOG((MSP_ERROR, "CBSourcePin::put_MediaTypeOnPin - bad media type stucture passed in")); return TRUE; } // // make sure format buffer is good, as advertized // if ( (pMediaType->cbFormat > 0) && IsBadReadPtr(pMediaType->pbFormat, pMediaType->cbFormat) ) { LOG((MSP_ERROR, "CBSourcePin::put_MediaTypeOnPin - bad format field in media type structure passed in")); return TRUE; } return FALSE; }