37 #ifndef RTCPSDESPACKET_H
39 #define RTCPSDESPACKET_H
41 #include "rtpconfig.h"
44 #include "rtpdefines.h"
45 #if ! (defined(WIN32) || defined(_WIN32_WCE))
46 #include <netinet/in.h>
120 #ifdef RTP_SUPPORT_SDESPRIV
140 #endif // RTP_SUPPORT_SDESPRIV
146 uint8_t *currentchunk;
155 RTCPCommonHeader *hdr = (RTCPCommonHeader *)data;
156 return ((
int)hdr->count);
166 currentchunk = data+
sizeof(RTCPCommonHeader);
168 itemoffset =
sizeof(uint32_t);
176 if (currentchunk == 0)
181 size_t offset =
sizeof(uint32_t);
182 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+
sizeof(uint32_t));
184 while (sdeshdr->sdesid != 0)
186 offset +=
sizeof(RTCPSDESHeader);
187 offset += (size_t)(sdeshdr->length);
188 sdeshdr = (RTCPSDESHeader *)(currentchunk+offset);
191 if ((offset&0x03) != 0)
192 offset += (4-(offset&0x03));
193 currentchunk += offset;
195 itemoffset =
sizeof(uint32_t);
203 if (currentchunk == 0)
205 uint32_t *ssrc = (uint32_t *)currentchunk;
213 if (currentchunk == 0)
215 itemoffset =
sizeof(uint32_t);
216 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
217 if (sdeshdr->sdesid == 0)
226 if (currentchunk == 0)
229 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
230 if (sdeshdr->sdesid == 0)
233 size_t offset = itemoffset;
234 offset +=
sizeof(RTCPSDESHeader);
235 offset += (size_t)(sdeshdr->length);
236 sdeshdr = (RTCPSDESHeader *)(currentchunk+offset);
237 if (sdeshdr->sdesid == 0)
247 if (currentchunk == 0)
249 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
250 switch (sdeshdr->sdesid)
254 case RTCP_SDES_ID_CNAME:
256 case RTCP_SDES_ID_NAME:
258 case RTCP_SDES_ID_EMAIL:
260 case RTCP_SDES_ID_PHONE:
262 case RTCP_SDES_ID_LOCATION:
264 case RTCP_SDES_ID_TOOL:
266 case RTCP_SDES_ID_NOTE:
268 case RTCP_SDES_ID_PRIVATE:
280 if (currentchunk == 0)
282 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
283 if (sdeshdr->sdesid == 0)
285 return (
size_t)(sdeshdr->length);
292 if (currentchunk == 0)
294 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
295 if (sdeshdr->sdesid == 0)
297 return (currentchunk+itemoffset+
sizeof(RTCPSDESHeader));
300 #ifdef RTP_SUPPORT_SDESPRIV
305 if (currentchunk == 0)
307 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
308 if (sdeshdr->sdesid != RTCP_SDES_ID_PRIVATE)
310 if (sdeshdr->length == 0)
312 uint8_t *preflen = currentchunk+itemoffset+
sizeof(RTCPSDESHeader);
313 size_t prefixlength = (size_t)(*preflen);
314 if (prefixlength > (
size_t)((sdeshdr->length)-1))
323 if (currentchunk == 0)
325 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
326 if (sdeshdr->sdesid != RTCP_SDES_ID_PRIVATE)
328 if (sdeshdr->length == 0)
330 uint8_t *preflen = currentchunk+itemoffset+
sizeof(RTCPSDESHeader);
331 size_t prefixlength = (size_t)(*preflen);
332 if (prefixlength > (
size_t)((sdeshdr->length)-1))
334 if (prefixlength == 0)
336 return (currentchunk+itemoffset+
sizeof(RTCPSDESHeader)+1);
343 if (currentchunk == 0)
345 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
346 if (sdeshdr->sdesid != RTCP_SDES_ID_PRIVATE)
348 if (sdeshdr->length == 0)
350 uint8_t *preflen = currentchunk+itemoffset+
sizeof(RTCPSDESHeader);
351 size_t prefixlength = (size_t)(*preflen);
352 if (prefixlength > (
size_t)((sdeshdr->length)-1))
354 return ((
size_t)(sdeshdr->length))-prefixlength-1;
361 if (currentchunk == 0)
363 RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
364 if (sdeshdr->sdesid != RTCP_SDES_ID_PRIVATE)
366 if (sdeshdr->length == 0)
368 uint8_t *preflen = currentchunk+itemoffset+
sizeof(RTCPSDESHeader);
369 size_t prefixlength = (size_t)(*preflen);
370 if (prefixlength > (
size_t)((sdeshdr->length)-1))
372 size_t valuelen = ((size_t)(sdeshdr->length))-prefixlength-1;
375 return (currentchunk+itemoffset+
sizeof(RTCPSDESHeader)+1+prefixlength);
378 #endif // RTP_SUPPORT_SDESPRIV
380 #endif // RTCPSDESPACKET_H