You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
490 lines
15 KiB
490 lines
15 KiB
/*
|
|
* Filename: RRCM_DLL.H
|
|
*
|
|
* Description: Declares imported/exported RRCM functions.
|
|
*
|
|
* $Workfile: rrcm_dll.h $
|
|
* $Author: CMACIOCC $
|
|
* $Date: 14 Feb 1997 11:59:52 $
|
|
* $Revision: 1.20 $
|
|
* $Archive: R:\rtp\src\include\rrcm_dll.h_v $
|
|
*
|
|
* INTEL Corporation Proprietary Information
|
|
* This listing is supplied under the terms of a license agreement with
|
|
* Intel Corporation and may not be copied nor disclosed except in
|
|
* accordance with the terms of that agreement.
|
|
* Copyright (c) 1995 Intel Corporation.
|
|
*
|
|
*/
|
|
|
|
#ifndef _RRCMDLL_H_
|
|
#define _RRCMDLL_H_
|
|
|
|
// force 8 byte structure packing
|
|
#include <pshpack8.h>
|
|
|
|
#if !defined (RRCMDLL)
|
|
//#define RRCMAPI __declspec (dllimport)
|
|
//#else
|
|
//#define RRCMAPI __declspec (dllexport)
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
#define MAX_SDES_LEN 256
|
|
#define MAX_ENCRYPT_KEY_SIZE 8
|
|
#define NUM_COLLISION_ENTRIES 10
|
|
#define MAX_ADDR_LEN 80
|
|
|
|
|
|
// RTCP SDES type
|
|
typedef enum {
|
|
RTCP_SDES_END,
|
|
RTCP_SDES_CNAME,
|
|
RTCP_SDES_NAME,
|
|
RTCP_SDES_EMAIL,
|
|
RTCP_SDES_PHONE,
|
|
RTCP_SDES_LOC,
|
|
RTCP_SDES_TOOL,
|
|
RTCP_SDES_TXT,
|
|
RTCP_SDES_PRIV
|
|
} RTCP_SDES_TYPE_T;
|
|
|
|
|
|
// RRCM events
|
|
typedef enum
|
|
{
|
|
RRCM_NO_EVENT,
|
|
RRCM_NEW_SOURCE_EVENT, // New SSRC detected
|
|
RRCM_RECV_RTCP_RECV_REPORT_EVENT, // RTCP RR received
|
|
RRCM_RECV_RTCP_SNDR_REPORT_EVENT, // RTCP SR received
|
|
RRCM_LOCAL_COLLISION_EVENT, // Collision detected
|
|
RRCM_REMOTE_COLLISION_EVENT, // Remote collision detected
|
|
RRCM_TIMEOUT_EVENT, // SSRC timed-out
|
|
RRCM_BYE_EVENT, // RTCP Bye received
|
|
RRCM_RTCP_WS_RCV_ERROR, // Winsock error on RTCP rcv
|
|
RRCM_RTCP_WS_XMT_ERROR // Winsock error on RTCP xmt
|
|
} RRCM_EVENT_T;
|
|
|
|
|
|
// RRCM events callback
|
|
typedef void (*PRRCM_EVENT_CALLBACK) (RRCM_EVENT_T, DWORD_PTR, DWORD_PTR, DWORD_PTR);
|
|
|
|
|
|
// RRCM SSRC entry update
|
|
typedef enum
|
|
{
|
|
RRCM_UPDATE_SDES,
|
|
RRCM_UPDATE_CALLBACK,
|
|
RRCM_UPDATE_STREAM_FREQUENCY,
|
|
RRCM_UPDATE_RTCP_STREAM_MIN_BW
|
|
} RRCM_UPDATE_SSRC_ENTRY;
|
|
|
|
|
|
// RTP/RTCP session bits mask
|
|
#define RTCP_DEST_LEARNED 0x00000001 // RTCP destination address known ?
|
|
#define H323_CONFERENCE 0x00000002 // H.323 conference control
|
|
#define ENCRYPT_SR_RR 0x00000004 // Encrypt SR/RR
|
|
#define RTCP_ON 0x00000008
|
|
#define NEW_RTCP_SESSION 0x00000010
|
|
#define RTCP_OFF 0x00000020
|
|
#define SHUTDOWN_IN_PROGRESS 0x80000000 // Shutdown in progress
|
|
|
|
// RTCP control
|
|
#define RRCM_CTRL_RTCP 0x00000000
|
|
#define RTCP_XMT_OFF 0x7FFFFFFF
|
|
#define RTCP_ONE_SEND_ONLY 0x80000000
|
|
|
|
// RTCP SDES data
|
|
typedef struct _SDES_DATA
|
|
{
|
|
DWORD dwSdesType; // SDES type: CNAME/NAME/...
|
|
char sdesBfr[MAX_SDES_LEN];
|
|
DWORD dwSdesLength; // SDES length
|
|
DWORD dwSdesFrequency; // SDES frequency
|
|
DWORD dwSdesEncrypted; // SDES encrypted Y/N ?
|
|
} SDES_DATA, *PSDES_DATA;
|
|
|
|
|
|
// Encryption data
|
|
typedef struct _encryption_info
|
|
{
|
|
DWORD dwEncryptType; // DES/Triple DES/...
|
|
DWORD dwKeyLen; // Encryption key length
|
|
char keyVal[MAX_ENCRYPT_KEY_SIZE];
|
|
} ENCRYPT_INFO, *PENCRYPT_INFO;
|
|
|
|
|
|
// Received sequence numbers/cycles. Union allows access as combined
|
|
// cycle/sequence number or as either field alone for optimizations
|
|
typedef struct _RTP_SEQUENCE
|
|
{
|
|
WORD wSequenceNum;
|
|
WORD wCycle;
|
|
} RTP_SEQUENCE, *PRTP_SEQUENCE;
|
|
|
|
|
|
typedef struct _RTP_SEQ_NUM
|
|
{
|
|
union {
|
|
DWORD dwXtndedHighSeqNumRcvd; // Combined cycle/sequence number
|
|
RTP_SEQUENCE RTPSequence; // Cycle/sequence number separate
|
|
} seq_union;
|
|
} RTP_SEQ_NUM, *PRTP_SEQ_NUM;
|
|
|
|
|
|
// Link list elements
|
|
typedef struct _LINK_LIST
|
|
{
|
|
struct _LINK_LIST *next; // Next in list / Head of list
|
|
struct _LINK_LIST *prev; // Previous in list / Tail of list
|
|
} LINK_LIST, *PLINK_LIST, HEAD_TAIL, *PHEAD_TAIL;
|
|
|
|
|
|
// Application provided buffer for RTCP to copy the raw RTCP report into
|
|
typedef struct _APP_RTCP_BFR
|
|
{
|
|
LINK_LIST bfrList; // Next/prev buffer in list
|
|
char *bfr;
|
|
DWORD dwBfrLen;
|
|
DWORD dwBfrStatus; // RTCP Operation on this Bfr
|
|
#define RTCP_SR_ONLY 0x00000001 // Only copy RTCP packet
|
|
DWORD dwBytesRcvd;
|
|
HANDLE hBfrEvent;
|
|
} APP_RTCP_BFR, *PAPP_RTCP_BFR;
|
|
|
|
|
|
// RTCP sender's feedback data structure
|
|
typedef struct _RTCP_FEEDBACK
|
|
{
|
|
DWORD SSRC;
|
|
DWORD fractionLost:8; // Fraction lost
|
|
int cumNumPcktLost:24; // Cumulative num of pckts lost
|
|
RTP_SEQ_NUM XtendedSeqNum; // Xtnded highest seq. num rcvd
|
|
DWORD dwInterJitter; // Interarrival jitter
|
|
DWORD dwLastSR; // Last sender report
|
|
DWORD dwDelaySinceLastSR; // Delay since last SR
|
|
DWORD dwLastRcvRpt; // Time of last Receive Report
|
|
} RTCP_FEEDBACK, *PRTCP_FEEDBACK;
|
|
|
|
|
|
// RTCPReportRequestEx bitmasks used to specify filter values
|
|
typedef enum
|
|
{
|
|
FLTR_SSRC = 1, // Filters report on SSRC value
|
|
FLTR_CNAME, // Filters report on CName
|
|
FLTR_TIME_WITHIN // Filters report receive within a time period
|
|
} RRCM_RPT_FILTER_OPTION;
|
|
|
|
|
|
// RTCP report data structure
|
|
typedef struct _RTCP_REPORT
|
|
{
|
|
// SSRC for this entry's information. Local SSRC if it's one of
|
|
// are local stream, or a remote SSRC otherwise.
|
|
DWORD ssrc;
|
|
|
|
DWORD status;
|
|
#define LOCAL_SSRC_RPT 0x1
|
|
#define REMOTE_SSRC_RPT 0x2
|
|
#define FEEDBACK_FOR_LOCAL_SSRC_PRESENT 0x4
|
|
// LOCAL_SSRC_RPT identifies to the application that this entry is
|
|
// one of our local stream.
|
|
// Only 'dwSrcNumPcktRealTime & dwSrcNumByteRealTime' which
|
|
// reflect the number of Pckt/byte transmitted are meaningful.
|
|
|
|
// FEEDBACK_FOR_LOCAL_SSRC_PRESENT is set if the entry is for a
|
|
// remote stream and if this remote stream has ever send us any
|
|
// feedback about ourselve. Feedback send by the remote stream to
|
|
// other SSRC are filtered out. Only feedback about ourselve is kept.
|
|
|
|
// Number of Pckt/Byte send if this entry is for a local stream, or
|
|
// number of Pckt/Byte received if this entry is for a remote stream
|
|
// This counters are updated in real-time.
|
|
DWORD dwSrcNumPcktRealTime;
|
|
DWORD dwSrcNumByteRealTime;
|
|
|
|
// This is the information we would be sending in a receiver report
|
|
// for the stream identified by 'ssrc' if this 'ssrc' has been active
|
|
// during the last report interval. This information is provided when the
|
|
// API is queried, and will most likely be different than the one send
|
|
// out by the receiver report. (RR will be send at some different time)
|
|
DWORD SrcFraction:8;
|
|
int SrcNumLost:24;
|
|
DWORD dwSrcXtndNum;
|
|
DWORD SrcJitter;
|
|
DWORD dwSrcLsr;
|
|
DWORD dwSrcDlsr;
|
|
|
|
// This information has been received from 'ssrc' has part of an
|
|
// RTCP sender report if 'ssrc' has been active, otherwise all 0s
|
|
DWORD dwSrcNumPckt;
|
|
DWORD dwSrcNumByte;
|
|
DWORD dwSrcNtpMsw;
|
|
DWORD dwSrcNtpLsw;
|
|
DWORD dwSrcRtpTs;
|
|
|
|
// This is the feedback information about us from the SSRC identified
|
|
// in the 'feedback' data structure. Currently we only store feedback
|
|
// information about ourselve and we filter out feedback information
|
|
// about additional streams. We'll have feedback information only if
|
|
// our stream has been active. If our stream goes from active to inactive
|
|
// the feedback information will be set, but not updated.
|
|
RTCP_FEEDBACK feedback;
|
|
|
|
// Generic information for the SSRC entry
|
|
// Payload type for this SSRC. If a sender, it is assume that the
|
|
// application knows what it is sending, and the type will be set
|
|
// to 0. If a receiver, this is the last value seen on an RTP data packet
|
|
DWORD PayLoadType;
|
|
DWORD dwStreamClock; // Sampling frequency
|
|
DWORD dwLastReportRcvdTime; // Time of last report rcvd
|
|
char fromAddr[MAX_ADDR_LEN];
|
|
DWORD dwFromLen;
|
|
CHAR cname[MAX_SDES_LEN];
|
|
DWORD dwCnameLen;
|
|
CHAR name[MAX_SDES_LEN];
|
|
DWORD dwNameLen;
|
|
} RTCP_REPORT, *PRTCP_REPORT;
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// ISDM Information
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifdef ENABLE_ISDM2
|
|
|
|
// RTCP Xmt information
|
|
typedef struct _XMIT_INFO_ISDM
|
|
{
|
|
DWORD dwNumPcktSent; // Number of packet sent
|
|
DWORD dwNumBytesSent; // Number of bytes sent
|
|
DWORD dwNTPmsw; // NTP most significant word
|
|
DWORD dwNTPlsw; // NTP least significant word
|
|
DWORD dwRTPts; // RTP timestamp
|
|
DWORD dwCurXmtSeqNum; // Current Xmt sequence number
|
|
DWORD dwPrvXmtSeqNum; // Previous Xmt sequence number
|
|
DWORD sessionBW; // Session's bandwidth
|
|
DWORD dwLastSR; // Last sender report
|
|
DWORD dwLastSRLocalTime; // Last sender report local time
|
|
DWORD dwLastSendRTPSystemTime; // Last RTP packet send time
|
|
DWORD dwLastSendRTPTimeStamp; // RTP timestamp of the last packet
|
|
} XMIT_INFO_ISDM, *PXMIT_INFO_ISDM;
|
|
|
|
|
|
|
|
// RTCP receive information
|
|
typedef struct _RECV_INFO_ISDM
|
|
{
|
|
DWORD dwNumPcktRcvd; // Number of packet received
|
|
DWORD dwPrvNumPcktRcvd; // Previous number of pckt rcvd
|
|
DWORD dwExpectedPrior; // Number previously expected
|
|
DWORD dwNumBytesRcvd; // Number of bytes rcvd
|
|
DWORD dwBaseRcvSeqNum; // Initial sequence number rcvd
|
|
DWORD dwBadSeqNum; // Potential new valid seq num
|
|
DWORD dwProbation; // # consec pkts for validation
|
|
RTP_SEQ_NUM XtendedSeqNum; // Xtnded highest seq. num rcvd
|
|
DWORD dwPropagationTime; // Last packet's transmit time
|
|
DWORD interJitter; // Interarrival jitter
|
|
} RECV_INFO_ISDM, *PRECV_INFO_ISDM;
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// RTP/RTCP: Registry information under:
|
|
//----------------------------------------------------------------------------
|
|
#define szRRCMISDM TEXT("RRCM_2")
|
|
|
|
|
|
// Structure used by new ISDM features
|
|
|
|
typedef struct _ISDM2_ENTRY
|
|
{
|
|
DWORD SSRC; // Source SSRC
|
|
DWORD dwSSRCStatus; // Entry status
|
|
#define XMITR 0x00000001
|
|
#define RECVR 0x00000002
|
|
|
|
DWORD PayLoadType; // Payload type for this SSRC
|
|
// taken from the RTP header.
|
|
|
|
// SSRC Transmit information
|
|
// If on our transmit list, this is our SSRC information, and if on our
|
|
// receive list, this is a SR feedback information.
|
|
XMIT_INFO_ISDM xmitinfo;
|
|
|
|
// SSRC Receive information
|
|
// If on our transmit list, this is undefined information, and if on our
|
|
// receive list, this is the SSRC's receive information, ie, this SSRC
|
|
// is an active sender somewhere on the network. This information is
|
|
// maintained by RTP, and used by RTCP to generate RR.
|
|
RECV_INFO_ISDM rcvInfo;
|
|
|
|
// Feedback information received about ourselve if we're an active source
|
|
RTCP_FEEDBACK rrFeedback; // Feedback information
|
|
|
|
DWORD dwLastReportRcvdTime; // Time of last report received
|
|
|
|
// SSRC SDES information
|
|
SDES_DATA cnameInfo; // CNAME information
|
|
SDES_DATA nameInfo; // NAME information
|
|
|
|
// SSRC network address information
|
|
int fromLen; // From address length
|
|
char from[MAX_ADDR_LEN]; // From address
|
|
|
|
DWORD dwNumRptSent; // Number of RTCP report sent
|
|
DWORD dwNumRptRcvd; // Number of RTCP report rcvd
|
|
DWORD dwNumXmtIoPending; // Number of transmit I/O pending
|
|
DWORD dwStreamClock; // Sampling frequency
|
|
|
|
} ISDM2_ENTRY, *PISDM2_ENTRY;
|
|
|
|
#endif // #ifdef ENABLE_ISDM2
|
|
|
|
//----------------------------------------------------------------------------
|
|
// RTP/RTCP Error Codes
|
|
//----------------------------------------------------------------------------
|
|
#define RRCM_NoError NO_ERROR
|
|
#define RTP_ERROR_BASE 0x8100
|
|
#define RTCP_ERROR_BASE 0x8200
|
|
|
|
// Macro to create a custom HRESULT
|
|
// S: Severity Code
|
|
// C: Customer subsystem (TRUE)
|
|
// F: Facility code
|
|
// E: Error code
|
|
#define MAKE_RRCM_HRESULT(S,C,F,E) \
|
|
((((DWORD)(S)<<31)|((DWORD)(C)<<29)|((DWORD)(F)<<16)|((DWORD)(E))))
|
|
|
|
// Custom facility codes
|
|
#define FACILITY_BASE 0x080
|
|
#define FACILITY_RRCM (FACILITY_BASE+9)
|
|
|
|
// Sample macro to support custom error reporting //
|
|
#define MAKE_RRCM_ERROR(error) \
|
|
MAKE_RRCM_HRESULT(SEVERITY_ERROR,TRUE,FACILITY_RRCM,error)
|
|
|
|
// RTP Error Codes
|
|
#define RRCMError_RTPReInit RTP_ERROR_BASE
|
|
#define RRCMError_RTPResources (RTP_ERROR_BASE+1)
|
|
#define RRCMError_RTPInvalidDelete (RTP_ERROR_BASE+2)
|
|
#define RRCMError_RTPNoContext (RTP_ERROR_BASE+3)
|
|
#define RRCMError_RTPSessResources (RTP_ERROR_BASE+4)
|
|
#define RRCMError_RTPInvalid (RTP_ERROR_BASE+5)
|
|
#define RRCMError_RTPInvSocket (RTP_ERROR_BASE+6)
|
|
#define RRCMError_RTPSSRCNotFound (RTP_ERROR_BASE+7)
|
|
#define RRCMError_RTCPCreateError (RTP_ERROR_BASE+8)
|
|
#define RRCMError_RTPInvalidSession (RTP_ERROR_BASE+9)
|
|
#define RRCMError_RTPStreamNotFound (RTP_ERROR_BASE+10)
|
|
#define RRCMError_WinsockLibNotFound (RTP_ERROR_BASE+11)
|
|
#define RRCMError_RTPNoSession (RTCP_ERROR_BASE+12)
|
|
|
|
|
|
// RTCP Error Codes
|
|
#define RRCMError_RTCPReInit RTCP_ERROR_BASE
|
|
#define RRCMError_RTCPResources (RTCP_ERROR_BASE+1)
|
|
#define RRCMError_RTCPInvalidDelete (RTCP_ERROR_BASE+2)
|
|
#define RRCMError_RTCPNoContext (RTCP_ERROR_BASE+3)
|
|
#define RRCMError_RTCPInvalidRequest (RTCP_ERROR_BASE+4)
|
|
#define RRCMError_RTCPheapError (RTCP_ERROR_BASE+5)
|
|
#define RRCMError_RTCPThreadCreation (RTCP_ERROR_BASE+6)
|
|
#define RRCMError_RTCPInvalidSession (RTCP_ERROR_BASE+7)
|
|
#define RRCMError_RTCPNotimer (RTCP_ERROR_BASE+8)
|
|
#define RRCMError_RTCPMaxStreamPerSession (RTCP_ERROR_BASE+9)
|
|
#define RRCMError_RTCPInvalidSSRCentry (RTCP_ERROR_BASE+10)
|
|
#define RRCMError_RTCPNoXmtList (RTCP_ERROR_BASE+11)
|
|
#define RRCMError_RTCPNoCname (RTCP_ERROR_BASE+12)
|
|
#define RRCMError_RTCPNotImpl (RTCP_ERROR_BASE+13)
|
|
|
|
|
|
|
|
// RRCM Exported API
|
|
HANDLE WINAPI CreateRTPSession (SOCKET,
|
|
SOCKET,
|
|
LPVOID,
|
|
DWORD,
|
|
PSDES_DATA,
|
|
DWORD,
|
|
PENCRYPT_INFO,
|
|
DWORD,
|
|
PRRCM_EVENT_CALLBACK,
|
|
DWORD_PTR,
|
|
DWORD,
|
|
DWORD,
|
|
PDWORD);
|
|
|
|
HRESULT WINAPI CloseRTPSession (HANDLE,
|
|
PCHAR,
|
|
DWORD);
|
|
|
|
DWORD WINAPI RTPSendTo ( HANDLE,
|
|
SOCKET,
|
|
LPWSABUF,
|
|
DWORD,
|
|
LPDWORD,
|
|
int,
|
|
LPVOID,
|
|
int,
|
|
LPWSAOVERLAPPED,
|
|
LPWSAOVERLAPPED_COMPLETION_ROUTINE);
|
|
|
|
DWORD WINAPI RTPRecvFrom (SOCKET,
|
|
LPWSABUF,
|
|
DWORD,
|
|
LPDWORD,
|
|
LPDWORD,
|
|
PSOCKADDR,
|
|
LPINT,
|
|
LPWSAOVERLAPPED,
|
|
LPWSAOVERLAPPED_COMPLETION_ROUTINE);
|
|
|
|
HRESULT WINAPI RTCPReportRequest (SOCKET,
|
|
DWORD,
|
|
PDWORD,
|
|
PDWORD,
|
|
DWORD,
|
|
PRTCP_REPORT,
|
|
DWORD,
|
|
LPVOID,
|
|
DWORD);
|
|
|
|
HRESULT WINAPI getRtcpSessionList (PDWORD_PTR,
|
|
DWORD,
|
|
PDWORD);
|
|
|
|
DWORD WINAPI updateRTCPDestinationAddress (HANDLE,
|
|
PSOCKADDR,
|
|
int);
|
|
|
|
DWORD WINAPI getAnSSRC (void);
|
|
|
|
DWORD WINAPI RTCPThreadCtrl (DWORD);
|
|
|
|
HRESULT WINAPI RTCPSendSessionCtrl (DWORD_PTR,
|
|
DWORD);
|
|
|
|
HRESULT WINAPI updateSSRCentry ( HANDLE,
|
|
SOCKET,
|
|
DWORD,
|
|
DWORD,
|
|
DWORD);
|
|
|
|
HRESULT WINAPI addApplicationRtcpBfr (DWORD_PTR,
|
|
PAPP_RTCP_BFR);
|
|
|
|
PAPP_RTCP_BFR WINAPI removeApplicationRtcpBfr (DWORD_PTR);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
// restore structure packing
|
|
#include <poppack.h>
|
|
|
|
#endif /* #ifndef _RRCMDLL_H_ */
|
|
|
|
|