/*++ Copyright (c) 1997 Microsoft Corporation Module Name: MSPCall.h Abstract: Definitions for MSP utililty functions. There are all related to active movie filter manipulation. Author: Mu Han (muhan) 1-November-1997 --*/ #ifndef __MSPUTIL_H #define __MSPUTIL_H const DWORD PAYLOAD_G711U = 0; const DWORD PAYLOAD_G723 = 4; const DWORD PAYLOAD_G711A = 8; const DWORD PAYLOAD_H261 = 31; const DWORD PAYLOAD_H263 = 34; const TCHAR gszMSPKey[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\H323MSP\\"; const TCHAR gszAEC[] = L"AEC"; HRESULT FindPin( IN IBaseFilter * pInterfaceilter, OUT IPin ** ppIPin, IN PIN_DIRECTION direction, IN BOOL bFree = TRUE ); HRESULT PinSupportsMediaType( IN IPin * pIPin, IN const GUID & MediaType ); HRESULT AddFilter( IN IGraphBuilder * pIGraph, IN const CLSID & Clsid, IN LPCWSTR pwstrName, OUT IBaseFilter ** ppIBaseFilter ); HRESULT SetQOSOption( IN IBaseFilter * pIBaseFilter, IN DWORD dwPayloadType, IN DWORD dwMaxBandwidth, IN BOOL bReceive, IN BOOL bCIF = FALSE ); HRESULT ConnectFilters( IN IGraphBuilder * pIGraph, IN IBaseFilter * pInterfaceilter1, IN IBaseFilter * pInterfaceilter2, IN BOOL fDirect = TRUE, IN AM_MEDIA_TYPE * pmt = NULL ); HRESULT ConnectFilters( IN IGraphBuilder * pIGraph, IN IPin * pIPinOutput, IN IBaseFilter * pInterfaceilter, IN BOOL fDirect = TRUE, IN AM_MEDIA_TYPE * pmt = NULL ); HRESULT ConnectFilters( IN IGraphBuilder * pIGraph, IN IBaseFilter * pInterfaceilter, IN IPin * pIPinInput, IN BOOL fDirect = TRUE, IN AM_MEDIA_TYPE * pmt = NULL ); HRESULT EnableRTCPEvents( IN IBaseFilter *pIBaseFilter, IN BOOL fDirectRTP ); void WINAPI H323DeleteMediaType(AM_MEDIA_TYPE *pmt); BOOL GetRegValue( IN LPCWSTR szName, OUT DWORD *pdwValue ); HRESULT SetAudioFormat( IN IUnknown* pIUnknown, IN WORD wBitPerSample, IN DWORD dwSampleRate ); HRESULT SetAudioBufferSize( IN IUnknown* pIUnknown, IN DWORD dwNumBuffers, IN DWORD dwBufferSize ); HRESULT GetFormatHelper( IN IPin *pPin, OUT AM_MEDIA_TYPE **ppMediaType ); HRESULT SetFormatHelper( IN IPin *pPin, IN AM_MEDIA_TYPE *pMediaType ); HRESULT GetNumberOfCapabilitiesHelper( IN IPin *pPin, OUT DWORD *pdwCount ); HRESULT GetStreamCapsHelper( IN IPin *pPin, IN DWORD dwIndex, OUT AM_MEDIA_TYPE **ppMediaType, OUT TAPI_STREAM_CONFIG_CAPS *pStreamConfigCaps, OUT BOOL *pfEnabled ); template HRESULT GetRangeHelper( IN TInterface * pInterface, IN TEnum Property, OUT long *plMin, OUT long *plMax, OUT long *plSteppingDelta, OUT long *plDefault, OUT Flag *plFlags ) { ENTER_FUNCTION("GetRangeHelper"); if (IsBadWritePtr(plMin, sizeof(long)) || IsBadWritePtr(plMax, sizeof(long)) || IsBadWritePtr(plSteppingDelta, sizeof(long)) || IsBadWritePtr(plDefault, sizeof(long)) || IsBadWritePtr(plFlags, sizeof(long))) { LOG((MSP_ERROR, "%s, bad pointer", __fxName)); return E_POINTER; } HRESULT hr = pInterface->GetRange( Property, plMin, plMax, plSteppingDelta, plDefault, plFlags ); return hr; } template HRESULT CreateCComObjectInstance ( CComObject **ppObject ) /*++ Create a new CComObject instance. Use try/except to catch exception. --*/ { HRESULT hr; __try { hr = CComObject::CreateInstance(ppObject); } __except (EXCEPTION_EXECUTE_HANDLER) { *ppObject = NULL; return E_OUTOFMEMORY; } return hr; } template HRESULT GetHelper( IN TInterface * pInterface, IN TEnum Property, OUT long *plValue, OUT Flag *plFlags ) { ENTER_FUNCTION("GetHelper"); if (IsBadWritePtr(plValue, sizeof(long)) || IsBadWritePtr(plFlags, sizeof(long))) { LOG((MSP_ERROR, "%s, bad pointer", __fxName)); return E_POINTER; } HRESULT hr = pInterface->Get( Property, plValue, plFlags ); return hr; } inline DWORD FindSampleRate(AM_MEDIA_TYPE *pMediaType) { _ASSERT(!IsBadReadPtr(pMediaType, sizeof(AM_MEDIA_TYPE))); if (pMediaType->majortype == MEDIATYPE_Audio && pMediaType->formattype == FORMAT_WaveFormatEx && pMediaType->pbFormat != NULL && pMediaType->cbFormat != 0) { WAVEFORMATEX *pWaveFormatEx = (WAVEFORMATEX *) pMediaType->pbFormat; return pWaveFormatEx->nSamplesPerSec; } return 90000; // default media clock rate, including video. } HRESULT ConfigureRTPFormats( IN IBaseFilter * pIRTPFilter, IN IStreamConfig * pIStreamConfig ); HRESULT H323DetermineLinkSpeed( IN DWORD dwHostAddr, OUT DWORD *dwInterfaceLinkSpeed ); class ATL_NO_VTABLE CMSPStreamClock : public CComObjectRootEx, public IReferenceClock { private: LONGLONG m_lPerfFrequency; union { LONGLONG m_lRtpRefTime; DWORD m_dwRtpRefTime; }; public: BEGIN_COM_MAP(CMSPStreamClock) COM_INTERFACE_ENTRY(IReferenceClock) END_COM_MAP() void InitReferenceTime(void); HRESULT GetTimeOfDay(OUT REFERENCE_TIME *pTime); CMSPStreamClock() { InitReferenceTime(); } STDMETHOD (GetTime) ( OUT REFERENCE_TIME *pTime ) { return(GetTimeOfDay(pTime)); } STDMETHOD (AdviseTime) ( IN REFERENCE_TIME baseTime, // base reference time IN REFERENCE_TIME streamTime, // stream offset time IN HEVENT hEvent, // advise via this event OUT DWORD_PTR *pdwAdviseCookie // where your cookie goes ) { _ASSERT(!"AdviseTime is called"); return E_NOTIMPL; } STDMETHOD (AdvisePeriodic) ( IN REFERENCE_TIME StartTime, // starting at this time IN REFERENCE_TIME PeriodTime, // time between notifications IN HSEMAPHORE hSemaphore, // advise via a semaphore OUT DWORD_PTR *pdwAdviseCookie // where your cookie goes ) { _ASSERT(!"AdvisePeriodic is called"); return E_NOTIMPL; } STDMETHOD (Unadvise) ( IN DWORD_PTR dwAdviseCookie ) { _ASSERT(!"Unadvise is called"); return E_NOTIMPL; } }; #endif