⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtcputil.h

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 H
字号:
/* ***** BEGIN LICENSE BLOCK ***** 
 * Version: RCSL 1.0/RPSL 1.0 
 *  
 * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
 *      
 * The contents of this file, and the files included with this file, are 
 * subject to the current version of the RealNetworks Public Source License 
 * Version 1.0 (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the RealNetworks Community Source License Version 1.0 
 * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
 * in which case the RCSL will apply. You may also obtain the license terms 
 * directly from RealNetworks.  You may not use this file except in 
 * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
 * applicable to this file, the RCSL.  Please see the applicable RPSL or 
 * RCSL for the rights, obligations and limitations governing use of the 
 * contents of the file.  
 *  
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the portions 
 * it created. 
 *  
 * This file, and the files included with this file, is distributed and made 
 * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
 * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
 * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
 * 
 * Technology Compatibility Kit Test Suite(s) Location: 
 *    http://www.helixcommunity.org/content/tck 
 * 
 * Contributor(s): 
 *  
 * ***** END LICENSE BLOCK ***** */ 


/* 
*   Need info about itself (sender or receiver)
*   Need info about everyone else 
*     - One sender and one or more receivers
*     - No sender and one or more receivers
*/

#ifndef _RTCPUTIL_H_
#define _RTCPUTIL_H_

#include "hxmap.h"
#include "hxstring.h"

class RTCPPacket;
class ReceptionReport;
class NTPTime;
class CHXTimestampConverter;

/* 
 *  Info about myself
 */
class MyselfAsReceiver
{
public:
    MyselfAsReceiver()
	: m_ulSsrc(0)
    {
//	printf("Myself()\n");fflush(stdout);
    }	
    ~MyselfAsReceiver() 
    {
//	printf("~Myself()\n");fflush(stdout);
    }
        
    UINT32			    m_ulSsrc;    
};

/* 
 *  A Sender have a little more var's to keep track of
 */
class MyselfAsSender
{
public:
    MyselfAsSender()
	: m_ulSsrc(0)
	, m_unLastSeqNo(0)
	, m_ulLastRTPTimestamp(0)
	, m_ulNumPktSentSoFar(0)
	, m_ulNumByteSentSoFar(0)
	, m_bWeSent(FALSE)
    {
//	printf("MyselfAsSender()\n");fflush(stdout);
    }

    ~MyselfAsSender()
    {
//	printf("~MyselfAsSender()\n");fflush(stdout);
    }

    UINT32		    m_ulSsrc;
    UINT16		    m_unLastSeqNo;
    UINT32		    m_ulLastRTPTimestamp;
    UINT32		    m_ulNumPktSentSoFar;
    UINT32		    m_ulNumByteSentSoFar;

    /* will be needed for interval calculation */
    BOOL			m_bWeSent;
};

/*
 *  We don't have any specific info for this...
 */
typedef BOOL ReceiverInfo;

/*
 *  Info about a reception from a sender (Myself is a receiver)
 *  Keep track of stats on incoming RTP!
 */

class ReceptionInfo
{
    enum 
    {
	INIT,
	UPDATE
    } m_state;

public:
    ReceptionInfo()
	: m_unMaxSeqNo(0)
	, m_ulCycles(0)
	, m_ulBaseSeqNo(0)
	, m_ulBadSeqNo(0)
	, m_ulNumPktReceived(0)
	, m_ulExpectedPrior(0)
	, m_ulReceivedPrior(0)
	, m_ulTransit(0)
	, m_ulJitter(0)	
//	, m_ulProbation(0)
	, m_ulLSR(0)
	, m_ulLastSRReceived(0)
	, m_bHeardSinceLastTime(FALSE)
	, m_state(INIT)
    {
	//printf("ReceptionInfo()\n");fflush(stdout);
    }	
    ~ReceptionInfo() 
    {
	//printf("~ReceptionInfo()\n");fflush(stdout);
    }

    /* deal with sequence number - Only on a receiver */
    void InitSeqNo		(UINT16 unSeqNo);
    BOOL UpdateSeqNo		(UINT16 unSeqNo);    

    void    MakeReceptionReport	(UINT32 ulSsrc, REF(ReceptionReport) rr, UINT32 ulNow);

    UINT16  m_unMaxSeqNo;	// Higheset SeqNo seen    
    UINT32  m_ulCycles;		// Shifted number of SeqNo cycle 
    UINT32  m_ulBaseSeqNo;	// base SeqNo
    UINT32  m_ulBadSeqNo;	// last bad SeqNo + 1
    UINT32  m_ulNumPktReceived;	// Packets received
    UINT32  m_ulExpectedPrior;	// pkt expected at last interval
    UINT32  m_ulReceivedPrior;	// pkt received at last interval

    UINT32  m_ulLSR;		// last SR time      
    UINT32  m_ulLastSRReceived; // last time we receive SR
    UINT32  m_ulTransit;	// relative transit time for prev pkt
    UINT32  m_ulJitter;		// estimated jitter

//    UINT32  m_ulProbation;	// Sequ.pkts till source is valid
    BOOL    m_bHeardSinceLastTime;
};


// this is a utility class that takes care of RTCP stuff
class ReportHandler
{
public:
    ReportHandler() { HX_ASSERT(!"don't use default constractor"); }
    /* for now it is "either or" in RealSystem */
//    ReportHandler(BOOL bIsSender, BOOL bIsReceiver, UINT32 ulSsrc, UINT32 ulDefaultProbation = 0);    
    ReportHandler(BOOL bIsSender, BOOL bIsReceiver, UINT32 ulSsrc);    
    ~ReportHandler();

    UINT32  GetSSRC() 
    { 
	return m_pSenderMe ? m_pSenderMe->m_ulSsrc : m_pReceiverMe->m_ulSsrc; 
    }
 
    void SetSSRC(UINT32 ulSSRC) 
    { 
	if (m_pSenderMe) 
	{
	    m_pSenderMe->m_ulSsrc = ulSSRC; 
	}
	else
	{
	    m_pReceiverMe->m_ulSsrc = ulSSRC;
	}
    }

    /* for each RTP pkt sent */
    void OnRTPSend		    (UINT16 unSeqNo, 
				    UINT32 ulPktIncrement, 
				    UINT32 ulByteIncrement,
				    UINT32 ulRTPTimestamp)
    {				    
    	HX_ASSERT(m_pSenderMe && !m_pReceiverMe);
    
    	m_pSenderMe->m_unLastSeqNo		= unSeqNo;
    	m_pSenderMe->m_ulLastRTPTimestamp	= ulRTPTimestamp;
    	m_pSenderMe->m_ulNumPktSentSoFar	+= ulPktIncrement;
    	m_pSenderMe->m_ulNumByteSentSoFar	+= ulByteIncrement;
    	m_pSenderMe->m_bWeSent			= TRUE;
    }
				    
    /* for each RTP pkt received */				    
    void OnRTPReceive		    (UINT32 ulSsrc, 
				     UINT16 unSeqNo, 
				     UINT32 ulHXTimestamp,
				     UINT32 ulNow);

    /* for each RTCP pkt received */
    void OnRTCPReceive		    (RTCPPacket* pPkt, UINT32 ulNow);
    
    /* Set this once before making any report */
    void    Init		    (REF(Timeval) tvInitial, 
				     INT64 nInitialRTP,
				     CHXTimestampConverter* pConverter);

    /* Acquire NTP base offset. */
    NTPTime GetNTPBase() { return *m_pNTPBase; }    

    /* For resetting RTP ts base on seek. */
    void SetRTPBase(INT64 nNewBase) { m_nRTPTSBase = nNewBase; }

    /* make a report */
    HX_RESULT MakeSR		    (RTCPPacket* pPkt, UINT32 ulNow); 
    HX_RESULT MakeSR		    (RTCPPacket* pPkt, REF(Timeval) tvNow); 
    HX_RESULT MakeRR		    (RTCPPacket* pPkt, UINT32 ulNow); 
    HX_RESULT MakeSDES		    (RTCPPacket* pPkt, const BYTE* pcCNAME); 
    HX_RESULT MakeBye		    (RTCPPacket* pPkt); 
    HX_RESULT MakeEOSApp	    (RTCPPacket* pPkt);
    HX_RESULT MakeBufInfoApp	    (RTCPPacket* pPkt, 
				     UINT32 ulLowTS, UINT32 ulHighTS,
				     UINT32 ulBytesBuffered);

    /* for RTCP interval calc */
    void    UpdateAvgRTCPSize	    (UINT32 ulCompoundRTCPSize)
    {
	/* par RFC1889 */
	m_ulAvgRTCPSize = (UINT32)((1.0/16.0) * ulCompoundRTCPSize + 
				   (15.0/16.0) * m_ulAvgRTCPSize);

    }
    double  GetRTCPInterval	    ();

    void SetRTCPIntervalParams(UINT32 ulRSBitRate, UINT32 ulRRBitRate,
			       UINT32 ulMinRTCPIntervalMs);
private:
    // create an entry it's not there.
    ReceiverInfo*   GetOrCreateReceiverInfo (UINT32 ulSsrc);
    ReceptionInfo*  GetOrCreateReceptionInfo(UINT32 ulSsrc);
    
    // find and delete an entry.
    void	DeleteReceiverInfo  (UINT32 ulSsrc);
    void	DeleteReceptionInfo (UINT32 ulSsrc);    
private:
    // they are exclusive
    MyselfAsReceiver*	    m_pReceiverMe;
    MyselfAsSender*	    m_pSenderMe;

    UINT32		    m_ulMySsrc;
    
//    UINT32		    m_ulDefaultProbation;    
    /* sender report */
    // m_pMe will be pointing MyselfAsSender if sender
    
    /* receiver report */
    // map of ReceptionInfo's
    CHXMapLongToObj	    m_mapSenders;
    // map of ReceiverInfo's
    CHXMapLongToObj	    m_mapReceivers;

    /* for RTCP interval calc */
    UINT32		    m_ulAvgRTCPSize;
    BOOL		    m_bInitialIntervalCalc;
    UINT32                  m_ulRSByteRate;    // Sender RTCP bandwidth
    UINT32                  m_ulRRByteRate;    // Receiver RTCP bandwidth
    double                  m_minRTCPInterval; // seconds

    NTPTime*		    m_pNTPBase;
    INT64		    m_nRTPTSBase;    
    CHXTimestampConverter*  m_pTSConverter;
};

#endif // _RTCPUTIL_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -