Skip to content

Commit 773e93c

Browse files
authored
Add RTP component as submodule after re-factoring (#1975)
* Add changes to user RTP librar with RTP serializaer & deserializer * Add error conversion * Fix clang formatting * Update submodule and minor fix * Fix size_t issue * Add RTP error code test case * Update submodule commit * Remove not a valid value for type 'RtpResult_t
1 parent a28e1e4 commit 773e93c

File tree

10 files changed

+162
-87
lines changed

10 files changed

+162
-87
lines changed

Diff for: CMake/Dependencies/libkvsrtp-CMakeLists.txt

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
cmake_minimum_required(VERSION 3.6.3)
2+
3+
project(libkvsrtp NONE)
4+
5+
include(ExternalProject)
6+
if (BUILD_STATIC_LIBS OR WIN32)
7+
set(LIBKVSRTP_SHARED_LIBS OFF)
8+
else()
9+
set(LIBKVSRTP_SHARED_LIBS ON)
10+
endif()
11+
12+
ExternalProject_Add(libkvsrtp
13+
GIT_REPOSITORY https://github.com/awslabs/amazon-kinesis-video-streams-rtp.git
14+
GIT_TAG 2f53e1993d7f94867da0fd2785841a3c921f579b
15+
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/build
16+
CMAKE_ARGS
17+
-DCMAKE_INSTALL_PREFIX=${OPEN_SRC_INSTALL_PREFIX}
18+
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
19+
-DBUILD_SHARED_LIBS=${LIBKVSRTP_SHARED_LIBS}
20+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
21+
BUILD_ALWAYS TRUE
22+
TEST_COMMAND ""
23+
)

Diff for: CMake/Utilities.cmake

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ function(build_dependency lib_name)
1515
kvspic
1616
kvsCommonLws
1717
kvssdp
18-
kvsstun)
18+
kvsstun
19+
kvsrtp)
1920
list(FIND supported_libs ${lib_name} index)
2021
if(${index} EQUAL -1)
2122
message(WARNING "${lib_name} is not supported to build from source")

Diff for: CMakeLists.txt

+3-6
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,8 @@ if(BUILD_DEPENDENCIES)
221221
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS})
222222

223223
build_dependency(kvssdp ${BUILD_ARGS})
224-
225-
set(BUILD_ARGS
226-
-DBUILD_STATIC_LIBS=${BUILD_STATIC_LIBS}
227-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
228-
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS})
229-
230224
build_dependency(kvsstun ${BUILD_ARGS})
225+
build_dependency(kvsrtp ${BUILD_ARGS})
231226

232227
set(BUILD_ARGS
233228
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
@@ -416,6 +411,7 @@ target_link_libraries(
416411
kvspicState
417412
kvssdp
418413
kvsstun
414+
kvsrtp
419415
${CMAKE_THREAD_LIBS_INIT}
420416
${OPENSSL_SSL_LIBRARY}
421417
${OPENSSL_CRYPTO_LIBRARY}
@@ -439,6 +435,7 @@ target_link_libraries(
439435
${LIBWEBSOCKETS_LIBRARIES}
440436
kvssdp
441437
kvsstun
438+
kvsrtp
442439
PRIVATE kvspicUtils
443440
kvspicState
444441
${CMAKE_THREAD_LIBS_INIT}

Diff for: samples/CMakeLists.txt

+5-5
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,18 @@ add_executable(
6161
kvsWebrtcClientMaster
6262
Common.c
6363
kvsWebRTCClientMaster.c)
64-
target_link_libraries(kvsWebrtcClientMaster kvsWebrtcClient kvsWebrtcSignalingClient ${EXTRA_DEPS} kvsCommonLws kvspicUtils websockets kvssdp kvsstun)
64+
target_link_libraries(kvsWebrtcClientMaster kvsWebrtcClient kvsWebrtcSignalingClient ${EXTRA_DEPS} kvsCommonLws kvspicUtils websockets kvssdp kvsstun kvsrtp)
6565

6666
add_executable(
6767
kvsWebrtcClientViewer
6868
Common.c
6969
kvsWebRTCClientViewer.c)
70-
target_link_libraries(kvsWebrtcClientViewer kvsWebrtcClient kvsWebrtcSignalingClient ${EXTRA_DEPS} kvsCommonLws kvspicUtils websockets kvssdp kvsstun)
70+
target_link_libraries(kvsWebrtcClientViewer kvsWebrtcClient kvsWebrtcSignalingClient ${EXTRA_DEPS} kvsCommonLws kvspicUtils websockets kvssdp kvsstun kvsrtp)
7171

7272
add_executable(
7373
discoverNatBehavior
7474
discoverNatBehavior.c)
75-
target_link_libraries(discoverNatBehavior kvsWebrtcClient ${EXTRA_DEPS} kvssdp kvsstun)
75+
target_link_libraries(discoverNatBehavior kvsWebrtcClient ${EXTRA_DEPS} kvssdp kvsstun kvsrtp)
7676

7777
if(GST_FOUND)
7878
add_executable(
@@ -81,7 +81,7 @@ if(GST_FOUND)
8181
GstAudioVideoReceiver.c
8282
kvsWebRTCClientMasterGstSample.c
8383
)
84-
target_link_libraries(kvsWebrtcClientMasterGstSample kvsWebrtcClient kvsWebrtcSignalingClient ${EXTRA_DEPS} ${GST_SAMPLE_LIBRARIES} kvsCommonLws kvspicUtils websockets kvssdp kvsstun)
84+
target_link_libraries(kvsWebrtcClientMasterGstSample kvsWebrtcClient kvsWebrtcSignalingClient ${EXTRA_DEPS} ${GST_SAMPLE_LIBRARIES} kvsCommonLws kvspicUtils websockets kvssdp kvsstun kvsrtp)
8585

8686
install(TARGETS kvsWebrtcClientMasterGstSample
8787
RUNTIME DESTINATION bin
@@ -93,7 +93,7 @@ if(GST_FOUND)
9393
GstAudioVideoReceiver.c
9494
kvsWebRTCClientViewerGstSample.c
9595
)
96-
target_link_libraries(kvsWebrtcClientViewerGstSample kvsWebrtcClient kvsWebrtcSignalingClient ${EXTRA_DEPS} ${GST_SAMPLE_LIBRARIES} kvsCommonLws kvspicUtils websockets kvssdp)
96+
target_link_libraries(kvsWebrtcClientViewerGstSample kvsWebrtcClient kvsWebrtcSignalingClient ${EXTRA_DEPS} ${GST_SAMPLE_LIBRARIES} kvsCommonLws kvspicUtils websockets kvssdp kvsrtp)
9797

9898
install(TARGETS kvsWebrtcClientViewerGstSample
9999
RUNTIME DESTINATION bin

Diff for: src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h

+2
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,8 @@ extern "C" {
311311
#define STATUS_RTP_INPUT_MTU_TOO_SMALL STATUS_RTP_BASE + 0x00000002
312312
#define STATUS_RTP_INVALID_NALU STATUS_RTP_BASE + 0x00000003
313313
#define STATUS_RTP_INVALID_EXTENSION_LEN STATUS_RTP_BASE + 0x00000004
314+
#define STATUS_RTP_INVALID_VERSION STATUS_RTP_BASE + 0x00000005
315+
#define STATUS_RTP_UNKNOWN_ERROR STATUS_RTP_BASE + 0x00000006
314316
/*!@} */
315317

316318
/////////////////////////////////////////////////////

Diff for: src/source/Include_i.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ extern "C" {
2727
#include <com/amazonaws/kinesis/video/webrtcclient/Include.h>
2828
#include "kvssdp/sdp_data_types.h"
2929
#include "kvsstun/stun_data_types.h"
30+
#include "kvsrtp/rtp_data_types.h"
3031

3132
#ifdef KVS_USE_OPENSSL
3233
#include <openssl/bio.h>
@@ -175,7 +176,8 @@ STATUS generateJSONSafeString(PCHAR, UINT32);
175176
#define KVS_CONVERT_TIMESCALE(pts, from_timescale, to_timescale) (pts * to_timescale / from_timescale)
176177

177178
STATUS convertSdpErrorCode(SdpResult_t sdpResult);
178-
STATUS convertStunErrorCode(StunResult_t sdpResult);
179+
STATUS convertStunErrorCode(StunResult_t stunResult);
180+
STATUS convertRtpErrorCode(RtpResult_t rtpResult);
179181

180182
#ifdef __cplusplus
181183
}

Diff for: src/source/Rtp/RtpPacket.c

+71-58
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#define LOG_CLASS "RtpPacket"
22

3+
#include "kvsrtp/rtp_api.h"
34
#include "../Include_i.h"
45

56
STATUS createRtpPacket(UINT8 version, BOOL padding, BOOL extension, UINT8 csrcCount, BOOL marker, UINT8 payloadType, UINT16 sequenceNumber,
@@ -168,45 +169,59 @@ STATUS setRtpPacketFromBytes(PBYTE rawPacket, UINT32 packetLength, PRtpPacket pR
168169
BOOL marker;
169170
UINT8 payloadType;
170171
UINT16 sequenceNumber;
172+
UINT16 i;
171173
UINT32 timestamp;
172174
UINT32 ssrc;
173175
PUINT32 csrcArray = NULL;
176+
PUINT32 extensionPayloadWord = NULL;
174177
UINT16 extensionProfile = 0;
175178
UINT16 extensionLength = 0;
176179
PBYTE extensionPayload = NULL;
177-
UINT32 currOffset = 0;
178-
179-
CHK(pRtpPacket != NULL && rawPacket != NULL, STATUS_NULL_ARG);
180+
UINT32 word;
181+
UINT16 currentIndex = 0;
182+
RtpResult_t rtpResult;
183+
RtpPacket_t deserializedPkt;
184+
RtpContext_t ctx;
185+
size_t dataLength = packetLength;
186+
187+
CHK(pRtpPacket != NULL, STATUS_NULL_ARG);
180188
CHK(packetLength >= MIN_HEADER_LENGTH, STATUS_RTP_INPUT_PACKET_TOO_SMALL);
181189

182-
version = (rawPacket[0] >> VERSION_SHIFT) & VERSION_MASK;
183-
padding = ((rawPacket[0] >> PADDING_SHIFT) & PADDING_MASK) > 0;
184-
extension = ((rawPacket[0] >> EXTENSION_SHIFT) & EXTENSION_MASK) > 0;
185-
csrcCount = rawPacket[0] & CSRC_COUNT_MASK;
186-
marker = ((rawPacket[1] >> MARKER_SHIFT) & MARKER_MASK) > 0;
187-
payloadType = rawPacket[1] & PAYLOAD_TYPE_MASK;
188-
sequenceNumber = getInt16(*(PUINT16) (rawPacket + SEQ_NUMBER_OFFSET));
189-
timestamp = getInt32(*(PUINT32) (rawPacket + TIMESTAMP_OFFSET));
190-
ssrc = getInt32(*(PUINT32) (rawPacket + SSRC_OFFSET));
190+
rtpResult = Rtp_Init(&(ctx));
191+
CHK(rtpResult == RTP_RESULT_OK, convertRtpErrorCode(rtpResult));
192+
193+
MEMSET(&deserializedPkt, 0, SIZEOF(RtpPacket_t));
194+
rtpResult = Rtp_DeSerialize(&(ctx), rawPacket, dataLength, &(deserializedPkt));
195+
CHK(rtpResult == RTP_RESULT_OK, convertRtpErrorCode(rtpResult));
191196

192-
currOffset = CSRC_OFFSET + (csrcCount * CSRC_LENGTH);
193-
CHK(packetLength >= currOffset, STATUS_RTP_INPUT_PACKET_TOO_SMALL);
197+
version = RTP_HEADER_VERSION;
198+
padding = (deserializedPkt.header.flags & RTP_HEADER_FLAG_PADDING) != 0;
199+
extension = (deserializedPkt.header.flags & RTP_HEADER_FLAG_EXTENSION) != 0;
200+
marker = (deserializedPkt.header.flags & RTP_HEADER_FLAG_MARKER) != 0;
201+
csrcCount = deserializedPkt.header.csrcCount;
202+
payloadType = deserializedPkt.header.payloadType;
203+
sequenceNumber = deserializedPkt.header.sequenceNumber;
204+
timestamp = deserializedPkt.header.timestamp;
205+
ssrc = deserializedPkt.header.ssrc;
194206

195207
if (csrcCount > 0) {
196-
csrcArray = (PUINT32) (rawPacket + CSRC_OFFSET);
208+
csrcArray = deserializedPkt.header.pCsrc;
197209
}
198210

199211
if (extension) {
200-
extensionProfile = getInt16(*(PUINT16) (rawPacket + currOffset));
201-
currOffset += SIZEOF(UINT16);
202-
extensionLength = getInt16(*(PUINT16) (rawPacket + currOffset)) * 4;
203-
currOffset += SIZEOF(UINT16);
204-
extensionPayload = (PBYTE) (rawPacket + currOffset);
205-
currOffset += extensionLength;
212+
extensionProfile = deserializedPkt.header.extension.extensionProfile;
213+
extensionLength = deserializedPkt.header.extension.extensionPayloadLength * 4;
214+
extensionPayloadWord = (deserializedPkt.header.extension.pExtensionPayload);
215+
for (i = 0; i < deserializedPkt.header.extension.extensionPayloadLength; i++) {
216+
word = getInt32(*(PUINT32) (extensionPayloadWord + currentIndex));
217+
extensionPayloadWord[currentIndex] = word;
218+
currentIndex += 4;
219+
}
220+
extensionPayload = (PBYTE) extensionPayloadWord;
206221
}
207222

208223
CHK_STATUS(setRtpPacket(version, padding, extension, csrcCount, marker, payloadType, sequenceNumber, timestamp, ssrc, csrcArray, extensionProfile,
209-
extensionLength, extensionPayload, rawPacket + currOffset, packetLength - currOffset, pRtpPacket));
224+
extensionLength, extensionPayload, deserializedPkt.pPayload, deserializedPkt.payloadLength, pRtpPacket));
210225

211226
CleanUp:
212227
LEAVES();
@@ -246,9 +261,13 @@ STATUS setBytesFromRtpPacket(PRtpPacket pRtpPacket, PBYTE pRawPacket, UINT32 pac
246261
ENTERS();
247262
STATUS retStatus = STATUS_SUCCESS;
248263
PRtpPacketHeader pHeader = &pRtpPacket->header;
249-
UINT32 packetLengthNeeded = 0;
250-
PBYTE pCurPtr = pRawPacket;
251-
UINT8 i;
264+
size_t packetLengthNeeded = 0;
265+
UINT16 i;
266+
RtpResult_t rtpResult;
267+
RtpPacket_t pkt;
268+
RtpContext_t ctx;
269+
UINT32 word;
270+
UINT16 currentIndex = 0;
252271

253272
CHK(pRtpPacket != NULL && pRawPacket != NULL, STATUS_NULL_ARG);
254273

@@ -269,54 +288,48 @@ STATUS setBytesFromRtpPacket(PRtpPacket pRtpPacket, PBYTE pRawPacket, UINT32 pac
269288
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
270289
*/
271290

272-
// The first byte contains the version, padding bit, extension bit, and csrc size
273-
*pCurPtr = ((pHeader->version << VERSION_SHIFT) | pHeader->csrcCount);
291+
rtpResult = Rtp_Init(&(ctx));
292+
CHK(rtpResult == RTP_RESULT_OK, convertRtpErrorCode(rtpResult));
293+
MEMSET(&pkt, 0, SIZEOF(RtpPacket_t));
294+
274295
if (pHeader->padding) {
275-
*pCurPtr |= (1 << PADDING_SHIFT);
296+
pkt.header.flags |= RTP_HEADER_FLAG_PADDING;
276297
}
277298
if (pHeader->extension) {
278-
*pCurPtr |= (1 << EXTENSION_SHIFT);
299+
pkt.header.flags |= RTP_HEADER_FLAG_EXTENSION;
279300
}
280-
pCurPtr++;
281-
282-
// The second byte contains the marker bit and payload type.
283-
*pCurPtr = pHeader->payloadType;
284301
if (pHeader->marker) {
285-
*pCurPtr |= (1 << MARKER_SHIFT);
302+
pkt.header.flags |= RTP_HEADER_FLAG_MARKER;
286303
}
287-
pCurPtr++;
288-
289-
// https://tools.ietf.org/html/rfc7741#page-5
290-
// All integer fields in the specifications are encoded as
291-
// unsigned integers in network octet order.
292-
putUnalignedInt16BigEndian(pCurPtr, pHeader->sequenceNumber);
293-
pCurPtr += SIZEOF(UINT16);
294-
295-
putUnalignedInt32BigEndian(pCurPtr, pHeader->timestamp);
296-
pCurPtr += SIZEOF(UINT32);
297304

298-
putUnalignedInt32BigEndian(pCurPtr, pHeader->ssrc);
299-
pCurPtr += SIZEOF(UINT32);
300-
301-
for (i = 0; i < pHeader->csrcCount; i++, pCurPtr += SIZEOF(UINT32)) {
302-
putUnalignedInt32BigEndian(pCurPtr, pHeader->csrcArray[i]);
303-
}
305+
pkt.header.csrcCount = pHeader->csrcCount;
306+
pkt.header.payloadType = pHeader->payloadType;
307+
pkt.header.sequenceNumber = pHeader->sequenceNumber;
308+
pkt.header.timestamp = pHeader->timestamp;
309+
pkt.header.ssrc = pHeader->ssrc;
310+
pkt.header.pCsrc = pHeader->csrcArray;
304311

305312
if (pHeader->extension) {
306313
// the payload must be in 32-bit words.
307314
CHK((pHeader->extensionLength) % SIZEOF(UINT32) == 0, STATUS_RTP_INVALID_EXTENSION_LEN);
308-
309-
putUnalignedInt16BigEndian(pCurPtr, pHeader->extensionProfile);
310-
pCurPtr += SIZEOF(UINT16);
311-
putUnalignedInt16BigEndian(pCurPtr, pHeader->extensionLength / SIZEOF(UINT32));
312-
pCurPtr += SIZEOF(UINT16);
313-
MEMCPY(pCurPtr, pHeader->extensionPayload, pHeader->extensionLength);
314-
pCurPtr += pHeader->extensionLength;
315+
pkt.header.extension.extensionProfile = pHeader->extensionProfile;
316+
pkt.header.extension.extensionPayloadLength = pHeader->extensionLength / SIZEOF(UINT32);
317+
for (i = 0; i < pkt.header.extension.extensionPayloadLength; i++) {
318+
word = getInt32(*(PUINT32) (pHeader->extensionPayload + currentIndex));
319+
MEMCPY((pHeader->extensionPayload + currentIndex), &word, SIZEOF(UINT32));
320+
currentIndex += 4;
321+
}
322+
pkt.header.extension.pExtensionPayload = (PUINT32) pHeader->extensionPayload;
315323
}
316324

317325
if (pRtpPacket->payload != NULL && pRtpPacket->payloadLength > 0) {
318-
MEMCPY(pCurPtr, pRtpPacket->payload, pRtpPacket->payloadLength);
326+
pkt.pPayload = pRtpPacket->payload;
327+
pkt.payloadLength = pRtpPacket->payloadLength;
319328
}
329+
330+
rtpResult = Rtp_Serialize(&(ctx), &(pkt), pRawPacket, &packetLengthNeeded);
331+
CHK(rtpResult == RTP_RESULT_OK, convertRtpErrorCode(rtpResult));
332+
320333
CleanUp:
321334
LEAVES();
322335
return retStatus;

Diff for: src/source/Rtp/RtpPacket.h

+6-16
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,12 @@ RTP Packet include file
1010
extern "C" {
1111
#endif
1212

13-
#define MIN_HEADER_LENGTH 12
14-
#define VERSION_SHIFT 6
15-
#define VERSION_MASK 0x3
16-
#define PADDING_SHIFT 5
17-
#define PADDING_MASK 0x1
18-
#define EXTENSION_SHIFT 4
19-
#define EXTENSION_MASK 0x1
20-
#define CSRC_COUNT_MASK 0xF
21-
#define MARKER_SHIFT 7
22-
#define MARKER_MASK 0x1
23-
#define PAYLOAD_TYPE_MASK 0x7F
24-
#define SEQ_NUMBER_OFFSET 2
25-
#define TIMESTAMP_OFFSET 4
26-
#define SSRC_OFFSET 8
27-
#define CSRC_OFFSET 12
28-
#define CSRC_LENGTH 4
13+
#define MIN_HEADER_LENGTH 12
14+
#define VERSION_SHIFT 6
15+
#define VERSION_MASK 0x3
16+
#define SSRC_OFFSET 8
17+
#define CSRC_LENGTH 4
18+
#define RTP_HEADER_VERSION 2
2919

3020
#define RTP_HEADER_LEN(pRtpPacket) \
3121
(12 + (pRtpPacket)->header.csrcCount * CSRC_LENGTH + ((pRtpPacket)->header.extension ? 4 + (pRtpPacket)->header.extensionLength : 0))

Diff for: src/source/Rtp/RtpUtils.c

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#define LOG_CLASS "RTPUtils"
2+
3+
#include "../Include_i.h"
4+
5+
STATUS convertRtpErrorCode(RtpResult_t rtpResult)
6+
{
7+
STATUS retStatus;
8+
9+
switch (rtpResult) {
10+
case RTP_RESULT_OK:
11+
retStatus = STATUS_SUCCESS;
12+
break;
13+
case RTP_RESULT_BAD_PARAM:
14+
retStatus = STATUS_INVALID_ARG;
15+
break;
16+
case RTP_RESULT_OUT_OF_MEMORY:
17+
retStatus = STATUS_NOT_ENOUGH_MEMORY;
18+
break;
19+
case RTP_RESULT_WRONG_VERSION:
20+
retStatus = STATUS_RTP_INVALID_VERSION;
21+
break;
22+
case RTP_RESULT_MALFORMED_PACKET:
23+
retStatus = STATUS_RTP_INPUT_PACKET_TOO_SMALL;
24+
break;
25+
default:
26+
retStatus = STATUS_RTP_UNKNOWN_ERROR;
27+
break;
28+
}
29+
30+
return retStatus;
31+
}

0 commit comments

Comments
 (0)