489 lines
18 KiB
C
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__
|
|
|