197 lines
7.7 KiB
C++
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
|
|
|
|
|
|
|