rtppkt.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:17k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef PMC_PREDEFINED_TYPES
  36. #define PMC_PREDEFINED_TYPES
  37. typedef char* pmc_string;
  38. struct buffer {
  39.  UINT32 len;
  40.  INT8* data;
  41. };
  42. #endif/*PMC_PREDEFINED_TYPES*/
  43. /* $Id: rtppkt.h,v 1.7 2003/09/30 16:15:42 csloan Exp $ */
  44. #ifndef _RTPPKT_H_
  45. #define _RTPPKT_H_
  46. // op-codes
  47. const int RTP_OP_PACKETFLAGS = 1;   // opcode datalength = 1
  48. const int RTP_OP_ASMRULES = 2;     // packs asm_flags/asm_rule instead
  49.     // of op_code_data
  50. // flags for opcode RTP_OP_PACKETFLAGS
  51. const int RTP_FLAG_LASTPACKET = 0x00000001; // last packet in stream
  52. const int RTP_FLAG_KEYFRAME =   0x00000002; // keyframe packet
  53. // RTCP types
  54. const int RTCP_SR  = 200;
  55. const int RTCP_RR  = 201;
  56. const int RTCP_SDES  = 202;
  57. const int RTCP_BYE  = 203;
  58. const int RTCP_APP  = 204;
  59. // SDES item types
  60. const int SDES_CNAME = 1;
  61. const int SDES_NAME = 2;
  62. const int SDES_EMAIL = 3;
  63. const int SDES_PHONE = 4;
  64. const int SDES_LOC = 5;
  65. const int SDES_TOOL = 6;
  66. const int SDES_NOTE = 7;
  67. const int SDES_PRIV = 8;
  68. // APP tiem Types
  69. const int APP_EOS = 1;
  70. const int APP_BUFINFO = 2;
  71. #include "bufnum.h"
  72. #include "hxinline.h"
  73. class RTPPacketBase
  74. {
  75. public:
  76.     UINT8* pack(UINT8* buf, UINT32 &len);
  77.     UINT8* unpack(UINT8* buf, UINT32 len);
  78.     const UINT32 static_size() {return 20;}
  79.     UINT8 version_flag;
  80.     UINT8 padding_flag;
  81.     UINT8 extension_flag;
  82.     UINT8 csrc_len;
  83.     UINT8 marker_flag;
  84.     UINT8 payload;
  85.     INT16 seq_no;
  86.     INT32 timestamp;
  87.     INT32 ssrc;
  88.     INT32 *csrc;
  89.     INT16 op_code;
  90.     INT16 op_code_data_length;
  91.     INT16 asm_flags;
  92.     INT16 asm_rule;
  93.     INT32 *op_code_data;
  94.     buffer data;
  95. };
  96. class ReceptionReport
  97. {
  98. public:
  99.     UINT8* pack(UINT8* buf, UINT32 &len);
  100.     UINT8* unpack(UINT8* buf, UINT32 len);
  101.     static const UINT32 static_size() {return 24;}
  102.     UINT32 ssrc;
  103.     UINT8 fraction;
  104.     UINT32 lost;
  105.     UINT32 last_seq;
  106.     UINT32 jitter;
  107.     UINT32 lsr;
  108.     UINT32 dlsr;
  109. };
  110. class SDESItem
  111. {
  112. public:
  113.     UINT8* pack(UINT8* buf, UINT32 &len);
  114.     UINT8* unpack(UINT8* buf, UINT32 len);
  115.     const UINT32 static_size() {return 2;}
  116.     UINT8 sdes_type;
  117.     UINT8 length;
  118.     UINT8 *data;
  119. };
  120. class APPItem
  121. {
  122. public:
  123.     UINT8* pack(UINT8* buf, UINT32 &len);
  124.     UINT8* unpack(UINT8* buf, UINT32 len);
  125.     const UINT32 static_size() {return 23;}
  126.     UINT8 app_type;
  127.     UINT8 packet_sent;
  128.     UINT16 seq_no;
  129.     UINT32 timestamp;
  130.     UINT32 lowest_timestamp;
  131.     UINT32 highest_timestamp;
  132.     UINT32 bytes_buffered;
  133.     UINT32 padding0;
  134. };
  135. class RTCPPacketBase
  136. {
  137. public:
  138.     UINT8* pack(UINT8* buf, UINT32 &len);
  139.     UINT8* unpack(UINT8* buf, UINT32 len);
  140.     const UINT32 static_size() {return 40;}
  141.     UINT8 version_flag;
  142.     UINT8 padding_flag;
  143.     UINT8 count;
  144.     UINT8 packet_type;
  145.     UINT16 length;
  146.     UINT32 sr_ssrc;
  147.     UINT32 ntp_sec;
  148.     UINT32 ntp_frac;
  149.     UINT32 rtp_ts;
  150.     UINT32 psent;
  151.     UINT32 osent;
  152.     ReceptionReport *sr_data;
  153.     UINT32 rr_ssrc;
  154.     ReceptionReport *rr_data;
  155.     UINT8 *sdes_data;
  156.     UINT32 *bye_src;
  157.     UINT32 app_ssrc;
  158.     UINT8 app_name[4];
  159.     UINT8 *app_data;
  160. };
  161. #if defined (_DEFINE_INLINE)
  162. HX_INLINE UINT8*
  163. RTPPacketBase::pack(UINT8* buf, UINT32 &len)
  164. {
  165.     UINT8* off = buf;
  166.     {
  167. *off &= ~0xc0; *off |= (version_flag&0x3)<<6;
  168.     }
  169.     {*off &= ~(1<<5); *off |= (padding_flag&1)<<5;}
  170.     {*off &= ~(1<<4); *off |= (extension_flag&1)<<4;}
  171.     {
  172. *off &= ~0xf; *off++ |= csrc_len&0xf;                       
  173.     }
  174.     {*off &= ~(1<<7); *off |= (marker_flag&1)<<7;}
  175.     {
  176. *off &= ~0x7f; *off++ |= payload&0x7f;
  177.     }
  178.     {*off++ = (UINT8) (seq_no>>8); *off++ = (UINT8) (seq_no);}
  179.     {
  180. *off++ = (UINT8) (timestamp>>24); *off++ = (UINT8) (timestamp>>16); *off++ = (UINT8) (timestamp>>8); *off++ = (UINT8) (timestamp);
  181.     }
  182.     {
  183. *off++ = (UINT8) (ssrc>>24); *off++ = (UINT8) (ssrc>>16); *off++ = (UINT8) (ssrc>>8); *off++ = (UINT8) (ssrc);
  184.     }
  185.     if ((csrc_len > 0))
  186.     {
  187.       {for (int i = 0;  i < csrc_len; i++)
  188.   {
  189.       *off++ = (UINT8) (csrc[i]>>24); *off++ = (UINT8) (csrc[i]>>16); *off++ = (UINT8) (csrc[i]>>8); *off++ = (UINT8) (csrc[i]);
  190.   }
  191.       }
  192.     }
  193.     if ((extension_flag == 1))
  194.     {
  195.       {*off++ = (UINT8) (op_code>>8); *off++ = (UINT8) (op_code);}
  196.       {*off++ = (UINT8) (op_code_data_length>>8); *off++ = (UINT8) (op_code_data_length);}
  197.       if ((op_code == 2))
  198.       {
  199. {*off++ = (UINT8) (asm_flags>>8); *off++ = (UINT8) (asm_flags);}
  200. {*off++ = (UINT8) (asm_rule>>8); *off++ = (UINT8) (asm_rule);}
  201.       }
  202.       else
  203.       {
  204. {for (int i = 0;  i < op_code_data_length; i++)
  205.     {
  206. *off++ = (UINT8) (op_code_data[i]>>24); *off++ = (UINT8) (op_code_data[i]>>16); *off++ = (UINT8) (op_code_data[i]>>8); *off++ = (UINT8) (op_code_data[i]);
  207.     }
  208. }
  209.       }
  210.     }
  211.     {
  212. memcpy(off, data.data, data.len); off += data.len; /* Flawfinder: ignore */
  213.     }
  214.     len = off-buf;
  215.     return off;
  216. }
  217. HX_INLINE UINT8*
  218. RTPPacketBase::unpack(UINT8* buf, UINT32 len)
  219. {
  220.     if (!buf || !len)
  221. return 0;
  222.     UINT8* off = buf;
  223.     {
  224. version_flag  = (*off&0xc0)>>6;
  225.     }
  226.     padding_flag = (*off>>5)&1;
  227.     extension_flag = (*off>>4)&1;
  228.     {
  229. csrc_len  = *off++&0xf;
  230.     }
  231.     marker_flag = (*off>>7)&1;
  232.     {
  233. payload  = *off++&0x7f;
  234.     }
  235.     {seq_no = *off++<<8; seq_no |= *off++;}
  236.     {
  237. timestamp = GetDwordFromBufAndInc(off);
  238.     }
  239.     {
  240. ssrc = GetDwordFromBufAndInc(off);
  241.     }
  242.     if ((csrc_len > 0))
  243.     {
  244.       {
  245.   csrc = new INT32[csrc_len];
  246.   for (int i = 0;  i < csrc_len; i++)
  247.   {
  248.       csrc[i] = GetDwordFromBufAndInc(off);
  249.   }
  250.       }
  251.     }
  252.     if ((extension_flag == 1))
  253.     {
  254.       {op_code = *off++<<8; op_code |= *off++;}
  255.       {op_code_data_length = *off++<<8; op_code_data_length |= *off++;}
  256.       if ((op_code == 2))
  257.       {
  258. {asm_flags = *off++<<8; asm_flags |= *off++;}
  259. {asm_rule = *off++<<8; asm_rule |= *off++;}
  260.       }
  261.       else
  262.       {
  263. {
  264.     op_code_data = new INT32[op_code_data_length];
  265.     for (int i = 0;  i < op_code_data_length; i++)
  266.     {
  267. op_code_data[i] = GetDwordFromBufAndInc(off);
  268.     }
  269. }
  270.       }
  271.     }
  272.     {
  273. data.len = len - (off - buf);
  274. if (off-buf+data.len > (int)len)
  275.     return 0;
  276. data.data = (INT8 *)off; off += data.len;
  277.     }
  278.     return off;
  279. }
  280. HX_INLINE UINT8*
  281. ReceptionReport::pack(UINT8* buf, UINT32 &len)
  282. {
  283.     UINT8* off = buf;
  284.     {
  285. *off++ = (UINT8) (ssrc>>24); *off++ = (UINT8) (ssrc>>16); *off++ = (UINT8) (ssrc>>8); *off++ = (UINT8) (ssrc);
  286.     }
  287.     {
  288. *off++ = (UINT8) (fraction);
  289.     }
  290.     {
  291. *off++ = (UINT8) (lost>>16);
  292. *off++ = (UINT8) (lost>>8);
  293. *off++ = (UINT8) (lost);
  294.     }
  295.     {
  296. *off++ = (UINT8) (last_seq>>24); *off++ = (UINT8) (last_seq>>16); *off++ = (UINT8) (last_seq>>8); *off++ = (UINT8) (last_seq);
  297.     }
  298.     {
  299. *off++ = (UINT8) (jitter>>24); *off++ = (UINT8) (jitter>>16); *off++ = (UINT8) (jitter>>8); *off++ = (UINT8) (jitter);
  300.     }
  301.     {
  302. *off++ = (UINT8) (lsr>>24); *off++ = (UINT8) (lsr>>16); *off++ = (UINT8) (lsr>>8); *off++ = (UINT8) (lsr);
  303.     }
  304.     {
  305. *off++ = (UINT8) (dlsr>>24); *off++ = (UINT8) (dlsr>>16); *off++ = (UINT8) (dlsr>>8); *off++ = (UINT8) (dlsr);
  306.     }
  307.     len = off-buf;
  308.     return off;
  309. }
  310. HX_INLINE UINT8*
  311. ReceptionReport::unpack(UINT8* buf, UINT32 len)
  312. {
  313.     if (!buf || !len)
  314. return 0;
  315.     UINT8* off = buf;
  316.     {
  317. ssrc = GetDwordFromBufAndInc(off);
  318.     }
  319.     {
  320. fraction  = *off++;
  321.     }
  322.     {
  323. lost  = *off++<<16;
  324. lost |= *off++<<8;
  325. lost |= *off++;
  326.     }
  327.     {
  328.         last_seq = GetDwordFromBufAndInc(off);
  329.     }
  330.     {
  331.         jitter = GetDwordFromBufAndInc(off);
  332.     }
  333.     {
  334. lsr = GetDwordFromBufAndInc(off);
  335.     }
  336.     {
  337. dlsr = GetDwordFromBufAndInc(off);
  338.     }
  339.     return off;
  340. }
  341. HX_INLINE UINT8*
  342. SDESItem::pack(UINT8* buf, UINT32 &len)
  343. {
  344.     UINT8* off = buf;
  345.     *off++ = sdes_type;
  346.     if ((sdes_type != 0))
  347.     {
  348.       *off++ = length;
  349.       {memcpy(off, data, length); off += length; } /* Flawfinder: ignore */
  350.     }
  351.     len = off-buf;
  352.     return off;
  353. }
  354. HX_INLINE UINT8*
  355. SDESItem::unpack(UINT8* buf, UINT32 len)
  356. {
  357.     if (!buf || !len)
  358. return 0;
  359.     UINT8* off = buf;
  360.     sdes_type = *off++;
  361.     if ((sdes_type != 0))
  362.     {
  363.       length = *off++;
  364.       if (off-buf+length > (int)len)
  365.   return 0;
  366.       {data = (UINT8 *)off; off += length;}
  367.     }
  368.     return off;
  369. }
  370. HX_INLINE UINT8*
  371. APPItem::pack(UINT8* buf, UINT32 &len)
  372. {
  373.     UINT8* off = buf;
  374.     *off++ = app_type;
  375.     if ((1 == app_type))
  376.     {
  377.       {
  378.   *off++ = (UINT8) (packet_sent);
  379.       }
  380.       {*off++ = (UINT8) (seq_no>>8); *off++ = (UINT8) (seq_no);}
  381.       {
  382.   *off++ = (UINT8) (timestamp>>24); *off++ = (UINT8) (timestamp>>16); *off++ = (UINT8) (timestamp>>8); *off++ = (UINT8) (timestamp);
  383.       }
  384.     }
  385.     if ((2 == app_type))
  386.     {
  387.       {
  388.   *off++ = (UINT8) (lowest_timestamp>>24); *off++ = (UINT8) (lowest_timestamp>>16); *off++ = (UINT8) (lowest_timestamp>>8); *off++ = (UINT8) (lowest_timestamp);
  389.       }
  390.       {
  391.   *off++ = (UINT8) (highest_timestamp>>24); *off++ = (UINT8) (highest_timestamp>>16); *off++ = (UINT8) (highest_timestamp>>8); *off++ = (UINT8) (highest_timestamp);
  392.       }
  393.       {
  394.   *off++ = (UINT8) (bytes_buffered>>24); *off++ = (UINT8) (bytes_buffered>>16); *off++ = (UINT8) (bytes_buffered>>8); *off++ = (UINT8) (bytes_buffered);
  395.       }
  396.       {
  397.   *off++ = (UINT8) (padding0>>16);
  398.   *off++ = (UINT8) (padding0>>8);
  399.   *off++ = (UINT8) (padding0);
  400.       }
  401.     }
  402.     len = off-buf;
  403.     return off;
  404. }
  405. HX_INLINE UINT8*
  406. APPItem::unpack(UINT8* buf, UINT32 len)
  407. {
  408.     if (!buf || !len)
  409. return 0;
  410.     UINT8* off = buf;
  411.     app_type = *off++;
  412.     if ((1 == app_type))
  413.     {
  414.       {
  415.   packet_sent  = *off++;
  416.       }
  417.       {seq_no = *off++<<8; seq_no |= *off++;}
  418.       {
  419.   timestamp = GetDwordFromBufAndInc(off);
  420.       }
  421.     }
  422.     if ((2 == app_type))
  423.     {
  424.       {
  425.   lowest_timestamp = GetDwordFromBufAndInc(off);
  426.       }
  427.       {
  428.   highest_timestamp = GetDwordFromBufAndInc(off);
  429.       }
  430.       {
  431.   bytes_buffered = GetDwordFromBufAndInc(off);
  432.       }
  433.       {
  434.   padding0  = *off++<<16;
  435.   padding0 |= *off++<<8;
  436.   padding0 |= *off++;
  437.       }
  438.     }
  439.     return off;
  440. }
  441. HX_INLINE UINT8*
  442. RTCPPacketBase::pack(UINT8* buf, UINT32 &len)
  443. {
  444.     UINT8* off = buf;
  445.     {
  446. *off &= ~0xc0; *off |= (version_flag&0x3)<<6;
  447.     }
  448.     {*off &= ~(1<<5); *off |= (padding_flag&1)<<5;}
  449.     {
  450. *off &= ~0x1f; *off++ |= count&0x1f;
  451.     }
  452.     {
  453. *off++ = (UINT8) (packet_type);
  454.     }
  455.     {*off++ = (UINT8) (length>>8); *off++ = (UINT8) (length);}
  456.     if ((packet_type == 200))
  457.     {
  458.       {
  459.   *off++ = (UINT8) (sr_ssrc>>24); *off++ = (UINT8) (sr_ssrc>>16); *off++ = (UINT8) (sr_ssrc>>8); *off++ = (UINT8) (sr_ssrc);
  460.       }
  461.       {
  462.   *off++ = (UINT8) (ntp_sec>>24); *off++ = (UINT8) (ntp_sec>>16); *off++ = (UINT8) (ntp_sec>>8); *off++ = (UINT8) (ntp_sec);
  463.       }
  464.       {
  465.   *off++ = (UINT8) (ntp_frac>>24); *off++ = (UINT8) (ntp_frac>>16); *off++ = (UINT8) (ntp_frac>>8); *off++ = (UINT8) (ntp_frac);
  466.       }
  467.       {
  468.   *off++ = (UINT8) (rtp_ts>>24); *off++ = (UINT8) (rtp_ts>>16); *off++ = (UINT8) (rtp_ts>>8); *off++ = (UINT8) (rtp_ts);
  469.       }
  470.       {
  471.   *off++ = (UINT8) (psent>>24); *off++ = (UINT8) (psent>>16); *off++ = (UINT8) (psent>>8); *off++ = (UINT8) (psent);
  472.       }
  473.       {
  474.   *off++ = (UINT8) (osent>>24); *off++ = (UINT8) (osent>>16); *off++ = (UINT8) (osent>>8); *off++ = (UINT8) (osent);
  475.       }
  476.       {for (int i = 0;  i < count; i++)
  477.   off = sr_data[i].pack(off, len);
  478.       }
  479.     }
  480.     if ((packet_type == 201))
  481.     {
  482.       {
  483.   *off++ = (UINT8) (rr_ssrc>>24); *off++ = (UINT8) (rr_ssrc>>16); *off++ = (UINT8) (rr_ssrc>>8); *off++ = (UINT8) (rr_ssrc);
  484.       }
  485.       {for (int i = 0;  i < count; i++)
  486.   off = rr_data[i].pack(off, len);
  487.       }
  488.     }
  489.     if ((packet_type == 202))
  490.     {
  491.       {memcpy(off, sdes_data, (length * 4)); off += (length * 4); } /* Flawfinder: ignore */
  492.     }
  493.     if ((packet_type == 203))
  494.     {
  495.       {for (int i = 0;  i < count; i++)
  496.   {
  497.       *off++ = (UINT8) (bye_src[i]>>24); *off++ = (UINT8) (bye_src[i]>>16); *off++ = (UINT8) (bye_src[i]>>8); *off++ = (UINT8) (bye_src[i]);
  498.   }
  499.       }
  500.     }
  501.     if ((packet_type == 204))
  502.     {
  503.       {
  504.   *off++ = (UINT8) (app_ssrc>>24); *off++ = (UINT8) (app_ssrc>>16); *off++ = (UINT8) (app_ssrc>>8); *off++ = (UINT8) (app_ssrc);
  505.       }
  506.       {memcpy(off, app_name, 4); off += 4; } /* Flawfinder: ignore */
  507.       {memcpy(off, app_data, ((length - 2) * 4)); off += ((length - 2) * 4); } /* Flawfinder: ignore */
  508.     }
  509.     len = off-buf;
  510.     return off;
  511. }
  512. HX_INLINE UINT8*
  513. RTCPPacketBase::unpack(UINT8* buf, UINT32 len)
  514. {
  515.     if (!buf || len < 4)
  516. return 0;
  517.     UINT8* off = buf;
  518.     {
  519. version_flag  = (*off&0xc0)>>6;
  520.     }
  521.     padding_flag = (*off>>5)&1;
  522.     {
  523. count  = *off++&0x1f;
  524.     }
  525.     {
  526. packet_type  = *off++;
  527.     }
  528.     {length = *off++<<8; length |= *off++;}
  529.     if (len < (UINT32)4*(length + 1))
  530.     {
  531.         count = 0;
  532.         return 0;
  533.     }
  534.     if ((packet_type == 200))
  535.     {
  536.         if (length < 6)
  537.         {
  538.             count = 0;
  539.             return buf + 4 + 4*length;
  540.         }
  541.       {
  542.   sr_ssrc = GetDwordFromBufAndInc(off);
  543.       }
  544.       {
  545.   ntp_sec = GetDwordFromBufAndInc(off);
  546.       }
  547.       {
  548.   ntp_frac = GetDwordFromBufAndInc(off);
  549.       }
  550.       {
  551.   rtp_ts = GetDwordFromBufAndInc(off);
  552.       }
  553.       {
  554.   psent = GetDwordFromBufAndInc(off);
  555.       }
  556.       {
  557.   osent = GetDwordFromBufAndInc(off);
  558.       }
  559.       if (length < 6 + count*(ReceptionReport::static_size() / 4))
  560.       {
  561.           count = 0;
  562.           return buf + 4 + length*4;
  563.       }
  564.       {
  565.   sr_data = new ReceptionReport[count];
  566.   for (int i = 0;  i < count; i++)
  567.   off = sr_data[i].unpack(off, len);
  568.       }
  569.     }
  570.     if ((packet_type == 201))
  571.     {
  572.         if (length < 1)
  573.         {
  574.             count = 0;
  575.             return buf + 4 + 4*length;
  576.         }
  577.       {
  578.   rr_ssrc = GetDwordFromBufAndInc(off);
  579.       }
  580.         if (length < 1 + count*(ReceptionReport::static_size() / 4))
  581.         {
  582.             count = 0;
  583.             return buf + 4 + length*4;
  584.         }
  585.       {
  586.   rr_data = new ReceptionReport[count];
  587.   for (int i = 0;  i < count; i++)
  588.   off = rr_data[i].unpack(off, len);
  589.       }
  590.     }
  591.     if ((packet_type == 202))
  592.     {
  593.       if (off-buf+(length * 4) > (int)len)
  594.   return 0;
  595.       {sdes_data = (UINT8 *)off; off += (length * 4);}
  596.     }
  597.     if ((packet_type == 203))
  598.     {
  599.         if (length < count)
  600.         {
  601.             count = 0;
  602.             return buf + 4 + length*4;
  603.         }
  604.       {
  605.   bye_src = new UINT32[count];
  606.   for (int i = 0;  i < count; i++)
  607.   {
  608.       bye_src[i] = GetDwordFromBufAndInc(off);
  609.   }
  610.       }
  611.     }
  612.     if ((packet_type == 204))
  613.     {
  614.       {
  615.   app_ssrc = GetDwordFromBufAndInc(off);
  616.       }
  617.       if (off-buf+4 > (int)len)
  618.   return 0;
  619.       {memcpy(app_name, off, 4); off += 4; } /* Flawfinder: ignore */
  620.       if (off-buf+((length - 2) * 4) > (int)len)
  621.   return 0;
  622.       {app_data = (UINT8 *)off; off += ((length - 2) * 4);}
  623.     }
  624.     return off;
  625. }
  626. #endif //_DEFINE_INLINE
  627. #endif /* _RTPPKT_H_ */