Skip to content

Commit 25abdac

Browse files
committed
Support dynamically allocated signaling payload
- We end up allocating `MAX_SIGNALING_MESSAGE_LEN` per signaling message received. - Not needed, and we can chose to do this allocation dynamically. - For memory constrained devices, this is a huge deal. and would reduce(~couple of 100KBs of) peak memory usage.
1 parent 15d19f0 commit 25abdac

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

samples/Common.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,6 +1410,9 @@ STATUS submitPendingIceCandidate(PPendingMessageQueue pPendingMessageQueue, PSam
14101410
if (pReceivedSignalingMessage->signalingMessage.messageType == SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE) {
14111411
CHK_STATUS(handleRemoteCandidate(pSampleStreamingSession, &pReceivedSignalingMessage->signalingMessage));
14121412
}
1413+
#ifdef DYNAMIC_SIGNALING_PAYLOAD
1414+
SAFE_MEMFREE(pReceivedSignalingMessage->signalingMessage.payload);
1415+
#endif
14131416
SAFE_MEMFREE(pReceivedSignalingMessage);
14141417
}
14151418
} while (!noPendingSignalingMessageForClient);
@@ -1418,6 +1421,11 @@ STATUS submitPendingIceCandidate(PPendingMessageQueue pPendingMessageQueue, PSam
14181421

14191422
CleanUp:
14201423

1424+
#ifdef DYNAMIC_SIGNALING_PAYLOAD
1425+
if (pReceivedSignalingMessage) {
1426+
SAFE_MEMFREE(pReceivedSignalingMessage->signalingMessage.payload);
1427+
}
1428+
#endif
14211429
SAFE_MEMFREE(pReceivedSignalingMessage);
14221430
CHK_LOG_ERR(retStatus);
14231431
return retStatus;
@@ -1539,6 +1547,12 @@ STATUS signalingMessageReceived(UINT64 customData, PReceivedSignalingMessage pRe
15391547

15401548
*pReceivedSignalingMessageCopy = *pReceivedSignalingMessage;
15411549

1550+
#ifdef DYNAMIC_SIGNALING_PAYLOAD
1551+
pReceivedSignalingMessageCopy->signalingMessage.payload = (PCHAR) MEMALLOC(pReceivedSignalingMessage->signalingMessage.payloadLen);
1552+
CHK(pReceivedSignalingMessageCopy->signalingMessage.payload != NULL, STATUS_NOT_ENOUGH_MEMORY);
1553+
MEMCPY(pReceivedSignalingMessageCopy->signalingMessage.payload, pReceivedSignalingMessage->signalingMessage.payload, pReceivedSignalingMessage->signalingMessage.payloadLen);
1554+
#endif
1555+
15421556
CHK_STATUS(stackQueueEnqueue(pPendingMessageQueue->messageQueue, (UINT64) pReceivedSignalingMessageCopy));
15431557

15441558
// NULL the pointers to not free any longer
@@ -1571,6 +1585,11 @@ STATUS signalingMessageReceived(UINT64 customData, PReceivedSignalingMessage pRe
15711585

15721586
CleanUp:
15731587

1588+
#ifdef DYNAMIC_SIGNALING_PAYLOAD
1589+
if (pReceivedSignalingMessageCopy) {
1590+
SAFE_MEMFREE(pReceivedSignalingMessageCopy->signalingMessage.payload);
1591+
}
1592+
#endif
15741593
SAFE_MEMFREE(pReceivedSignalingMessageCopy);
15751594
if (pPendingMessageQueue != NULL) {
15761595
freeMessageQueue(pPendingMessageQueue);

src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,15 @@ typedef struct {
12621262
//!<
12631263
} RtcIceCandidateInit, *PRtcIceCandidateInit;
12641264

1265+
/**
1266+
* @brief Define this macro to use dynamically allocated payload in SignalingMessage
1267+
* This can be useful for platforms with limited memory as it avoids allocating
1268+
* MAX_SIGNALING_MESSAGE_LEN for each message when only a small payload is needed
1269+
*/
1270+
#ifndef DYNAMIC_SIGNALING_PAYLOAD
1271+
#define DYNAMIC_SIGNALING_PAYLOAD 1
1272+
#endif
1273+
12651274
/**
12661275
* @brief Structure defining the basic signaling message
12671276
*/
@@ -1276,7 +1285,11 @@ typedef struct {
12761285

12771286
UINT32 payloadLen; //!< Optional payload length. If 0, the length will be calculated
12781287

1288+
#ifdef DYNAMIC_SIGNALING_PAYLOAD
1289+
PCHAR payload; //!< Actual signaling message payload - dynamically allocated
1290+
#else
12791291
CHAR payload[MAX_SIGNALING_MESSAGE_LEN + 1]; //!< Actual signaling message payload
1292+
#endif
12801293
} SignalingMessage, *PSignalingMessage;
12811294

12821295
/**

src/source/Signaling/LwsApiCalls.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2017,6 +2017,10 @@ STATUS receiveLwsMessage(PSignalingClient pSignalingClient, PCHAR pMessage, UINT
20172017

20182018
CHK(NULL != (pSignalingMessageWrapper = (PSignalingMessageWrapper) MEMCALLOC(1, SIZEOF(SignalingMessageWrapper))), STATUS_NOT_ENOUGH_MEMORY);
20192019

2020+
#ifdef DYNAMIC_SIGNALING_PAYLOAD
2021+
CHK(NULL != (pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload = (PBYTE) MEMCALLOC(1, MAX_SIGNALING_MESSAGE_LEN + 1)), STATUS_NOT_ENOUGH_MEMORY);
2022+
#endif
2023+
20202024
pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.version = SIGNALING_MESSAGE_CURRENT_VERSION;
20212025

20222026
// Loop through the tokens and extract the stream description
@@ -2235,7 +2239,11 @@ STATUS receiveLwsMessage(PSignalingClient pSignalingClient, PCHAR pMessage, UINT
22352239
if (IS_VALID_TID_VALUE(receivedTid)) {
22362240
THREAD_CANCEL(receivedTid);
22372241
}
2238-
2242+
#ifdef DYNAMIC_SIGNALING_PAYLOAD
2243+
if (pSignalingMessageWrapper) {
2244+
SAFE_MEMFREE(pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload);
2245+
}
2246+
#endif
22392247
SAFE_MEMFREE(pSignalingMessageWrapper);
22402248
}
22412249

@@ -2402,6 +2410,9 @@ PVOID receiveLwsMessageWrapper(PVOID args)
24022410
CleanUp:
24032411
CHK_LOG_ERR(retStatus);
24042412

2413+
#ifdef DYNAMIC_SIGNALING_PAYLOAD
2414+
SAFE_MEMFREE(pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload);
2415+
#endif
24052416
SAFE_MEMFREE(pSignalingMessageWrapper);
24062417

24072418
return (PVOID) (ULONG_PTR) retStatus;

0 commit comments

Comments
 (0)