windows-nt/Source/XPSP1/NT/enduser/netmeeting/av/h323/capif.h
2020-09-26 16:20:57 +08:00

197 lines
7.7 KiB
C++

#ifndef _CAPIF_H
#define _CAPIF_H
#define AUDIO_PACKET_DURATION_SHORT 32
#define AUDIO_PACKET_DURATION_MEDIUM 64
#define AUDIO_PACKET_DURATION_LONG 90
extern UINT g_AudioPacketDurationMs;
extern BOOL g_fRegAudioPacketDuration;
#ifdef DEBUG
extern VOID DumpChannelParameters(PCC_TERMCAP pChanCap1, PCC_TERMCAP pChanCap2);
extern VOID DumpNonstdParameters(PCC_TERMCAP pChanCap1, PCC_TERMCAP pChanCap2);
#else
#define DumpNonstdParameters(a, b)
#define DumpChannelParameters(a, b)
#endif
#define NUM_SIMCAP_SETS 6 //Nuber of default pTermcapDescriptorArray Elements to allocate (AddCombinedEntry (...) )
#ifdef __cplusplus
// RES_PAIR_LIST represents viable local and remote capability IDs for one
// media channel. e.g. a list of resolved audio formats or a list of resolved
// video formats. Each RES_PAIR_LIST is one column in a permutation table.
typedef struct res_pair_list
{
LPIH323MediaCap pMediaResolver; // interface pointer of the resolver that handles
// this media type
UINT uSize; // number of RES_PAIR in pResolvedPairs
UINT uCurrentIndex; // index into pResolvedPairs[]
RES_PAIR *pResolvedPairs; // pointer to array of RES_PAIR
}RES_PAIR_LIST, *PRES_PAIR_LIST;
// RES_CONTEXT represents a permutation table (A list of RES_PAIR_LISTs)
// This used internally by a combination generator
typedef struct res_context {
UINT uColumns; // number of RES_PAIR_LIST in ppPairLists
RES_PAIR_LIST **ppPairLists; // ptr to array of RES_PAIR_LIST pointers
H245_CAPID_T *pIDScratch; // scratch area big enough to contain uColumns * sizeof(H245_CAPID_T)
PCC_TERMCAPDESCRIPTORS pTermCapsLocal;
PCC_TERMCAPDESCRIPTORS pTermCapsRemote;
}RES_CONTEXT, *PRES_CONTEXT;
// IH323PubCap is used by H323 call control
class IH323PubCap
{
public:
STDMETHOD_(ULONG, AddRef()) =0;
STDMETHOD_(ULONG, Release())=0;
STDMETHOD_(BOOL, Init())=0;
STDMETHOD(AddRemoteDecodeCaps(PCC_TERMCAPLIST pTermCapList, PCC_TERMCAPDESCRIPTORS
pTermCapDescriptors, PCC_VENDORINFO pVendorInfo))=0;
// H.245 parameter grabbing functions
// Get public version of channel parameters for a specific decode capability
STDMETHOD(GetPublicDecodeParams(LPVOID pBufOut, UINT uBufSize, MEDIA_FORMAT_ID id))=0;
// Get local and remote channel parameters for a specific encode capability
STDMETHOD( GetEncodeParams(LPVOID pBufOut, UINT uBufSize, LPVOID pLocalParams,
UINT uLocalSize,MEDIA_FORMAT_ID idRemote,MEDIA_FORMAT_ID idLocal))=0;
// get local version of channel parameters for a specific decode capability
STDMETHOD(GetDecodeParams(PCC_RX_CHANNEL_REQUEST_CALLBACK_PARAMS pChannelParams,
MEDIA_FORMAT_ID * pFormatID, LPVOID lpvBuf, UINT uBufSize))=0;
STDMETHOD( EnableMediaType(BOOL bEnable, LPGUID pGuid))=0;
STDMETHOD_(UINT, GetLocalSendParamSize(MEDIA_FORMAT_ID dwID))=0;
STDMETHOD_(UINT, GetLocalRecvParamSize(PCC_TERMCAP pCapability))=0;
// The following is an interim solution, definitely must revisit this for the next release.
// The data pump requires access to local parameters that results from capability
// negotiation. In the absence of a separate interface that the data pump can use,
// the following are stuck onto this interface.
STDMETHOD(GetDecodeFormatDetails(MEDIA_FORMAT_ID FormatID, VOID **ppFormat, UINT *puSize))=0;
STDMETHOD(GetEncodeFormatDetails(MEDIA_FORMAT_ID FormatID, VOID **ppFormat, UINT *puSize))=0;
STDMETHOD ( ComputeCapabilitySets (DWORD dwBandwidth))=0;
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE;
STDMETHOD_ (VOID, EnableTXCaps(BOOL bSetting))PURE;
STDMETHOD_ (VOID, EnableRemoteTSTradeoff(BOOL bSetting))PURE;
STDMETHOD (ResolveToLocalFormat(MEDIA_FORMAT_ID FormatIDLocal,
MEDIA_FORMAT_ID * pFormatIDRemote))PURE;
STDMETHOD ( ResolveFormats (LPGUID pMediaGuidArray, UINT uNumMedia,
PRES_PAIR pResOutput))PURE;
STDMETHOD (ReInitialize())PURE;
};
typedef IH323PubCap *LPIH323PubCap;
class CapsCtl : public IH323PubCap, public IDualPubCap {
protected:
PCC_TERMCAPLIST m_pAudTermCaps;
PCC_TERMCAPLIST m_pVidTermCaps;
// internal utility functions
UINT GetCapDescBufSize (BOOL bRxCaps);
HRESULT GetCombinedBufSize(BOOL bRXCaps, UINT *puBufsize, UINT *puCapsCount);
UINT GetSimCapBufSize (BOOL bRxCaps);
BOOL TestSimultaneousCaps(H245_CAPID_T* pIDArray, UINT uIDArraySize,
PCC_TERMCAPDESCRIPTORS pTermCaps);
BOOL ResolvePermutations(PRES_CONTEXT pResContext, UINT uNumFixedColumns);
BOOL AreSimCaps(H245_CAPID_T* pIDArray, UINT uIDArraySize,
H245_SIMCAP_T **ppAltCapArray,UINT uAltCapArraySize);
public:
CapsCtl();
~CapsCtl();
STDMETHOD_(ULONG, AddRef());
STDMETHOD_(ULONG, Release());
STDMETHOD_(BOOL, Init());
STDMETHOD( AddRemoteDecodeCaps(PCC_TERMCAPLIST pTermCapList,PCC_TERMCAPDESCRIPTORS pTermCapDescriptors,PCC_VENDORINFO pVendorInfo));
STDMETHOD( CreateCapList(PCC_TERMCAPLIST *ppCapBuf, PCC_TERMCAPDESCRIPTORS *ppCombinations));
STDMETHOD( DeleteCapList(PCC_TERMCAPLIST pCapBuf, PCC_TERMCAPDESCRIPTORS pCombinations));
STDMETHOD( GetEncodeParams(LPVOID pBufOut, UINT uBufSize, LPVOID pLocalParams, UINT uLocalSize,MEDIA_FORMAT_ID idRemote,MEDIA_FORMAT_ID idLocal));
STDMETHOD( GetPublicDecodeParams(LPVOID pBufOut, UINT uBufSize, VIDEO_FORMAT_ID id));
STDMETHOD(GetDecodeParams(PCC_RX_CHANNEL_REQUEST_CALLBACK_PARAMS pChannelParams,DWORD * pFormatID, LPVOID lpvBuf, UINT uBufSize));
STDMETHOD_(UINT, GetNumCaps(BOOL bRXCaps));
STDMETHOD( EnableMediaType(BOOL bEnable, LPGUID pGuid));
STDMETHOD_(UINT, GetLocalSendParamSize(MEDIA_FORMAT_ID dwID));
STDMETHOD_(UINT, GetLocalRecvParamSize(PCC_TERMCAP pCapability));
//
// methods provided to the Data pump, common to H.323 and MSICCP
STDMETHOD(GetDecodeFormatDetails(MEDIA_FORMAT_ID FormatID, VOID **ppFormat, UINT *puSize));
STDMETHOD(GetEncodeFormatDetails(MEDIA_FORMAT_ID FormatID, VOID **ppFormat, UINT *puSize));
//
//
LPIH323MediaCap FindHostForID(MEDIA_FORMAT_ID id);
LPIH323MediaCap FindHostForMediaType(PCC_TERMCAP pCapability);
LPIH323MediaCap FindHostForMediaGuid(LPGUID pMediaGuid);
STDMETHOD ( AddCombinedEntry (MEDIA_FORMAT_ID *puAudioFormatList,UINT uAudNumEntries,MEDIA_FORMAT_ID *puVideoFormatList, UINT uVidNumEntries,PDWORD pIDOut));
STDMETHOD ( RemoveCombinedEntry (DWORD ID));
STDMETHOD ( ResetCombinedEntries());
STDMETHOD ( ComputeCapabilitySets (DWORD dwBandwidth));
STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR * ppvObj);
STDMETHODIMP ReInitialize();
STDMETHOD_ (VOID, EnableTXCaps(BOOL bSetting)
{
if (pAudCaps)
pAudCaps->EnableTXCaps(bSetting);
if (pVidCaps)
pVidCaps->EnableTXCaps(bSetting);
};);
STDMETHOD_ (VOID, EnableRemoteTSTradeoff(BOOL bSetting)
{
if (pAudCaps)
pAudCaps->EnableRemoteTSTradeoff(bSetting);
if (pVidCaps)
pVidCaps->EnableRemoteTSTradeoff(bSetting);
};);
STDMETHOD (ResolveToLocalFormat(MEDIA_FORMAT_ID FormatIDLocal,
MEDIA_FORMAT_ID * pFormatIDRemote));
STDMETHOD ( ResolveFormats (LPGUID pMediaGuidArray, UINT uNumMedia,
PRES_PAIR pResOutput));
protected:
UINT uRef;
static UINT uAdvertizedSize;
BOOL bAudioPublicize, bVideoPublicize, bT120Publicize;
MEDIA_FORMAT_ID m_localT120cap;
MEDIA_FORMAT_ID m_remoteT120cap;
DWORD m_remoteT120bitrate;
LPIH323MediaCap pAudCaps;
LPIH323MediaCap pVidCaps;
PCC_TERMCAPLIST pACapsBuf,pVCapsBuf;
static PCC_TERMCAPDESCRIPTORS pAdvertisedSets;
static UINT uStaticGlobalRefCount;
PCC_TERMCAPDESCRIPTORS pRemAdvSets;
DWORD dwNumInUse; // # of active TERMCAPDESCRIPTORS in use
DWORD *pSetIDs; //Id's of the active PCC_TERMCAPDESCRIPTORS
BOOL m_fNM20; // set to TRUE if we're talking to NM 2.0
static DWORD dwConSpeed;
};
LPIH323PubCap CreateCapabilityObject();
#endif // __cplusplus
#endif //#ifndef _CAPIF_H