diff --git a/samples/Common.c b/samples/Common.c index b371f30779..f3e8a24a87 100644 --- a/samples/Common.c +++ b/samples/Common.c @@ -1410,6 +1410,9 @@ STATUS submitPendingIceCandidate(PPendingMessageQueue pPendingMessageQueue, PSam if (pReceivedSignalingMessage->signalingMessage.messageType == SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE) { CHK_STATUS(handleRemoteCandidate(pSampleStreamingSession, &pReceivedSignalingMessage->signalingMessage)); } +#ifdef DYNAMIC_SIGNALING_PAYLOAD + SAFE_MEMFREE(pReceivedSignalingMessage->signalingMessage.payload); +#endif SAFE_MEMFREE(pReceivedSignalingMessage); } } while (!noPendingSignalingMessageForClient); @@ -1418,6 +1421,11 @@ STATUS submitPendingIceCandidate(PPendingMessageQueue pPendingMessageQueue, PSam CleanUp: +#ifdef DYNAMIC_SIGNALING_PAYLOAD + if (pReceivedSignalingMessage) { + SAFE_MEMFREE(pReceivedSignalingMessage->signalingMessage.payload); + } +#endif SAFE_MEMFREE(pReceivedSignalingMessage); CHK_LOG_ERR(retStatus); return retStatus; @@ -1539,6 +1547,12 @@ STATUS signalingMessageReceived(UINT64 customData, PReceivedSignalingMessage pRe *pReceivedSignalingMessageCopy = *pReceivedSignalingMessage; +#ifdef DYNAMIC_SIGNALING_PAYLOAD + pReceivedSignalingMessageCopy->signalingMessage.payload = (PCHAR) MEMALLOC(pReceivedSignalingMessage->signalingMessage.payloadLen); + CHK(pReceivedSignalingMessageCopy->signalingMessage.payload != NULL, STATUS_NOT_ENOUGH_MEMORY); + MEMCPY(pReceivedSignalingMessageCopy->signalingMessage.payload, pReceivedSignalingMessage->signalingMessage.payload, pReceivedSignalingMessage->signalingMessage.payloadLen); +#endif + CHK_STATUS(stackQueueEnqueue(pPendingMessageQueue->messageQueue, (UINT64) pReceivedSignalingMessageCopy)); // NULL the pointers to not free any longer @@ -1571,6 +1585,11 @@ STATUS signalingMessageReceived(UINT64 customData, PReceivedSignalingMessage pRe CleanUp: +#ifdef DYNAMIC_SIGNALING_PAYLOAD + if (pReceivedSignalingMessageCopy) { + SAFE_MEMFREE(pReceivedSignalingMessageCopy->signalingMessage.payload); + } +#endif SAFE_MEMFREE(pReceivedSignalingMessageCopy); if (pPendingMessageQueue != NULL) { freeMessageQueue(pPendingMessageQueue); diff --git a/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h b/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h index d25906b7ee..1cde98f876 100644 --- a/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h +++ b/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h @@ -1262,6 +1262,15 @@ typedef struct { //!< } RtcIceCandidateInit, *PRtcIceCandidateInit; +/** + * @brief Define this macro to use dynamically allocated payload in SignalingMessage + * This can be useful for platforms with limited memory as it avoids allocating + * MAX_SIGNALING_MESSAGE_LEN for each message when only a small payload is needed + */ +#ifndef DYNAMIC_SIGNALING_PAYLOAD +#define DYNAMIC_SIGNALING_PAYLOAD 1 +#endif + /** * @brief Structure defining the basic signaling message */ @@ -1276,7 +1285,11 @@ typedef struct { UINT32 payloadLen; //!< Optional payload length. If 0, the length will be calculated +#ifdef DYNAMIC_SIGNALING_PAYLOAD + PCHAR payload; //!< Actual signaling message payload - dynamically allocated +#else CHAR payload[MAX_SIGNALING_MESSAGE_LEN + 1]; //!< Actual signaling message payload +#endif } SignalingMessage, *PSignalingMessage; /** diff --git a/src/source/Signaling/LwsApiCalls.c b/src/source/Signaling/LwsApiCalls.c index 1b6721b374..abb3324a5e 100644 --- a/src/source/Signaling/LwsApiCalls.c +++ b/src/source/Signaling/LwsApiCalls.c @@ -2017,6 +2017,10 @@ STATUS receiveLwsMessage(PSignalingClient pSignalingClient, PCHAR pMessage, UINT CHK(NULL != (pSignalingMessageWrapper = (PSignalingMessageWrapper) MEMCALLOC(1, SIZEOF(SignalingMessageWrapper))), STATUS_NOT_ENOUGH_MEMORY); +#ifdef DYNAMIC_SIGNALING_PAYLOAD + CHK(NULL != (pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload = (PBYTE) MEMCALLOC(1, MAX_SIGNALING_MESSAGE_LEN + 1)), STATUS_NOT_ENOUGH_MEMORY); +#endif + pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.version = SIGNALING_MESSAGE_CURRENT_VERSION; // Loop through the tokens and extract the stream description @@ -2235,7 +2239,11 @@ STATUS receiveLwsMessage(PSignalingClient pSignalingClient, PCHAR pMessage, UINT if (IS_VALID_TID_VALUE(receivedTid)) { THREAD_CANCEL(receivedTid); } - +#ifdef DYNAMIC_SIGNALING_PAYLOAD + if (pSignalingMessageWrapper) { + SAFE_MEMFREE(pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload); + } +#endif SAFE_MEMFREE(pSignalingMessageWrapper); } @@ -2402,6 +2410,9 @@ PVOID receiveLwsMessageWrapper(PVOID args) CleanUp: CHK_LOG_ERR(retStatus); +#ifdef DYNAMIC_SIGNALING_PAYLOAD + SAFE_MEMFREE(pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload); +#endif SAFE_MEMFREE(pSignalingMessageWrapper); return (PVOID) (ULONG_PTR) retStatus;