rtppkt.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:17k
源码类别:

Symbian

开发平台:

Visual C++

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