windows-nt/Source/XPSP1/NT/net/tapi/skywalker/h323/inc/h323util.h
2020-09-26 16:20:57 +08:00

320 lines
6.8 KiB
C++

/*++
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 <class TInterface, class TEnum, class Flag>
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 <class T>
HRESULT CreateCComObjectInstance (
CComObject<T> **ppObject
)
/*++
Create a new CComObject instance. Use try/except to catch exception.
--*/
{
HRESULT hr;
__try
{
hr = CComObject<T>::CreateInstance(ppObject);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
*ppObject = NULL;
return E_OUTOFMEMORY;
}
return hr;
}
template <class TInterface, class TEnum, class Flag>
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<CComMultiThreadModelNoCS>,
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