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

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 _RTPWRAP_H_
  36. #define _RTPWRAP_H_
  37. #include "rtppkt.h" // Base class definitions from PMC
  38. #include "hxmap.h"
  39. #include "hxslist.h"
  40. #include "hxassert.h"
  41. #include "hxinline.h"
  42. class RTPPacket : public RTPPacketBase
  43. {
  44. public:
  45.     RTPPacket()
  46.     {
  47.         /* 
  48.          * XXXST I should be doing this in the initialization parameters
  49.          * except the PMC generated class doesn't have a constructor so 
  50.          * I cannot set them in this constructor.
  51.          */
  52.      
  53.         version_flag = 0;
  54.         padding_flag = 0;
  55.         extension_flag = 0;
  56.         csrc_len = 0;
  57.         marker_flag = 0;
  58.         payload = 0;
  59.         seq_no = 0;
  60.         timestamp = 0;
  61.         ssrc = 0;
  62.         csrc = 0;
  63.         op_code = 0;
  64.         op_code_data_length = 0;
  65.         asm_flags = 0;
  66.         asm_rule = 0;
  67.         op_code_data = 0;
  68.         data.data = 0;
  69.         data.len = 0;
  70.     }
  71.     ~RTPPacket()
  72.     {
  73.         if (csrc)
  74.     delete [] csrc;
  75.         if (op_code_data)
  76.     delete [] op_code_data;
  77.     }
  78.     void SetCSrc(INT32* pchNewData, UINT32 ulLen)
  79.     {
  80.         if (csrc)
  81.     delete [] csrc;
  82.         csrc = new INT32[ulLen];
  83.         memcpy(csrc, pchNewData, ulLen * sizeof(INT32)); /* Flawfinder: ignore */
  84.     }
  85.     void SetOpCodeData(INT32* pchNewData, UINT32 ulLen)
  86.     {
  87.         if (op_code_data)
  88.     delete [] op_code_data;
  89.         op_code_data = new INT32[ulLen];
  90.         memcpy(op_code_data, pchNewData, ulLen * sizeof(INT32)); /* Flawfinder: ignore */
  91.     }
  92. };
  93. class RTCPPacket : public RTCPPacketBase
  94. {
  95. public:
  96.     RTCPPacket()
  97.     {
  98.         version_flag = 0;
  99.         padding_flag = 0;
  100.         count = 0;
  101.         packet_type = 0;
  102.         length = 0;
  103.         sr_ssrc = 0;
  104.         ntp_sec = 0;
  105.         ntp_frac = 0;
  106.         rtp_ts = 0;
  107.         psent = 0;
  108.         osent = 0;
  109.         sr_data = 0;
  110.         rr_ssrc = 0;
  111.         rr_data = 0;
  112.         sdes_data = 0;
  113.         bye_src = 0;
  114.         // used for APP
  115.     //    app_name = 0;  // not a pointer...
  116.         app_data = 0;
  117.         m_pAPPItems = 0;
  118.     }
  119.     ~RTCPPacket()
  120.     {
  121.         CleanBuffers();
  122.     }
  123.     UINT8*  pack(UINT8* data, UINT32 &len);
  124.     UINT8*  unpack(UINT8* data, UINT32 len);
  125.     void SetSenderReport  (ReceptionReport* pNewData, UINT32 ulLen)
  126.     {
  127.         if (sr_data)
  128.     delete [] sr_data;
  129.         sr_data = new ReceptionReport[ulLen];
  130.         memcpy(sr_data, pNewData, ulLen * sizeof(ReceptionReport)); /* Flawfinder: ignore */
  131.     }
  132.     void SetReceiverReport(ReceptionReport* pNewData, UINT32 ulLen)
  133.     {
  134.         if (rr_data)
  135.     delete [] rr_data;
  136.         rr_data = new ReceptionReport[ulLen];
  137.         memcpy(rr_data, pNewData, ulLen * sizeof(ReceptionReport)); /* Flawfinder: ignore */
  138.     }
  139.     void SetSDES (UINT8* pchNewData, UINT32 ulLen)
  140.     {
  141.         if (sdes_data)
  142.     delete [] sdes_data;
  143.         sdes_data = new UINT8[ulLen];
  144.         memcpy(sdes_data, pchNewData, ulLen * sizeof(UINT8)); /* Flawfinder: ignore */
  145.     }
  146.     void SetByeSrc (UINT32* pulNewData, UINT32 ulLen)
  147.     {
  148.         if (bye_src)
  149.     delete [] bye_src;
  150.         bye_src = new UINT32[ulLen];
  151.         memcpy(bye_src, pulNewData, ulLen * sizeof(UINT32)); /* Flawfinder: ignore */
  152.     }
  153.     SDESItem* AddSDESItem (UINT32 ulSSrc, SDESItem item)
  154.     {
  155.         /*
  156.          * Attempt to lookup this SSRC id from our map
  157.          */
  158.      
  159.         CHXSimpleList*  pList = NULL;
  160.         SDESItem*     pItem = new SDESItem;
  161.         if (!m_mapSDESSources.Lookup(ulSSrc, (void*&)pList))
  162.         {
  163.     /* Not in map */
  164.     
  165.     pList = new CHXSimpleList;
  166.     m_mapSDESSources[ulSSrc] = pList;
  167.         }
  168.         pItem->sdes_type = item.sdes_type;
  169.         pItem->length = item.length;
  170.         pItem->data = new UINT8[pItem->length];
  171.         memcpy(pItem->data, item.data, item.length * sizeof(UINT8)); /* Flawfinder: ignore */
  172.         pList->AddTail(pItem);
  173.         return pItem;
  174.     }
  175.     void SetAPPItem (APPItem* item, UINT32 ulCount)
  176.     {
  177.         HX_VECTOR_DELETE(m_pAPPItems);
  178.         m_pAPPItems = new APPItem[ulCount];
  179.         memcpy(m_pAPPItems, item, ulCount * sizeof (APPItem)); /* Flawfinder: ignore */
  180.     }
  181.     
  182.     // keys off of source id and contains a pointer to a list 
  183.     // of SDESItems.
  184.     CHXMapLongToObj m_mapSDESSources;    
  185.     // array of APPItem
  186.     APPItem* m_pAPPItems;
  187.     void CleanBuffers();
  188. };
  189. #if defined (_DEFINE_INLINE)
  190. HX_INLINE void
  191. RTCPPacket::CleanBuffers()
  192. {
  193.     if (sr_data)
  194. delete [] sr_data;
  195.     if (rr_data)
  196. delete [] rr_data;
  197.     if (sdes_data)
  198. delete [] sdes_data;
  199.     if (bye_src)
  200. delete [] bye_src;
  201.     if (app_data)
  202. delete [] app_data;
  203.     CHXMapLongToObj::Iterator i;
  204.     for (i = m_mapSDESSources.Begin(); i != m_mapSDESSources.End(); ++i)
  205.     {
  206. CHXSimpleList* pItems = (CHXSimpleList*) *i;
  207. while (!pItems->IsEmpty())
  208. {
  209.     SDESItem* pItem = (SDESItem*) pItems->RemoveHead();
  210.     delete pItem;
  211. }
  212. delete pItems;
  213.     }
  214.     if (m_pAPPItems)
  215.     {
  216. delete [] m_pAPPItems;
  217.     }
  218.     
  219. }
  220. HX_INLINE UINT8*
  221. RTCPPacket::unpack(UINT8* data, UINT32 len)
  222. {
  223.     CleanBuffers();
  224.     UINT8* pBaseOff = RTCPPacketBase::unpack(data, len);
  225.     // immediate error return
  226.     if (!pBaseOff) return 0;
  227.     /*
  228.      * check to see if this is an SDES message and if it is then 
  229.      * parse out the SDES source chunks from the sdes_data blob
  230.      */
  231.     if (packet_type == RTCP_SDES)
  232.     {
  233. HX_ASSERT(sdes_data != NULL);
  234. /*
  235.  * the PMC generates code that points the byte pointer into
  236.  * the containing buffer rather than copying it out we may
  237.  * as well do it all the way here.
  238.  */
  239. UINT8* pOff = new UINT8[length * 4];
  240. memcpy(pOff, sdes_data, length * 4 * sizeof(UINT8)); /* Flawfinder: ignore */
  241. sdes_data = pOff;
  242. for (INT32 iSrc = 0; iSrc < count; iSrc++)
  243. {
  244.     INT32     lSrc = 0;
  245.     CHXSimpleList*  pItems = new CHXSimpleList;
  246.     
  247.     lSrc = GetDwordFromBufAndInc(pOff);
  248.     while (pOff && pOff < sdes_data + (length * 4))
  249.     {
  250. SDESItem*   pItem = new SDESItem;
  251. UINT32     ulItemLen = (length * 4) - (pOff - sdes_data);
  252. pOff = pItem->unpack(pOff, ulItemLen);
  253. if (pItem->sdes_type == 0)
  254. {
  255.     /*
  256.      * We are done with this list of items within the source
  257.      * chunk (null terminated)
  258.      */
  259.     delete pItem;
  260.     break;
  261. }
  262. pItems->AddTail(pItem);
  263.     } 
  264.     
  265.     m_mapSDESSources[lSrc] = pItems;
  266. }
  267.     }
  268.     /*
  269.     * Gatta do the same for APP msg!
  270.     */
  271.     else if (packet_type == RTCP_APP)
  272.     {
  273. HX_ASSERT(app_data != NULL);
  274. /*
  275. *   if this is RNWK app, unpack, otherwise, leave it along...
  276. */
  277. // has to be NULL terminated...
  278. char pc[5] = {0}; /* Flawfinder: ignore */
  279. memcpy(pc, app_name, 4); /* Flawfinder: ignore */
  280. // whether this is ours or not, we have to make own buffer
  281. UINT8* pOff = new UINT8[(length - 2) * 4];
  282. memcpy(pOff, app_data, (length - 2) * 4); /* Flawfinder: ignore */
  283. app_data = pOff;
  284. if ((0 == strncmp((const char*)pc, "RNWK", 4)) || 
  285.     (0 == strncmp((const char*)pc, "HELX", 4)))
  286. {
  287.     // it's ours
  288.     m_pAPPItems = new APPItem[count];
  289.     
  290.     for (UINT32 i = 0; i < count; i++)
  291.     {
  292. HX_ASSERT(pOff);
  293. // length is anything other than 0...
  294. pOff = m_pAPPItems[i].unpack(pOff, 1);
  295.     }
  296. }
  297.     }
  298.     return pBaseOff;
  299. }
  300. HX_INLINE UINT8*
  301. RTCPPacket::pack(UINT8* data, UINT32& len)
  302. {
  303.     if (packet_type == RTCP_SDES)
  304.     {
  305.      /*
  306.       * revert the m_mapSDESSources back to blob form
  307.       */
  308.     
  309.      if (sdes_data != NULL)
  310.      {
  311.     delete [] sdes_data;
  312.      }
  313.     
  314.      /* 
  315.       * Order may be important here, using a map will not
  316.       * guarentee order
  317.       */
  318.     
  319.      UINT8*  pBuf = new UINT8[0x1000];
  320.      UINT8*  pOff = pBuf;
  321.      CHXMapLongToObj::Iterator   iSrc = m_mapSDESSources.Begin();
  322.      for (; iSrc != m_mapSDESSources.End(); ++iSrc)
  323.      {
  324.     INT32 lSrc = iSrc.get_key();
  325.     CHXSimpleList* pItems = (CHXSimpleList*) *iSrc;
  326.     CHXSimpleList::Iterator iItem = pItems->Begin();
  327.     
  328.          *pOff++ = (UINT8) (lSrc>>24);   *pOff++ = (UINT8) (lSrc>>16);
  329.          *pOff++ = (UINT8) (lSrc>>8);    *pOff++ = (UINT8) (lSrc);
  330.     
  331.     for (; iItem != pItems->End(); ++iItem)
  332.     {
  333.      UINT32 ulItemLen = pBuf - pOff;
  334.      SDESItem* pSDESItem = (SDESItem*)*iItem;
  335.     
  336.      pOff = pSDESItem->pack(pOff, ulItemLen);
  337. if (pSDESItem->data)
  338. {
  339.     delete [] pSDESItem->data;
  340. }
  341.     }
  342.     
  343.     /*
  344.      * Terminate the list with an item of type 0 (first byte)
  345.      */
  346.     *pOff++ = 0;
  347.     
  348.          /* 
  349.            * Pad until 4 bytes boundary
  350.            */
  351.     
  352.          int lLength = HX_SAFEINT(pOff - pBuf);
  353.          
  354.          if (lLength % 4)
  355.          {
  356.      memset(pOff, 0, 4 - (lLength % 4));
  357.      pOff += 4 - (lLength % 4);
  358.          }            
  359.          HX_ASSERT((HX_SAFEINT(pOff - pBuf) % 4) == 0);
  360.      }
  361.     
  362.      sdes_data = new UINT8[pOff - pBuf];
  363.      memcpy(sdes_data, pBuf, (pOff - pBuf) * sizeof(UINT8)); /* Flawfinder: ignore */
  364.     
  365.      length = (pOff - pBuf) / 4;
  366. delete [] pBuf;
  367.     }
  368.     else if (packet_type == RTCP_APP)
  369.     {
  370.      /*
  371.       * revert the m_mapSDESSources back to blob form
  372.       */
  373.     
  374.      if (app_data != NULL)
  375.      {
  376.     delete [] app_data;
  377.      }
  378.         
  379.      UINT8*  pBuf = new UINT8[0x1000];
  380.      UINT8*  pOff = pBuf;
  381. UINT32  ulDammy = 0;
  382. for (UINT32 i = 0; i < count; i++)
  383. {
  384.     pOff = m_pAPPItems[i].pack(pOff, ulDammy);
  385. }
  386. app_data = new UINT8[pOff - pBuf];
  387. memcpy(app_data, pBuf, (pOff - pBuf) * sizeof(UINT8)); /* Flawfinder: ignore */
  388. delete [] pBuf;
  389.     }
  390.     
  391.     return RTCPPacketBase::pack(data, len);
  392. }
  393. #endif //_DEFINE_INLINE
  394. #endif /* _RTPWRAP_H_ */