#ifndef _MEDIACAP_H #define _MEDIACAP_H #ifdef __cplusplus #define RTP_DYNAMIC_MIN 96 // use value in the range of "dynamic" payload type #define RTP_DYNAMIC_MAX 127 #define IsDynamicPayload(p) ((p >= RTP_DYNAMIC_MIN) && (p <= RTP_DYNAMIC_MAX)) #define CAP_CHUNK_SIZE 8 // allocate AUDCAP_DETAILS and VIDCAP_DETAILS in chunks of this size #define MAX_CAPS_PRESORT 64 typedef struct { WORD wDataRate; // (channel param) Data rate - must be one of the data rates // received in the exchanged capabilities. or within the //specified range. Note that this is redundant // in the case of exchanging a WAVEFORMATEX WORD wFrameSizeMax; // (capability) WORD wFrameSizeMin; // (capability) WORD wFrameSize; // (channel open param) Record - playback frame size WORD wFramesPerPkt; // (channel open param) Number of frames in an audio packet WORD wFramesPerPktMax; // (capability) WORD wFramesPerPktMin; // (capability) BYTE UseSilenceDet; // If silence detection is to be used/is available (both) BYTE UsePostFilter; // If post-filtering is to be used (channel open param. (both?)) }NSC_CHANNEL_PARAMETERS, *PNSC_CHANNEL_PARAMETERS; typedef struct { NSC_CHANNEL_PARAMETERS ns_params; BYTE RTP_Payload; }AUDIO_CHANNEL_PARAMETERS, *PAUDIO_CHANNEL_PARAMETERS; typedef enum { NSC_ACMABBREV = 1, NSC_ACM_WAVEFORMATEX, // NSC_MS_ACTIVE_MOVIE } NSC_CAP_TYPE; typedef struct { DWORD dwFormatTag; // ACM format tag + padding DWORD dwSamplesPerSec; // samples per second DWORD dwBitsPerSample; // bits per sample plus padding }NSC_AUDIO_ACM_ABBREVIATED; //ACM_TAG_CAPS, *LP_ACM_TAG_CAPS; // DON't ever allocate an array of these because of WAVEFORMATEX Extra Bytes typedef struct { NSC_CAP_TYPE cap_type; NSC_CHANNEL_PARAMETERS cap_params; union { WAVEFORMATEX wfx; NSC_AUDIO_ACM_ABBREVIATED acm_brief; }cap_data; }NSC_AUDIO_CAPABILITY, *PNSC_AUDIO_CAPABILITY; typedef struct { UINT maxBitRate; USHORT maxBPP; USHORT MPI; }NSC_CHANNEL_VIDEO_PARAMETERS, *PNSC_CHANNEL_VIDEO_PARAMETERS; typedef struct { NSC_CHANNEL_VIDEO_PARAMETERS ns_params; BYTE RTP_Payload; BOOL TS_Tradeoff; }VIDEO_CHANNEL_PARAMETERS, *PVIDEO_CHANNEL_PARAMETERS; typedef enum { NSC_VCMABBREV = 1, NSC_VCM_VIDEOFORMATEX, // NSC_MS_ACTIVE_MOVIE } NSC_CVP_TYPE; typedef struct { DWORD dwFormatTag; // VCM format tag + padding DWORD dwSamplesPerSec; // samples per second DWORD dwBitsPerSample; // bits per sample plus padding }NSC_VIDEO_VCM_ABBREVIATED; //VCM_TAG_CAPS, *LP_VCM_TAG_CAPS; // DON't ever allocate an array of these because of VIDEOFORMATEX Extra Bytes typedef struct { NSC_CVP_TYPE cvp_type; NSC_CHANNEL_VIDEO_PARAMETERS cvp_params; union { VIDEOFORMATEX vfx; NSC_VIDEO_VCM_ABBREVIATED vcm_brief; }cvp_data; }NSC_VIDEO_CAPABILITY, *PNSC_VIDEO_CAPABILITY; // IH323MediaCap is exposed by the media-specific capability object // This interface is used primarily by the simultaneous capability object. // (i.e. the thing that combines all capabilities) class IH323MediaCap { public: STDMETHOD(QueryInterface(REFIID riid, LPVOID FAR * ppvObj))=0; STDMETHOD_(ULONG, AddRef()) =0; STDMETHOD_(ULONG, Release())=0; STDMETHOD_(BOOL, Init())=0; STDMETHOD_(BOOL, ReInit())=0; STDMETHOD_(VOID, FlushRemoteCaps())=0; STDMETHOD(AddRemoteDecodeCaps(PCC_TERMCAPLIST pTermCapList))=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( CreateCapList(LPVOID *ppCapBuf))=0; STDMETHOD( DeleteCapList(LPVOID pCapBuf))=0; STDMETHOD( ResolveEncodeFormat(MEDIA_FORMAT_ID *pIDEncodeOut,MEDIA_FORMAT_ID * pIDRemoteDecode))=0; STDMETHOD_(UINT, GetNumCaps())=0; STDMETHOD_(UINT, GetNumCaps(BOOL bRXCaps))=0; STDMETHOD_(BOOL, IsHostForCapID(MEDIA_FORMAT_ID CapID))=0; STDMETHOD_(BOOL, IsCapabilityRecognized(PCC_TERMCAP pCCThisCap))=0; STDMETHOD_(MEDIA_FORMAT_ID, AddRemoteDecodeFormat(PCC_TERMCAP pCCThisCap))=0; STDMETHOD(SetCapIDBase(UINT uNewBase))=0; STDMETHOD_(UINT, GetCapIDBase())=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 (IsFormatEnabled (MEDIA_FORMAT_ID FormatID, PBOOL bRecv, PBOOL bSend))=0; STDMETHOD_(BOOL, IsFormatPublic(MEDIA_FORMAT_ID FormatID))=0; STDMETHOD_(MEDIA_FORMAT_ID, GetPublicID(MEDIA_FORMAT_ID FormatID))=0; STDMETHOD_ (VOID, EnableTXCaps(BOOL bSetting))=0; STDMETHOD_ (VOID, EnableRemoteTSTradeoff(BOOL bSetting))=0; STDMETHOD (SetAudioPacketDuration( UINT durationInMs))=0; STDMETHOD (ResolveToLocalFormat(MEDIA_FORMAT_ID FormatIDLocal, MEDIA_FORMAT_ID * pFormatIDRemote))=0; }; typedef IH323MediaCap *LPIH323MediaCap; #endif //__cplusplus #endif // _MEDIACAP_H