Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

206 lines
4.6 KiB

//
// tmutils.cpp : Utility functions
//
#include "stdafx.h"
#include <fourcc.h>
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;
}