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

489 lines
18 KiB
C

#ifndef __tapirtp_h__
#define __tapirtp_h__
#include <objbase.h>
#include "msrtp.h"
/*
* WARNING
*
* All the NETWORK/HOST sensitive parameters (e.g. port numbers, IP
* addresses, SSRCs) are expected/returned in NETWORK order
* */
/*
* NOTE
*
* Most constants are defined in file msrtp.h,
* e.g. RTPMCAST_LOOPBACKMODE_NONE, RTPSDES_CNAME, etc. msrtp.h (in
* the same directory as this file) has all the options and a short
* explanation
* */
/* {5467edec-0cca-11d3-96e0-00104bc7b3a8} */
DEFINE_GUID(CLSID_MSRTPSourceFilter,
0x5467edec, 0x0cca, 0x11d3, 0x96, 0xe0, 0x00, 0x10, 0x4b, 0xc7, 0xb3, 0xa8);
struct DECLSPEC_UUID("5467edec-0cca-11d3-96e0-00104bc7b3a8") MSRTPSourceFilter;
/* {323cdf3c-0cca-11d3-96e0-00104bc7b3a8} */
DEFINE_GUID(CLSID_MSRTPRenderFilter,
0x323cdf3c, 0x0cca, 0x11d3, 0x96, 0xe0, 0x00, 0x10, 0x4b, 0xc7, 0xb3, 0xa8);
struct DECLSPEC_UUID("323cdf3c-0cca-11d3-96e0-00104bc7b3a8") MSRTPRenderFilter;
/**********************************************************************
* IRtpSession (Exposed by RTP Source and Render filters)
**********************************************************************/
struct DECLSPEC_UUID("f07f3070-0cca-11d3-96e0-00104bc7b3a8") DECLSPEC_NOVTABLE
IRtpSession : public IUnknown
{
/* Compact form */
STDMETHOD(Control)(
DWORD dwControl,
DWORD_PTR dwPar1,
DWORD_PTR dwPar2
) PURE;
STDMETHOD(GetLastError)(
DWORD *pdwError
) PURE;
/* Separate methods */
/***************************
* Initialization
***************************/
/* Init is the first method to call after an RTP source or render
* filter is created, using a cookie allows the same RTP session
* to be shared by a source and a render. The first call will have
* the coockie initialized to NULL, the next call will use the
* returned cookie to lookup the same RTP session. dwFlags can be
* RTPINIT_QOS to create QOS enabled sockets, you can find out the
* complete list of flags that can be used in file msrtp.h */
STDMETHOD(Init)(
HANDLE *phCookie,
DWORD dwFlags
) PURE;
/* Deinit is a method used to take the filter back to a state on
* which a new Init() can and must be done if the filter is to be
* started again, also note that just after Init(), a filter needs
* to be configured, that holds also when you use Deinit() taking
* the filter to its initial state */
STDMETHOD(Deinit)(
void
) PURE;
/***************************
* IP adress and ports
***************************/
/* Get the local and remote ports */
STDMETHOD(GetPorts)(
WORD *pwRtpLocalPort,
WORD *pwRtpRemotePort,
WORD *pwRtcpLocalPort,
WORD *pwRtcpRemotePort
) PURE;
/* Set the local and remote ports */
STDMETHOD(SetPorts)(
WORD wRtpLocalPort,
WORD wRtpRemotePort,
WORD wRtcpLocalPort,
WORD wRtcpRemotePort
) PURE;
/* Set the local and remote IP address */
STDMETHOD(SetAddress)(
DWORD dwLocalAddr,
DWORD dwRemoteAddr
) PURE;
/* Obtain the local and remote IP addresses */
STDMETHOD(GetAddress)(
DWORD *pdwLocalAddr,
DWORD *pdwRemoteAddr
) PURE;
/* The dwFlags parameter is used to determine if the scope is set
* for RTP (0x1), RTCP (0x2), or both (0x3) */
STDMETHOD(SetScope)(
DWORD dwTTL,
DWORD dwFlags
) PURE;
/* Set the multicast loopback mode
* (e.g. RTPMCAST_LOOPBACKMODE_NONE,
* RTPMCAST_LOOPBACKMODE_PARTIAL, etc) */
STDMETHOD(SetMcastLoopback)(
int iMcastLoopbackMode,
DWORD dwFlags /* Not used, pass 0 */
) PURE;
/***************************
* Miscelaneous
***************************/
/* Modify the mask specified by dwKind (e.g. RTPMASK_RECV_EVENTS,
* RTPMASK_SDES_LOCMASK).
*
* dwMask is the mask of bits to be set or reset depending on
* dwValue (reset if 0, set otherwise).
*
* pdwModifiedMask will return the resulting mask if the pointer
* is not NULL. You can just query the current mask value by
* passing dwMask=0 */
STDMETHOD(ModifySessionMask)(
DWORD dwKind,
DWORD dwMask,
DWORD dwValue,
DWORD *pdwModifiedMask
) PURE;
/* Set the bandwidth limits. A value of -1 will make the parameter
* to be left unchanged.
*
* All the parameters are in bits/sec */
STDMETHOD(SetBandwidth)(
DWORD dwInboundBw,
DWORD dwOutboundBw,
DWORD dwReceiversRtcpBw,
DWORD dwSendersRtcpBw
) PURE;
/***************************
* Participants
***************************/
/* pdwSSRC points to an array of DWORDs where to copy the SSRCs,
* pdwNumber contains the maximum entries to copy, and returns the
* actual number of SSRCs copied. If pdwSSRC is NULL, pdwNumber
* will return the current number of SSRCs (i.e. the current
* number of participants) */
STDMETHOD(EnumParticipants)(
DWORD *pdwSSRC,
DWORD *pdwNumber
) PURE;
/* Get the participant state. dwSSRC specifies the
* participant. pdwState will return the current participant's
* state (e.g. RTPPARINFO_TALKING, RTPPARINFO_SILENT). */
STDMETHOD(GetParticipantState)(
DWORD dwSSRC,
DWORD *pdwState
) PURE;
/* Get the participant's mute state. dwSSRC specifies the
* participant. pbMuted will return the participant's mute state
* */
STDMETHOD(GetMuteState)(
DWORD dwSSRC,
BOOL *pbMuted
) PURE;
/* Set the participant's mute state. dwSSRC specifies the
* participant. bMuted specifies the new state. Note that mute is
* used to refer to the permission or not to pass packets received
* up to the application, and it applies equally to audio or video
* */
STDMETHOD(SetMuteState)(
DWORD dwSSRC,
BOOL bMuted
) PURE;
/* Query the network metrics computation state for the specific SSRC */
STDMETHOD(GetNetMetricsState)(
DWORD dwSSRC,
BOOL *pbState
) PURE;
/* Enable or disable the computation of networks metrics, this is
* mandatory in order of the corresponding event to be fired if
* enabled. This is done for the specific SSRC or the first one
* found if SSRC=-1, if SSRC=0, then the network metrics
* computation will be performed for any and all the SSRCs */
STDMETHOD(SetNetMetricsState)(
DWORD dwSSRC,
BOOL bState
) PURE;
/* Retrieves network information, if the network metric
* computation is enabled for the specific SSRC, all the fields in
* the structure will be meaningful, if not, only the average
* values will contain valid data */
STDMETHOD(GetNetworkInfo)(
DWORD dwSSRC,
RtpNetInfo_t *pRtpNetInfo
) PURE;
/***************************
* SDES
***************************/
/* Set the local SDES information for item dwSdesItem (e.g
* RTPSDES_CNAME, RTPSDES_EMAIL), psSdesData contains the UNICODE
* NULL terminated string to be assigned to the item */
STDMETHOD(SetSdesInfo)(
DWORD dwSdesItem,
WCHAR *psSdesData
) PURE;
/* Get a local SDES item if dwSSRC=0, otherwise gets the SDES item
* from the participant whose SSRC was specified.
*
* dwSdesItem is the item to get (e.g. RTPSDES_CNAME,
* RTPSDES_EMAIL), psSdesData is the memory place where the item's
* value will be copied, pdwSdesDataLen contains the initial size
* in UNICODE chars, and returns the actual UNICODE chars copied
* (including the NULL terminating char, if any), dwSSRC specify
* which participant to retrieve the information from. If the SDES
* item is not available, dwSdesDataLen is set to 0 and the call
* doesn't fail */
STDMETHOD(GetSdesInfo)(
DWORD dwSdesItem,
WCHAR *psSdesData,
DWORD *pdwSdesDataLen,
DWORD dwSSRC
) PURE;
/***************************
* QOS
***************************/
/* Select a QOS template (flowspec) by passing its name in
* psQosName, dwResvStyle specifies the RSVP style (e.g
* RTPQOS_STYLE_WF, RTPQOS_STYLE_FF), dwMaxParticipants specifies
* the max number of participants (1 for unicast, N for
* multicast), this number is used to scale up the
* flowspec. dwQosSendMode specifies the send mode (has to do with
* allowed/not allowed to send) (e.g. RTPQOSSENDMODE_UNRESTRICTED,
* RTPQOSSENDMODE_RESTRICTED1). dwFrameSize is the frame size (in
* ms), used to derive several flowspec parameters, if this value
* is not available, 0 can be set
* */
STDMETHOD(SetQosByName)(
WCHAR *psQosName,
DWORD dwResvStyle,
DWORD dwMaxParticipants,
DWORD dwQosSendMode,
DWORD dwFrameSize
) PURE;
/* Not yet implemented, will have same functionality as
* SetQosByName, except that instead of passing a name to use a
* predefined flowspec, the caller will pass enough information in
* the RtpQosSpec structure to obtain the customized flowspec to
* use */
STDMETHOD(SetQosParameters)(
RtpQosSpec_t *pRtpQosSpec,
DWORD dwMaxParticipants,
DWORD dwQosSendMode
) PURE;
/* If AppName is specified, replaces the default AppName, as well
* as the APP field in the policy used, with the new UNICODE
* string, if not, sets the binary image name as the default. If
* psAppGUID is specified, it will be prepended to the default
* policy locator as "GUID=string_passed,". If psPolicyLocator is
* specified, append a comma and this whole string to the default
* policy locator, if not, just sets the default
* */
STDMETHOD(SetQosAppId)(
WCHAR *psAppName,
WCHAR *psAppGUID,
WCHAR *psPolicyLocator
) PURE;
/* Adds/removes a single SSRC to/from the shared explicit list of
* participants who receive reservation (i.e. it is used when the
* ResvStyle=RTPQOS_STYLE_SE). */
STDMETHOD(SetQosState)(
DWORD dwSSRC,
BOOL bEnable
) PURE;
/* Adds/removes a number of SSRCs to/from the shared explicit list
* of participants who receive reservation (i.e. it is used when
* the ResvStyle=RTPQOS_STYLE_SE). dwNumber is the number of SSRCs
* to add/remove, and returns the actual number of SSRCs
* added/removed */
STDMETHOD(ModifyQosList)(
DWORD *pdwSSRC,
DWORD *pdwNumber,
DWORD dwOperation
) PURE;
/***************************
* Cryptography
***************************/
/* iMode defines what is going to be encrypted/decrypted,
* e.g. RTPCRYPTMODE_PAYLOAD to encrypt/decrypt only RTP
* payload. dwFlag can be RTPCRYPT_SAMEKEY to indicate that (if
* applicable) the key used for RTCP is the same used for RTP */
STDMETHOD(SetEncryptionMode)(
int iMode,
DWORD dwFlags
) PURE;
/* Specifies the information needed to derive an
* encryption/decryption key. PassPhrase is the (random) text used
* to generate a key. HashAlg specifies the algorithm to use to
* hash the pass phrase and generate a key. DataAlg is the
* algorithm used to encrypt/decrypt the data. Default hash
* algorithm is RTPCRYPT_MD5, default data algorithm is
* RTPCRYPT_DES. If encryption is to be used, the PassPhrase is a
* mandatory parameter to set. bRtcp specifies if the parameters
* are for RTCP or RTP, if the SAMEKEY flag was used when setting
* the mode, this parameter is ignored */
STDMETHOD(SetEncryptionKey)(
WCHAR *psPassPhrase,
WCHAR *psHashAlg,
WCHAR *psDataAlg,
BOOL bRtcp
) PURE;
};
/**********************************************************************
* IRtpMediaControl (Exposed by RTP Source and Render filters)
**********************************************************************/
struct DECLSPEC_UUID("825db25c-cbbd-4212-b10f-2e1b2ff024e7") DECLSPEC_NOVTABLE
IRtpMediaControl : public IUnknown
{
/* Establishes the mapping between a payload type, its sampling
* frequency and its DShow media type (e.g. for H.261
* {31,90000,MEDIASUBTYPE_RTP_Payload_H261} ) */
STDMETHOD(SetFormatMapping)(
IN DWORD dwRTPPayLoadType,
IN DWORD dwFrequency,
IN AM_MEDIA_TYPE *pMediaType
) PURE;
/* Empties the format mapping table */
STDMETHOD(FlushFormatMappings)(
void
) PURE;
};
/**********************************************************************
* IRtpDemux (Exposed only by RTP Source filter)
**********************************************************************/
struct DECLSPEC_UUID("1308f00a-fc1a-4d08-af3c-10a62ae70bde") DECLSPEC_NOVTABLE
IRtpDemux : public IUnknown
{
/* Add a single pin, may return its position */
STDMETHOD(AddPin)(
IN int iOutMode,
OUT int *piPos
) PURE;
/* Set the number of pins, can only be >= than current number of
* pins */
STDMETHOD(SetPinCount)(
IN int iCount,
IN int iOutMode
) PURE;
/* Set the pin mode (e.g. RTPDMXMODE_AUTO or RTPDMXMODE_MANUAL),
* if iPos >= 0 use it, otherwise use pIPin */
STDMETHOD(SetPinMode)(
IN int iPos,
IN IPin *pIPin,
IN int iOutMode
) PURE;
/* Map/unmap pin i to/from user with SSRC, if iPos >= 0 use it,
* otherwise use pIPin, when unmapping, only the pin or the SSRC
* is required */
STDMETHOD(SetMappingState)(
IN int iPos,
IN IPin *pIPin,
IN DWORD dwSSRC,
IN BOOL bMapped
) PURE;
/* Find the Pin assigned (if any) to the SSRC, return either
* position or pin or both */
STDMETHOD(FindPin)(
IN DWORD dwSSRC,
OUT int *piPos,
OUT IPin **ppIPin
) PURE;
/* Find the SSRC mapped to the Pin, if iPos >= 0 use it, otherwise
* use pIPin */
STDMETHOD(FindSSRC)(
IN int iPos,
IN IPin *pIPin,
OUT DWORD *pdwSSRC
) PURE;
};
/**********************************************************************
* IRtpDtmf (Exposed only by RTP Render filter)
**********************************************************************/
struct DECLSPEC_UUID("554438d8-a4bd-428a-aabd-1cff350eece6") DECLSPEC_NOVTABLE
IRtpDtmf : public IUnknown
{
/***************************
* DTMF (RFC2833)
***************************/
/* Configures DTMF parameters */
STDMETHOD(SetDtmfParameters)(
DWORD dwPT_Dtmf /* Payload type for DTMF events */
) PURE;
/* Directs an RTP render filter to send a packet formatted
* according to rfc2833 containing the specified event, specified
* volume level, duration in milliseconds, and the END flag,
* following the rules in section 3.6 for events sent in multiple
* packets. Parameter dwId changes from one digit to the next one.
*
* NOTE the duration is given in milliseconds, then it is
* converted to RTP timestamp units which are represented using 16
* bits, the maximum value is hence dependent on the sampling
* frequency, but for 8KHz the valid values would be 0 to 8191 ms
* */
STDMETHOD(SendDtmfEvent)(
DWORD dwId,
/* As per RFC2833 */
DWORD dwEvent, /* 0 - 16 */
DWORD dwVolume, /* 0 - 63 */
DWORD dwDuration, /* See note above */
BOOL bEnd /* 0 - 1 */
) PURE;
};
/**********************************************************************
* IRtpRedundancy (Exposed by RTP Source and Render filters)
**********************************************************************/
struct DECLSPEC_UUID("f3a9dcfe-1513-46ce-a1cb-0fcabe70ff44") DECLSPEC_NOVTABLE
IRtpRedundancy : public IUnknown
{
/***************************
* RTP redundancy (RFC2918)
***************************/
/* Configures redundancy. For a receiver only parameter dwPT_Red
* is used (the other are ignored) and may be set to -1 to ignore
* it if it was already set or to assign the default. For a
* sender, parameters dwPT_Red, dwInitialRedDistance, and
* dwMaxRedDistance can be set to -1 to ignore the parameter if it
* was already set or to assign the default value */
STDMETHOD(SetRedParameters)(
DWORD dwPT_Red, /* Payload type for redundant packets */
DWORD dwInitialRedDistance,/* Initial red distance */
DWORD dwMaxRedDistance /* default used when passing -1*/
) PURE;
};
#endif // __tapirtp_h__