Amazon Kinesis Webrtc C SDK
PeerConnection.h
Go to the documentation of this file.
1 /*******************************************
2 PeerConnection internal include file
3 *******************************************/
4 #ifndef __KINESIS_VIDEO_WEBRTC_CLIENT_PEERCONNECTION_PEERCONNECTION__
5 #define __KINESIS_VIDEO_WEBRTC_CLIENT_PEERCONNECTION_PEERCONNECTION__
6 
7 #pragma once
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 #define LOCAL_ICE_UFRAG_LEN 4
14 #define LOCAL_ICE_PWD_LEN 24
15 #define LOCAL_CNAME_LEN 16
16 
17 // https://tools.ietf.org/html/rfc5245#section-15.4
18 #define MAX_ICE_UFRAG_LEN 256
19 #define MAX_ICE_PWD_LEN 256
20 
21 #define PEER_FRAME_BUFFER_SIZE_INCREMENT_FACTOR 1.5
22 
23 // A non-comprehensive list of valid JSON characters
24 #define VALID_CHAR_SET_FOR_JSON "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"
25 
26 #define ICE_CANDIDATE_JSON_TEMPLATE (PCHAR) "{\"candidate\":\"candidate:%s\",\"sdpMid\":\"0\",\"sdpMLineIndex\":0}"
27 
28 #define MAX_ICE_CANDIDATE_JSON_LEN (MAX_SDP_ATTRIBUTE_VALUE_LENGTH + SIZEOF(ICE_CANDIDATE_JSON_TEMPLATE) + 1)
29 
30 #define CODEC_HASH_TABLE_BUCKET_COUNT 50
31 #define CODEC_HASH_TABLE_BUCKET_LENGTH 2
32 #define RTX_HASH_TABLE_BUCKET_COUNT 50
33 #define RTX_HASH_TABLE_BUCKET_LENGTH 2
34 #define TWCC_HASH_TABLE_BUCKET_COUNT 100
35 #define TWCC_HASH_TABLE_BUCKET_LENGTH 2
36 
37 #define DATA_CHANNEL_HASH_TABLE_BUCKET_COUNT 200
38 #define DATA_CHANNEL_HASH_TABLE_BUCKET_LENGTH 2
39 
40 // Environment variable to display SDPs
41 #define DEBUG_LOG_SDP ((PCHAR) "DEBUG_LOG_SDP")
42 
43 #define MAX_ACCESS_THREADS_WEBRTC_CLIENT_CONTEXT 50
44 
45 typedef enum {
49 } RTX_CODEC;
50 
51 typedef struct {
52  UINT64 localTimeKvs;
53  UINT64 remoteTimeKvs;
54  UINT32 packetSize;
56 
57 typedef struct {
58  PHashTable pTwccRtpPktInfosHashTable; // Hash table of [seqNum, PTwccPacket]
59  UINT16 firstSeqNumInRollingWindow; // To monitor the last deleted packet in the rolling window
60  UINT16 lastReportedSeqNum; // To monitor the last packet's seqNum in the TWCC response
61  UINT16 prevReportedBaseSeqNum; // To monitor the base seqNum in the TWCC response
63 
64 typedef struct {
71 
72 typedef struct {
74  // UINT32 padding makes transportWideSequenceNumber 64bit aligned
75  // we put atomics at the top of structs because customers application could set the packing to 0
76  // in which case any atomic operations would result in bus errors if there is a misalignment
77  // for more see https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c/pull/987#discussion_r534432907
78  UINT32 padding;
79  volatile SIZE_T transportWideSequenceNumber;
80 
84 
87 
89 
91  PDoubleList pTransceivers;
92  PDoubleList pFakeTransceivers;
93  PDoubleList pAnswerTransceivers;
94 
95  volatile ATOMIC_BOOL sctpIsEnabled;
96 
97  CHAR localIceUfrag[LOCAL_ICE_UFRAG_LEN + 1];
98  CHAR localIcePwd[LOCAL_ICE_PWD_LEN + 1];
99 
100  CHAR remoteIceUfrag[MAX_ICE_UFRAG_LEN + 1];
101  CHAR remoteIcePwd[MAX_ICE_PWD_LEN + 1];
102 
103  CHAR localCNAME[LOCAL_CNAME_LEN + 1];
104 
105  CHAR remoteCertificateFingerprint[CERTIFICATE_FINGERPRINT_LENGTH + 1];
106 
108 
109  BOOL isOffer;
110 
111  TIMER_QUEUE_HANDLE timerQueueHandle;
112 
113  // Codecs that we support and their payloadTypes
114  // When offering we generate values starting from 96
115  // When answering this is populated from the remote offer
116  PHashTable pCodecTable;
117 
118  // Payload types that we use to retransmit data
119  // When answering this is populated from the remote offer
120  PHashTable pRtxTable;
121 
122  // DataChannels keyed by streamId
123  PHashTable pDataChannels;
124 
127 
130 
134 
135  UINT16 MTU;
136 
138 
139  // congestion control
140  // https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
141  UINT16 twccExtId;
142  MUTEX twccLock;
146 
149 
151 
152 typedef struct {
157 
158 typedef struct {
159  CHAR hostname[MAX_ICE_CONFIG_URI_LEN + 1];
162  UINT64 startTime;
165  STATUS status;
167 
168 // Declare the structure of the Singleton
169 // Members of the singleton are responsible for their own sync mechanisms.
170 typedef struct {
172  volatile ATOMIC_BOOL isContextInitialized;
173  volatile SIZE_T contextRefCnt;
174  MUTEX stunCtxlock;
176 
177 STATUS onFrameReadyFunc(UINT64, UINT16, UINT16, UINT32);
178 STATUS onFrameDroppedFunc(UINT64, UINT16, UINT16, UINT32);
179 VOID onSctpSessionOutboundPacket(UINT64, PBYTE, UINT32);
180 VOID onSctpSessionDataChannelMessage(UINT64, UINT32, BOOL, PBYTE, UINT32);
181 VOID onSctpSessionDataChannelOpen(UINT64, UINT32, PBYTE, UINT32);
182 
183 STATUS sendPacketToRtpReceiver(PKvsPeerConnection, PBYTE, UINT32);
186 UINT32 parseExtId(PCHAR);
187 
188 // visible for testing only
189 VOID onIceConnectionStateChange(UINT64, UINT64);
190 
191 #ifdef __cplusplus
192 }
193 #endif
194 #endif /* __KINESIS_VIDEO_WEBRTC_CLIENT_PEERCONNECTION_PEERCONNECTION__ */
#define CERTIFICATE_FINGERPRINT_LENGTH
Definition: Include_i.h:93
#define LOCAL_ICE_PWD_LEN
Definition: PeerConnection.h:14
struct TwccRtpPacketInfo * PTwccRtpPacketInfo
RTX_CODEC
Definition: PeerConnection.h:45
@ RTC_RTX_CODEC_H265
Definition: PeerConnection.h:48
@ RTC_RTX_CODEC_VP8
Definition: PeerConnection.h:47
@ RTC_RTX_CODEC_H264_PROFILE_42E01F_LEVEL_ASYMMETRY_ALLOWED_PACKETIZATION_MODE
Definition: PeerConnection.h:46
STATUS onFrameDroppedFunc(UINT64, UINT16, UINT16, UINT32)
Definition: PeerConnection.c:416
#define LOCAL_ICE_UFRAG_LEN
Definition: PeerConnection.h:13
struct KvsPeerConnection * PKvsPeerConnection
#define MAX_ICE_PWD_LEN
Definition: PeerConnection.h:19
STATUS onFrameReadyFunc(UINT64, UINT16, UINT16, UINT32)
Definition: PeerConnection.c:359
#define LOCAL_CNAME_LEN
Definition: PeerConnection.h:15
VOID onSctpSessionOutboundPacket(UINT64, PBYTE, UINT32)
Definition: PeerConnection.c:568
struct AllocateSctpSortDataChannelsData * PAllocateSctpSortDataChannelsData
VOID onIceConnectionStateChange(UINT64, UINT64)
Definition: PeerConnection.c:456
STATUS changePeerConnectionState(PKvsPeerConnection, RTC_PEER_CONNECTION_STATE)
Definition: PeerConnection.c:307
STATUS sendPacketToRtpReceiver(PKvsPeerConnection, PBYTE, UINT32)
Definition: PeerConnection.c:219
struct TwccManager * PTwccManager
struct StunIpAddrContext * PStunIpAddrContext
struct WebRtcClientContext * PWebRtcClientContext
VOID onSctpSessionDataChannelOpen(UINT64, UINT32, PBYTE, UINT32)
Definition: PeerConnection.c:615
UINT32 parseExtId(PCHAR)
parses string of form "$number $whatever" returns $number as uint32
Definition: PeerConnection.c:1292
#define MAX_ICE_UFRAG_LEN
Definition: PeerConnection.h:18
STATUS twccManagerOnPacketSent(PKvsPeerConnection, PRtpPacket)
Definition: PeerConnection.c:1866
struct KvsPeerConnectionDiagnostics * PKvsPeerConnectionDiagnostics
VOID onSctpSessionDataChannelMessage(UINT64, UINT32, BOOL, PBYTE, UINT32)
Definition: PeerConnection.c:585
VOID(* RtcOnDataChannel)(UINT64, PRtcDataChannel)
RtcOnDataChannel is fired when the remote PeerConnection creates a new DataChannel.
Definition: Include.h:1081
VOID(* RtcOnSenderBandwidthEstimation)(UINT64, UINT32, UINT32, UINT32, UINT32, UINT64)
RtcOnSenderBandwidthEstimation is fired everytime a bandwidth estimation value is computed by sender....
Definition: Include.h:1036
VOID(* RtcOnIceCandidate)(UINT64, PCHAR)
RtcOnIceCandidate is fired when new iceCandidate is found. if PCHAR is NULL then candidate gathering ...
Definition: Include.h:1088
VOID(* RtcOnConnectionStateChange)(UINT64, RTC_PEER_CONNECTION_STATE)
RtcOnConnectionStateChange is fired to report a change in peer connection state.
Definition: Include.h:1101
RTC_PEER_CONNECTION_STATE
RTC_PEER_CONNECTION_STATE Stats of RTC peer connection.
Definition: Include.h:820
#define MAX_ICE_CONFIG_URI_LEN
Definition: Stats.h:30
Definition: PeerConnection.h:152
PKvsPeerConnection pKvsPeerConnection
Definition: PeerConnection.h:154
PHashTable unkeyedDataChannels
Definition: PeerConnection.h:155
UINT32 currentDataChannelId
Definition: PeerConnection.h:153
Definition: Include_i.h:102
Definition: PeerConnection.h:64
UINT64 peerConnectionCreationTime
Definition: PeerConnection.h:65
UINT64 dtlsSessionSetupTime
Definition: PeerConnection.h:66
UINT64 closePeerConnectionTime
Definition: PeerConnection.h:68
UINT64 iceHolePunchingTime
Definition: PeerConnection.h:67
UINT64 freePeerConnectionTime
Definition: PeerConnection.h:69
Definition: PeerConnection.h:72
PHashTable pDataChannels
Definition: PeerConnection.h:123
RtcOnDataChannel onDataChannel
Definition: PeerConnection.h:126
PDoubleList pTransceivers
Definition: PeerConnection.h:91
volatile SIZE_T transportWideSequenceNumber
Definition: PeerConnection.h:79
MUTEX pSrtpSessionLock
Definition: PeerConnection.h:85
PHashTable pCodecTable
Definition: PeerConnection.h:116
RtcOnConnectionStateChange onConnectionStateChange
Definition: PeerConnection.h:132
RtcOnIceCandidate onIceCandidate
Definition: PeerConnection.h:129
RtcOnSenderBandwidthEstimation onSenderBandwidthEstimation
Definition: PeerConnection.h:144
PHashTable pRtxTable
Definition: PeerConnection.h:120
UINT32 padding
Definition: PeerConnection.h:78
UINT64 onIceCandidateCustomData
Definition: PeerConnection.h:128
UINT64 onDataChannelCustomData
Definition: PeerConnection.h:125
UINT64 onConnectionStateChangeCustomData
Definition: PeerConnection.h:131
RtcPeerConnection peerConnection
Definition: PeerConnection.h:73
UINT16 MTU
Definition: PeerConnection.h:135
BOOL isOffer
Definition: PeerConnection.h:109
PSctpSession pSctpSession
Definition: PeerConnection.h:88
PTwccManager pTwccManager
Definition: PeerConnection.h:143
PIceAgent pIceAgent
Definition: PeerConnection.h:81
PDoubleList pAnswerTransceivers
Definition: PeerConnection.h:93
MUTEX twccLock
Definition: PeerConnection.h:142
PSessionDescription pRemoteSessionDescription
Definition: PeerConnection.h:90
UINT64 iceConnectingStartTime
Definition: PeerConnection.h:147
MUTEX peerConnectionObjLock
Definition: PeerConnection.h:107
BOOL dtlsIsServer
Definition: PeerConnection.h:83
UINT64 onSenderBandwidthEstimationCustomData
Definition: PeerConnection.h:145
KvsPeerConnectionDiagnostics peerConnectionDiagnostics
Definition: PeerConnection.h:148
NullableBool canTrickleIce
Definition: PeerConnection.h:137
TIMER_QUEUE_HANDLE timerQueueHandle
Definition: PeerConnection.h:111
PDtlsSession pDtlsSession
Definition: PeerConnection.h:82
volatile ATOMIC_BOOL sctpIsEnabled
Definition: PeerConnection.h:95
RTC_PEER_CONNECTION_STATE connectionState
Definition: PeerConnection.h:133
UINT16 twccExtId
Definition: PeerConnection.h:141
PDoubleList pFakeTransceivers
Definition: PeerConnection.h:92
PSrtpSession pSrtpSession
Definition: PeerConnection.h:86
Definition: NullableDefs.h:60
An RtcPeerConnection instance allows an application to establish peer-to-peer communications with ano...
Definition: Include.h:1119
Definition: Sctp.h:61
Definition: Sdp.h:158
Definition: PeerConnection.h:158
UINT64 expirationDuration
Definition: PeerConnection.h:164
UINT64 stunDnsResolutionTime
Definition: PeerConnection.h:163
STATUS status
Definition: PeerConnection.h:165
BOOL isIpInitialized
Definition: PeerConnection.h:161
UINT64 startTime
Definition: PeerConnection.h:162
KvsIpAddress kvsIpAddr
Definition: PeerConnection.h:160
Definition: PeerConnection.h:57
UINT16 lastReportedSeqNum
Definition: PeerConnection.h:60
PHashTable pTwccRtpPktInfosHashTable
Definition: PeerConnection.h:58
UINT16 prevReportedBaseSeqNum
Definition: PeerConnection.h:61
UINT16 firstSeqNumInRollingWindow
Definition: PeerConnection.h:59
Definition: PeerConnection.h:51
UINT64 localTimeKvs
Definition: PeerConnection.h:52
UINT64 remoteTimeKvs
Definition: PeerConnection.h:53
UINT32 packetSize
Definition: PeerConnection.h:54
Definition: PeerConnection.h:170
PStunIpAddrContext pStunIpAddrCtx
Definition: PeerConnection.h:171
volatile ATOMIC_BOOL isContextInitialized
Definition: PeerConnection.h:172
MUTEX stunCtxlock
Definition: PeerConnection.h:174
volatile SIZE_T contextRefCnt
Definition: PeerConnection.h:173
Definition: Dtls.h:106
Definition: IceAgent.h:199
Definition: RtpPacket.h:89
Definition: SrtpSession.h:15