1
1
#define LOG_CLASS "RtpPacket"
2
2
3
+ #include "kvsrtp/rtp_api.h"
3
4
#include "../Include_i.h"
4
5
5
6
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
168
169
BOOL marker ;
169
170
UINT8 payloadType ;
170
171
UINT16 sequenceNumber ;
172
+ UINT16 i ;
171
173
UINT32 timestamp ;
172
174
UINT32 ssrc ;
173
175
PUINT32 csrcArray = NULL ;
176
+ PUINT32 extensionPayloadWord = NULL ;
174
177
UINT16 extensionProfile = 0 ;
175
178
UINT16 extensionLength = 0 ;
176
179
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 );
180
188
CHK (packetLength >= MIN_HEADER_LENGTH , STATUS_RTP_INPUT_PACKET_TOO_SMALL );
181
189
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 ));
191
196
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 ;
194
206
195
207
if (csrcCount > 0 ) {
196
- csrcArray = ( PUINT32 ) ( rawPacket + CSRC_OFFSET ) ;
208
+ csrcArray = deserializedPkt . header . pCsrc ;
197
209
}
198
210
199
211
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 ;
206
221
}
207
222
208
223
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 ));
210
225
211
226
CleanUp :
212
227
LEAVES ();
@@ -246,9 +261,13 @@ STATUS setBytesFromRtpPacket(PRtpPacket pRtpPacket, PBYTE pRawPacket, UINT32 pac
246
261
ENTERS ();
247
262
STATUS retStatus = STATUS_SUCCESS ;
248
263
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 ;
252
271
253
272
CHK (pRtpPacket != NULL && pRawPacket != NULL , STATUS_NULL_ARG );
254
273
@@ -269,54 +288,48 @@ STATUS setBytesFromRtpPacket(PRtpPacket pRtpPacket, PBYTE pRawPacket, UINT32 pac
269
288
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
270
289
*/
271
290
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
+
274
295
if (pHeader -> padding ) {
275
- * pCurPtr |= ( 1 << PADDING_SHIFT ) ;
296
+ pkt . header . flags |= RTP_HEADER_FLAG_PADDING ;
276
297
}
277
298
if (pHeader -> extension ) {
278
- * pCurPtr |= ( 1 << EXTENSION_SHIFT ) ;
299
+ pkt . header . flags |= RTP_HEADER_FLAG_EXTENSION ;
279
300
}
280
- pCurPtr ++ ;
281
-
282
- // The second byte contains the marker bit and payload type.
283
- * pCurPtr = pHeader -> payloadType ;
284
301
if (pHeader -> marker ) {
285
- * pCurPtr |= ( 1 << MARKER_SHIFT ) ;
302
+ pkt . header . flags |= RTP_HEADER_FLAG_MARKER ;
286
303
}
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 );
297
304
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 ;
304
311
305
312
if (pHeader -> extension ) {
306
313
// the payload must be in 32-bit words.
307
314
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 ;
315
323
}
316
324
317
325
if (pRtpPacket -> payload != NULL && pRtpPacket -> payloadLength > 0 ) {
318
- MEMCPY (pCurPtr , pRtpPacket -> payload , pRtpPacket -> payloadLength );
326
+ pkt .pPayload = pRtpPacket -> payload ;
327
+ pkt .payloadLength = pRtpPacket -> payloadLength ;
319
328
}
329
+
330
+ rtpResult = Rtp_Serialize (& (ctx ), & (pkt ), pRawPacket , & packetLengthNeeded );
331
+ CHK (rtpResult == RTP_RESULT_OK , convertRtpErrorCode (rtpResult ));
332
+
320
333
CleanUp :
321
334
LEAVES ();
322
335
return retStatus ;
0 commit comments