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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: rtcputil.h,v 1.5.4.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. /* 
  50. *   Need info about itself (sender or receiver)
  51. *   Need info about everyone else 
  52. *     - One sender and one or more receivers
  53. *     - No sender and one or more receivers
  54. */
  55. #ifndef _RTCPUTIL_H_
  56. #define _RTCPUTIL_H_
  57. #include "hxmap.h"
  58. #include "hxstring.h"
  59. class RTCPPacket;
  60. class ReceptionReport;
  61. class NTPTime;
  62. class CHXTimestampConverter;
  63. /* 
  64.  *  Info about myself
  65.  */
  66. class MyselfAsReceiver
  67. {
  68. public:
  69.     MyselfAsReceiver()
  70. : m_ulSsrc(0)
  71.     {
  72. // printf("Myself()n");fflush(stdout);
  73.     }
  74.     ~MyselfAsReceiver() 
  75.     {
  76. // printf("~Myself()n");fflush(stdout);
  77.     }
  78.         
  79.     UINT32     m_ulSsrc;    
  80. };
  81. /* 
  82.  *  A Sender have a little more var's to keep track of
  83.  */
  84. class MyselfAsSender
  85. {
  86. public:
  87.     MyselfAsSender()
  88. : m_ulSsrc(0)
  89. , m_unLastSeqNo(0)
  90. , m_ulLastRTPTimestamp(0)
  91. , m_ulNumPktSentSoFar(0)
  92. , m_ulNumByteSentSoFar(0)
  93. , m_bWeSent(FALSE)
  94.     {
  95. // printf("MyselfAsSender()n");fflush(stdout);
  96.     }
  97.     ~MyselfAsSender()
  98.     {
  99. // printf("~MyselfAsSender()n");fflush(stdout);
  100.     }
  101.     UINT32     m_ulSsrc;
  102.     UINT16     m_unLastSeqNo;
  103.     UINT32     m_ulLastRTPTimestamp;
  104.     UINT32     m_ulNumPktSentSoFar;
  105.     UINT32     m_ulNumByteSentSoFar;
  106.     /* will be needed for interval calculation */
  107.     BOOL m_bWeSent;
  108. };
  109. /*
  110.  *  We don't have any specific info for this...
  111.  */
  112. typedef BOOL ReceiverInfo;
  113. /*
  114.  *  Info about a reception from a sender (Myself is a receiver)
  115.  *  Keep track of stats on incoming RTP!
  116.  */
  117. class ReceptionInfo
  118. {
  119.     enum 
  120.     {
  121. INIT,
  122. UPDATE
  123.     } m_state;
  124. public:
  125.     ReceptionInfo()
  126. : m_unMaxSeqNo(0)
  127. , m_ulCycles(0)
  128. , m_ulBaseSeqNo(0)
  129. , m_ulBadSeqNo(0)
  130. , m_ulNumPktReceived(0)
  131. , m_ulExpectedPrior(0)
  132. , m_ulReceivedPrior(0)
  133. , m_ulTransit(0)
  134. , m_ulJitter(0)
  135. // , m_ulProbation(0)
  136. , m_ulLSR(0)
  137. , m_ulLastSRReceived(0)
  138. , m_bHeardSinceLastTime(FALSE)
  139. , m_state(INIT)
  140.     {
  141. //printf("ReceptionInfo()n");fflush(stdout);
  142.     }
  143.     ~ReceptionInfo() 
  144.     {
  145. //printf("~ReceptionInfo()n");fflush(stdout);
  146.     }
  147.     /* deal with sequence number - Only on a receiver */
  148.     void InitSeqNo (UINT16 unSeqNo);
  149.     BOOL UpdateSeqNo (UINT16 unSeqNo);    
  150.     void    MakeReceptionReport (UINT32 ulSsrc, REF(ReceptionReport) rr, UINT32 ulNow);
  151.     UINT16  m_unMaxSeqNo; // Higheset SeqNo seen    
  152.     UINT32  m_ulCycles; // Shifted number of SeqNo cycle 
  153.     UINT32  m_ulBaseSeqNo; // base SeqNo
  154.     UINT32  m_ulBadSeqNo; // last bad SeqNo + 1
  155.     UINT32  m_ulNumPktReceived; // Packets received
  156.     UINT32  m_ulExpectedPrior; // pkt expected at last interval
  157.     UINT32  m_ulReceivedPrior; // pkt received at last interval
  158.     UINT32  m_ulLSR; // last SR time      
  159.     UINT32  m_ulLastSRReceived; // last time we receive SR
  160.     UINT32  m_ulTransit; // relative transit time for prev pkt
  161.     UINT32  m_ulJitter; // estimated jitter
  162. //    UINT32  m_ulProbation; // Sequ.pkts till source is valid
  163.     BOOL    m_bHeardSinceLastTime;
  164. };
  165. // this is a utility class that takes care of RTCP stuff
  166. class ReportHandler
  167. {
  168. public:
  169.     ReportHandler() { HX_ASSERT(!"don't use default constractor"); }
  170.     /* for now it is "either or" in RealSystem */
  171. //    ReportHandler(BOOL bIsSender, BOOL bIsReceiver, UINT32 ulSsrc, UINT32 ulDefaultProbation = 0);    
  172.     ReportHandler(BOOL bIsSender, BOOL bIsReceiver, UINT32 ulSsrc);    
  173.     ~ReportHandler();
  174.     UINT32  GetSSRC() 
  175.     { 
  176. return m_pSenderMe ? m_pSenderMe->m_ulSsrc : m_pReceiverMe->m_ulSsrc; 
  177.     }
  178.  
  179.     void SetSSRC(UINT32 ulSSRC) 
  180.     { 
  181. if (m_pSenderMe) 
  182. {
  183.     m_pSenderMe->m_ulSsrc = ulSSRC; 
  184. }
  185. else
  186. {
  187.     m_pReceiverMe->m_ulSsrc = ulSSRC;
  188. }
  189.     }
  190.     /* for each RTP pkt sent */
  191.     void OnRTPSend     (UINT16 unSeqNo, 
  192.     UINT32 ulPktIncrement, 
  193.     UINT32 ulByteIncrement,
  194.     UINT32 ulRTPTimestamp)
  195.     {     
  196.      HX_ASSERT(m_pSenderMe && !m_pReceiverMe);
  197.     
  198.      m_pSenderMe->m_unLastSeqNo = unSeqNo;
  199.      m_pSenderMe->m_ulLastRTPTimestamp = ulRTPTimestamp;
  200.      m_pSenderMe->m_ulNumPktSentSoFar += ulPktIncrement;
  201.      m_pSenderMe->m_ulNumByteSentSoFar += ulByteIncrement;
  202.      m_pSenderMe->m_bWeSent = TRUE;
  203.     }
  204.     
  205.     /* for each RTP pkt received */     
  206.     void OnRTPReceive     (UINT32 ulSsrc, 
  207.      UINT16 unSeqNo, 
  208.      UINT32 ulHXTimestamp,
  209.      UINT32 ulNow);
  210.     /* for each RTCP pkt received */
  211.     void OnRTCPReceive     (RTCPPacket* pPkt, UINT32 ulNow);
  212.     
  213.     /* Set this once before making any report */
  214.     void    Init     (REF(Timeval) tvInitial, 
  215.      INT64 nInitialRTP,
  216.      CHXTimestampConverter* pConverter);
  217.     /* Acquire NTP base offset. */
  218.     NTPTime GetNTPBase() { return *m_pNTPBase; }    
  219.     /* For resetting RTP ts base on seek. */
  220.     void SetRTPBase(INT64 nNewBase) { m_nRTPTSBase = nNewBase; }
  221.     /* make a report */
  222.     HX_RESULT MakeSR     (RTCPPacket* pPkt, UINT32 ulNow); 
  223.     HX_RESULT MakeSR     (RTCPPacket* pPkt, REF(Timeval) tvNow); 
  224.     HX_RESULT MakeRR     (RTCPPacket* pPkt, UINT32 ulNow); 
  225.     HX_RESULT MakeSDES     (RTCPPacket* pPkt, const BYTE* pcCNAME); 
  226.     HX_RESULT MakeBye     (RTCPPacket* pPkt); 
  227.     HX_RESULT MakeEOSApp     (RTCPPacket* pPkt);
  228.     HX_RESULT MakeBufInfoApp     (RTCPPacket* pPkt, 
  229.      UINT32 ulLowTS, UINT32 ulHighTS,
  230.      UINT32 ulBytesBuffered);
  231.     /* for RTCP interval calc */
  232.     void    UpdateAvgRTCPSize     (UINT32 ulCompoundRTCPSize)
  233.     {
  234. /* par RFC1889 */
  235. m_ulAvgRTCPSize = (UINT32)((1.0/16.0) * ulCompoundRTCPSize + 
  236.    (15.0/16.0) * m_ulAvgRTCPSize);
  237.     }
  238.     double  GetRTCPInterval     ();
  239.     void SetRTCPIntervalParams(UINT32 ulRSBitRate, UINT32 ulRRBitRate,
  240.        UINT32 ulMinRTCPIntervalMs);
  241. private:
  242.     // create an entry it's not there.
  243.     ReceiverInfo*   GetOrCreateReceiverInfo (UINT32 ulSsrc);
  244.     ReceptionInfo*  GetOrCreateReceptionInfo(UINT32 ulSsrc);
  245.     
  246.     // find and delete an entry.
  247.     void DeleteReceiverInfo  (UINT32 ulSsrc);
  248.     void DeleteReceptionInfo (UINT32 ulSsrc);    
  249. private:
  250.     // they are exclusive
  251.     MyselfAsReceiver*     m_pReceiverMe;
  252.     MyselfAsSender*     m_pSenderMe;
  253.     UINT32     m_ulMySsrc;
  254.     
  255. //    UINT32     m_ulDefaultProbation;    
  256.     /* sender report */
  257.     // m_pMe will be pointing MyselfAsSender if sender
  258.     
  259.     /* receiver report */
  260.     // map of ReceptionInfo's
  261.     CHXMapLongToObj     m_mapSenders;
  262.     // map of ReceiverInfo's
  263.     CHXMapLongToObj     m_mapReceivers;
  264.     /* for RTCP interval calc */
  265.     UINT32     m_ulAvgRTCPSize;
  266.     BOOL     m_bInitialIntervalCalc;
  267.     UINT32                  m_ulRSByteRate;    // Sender RTCP bandwidth
  268.     UINT32                  m_ulRRByteRate;    // Receiver RTCP bandwidth
  269.     double                  m_minRTCPInterval; // seconds
  270.     NTPTime*     m_pNTPBase;
  271.     INT64     m_nRTPTSBase;    
  272.     CHXTimestampConverter*  m_pTSConverter;
  273. };
  274. #endif // _RTCPUTIL_H_