/* * 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 #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 #endif /* #ifndef _RRCMDLL_H_ */