421 lines
14 KiB
C
421 lines
14 KiB
C
/*---------------------------------------------------------------------------
|
||
* File : RRCMDATA.H
|
||
*
|
||
* RRCM data structures information.
|
||
*
|
||
* 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 __RRCMDATA_H_
|
||
#define __RRCMDATA_H_
|
||
|
||
// force 8 byte structure packing
|
||
#include <pshpack8.h>
|
||
|
||
#define MAX_DWORD 4294967295
|
||
#define HASH_MODULO 255
|
||
#define FILENAME_LENGTH 128
|
||
#define RTCP_FEEDBACK_LIST 0
|
||
|
||
|
||
// RTP/RTCP collision data
|
||
typedef struct _rtp_collision
|
||
{
|
||
char collideAddr[MAX_ADDR_LEN];
|
||
int addrLen;
|
||
DWORD dwCollideTime;
|
||
DWORD dwCurRecvRTCPrptNumber;
|
||
DWORD SSRC;
|
||
} RTP_COLLISION, *PRTP_COLLISION;
|
||
|
||
|
||
|
||
// RTCP Session Information data structure
|
||
typedef struct _RTCP_SESSION
|
||
{
|
||
LINK_LIST RTCPList; // Next/prev RTCP session ptrs
|
||
|
||
// Synchronization elements
|
||
CRITICAL_SECTION critSect; // Critical section
|
||
HANDLE hExitEvent; // Exit RTCP event handle
|
||
|
||
#ifdef ENABLE_ISDM2
|
||
// ISDM2 Handle
|
||
KEY_HANDLE hSessKey; // Key to this sessions ISDM info
|
||
#endif
|
||
|
||
// List of SSRC(s) on the transmit list, i.e., our own transmit SSRC's
|
||
// and list of SSRC(s) received
|
||
HEAD_TAIL RcvSSRCList; // Rcv SSRC list head/tail ptrs
|
||
HEAD_TAIL XmtSSRCList; // Xmt SSRC list head/tail ptrs
|
||
|
||
// List of Rcv/Xmt data structure. The data resides in a heap
|
||
// in order to avoid page fault
|
||
HEAD_TAIL RTCPrcvBfrList; // Rcv buffers head/tail ptrs
|
||
HANDLE hHeapRcvBfrList; // Heap handle to Rcv bfrs list
|
||
|
||
// Rcv/Xmt buffers have their own heap
|
||
HANDLE hHeapRcvBfr; // Heap handle to Rcv Bfrs mem.
|
||
|
||
WSABUF XmtBfr; // RTCP send buffer descriptor
|
||
// Application provided list of buffers where RRCM will copy the raw
|
||
// RTCP buffers
|
||
HEAD_TAIL appRtcpBfrList; // Head/tail ptrs for app bfr list
|
||
|
||
DWORD dwInitNumFreeRcvBfr; // Number of Free Rcv Buffers
|
||
DWORD dwRcvBfrSize; // Receive Buffer size
|
||
DWORD dwXmtBfrSize; // Transmit Buffer size
|
||
|
||
DWORD dwSessionStatus; // Entry status:
|
||
|
||
char toBfr[MAX_ADDR_LEN]; // Destination address
|
||
int toLen; // Size of lpTo
|
||
|
||
int avgRTCPpktSizeRcvd; // Average RTCP pckt size
|
||
|
||
DWORD dwNumStreamPerSes; // Num of streams per Session
|
||
DWORD dwCurNumSSRCperSes; // Num of SSRC per Session
|
||
|
||
#ifdef MONITOR_STATS
|
||
DWORD dwHiNumSSRCperSes; // High Num of SSRC per Session
|
||
#endif
|
||
|
||
// Receive information (shared by all streams of this session)
|
||
HANDLE hShutdownDone; // Shutdown procedure done
|
||
int dwNumRcvIoPending; // Number of receive I/O pending
|
||
|
||
// Notification callback of RRCM events if desired by the application
|
||
VOID (*pRRCMcallback)(RRCM_EVENT_T, DWORD_PTR, DWORD_PTR, DWORD_PTR);
|
||
|
||
// User information on callback
|
||
DWORD_PTR dwCallbackUserInfo;
|
||
|
||
// RTP Loop/Collision information
|
||
RTP_COLLISION collInfo[NUM_COLLISION_ENTRIES];
|
||
|
||
} RTCP_SESSION, *PRTCP_SESSION;
|
||
|
||
|
||
|
||
// RTCP Xmt information
|
||
typedef struct _XMIT_INFO
|
||
{
|
||
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 dwRtcpStreamMinBW; // Minimal session's bandwidth
|
||
#ifdef DYNAMIC_RTCP_BW
|
||
DWORD dwCalculatedXmtBW; // Session's calculated bandwidth
|
||
DWORD dwLastTimeBwCalculated; // Last time BW was calculated
|
||
DWORD dwLastTimeNumBytesSent; // Last time number of bytes send
|
||
DWORD dwLastTimeNumPcktSent; // Last time number of bytes send
|
||
#endif
|
||
DWORD dwLastSR; // Last sender report (RTP format)
|
||
DWORD dwLastSRLocalTime; // Last sender report local time
|
||
DWORD dwLastSendRTPSystemTime; // Last RTP packet send time
|
||
DWORD dwLastSendRTPTimeStamp; // RTP timestamp of the last packet
|
||
} XMIT_INFO, *PXMIT_INFO;
|
||
|
||
|
||
|
||
// RTCP receive information
|
||
typedef struct _RECV_INFO
|
||
{
|
||
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
|
||
#ifdef DYNAMIC_RTCP_BW
|
||
DWORD dwCalculatedRcvBW; // Session's calculated bandwidth
|
||
DWORD dwLastTimeBwCalculated; // Last time BW was calculated
|
||
DWORD dwLastTimeNumBytesRcvd; // Last time number of bytes rcvd
|
||
DWORD dwLastTimeNumPcktRcvd; // Last time number of bytes rcvd
|
||
#endif
|
||
} RECV_INFO, *PRECV_INFO;
|
||
|
||
|
||
|
||
// RRCM statistics table entry data structure
|
||
typedef struct _SSRC_ENTRY
|
||
{
|
||
LINK_LIST SSRCList; // Next/prev SSRC entry
|
||
|
||
CRITICAL_SECTION critSect; // Critical section synch.
|
||
|
||
PRTCP_SESSION pRTCPses; // Point to the parent session
|
||
|
||
DWORD SSRC; // Source SSRC
|
||
DWORD PayLoadType; // payload associated with this SSRC
|
||
|
||
DWORD dwSSRCStatus; // Entry status
|
||
#define NETWK_ADDR_UPDATED 0x80000000 // Network Address already done
|
||
#define SEQ_NUM_UPDATED 0x40000000 // XMT Sequence already done
|
||
#define THIRD_PARTY_COLLISION 0x20000000 // Third party collsion detected
|
||
#define CLOSE_RTCP_SOCKET 0x10000000 // RTCP will close the RTCP socket
|
||
#define RTCP_XMT_USER_CTRL 0x08000000 // User's has RTCP timeout control
|
||
|
||
// 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 xmtInfo;
|
||
|
||
// 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 rcvInfo;
|
||
|
||
// Feedback information received about ourselve if we're an active source
|
||
RTCP_FEEDBACK rrFeedback; // Feedback information
|
||
|
||
DWORD dwLastReportRcvdTime; // Time of last report received
|
||
DWORD dwNextReportSendTime; // Next scheduled report time (ms)
|
||
|
||
#ifdef _DEBUG
|
||
DWORD dwPrvTime; // Elapsed time between report
|
||
#endif
|
||
|
||
// SSRC SDES information
|
||
SDES_DATA cnameInfo; // CNAME information
|
||
SDES_DATA nameInfo; // NAME information
|
||
SDES_DATA emailInfo; // EMAIL address information
|
||
SDES_DATA phoneInfo; // PHONE number information
|
||
SDES_DATA locInfo; // LOCation (users) information
|
||
SDES_DATA toolInfo; // TOOL name information
|
||
SDES_DATA txtInfo; // TEXT (NOTE) information
|
||
SDES_DATA privInfo; // PRIVate information
|
||
|
||
// SSRC network address information
|
||
int fromLen; // From address length
|
||
char from[MAX_ADDR_LEN]; // From address
|
||
|
||
// !!! Not implemented (entries will grow exponentionally) !!!
|
||
// List of SSRCs in RR received by this SSRC. It might be useful for a
|
||
// sender or a controller to know how other active sources are received
|
||
// by others.
|
||
// The drawback is that the number of entries will grow exponentially
|
||
// with the number of participants.
|
||
// Currently not implemented.
|
||
#if RTCP_FEEDBACK_LIST
|
||
HEAD_TAIL rrFeedbackList; // Head/Tail of feedback list
|
||
#endif
|
||
|
||
#ifdef ENABLE_ISDM2
|
||
DWORD hISDM; // ISDM session handle
|
||
#endif
|
||
|
||
// All variables below should be in an additional linked list one layer
|
||
// up this one, under the RTCP session link list.
|
||
// They have been moved here when we added multiple streams per session
|
||
// !!! NOTE !!!: There is only 1 transmit thread per stream. It's ID is
|
||
// found in this data structure which is on the Xmt list.
|
||
SOCKET RTPsd; // RTP socket descriptor
|
||
SOCKET RTCPsd; // RTCP socket descriptor
|
||
HANDLE hXmtThread; // RTCP session thread handle
|
||
DWORD dwXmtThreadID; // RTCP session thread ID
|
||
HANDLE hExitXmtEvent; // Xmt thread Exit event -
|
||
// Used to terminate a session
|
||
// among multiple stream on the
|
||
// same session
|
||
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
|
||
DWORD dwUserXmtTimeoutCtrl; // User's xmt timer control
|
||
// 0x0 -> RRCM control
|
||
// 0xFFFF -> No RTCP send
|
||
// value -> timer value
|
||
// All the above variables should move in the intermediate layer for
|
||
// multiple stream per session support
|
||
|
||
} SSRC_ENTRY, *PSSRC_ENTRY;
|
||
|
||
|
||
|
||
// RTP process data structure
|
||
typedef struct _RTP_SESSION
|
||
{
|
||
LINK_LIST RTPList; // Next/Prev RTP session
|
||
|
||
CRITICAL_SECTION critSect; // Critical section
|
||
|
||
PRTCP_SESSION pRTCPSession; // Pointer to my RTCP side
|
||
} RTP_SESSION, *PRTP_SESSION;
|
||
|
||
|
||
#if 0
|
||
// RTP Ordered buffer structure
|
||
typedef struct _RTP_BFR_LIST
|
||
{
|
||
LINK_LIST RTPBufferLink; // Next/prev
|
||
|
||
LPWSAOVERLAPPED_COMPLETION_ROUTINE
|
||
pfnCompletionNotification; // Pointer to Rcv notif. func
|
||
WSAEVENT hEvent; // WSAOverlapped handle
|
||
LPWSABUF pBuffer; // Pointer to WSABuffers
|
||
PRTP_SESSION pSession; // This session's ID
|
||
DWORD dwBufferCount; // Number of bufs in LPWSABUF
|
||
DWORD dwFlags; // WSARecv flags
|
||
LPVOID pFrom; // Pointer to source address
|
||
LPINT pFromlen; // Pointer to source address
|
||
SOCKET RTPsocket; // Socket descriptor
|
||
} RTP_BFR_LIST, *PRTP_BFR_LIST;
|
||
|
||
|
||
|
||
// RTP Ordered buffer structure
|
||
typedef struct _RTP_HASH_LIST
|
||
{
|
||
LINK_LIST RTPHashLink; // Next/prev
|
||
|
||
PRTP_SESSION pSession; // This session's ID
|
||
SOCKET RTPsocket; // Socket descriptor
|
||
} RTP_HASH_LIST, *PRTP_HASH_LIST;
|
||
|
||
#endif
|
||
|
||
|
||
// RTP registry initialization
|
||
typedef struct _RRCM_REGISTRY
|
||
{
|
||
DWORD NumSessions; // RTP/RTCP sessions
|
||
DWORD NumFreeSSRC; // Initial number of free SSRCs
|
||
DWORD NumRTCPPostedBfr; // Number of RTCP recv bfr posted
|
||
DWORD RTCPrcvBfrSize; // RTCP rcv bfr size
|
||
|
||
// Dynamically loaded DLL & Send/Recv function name
|
||
CHAR WSdll[FILENAME_LENGTH];
|
||
} RRCM_REGISTRY, *PRRCM_REGISTRY;
|
||
|
||
|
||
|
||
// RTP Context Sensitive structure
|
||
typedef struct _RTP_CONTEXT
|
||
{
|
||
HEAD_TAIL pRTPSession; // Head/tail of RTP session(s)
|
||
|
||
CRITICAL_SECTION critSect;
|
||
HINSTANCE hInst; // DLL instance
|
||
|
||
|
||
RRCM_REGISTRY registry; // Registry initialization
|
||
} RTP_CONTEXT, *PRTP_CONTEXT;
|
||
|
||
|
||
|
||
// RTCP Context Sensitive structure
|
||
typedef struct _RTCP_CONTEXT
|
||
{
|
||
HEAD_TAIL RTCPSession; // RTCP sessions head/tail ptrs
|
||
HANDLE hHeapRTCPSes; // Heap handle to RTCP sessions
|
||
|
||
CRITICAL_SECTION critSect; // Critical section synch.
|
||
|
||
HEAD_TAIL RRCMFreeStat; // RRCM entries head/tail ptrs
|
||
HANDLE hHeapRRCMStat; // Heap handle to RRCM stats
|
||
DWORD dwInitNumFreeRRCMStat; // Number of Free SSRC entries
|
||
|
||
DWORD dwRtcpThreadID; // RTCP thread ID
|
||
HANDLE hRtcpThread; // RTCP thread hdle
|
||
HANDLE hTerminateRtcpEvent; // RTCP terminate thread event hdl
|
||
HANDLE hRtcpRptRequestEvent; // RTCP report request event
|
||
|
||
#ifdef MONITOR_STATS
|
||
DWORD dwRTCPSesCurNum; // Num of RTCP Session
|
||
DWORD dwRTCPSesHiNum; // High num RTCP per Session
|
||
|
||
DWORD dwRRCMStatFreeLoNum; // Low num of RRCM free Stat
|
||
DWORD dwRRCMStatFreeCurNum; // Cur num of RRCM Free Stat
|
||
DWORD dwRRCMStatFreeHiNum; // High num of RRCM Free Stat
|
||
|
||
DWORD dwCurNumRTCPThread; // Current num of RTCP thread
|
||
DWORD dwHiNumRTCPThread; // High number of RTCP thread
|
||
|
||
DWORD dwNumRTCPhdrErr; // Num of RTCP pckt header err.
|
||
DWORD dwNumRTCPlenErr; // Num of RTCP pckt length err.
|
||
#endif
|
||
} RTCP_CONTEXT, *PRTCP_CONTEXT;
|
||
|
||
|
||
|
||
// RTCP Free Buffers List
|
||
typedef struct _RTCP_BFR_LIST
|
||
{
|
||
LINK_LIST bfrList; // Next/prev buffer in list
|
||
|
||
WSAOVERLAPPED overlapped; // Overlapped I/O structure
|
||
WSABUF bfr; // WSABuffers
|
||
DWORD dwBufferCount; // Number of bufs in WSABUF
|
||
|
||
DWORD dwNumBytesXfr; // Number of bytes rcv/xmt
|
||
DWORD dwFlags; // Flags
|
||
char addr[MAX_ADDR_LEN]; // Network Address
|
||
int addrLen; // Address length
|
||
|
||
PSSRC_ENTRY pSSRC; // Pointer to SSRC entry address
|
||
} RTCP_BFR_LIST, *PRTCP_BFR_LIST;
|
||
|
||
|
||
// Dynamically loaded functions
|
||
typedef struct _RRCM_WS
|
||
{
|
||
HINSTANCE hWSdll;
|
||
LPFN_WSASENDTO sendTo;
|
||
LPFN_WSARECVFROM recvFrom;
|
||
LPFN_WSANTOHL ntohl;
|
||
LPFN_WSANTOHS ntohs;
|
||
LPFN_WSAHTONL htonl;
|
||
LPFN_WSAHTONS htons;
|
||
LPFN_GETSOCKNAME getsockname;
|
||
LPFN_GETHOSTNAME gethostname;
|
||
LPFN_GETHOSTBYNAME gethostbyname;
|
||
LPFN_CLOSESOCKET closesocket;
|
||
LPFN_WSASOCKET WSASocket;
|
||
LPFN_BIND bind;
|
||
LPFN_WSAENUMPROTOCOLS WSAEnumProtocols;
|
||
LPFN_WSAJOINLEAF WSAJoinLeaf;
|
||
LPFN_WSAIOCTL WSAIoctl;
|
||
LPFN_SETSOCKOPT setsockopt;
|
||
WSAPROTOCOL_INFO RTPProtInfo; // used to open RTP sockets
|
||
|
||
} RRCM_WS, *PRRCM_WS;
|
||
|
||
extern RRCM_WS RRCMws;
|
||
|
||
#define WS2Enabled (RRCMws.hWSdll != NULL)
|
||
#define WSQOSEnabled (RRCMws.RTPProtInfo.dwServiceFlags1 & XP1_QOS_SUPPORTED)
|
||
|
||
|
||
#ifdef ENABLE_ISDM2
|
||
// ISDM support
|
||
typedef struct _ISDM2
|
||
{
|
||
CRITICAL_SECTION critSect; // Critical section synch.
|
||
ISDM2API ISDMEntry; // DLL entry point
|
||
HINSTANCE hISDMdll;
|
||
DWORD hIsdmSession; // ISDM Session's handle
|
||
} ISDM2, *PISDM2;
|
||
#endif // #ifdef ENABLE_ISDM2
|
||
|
||
|
||
// restore structure packing
|
||
#include <poppack.h>
|
||
|
||
#endif // __RRCMDATA_H_
|
||
|
||
|