mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-30 12:30:20 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			801 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			801 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
| 
 | |
|  This file is a part of JRTPLIB
 | |
|  Copyright (c) 1999-2017 Jori Liesenborgs
 | |
| 
 | |
|  Contact: jori.liesenborgs@gmail.com
 | |
| 
 | |
|  This library was developed at the Expertise Centre for Digital Media
 | |
|  (http://www.edm.uhasselt.be), a research center of the Hasselt University
 | |
|  (http://www.uhasselt.be). The library is based upon work done for
 | |
|  my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
 | |
| 
 | |
|  Permission is hereby granted, free of charge, to any person obtaining a
 | |
|  copy of this software and associated documentation files (the "Software"),
 | |
|  to deal in the Software without restriction, including without limitation
 | |
|  the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | |
|  and/or sell copies of the Software, and to permit persons to whom the
 | |
|  Software is furnished to do so, subject to the following conditions:
 | |
| 
 | |
|  The above copyright notice and this permission notice shall be included
 | |
|  in all copies or substantial portions of the Software.
 | |
| 
 | |
|  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | |
|  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 | |
|  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
|  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | |
|  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | |
|  IN THE SOFTWARE.
 | |
| 
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * \file rtpsourcedata.h
 | |
|  */
 | |
| 
 | |
| #ifndef RTPSOURCEDATA_H
 | |
| 
 | |
| #define RTPSOURCEDATA_H
 | |
| 
 | |
| #include "rtpconfig.h"
 | |
| #include "rtptimeutilities.h"
 | |
| #include "rtppacket.h"
 | |
| #include "rtcpsdesinfo.h"
 | |
| #include "rtptypes.h"
 | |
| #include <list>
 | |
| 
 | |
| #include "export.h"
 | |
| 
 | |
| namespace qrtplib
 | |
| {
 | |
| 
 | |
| class RTPAddress;
 | |
| 
 | |
| class QRTPLIB_API RTCPSenderReportInfo
 | |
| {
 | |
| public:
 | |
|     RTCPSenderReportInfo() :
 | |
|             ntptimestamp(0, 0), receivetime(0, 0)
 | |
|     {
 | |
|         hasinfo = false;
 | |
|         rtptimestamp = 0;
 | |
|         packetcount = 0;
 | |
|         bytecount = 0;
 | |
|     }
 | |
|     void Set(const RTPNTPTime &ntptime, uint32_t rtptime, uint32_t pcount, uint32_t bcount, const RTPTime &rcvtime)
 | |
|     {
 | |
|         ntptimestamp = ntptime;
 | |
|         rtptimestamp = rtptime;
 | |
|         packetcount = pcount;
 | |
|         bytecount = bcount;
 | |
|         receivetime = rcvtime;
 | |
|         hasinfo = true;
 | |
|     }
 | |
| 
 | |
|     bool HasInfo() const
 | |
|     {
 | |
|         return hasinfo;
 | |
|     }
 | |
|     RTPNTPTime GetNTPTimestamp() const
 | |
|     {
 | |
|         return ntptimestamp;
 | |
|     }
 | |
|     uint32_t GetRTPTimestamp() const
 | |
|     {
 | |
|         return rtptimestamp;
 | |
|     }
 | |
|     uint32_t GetPacketCount() const
 | |
|     {
 | |
|         return packetcount;
 | |
|     }
 | |
|     uint32_t GetByteCount() const
 | |
|     {
 | |
|         return bytecount;
 | |
|     }
 | |
|     RTPTime GetReceiveTime() const
 | |
|     {
 | |
|         return receivetime;
 | |
|     }
 | |
| private:
 | |
|     bool hasinfo;
 | |
|     RTPNTPTime ntptimestamp;
 | |
|     uint32_t rtptimestamp;
 | |
|     uint32_t packetcount;
 | |
|     uint32_t bytecount;
 | |
|     RTPTime receivetime;
 | |
| };
 | |
| 
 | |
| class RTCPReceiverReportInfo
 | |
| {
 | |
| public:
 | |
|     RTCPReceiverReportInfo() :
 | |
|             receivetime(0, 0)
 | |
|     {
 | |
|         hasinfo = false;
 | |
|         fractionlost = 0;
 | |
|         packetslost = 0;
 | |
|         exthighseqnr = 0;
 | |
|         jitter = 0;
 | |
|         lsr = 0;
 | |
|         dlsr = 0;
 | |
|     }
 | |
|     void Set(uint8_t fraclost, int32_t plost, uint32_t exthigh, uint32_t jit, uint32_t l, uint32_t dl, const RTPTime &rcvtime)
 | |
|     {
 | |
|         fractionlost = ((double) fraclost) / 256.0;
 | |
|         packetslost = plost;
 | |
|         exthighseqnr = exthigh;
 | |
|         jitter = jit;
 | |
|         lsr = l;
 | |
|         dlsr = dl;
 | |
|         receivetime = rcvtime;
 | |
|         hasinfo = true;
 | |
|     }
 | |
| 
 | |
|     bool HasInfo() const
 | |
|     {
 | |
|         return hasinfo;
 | |
|     }
 | |
|     double GetFractionLost() const
 | |
|     {
 | |
|         return fractionlost;
 | |
|     }
 | |
|     int32_t GetPacketsLost() const
 | |
|     {
 | |
|         return packetslost;
 | |
|     }
 | |
|     uint32_t GetExtendedHighestSequenceNumber() const
 | |
|     {
 | |
|         return exthighseqnr;
 | |
|     }
 | |
|     uint32_t GetJitter() const
 | |
|     {
 | |
|         return jitter;
 | |
|     }
 | |
|     uint32_t GetLastSRTimestamp() const
 | |
|     {
 | |
|         return lsr;
 | |
|     }
 | |
|     uint32_t GetDelaySinceLastSR() const
 | |
|     {
 | |
|         return dlsr;
 | |
|     }
 | |
|     RTPTime GetReceiveTime() const
 | |
|     {
 | |
|         return receivetime;
 | |
|     }
 | |
| private:
 | |
|     bool hasinfo;
 | |
|     double fractionlost;
 | |
|     int32_t packetslost;
 | |
|     uint32_t exthighseqnr;
 | |
|     uint32_t jitter;
 | |
|     uint32_t lsr;
 | |
|     uint32_t dlsr;
 | |
|     RTPTime receivetime;
 | |
| };
 | |
| 
 | |
| class RTPSourceStats
 | |
| {
 | |
| public:
 | |
|     RTPSourceStats();
 | |
|     void ProcessPacket(
 | |
|             RTPPacket *pack,
 | |
|             const RTPTime &receivetime,
 | |
|             double tsunit,
 | |
|             bool ownpacket,
 | |
|             bool *accept);
 | |
| 
 | |
|     bool HasSentData() const
 | |
|     {
 | |
|         return sentdata;
 | |
|     }
 | |
|     uint32_t GetNumPacketsReceived() const
 | |
|     {
 | |
|         return packetsreceived;
 | |
|     }
 | |
|     uint32_t GetBaseSequenceNumber() const
 | |
|     {
 | |
|         return baseseqnr;
 | |
|     }
 | |
|     uint32_t GetExtendedHighestSequenceNumber() const
 | |
|     {
 | |
|         return exthighseqnr;
 | |
|     }
 | |
|     uint32_t GetJitter() const
 | |
|     {
 | |
|         return jitter;
 | |
|     }
 | |
| 
 | |
|     int32_t GetNumPacketsReceivedInInterval() const
 | |
|     {
 | |
|         return numnewpackets;
 | |
|     }
 | |
|     uint32_t GetSavedExtendedSequenceNumber() const
 | |
|     {
 | |
|         return savedextseqnr;
 | |
|     }
 | |
|     void StartNewInterval()
 | |
|     {
 | |
|         numnewpackets = 0;
 | |
|         savedextseqnr = exthighseqnr;
 | |
|     }
 | |
| 
 | |
|     void SetLastMessageTime(const RTPTime &t)
 | |
|     {
 | |
|         lastmsgtime = t;
 | |
|     }
 | |
|     RTPTime GetLastMessageTime() const
 | |
|     {
 | |
|         return lastmsgtime;
 | |
|     }
 | |
|     void SetLastRTPPacketTime(const RTPTime &t)
 | |
|     {
 | |
|         lastrtptime = t;
 | |
|     }
 | |
|     RTPTime GetLastRTPPacketTime() const
 | |
|     {
 | |
|         return lastrtptime;
 | |
|     }
 | |
| 
 | |
|     void SetLastNoteTime(const RTPTime &t)
 | |
|     {
 | |
|         lastnotetime = t;
 | |
|     }
 | |
|     RTPTime GetLastNoteTime() const
 | |
|     {
 | |
|         return lastnotetime;
 | |
|     }
 | |
| private:
 | |
|     bool sentdata;
 | |
|     uint32_t packetsreceived;
 | |
|     uint32_t numcycles; // shifted left 16 bits
 | |
|     uint32_t baseseqnr;
 | |
|     uint32_t exthighseqnr, prevexthighseqnr;
 | |
|     uint32_t jitter, prevtimestamp;
 | |
|     double djitter;
 | |
|     RTPTime prevpacktime;
 | |
|     RTPTime lastmsgtime;
 | |
|     RTPTime lastrtptime;
 | |
|     RTPTime lastnotetime;
 | |
|     uint32_t numnewpackets;
 | |
|     uint32_t savedextseqnr;
 | |
| };
 | |
| 
 | |
| inline RTPSourceStats::RTPSourceStats() :
 | |
|         prevpacktime(0, 0), lastmsgtime(0, 0), lastrtptime(0, 0), lastnotetime(0, 0)
 | |
| {
 | |
|     sentdata = false;
 | |
|     packetsreceived = 0;
 | |
|     baseseqnr = 0;
 | |
|     exthighseqnr = 0;
 | |
|     prevexthighseqnr = 0;
 | |
|     jitter = 0;
 | |
|     numcycles = 0;
 | |
|     numnewpackets = 0;
 | |
|     prevtimestamp = 0;
 | |
|     djitter = 0;
 | |
|     savedextseqnr = 0;
 | |
| }
 | |
| 
 | |
| /** Describes an entry in the RTPSources source table. */
 | |
| class RTPSourceData
 | |
| {
 | |
| protected:
 | |
|     RTPSourceData(uint32_t ssrc);
 | |
|     virtual ~RTPSourceData();
 | |
| public:
 | |
|     /** Extracts the first packet of this participants RTP packet queue. */
 | |
|     RTPPacket *GetNextPacket();
 | |
| 
 | |
|     /** Clears the participant's RTP packet list. */
 | |
|     void FlushPackets();
 | |
| 
 | |
|     /** Returns \c true if there are RTP packets which can be extracted. */
 | |
|     bool HasData() const
 | |
|     {
 | |
|         if (!validated)
 | |
|             return false;
 | |
|         return packetlist.empty() ? false : true;
 | |
|     }
 | |
| 
 | |
|     /** Returns the SSRC identifier for this member. */
 | |
|     uint32_t GetSSRC() const
 | |
|     {
 | |
|         return ssrc;
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if the participant was added using the RTPSources member function CreateOwnSSRC and
 | |
|      *  returns \c false otherwise.
 | |
|      */
 | |
|     bool IsOwnSSRC() const
 | |
|     {
 | |
|         return ownssrc;
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if the source identifier is actually a CSRC from an RTP packet. */
 | |
|     bool IsCSRC() const
 | |
|     {
 | |
|         return iscsrc;
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if this member is marked as a sender and \c false if not. */
 | |
|     bool IsSender() const
 | |
|     {
 | |
|         return issender;
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if the participant is validated, which is the case if a number of
 | |
|      *  consecutive RTP packets have been received or if a CNAME item has been received for
 | |
|      *  this participant.
 | |
|      */
 | |
|     bool IsValidated() const
 | |
|     {
 | |
|         return validated;
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if the source was validated and had not yet sent a BYE packet. */
 | |
|     bool IsActive() const
 | |
|     {
 | |
|         if (!validated)
 | |
|             return false;
 | |
|         if (receivedbye)
 | |
|             return false;
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /** This function is used by the RTCPPacketBuilder class to mark whether this participant's
 | |
|      *  information has been processed in a report block or not.
 | |
|      */
 | |
|     void SetProcessedInRTCP(bool v)
 | |
|     {
 | |
|         processedinrtcp = v;
 | |
|     }
 | |
| 
 | |
|     /** This function is used by the RTCPPacketBuilder class and returns whether this participant
 | |
|      *  has been processed in a report block or not.
 | |
|      */
 | |
|     bool IsProcessedInRTCP() const
 | |
|     {
 | |
|         return processedinrtcp;
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if the address from which this participant's RTP packets originate has
 | |
|      *  already been set.
 | |
|      */
 | |
|     bool IsRTPAddressSet() const
 | |
|     {
 | |
|         return isrtpaddrset;
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if the address from which this participant's RTCP packets originate has
 | |
|      * already been set.
 | |
|      */
 | |
|     bool IsRTCPAddressSet() const
 | |
|     {
 | |
|         return isrtcpaddrset;
 | |
|     }
 | |
| 
 | |
|     /** Returns the address from which this participant's RTP packets originate.
 | |
|      *  Returns the address from which this participant's RTP packets originate. If the address has
 | |
|      *  been set and the returned value is NULL, this indicates that it originated from the local
 | |
|      *  participant.
 | |
|      */
 | |
|     const RTPAddress *GetRTPDataAddress() const
 | |
|     {
 | |
|         return rtpaddr;
 | |
|     }
 | |
| 
 | |
|     /** Returns the address from which this participant's RTCP packets originate.
 | |
|      *  Returns the address from which this participant's RTCP packets originate. If the address has
 | |
|      *  been set and the returned value is NULL, this indicates that it originated from the local
 | |
|      *  participant.
 | |
|      */
 | |
|     const RTPAddress *GetRTCPDataAddress() const
 | |
|     {
 | |
|         return rtcpaddr;
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if we received a BYE message for this participant and \c false otherwise. */
 | |
|     bool ReceivedBYE() const
 | |
|     {
 | |
|         return receivedbye;
 | |
|     }
 | |
| 
 | |
|     /** Returns the reason for leaving contained in the BYE packet of this participant.
 | |
|      *  Returns the reason for leaving contained in the BYE packet of this participant. The length of
 | |
|      *  the reason is stored in \c len.
 | |
|      */
 | |
|     uint8_t *GetBYEReason(std::size_t *len) const
 | |
|     {
 | |
|         *len = byereasonlen;
 | |
|         return byereason;
 | |
|     }
 | |
| 
 | |
|     /** Returns the time at which the BYE packet was received. */
 | |
|     RTPTime GetBYETime() const
 | |
|     {
 | |
|         return byetime;
 | |
|     }
 | |
| 
 | |
|     /** Sets the value for the timestamp unit to be used in jitter calculations for data received from this participant.
 | |
|      *  Sets the value for the timestamp unit to be used in jitter calculations for data received from this participant.
 | |
|      *  If not set, the library uses an approximation for the timestamp unit which is calculated from two consecutive
 | |
|      *  RTCP sender reports. The timestamp unit is defined as a time interval divided by the corresponding timestamp
 | |
|      *  interval. For 8000 Hz audio this would be 1/8000. For video, often a timestamp unit of 1/90000 is used.
 | |
|      */
 | |
|     void SetTimestampUnit(double tsu)
 | |
|     {
 | |
|         timestampunit = tsu;
 | |
|     }
 | |
| 
 | |
|     /** Returns the timestamp unit used for this participant. */
 | |
|     double GetTimestampUnit() const
 | |
|     {
 | |
|         return timestampunit;
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if an RTCP sender report has been received from this participant. */
 | |
|     bool SR_HasInfo() const
 | |
|     {
 | |
|         return SRinf.HasInfo();
 | |
|     }
 | |
| 
 | |
|     /** Returns the NTP timestamp contained in the last sender report. */
 | |
|     RTPNTPTime SR_GetNTPTimestamp() const
 | |
|     {
 | |
|         return SRinf.GetNTPTimestamp();
 | |
|     }
 | |
| 
 | |
|     /** Returns the RTP timestamp contained in the last sender report. */
 | |
|     uint32_t SR_GetRTPTimestamp() const
 | |
|     {
 | |
|         return SRinf.GetRTPTimestamp();
 | |
|     }
 | |
| 
 | |
|     /** Returns the packet count contained in the last sender report. */
 | |
|     uint32_t SR_GetPacketCount() const
 | |
|     {
 | |
|         return SRinf.GetPacketCount();
 | |
|     }
 | |
| 
 | |
|     /** Returns the octet count contained in the last sender report. */
 | |
|     uint32_t SR_GetByteCount() const
 | |
|     {
 | |
|         return SRinf.GetByteCount();
 | |
|     }
 | |
| 
 | |
|     /** Returns the time at which the last sender report was received. */
 | |
|     RTPTime SR_GetReceiveTime() const
 | |
|     {
 | |
|         return SRinf.GetReceiveTime();
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if more than one RTCP sender report has been received. */
 | |
|     bool SR_Prev_HasInfo() const
 | |
|     {
 | |
|         return SRprevinf.HasInfo();
 | |
|     }
 | |
| 
 | |
|     /** Returns the NTP timestamp contained in the second to last sender report. */
 | |
|     RTPNTPTime SR_Prev_GetNTPTimestamp() const
 | |
|     {
 | |
|         return SRprevinf.GetNTPTimestamp();
 | |
|     }
 | |
| 
 | |
|     /** Returns the RTP timestamp contained in the second to last sender report. */
 | |
|     uint32_t SR_Prev_GetRTPTimestamp() const
 | |
|     {
 | |
|         return SRprevinf.GetRTPTimestamp();
 | |
|     }
 | |
| 
 | |
|     /** Returns the packet count contained in the second to last sender report. */
 | |
|     uint32_t SR_Prev_GetPacketCount() const
 | |
|     {
 | |
|         return SRprevinf.GetPacketCount();
 | |
|     }
 | |
| 
 | |
|     /**  Returns the octet count contained in the second to last sender report. */
 | |
|     uint32_t SR_Prev_GetByteCount() const
 | |
|     {
 | |
|         return SRprevinf.GetByteCount();
 | |
|     }
 | |
| 
 | |
|     /** Returns the time at which the second to last sender report was received. */
 | |
|     RTPTime SR_Prev_GetReceiveTime() const
 | |
|     {
 | |
|         return SRprevinf.GetReceiveTime();
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if this participant sent a receiver report with information about the reception of our data. */
 | |
|     bool RR_HasInfo() const
 | |
|     {
 | |
|         return RRinf.HasInfo();
 | |
|     }
 | |
| 
 | |
|     /** Returns the fraction lost value from the last report. */
 | |
|     double RR_GetFractionLost() const
 | |
|     {
 | |
|         return RRinf.GetFractionLost();
 | |
|     }
 | |
| 
 | |
|     /** Returns the number of lost packets contained in the last report. */
 | |
|     int32_t RR_GetPacketsLost() const
 | |
|     {
 | |
|         return RRinf.GetPacketsLost();
 | |
|     }
 | |
| 
 | |
|     /** Returns the extended highest sequence number contained in the last report. */
 | |
|     uint32_t RR_GetExtendedHighestSequenceNumber() const
 | |
|     {
 | |
|         return RRinf.GetExtendedHighestSequenceNumber();
 | |
|     }
 | |
| 
 | |
|     /** Returns the jitter value from the last report. */
 | |
|     uint32_t RR_GetJitter() const
 | |
|     {
 | |
|         return RRinf.GetJitter();
 | |
|     }
 | |
| 
 | |
|     /** Returns the LSR value from the last report. */
 | |
|     uint32_t RR_GetLastSRTimestamp() const
 | |
|     {
 | |
|         return RRinf.GetLastSRTimestamp();
 | |
|     }
 | |
| 
 | |
|     /** Returns the DLSR value from the last report. */
 | |
|     uint32_t RR_GetDelaySinceLastSR() const
 | |
|     {
 | |
|         return RRinf.GetDelaySinceLastSR();
 | |
|     }
 | |
| 
 | |
|     /** Returns the time at which the last report was received. */
 | |
|     RTPTime RR_GetReceiveTime() const
 | |
|     {
 | |
|         return RRinf.GetReceiveTime();
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if this participant sent more than one receiver report with information
 | |
|      *  about the reception of our data.
 | |
|      */
 | |
|     bool RR_Prev_HasInfo() const
 | |
|     {
 | |
|         return RRprevinf.HasInfo();
 | |
|     }
 | |
| 
 | |
|     /** Returns the fraction lost value from the second to last report. */
 | |
|     double RR_Prev_GetFractionLost() const
 | |
|     {
 | |
|         return RRprevinf.GetFractionLost();
 | |
|     }
 | |
| 
 | |
|     /** Returns the number of lost packets contained in the second to last report. */
 | |
|     int32_t RR_Prev_GetPacketsLost() const
 | |
|     {
 | |
|         return RRprevinf.GetPacketsLost();
 | |
|     }
 | |
| 
 | |
|     /** Returns the extended highest sequence number contained in the second to last report. */
 | |
|     uint32_t RR_Prev_GetExtendedHighestSequenceNumber() const
 | |
|     {
 | |
|         return RRprevinf.GetExtendedHighestSequenceNumber();
 | |
|     }
 | |
| 
 | |
|     /** Returns the jitter value from the second to last report. */
 | |
|     uint32_t RR_Prev_GetJitter() const
 | |
|     {
 | |
|         return RRprevinf.GetJitter();
 | |
|     }
 | |
| 
 | |
|     /** Returns the LSR value from the second to last report. */
 | |
|     uint32_t RR_Prev_GetLastSRTimestamp() const
 | |
|     {
 | |
|         return RRprevinf.GetLastSRTimestamp();
 | |
|     }
 | |
| 
 | |
|     /** Returns the DLSR value from the second to last report. */
 | |
|     uint32_t RR_Prev_GetDelaySinceLastSR() const
 | |
|     {
 | |
|         return RRprevinf.GetDelaySinceLastSR();
 | |
|     }
 | |
| 
 | |
|     /** Returns the time at which the second to last report was received. */
 | |
|     RTPTime RR_Prev_GetReceiveTime() const
 | |
|     {
 | |
|         return RRprevinf.GetReceiveTime();
 | |
|     }
 | |
| 
 | |
|     /** Returns \c true if validated RTP packets have been received from this participant. */
 | |
|     bool INF_HasSentData() const
 | |
|     {
 | |
|         return stats.HasSentData();
 | |
|     }
 | |
| 
 | |
|     /** Returns the total number of received packets from this participant. */
 | |
|     int32_t INF_GetNumPacketsReceived() const
 | |
|     {
 | |
|         return stats.GetNumPacketsReceived();
 | |
|     }
 | |
| 
 | |
|     /** Returns the base sequence number of this participant. */
 | |
|     uint32_t INF_GetBaseSequenceNumber() const
 | |
|     {
 | |
|         return stats.GetBaseSequenceNumber();
 | |
|     }
 | |
| 
 | |
|     /** Returns the extended highest sequence number received from this participant. */
 | |
|     uint32_t INF_GetExtendedHighestSequenceNumber() const
 | |
|     {
 | |
|         return stats.GetExtendedHighestSequenceNumber();
 | |
|     }
 | |
| 
 | |
|     /** Returns the current jitter value for this participant. */
 | |
|     uint32_t INF_GetJitter() const
 | |
|     {
 | |
|         return stats.GetJitter();
 | |
|     }
 | |
| 
 | |
|     /** Returns the time at which something was last heard from this member. */
 | |
|     RTPTime INF_GetLastMessageTime() const
 | |
|     {
 | |
|         return stats.GetLastMessageTime();
 | |
|     }
 | |
| 
 | |
|     /** Returns the time at which the last RTP packet was received. */
 | |
|     RTPTime INF_GetLastRTPPacketTime() const
 | |
|     {
 | |
|         return stats.GetLastRTPPacketTime();
 | |
|     }
 | |
| 
 | |
|     /** Returns the estimated timestamp unit, calculated from two consecutive sender reports. */
 | |
|     double INF_GetEstimatedTimestampUnit() const;
 | |
| 
 | |
|     /** Returns the number of packets received since a new interval was started with INF_StartNewInterval. */
 | |
|     uint32_t INF_GetNumPacketsReceivedInInterval() const
 | |
|     {
 | |
|         return stats.GetNumPacketsReceivedInInterval();
 | |
|     }
 | |
| 
 | |
|     /** Returns the extended sequence number which was stored by the INF_StartNewInterval call. */
 | |
|     uint32_t INF_GetSavedExtendedSequenceNumber() const
 | |
|     {
 | |
|         return stats.GetSavedExtendedSequenceNumber();
 | |
|     }
 | |
| 
 | |
|     /** Starts a new interval to count received packets in; this also stores the current extended highest sequence
 | |
|      *  number to be able to calculate the packet loss during the interval.
 | |
|      */
 | |
|     void INF_StartNewInterval()
 | |
|     {
 | |
|         stats.StartNewInterval();
 | |
|     }
 | |
| 
 | |
|     /** Estimates the round trip time by using the LSR and DLSR info from the last receiver report. */
 | |
|     RTPTime INF_GetRoundtripTime() const;
 | |
| 
 | |
|     /** Returns the time at which the last SDES NOTE item was received. */
 | |
|     RTPTime INF_GetLastSDESNoteTime() const
 | |
|     {
 | |
|         return stats.GetLastNoteTime();
 | |
|     }
 | |
| 
 | |
|     /** Returns a pointer to the SDES CNAME item of this participant and stores its length in \c len. */
 | |
|     uint8_t *SDES_GetCNAME(std::size_t *len) const
 | |
|     {
 | |
|         return SDESinf.GetCNAME(len);
 | |
|     }
 | |
| 
 | |
|     /** Returns a pointer to the SDES name item of this participant and stores its length in \c len. */
 | |
|     uint8_t *SDES_GetName(std::size_t *len) const
 | |
|     {
 | |
|         return SDESinf.GetName(len);
 | |
|     }
 | |
| 
 | |
|     /** Returns a pointer to the SDES e-mail item of this participant and stores its length in \c len. */
 | |
|     uint8_t *SDES_GetEMail(std::size_t *len) const
 | |
|     {
 | |
|         return SDESinf.GetEMail(len);
 | |
|     }
 | |
| 
 | |
|     /** Returns a pointer to the SDES phone item of this participant and stores its length in \c len. */
 | |
|     uint8_t *SDES_GetPhone(std::size_t *len) const
 | |
|     {
 | |
|         return SDESinf.GetPhone(len);
 | |
|     }
 | |
| 
 | |
|     /** Returns a pointer to the SDES location item of this participant and stores its length in \c len. */
 | |
|     uint8_t *SDES_GetLocation(std::size_t *len) const
 | |
|     {
 | |
|         return SDESinf.GetLocation(len);
 | |
|     }
 | |
| 
 | |
|     /** Returns a pointer to the SDES tool item of this participant and stores its length in \c len. */
 | |
|     uint8_t *SDES_GetTool(std::size_t *len) const
 | |
|     {
 | |
|         return SDESinf.GetTool(len);
 | |
|     }
 | |
| 
 | |
|     /** Returns a pointer to the SDES note item of this participant and stores its length in \c len. */
 | |
|     uint8_t *SDES_GetNote(std::size_t *len) const
 | |
|     {
 | |
|         return SDESinf.GetNote(len);
 | |
|     }
 | |
| 
 | |
| #ifdef RTP_SUPPORT_SDESPRIV
 | |
|     /** Starts the iteration over the stored SDES private item prefixes and their associated values. */
 | |
|     void SDES_GotoFirstPrivateValue()
 | |
|     {
 | |
|         SDESinf.GotoFirstPrivateValue();
 | |
|     }
 | |
| 
 | |
|     /** If available, returns \c true and stores the next SDES private item prefix in \c prefix and its length in
 | |
|      *  \c prefixlen; the associated value and its length are then stored in \c value and \c valuelen.
 | |
|      */
 | |
|     bool SDES_GetNextPrivateValue(uint8_t **prefix, std::size_t *prefixlen, uint8_t **value, std::size_t *valuelen)
 | |
|     {
 | |
|         return SDESinf.GetNextPrivateValue(prefix, prefixlen, value, valuelen);
 | |
|     }
 | |
| 
 | |
|     /**	Looks for the entry which corresponds to the SDES private item prefix \c prefix with length
 | |
|      *  \c prefixlen; if found, the function returns \c true and stores the associated value and
 | |
|      *  its length in \c value and \c valuelen respectively.
 | |
|      */
 | |
|     bool SDES_GetPrivateValue(uint8_t *prefix, std::size_t prefixlen, uint8_t **value, std::size_t *valuelen) const
 | |
|     {
 | |
|         return SDESinf.GetPrivateValue(prefix, prefixlen, value, valuelen);
 | |
|     }
 | |
| #endif // RTP_SUPPORT_SDESPRIV
 | |
| 
 | |
| protected:
 | |
|     std::list<RTPPacket *> packetlist;
 | |
| 
 | |
|     uint32_t ssrc;
 | |
|     bool ownssrc;
 | |
|     bool iscsrc;
 | |
|     double timestampunit;
 | |
|     bool receivedbye;
 | |
|     bool validated;
 | |
|     bool processedinrtcp;
 | |
|     bool issender;
 | |
| 
 | |
|     RTCPSenderReportInfo SRinf, SRprevinf;
 | |
|     RTCPReceiverReportInfo RRinf, RRprevinf;
 | |
|     RTPSourceStats stats;
 | |
|     RTCPSDESInfo SDESinf;
 | |
| 
 | |
|     bool isrtpaddrset, isrtcpaddrset;
 | |
|     RTPAddress *rtpaddr, *rtcpaddr;
 | |
| 
 | |
|     RTPTime byetime;
 | |
|     uint8_t *byereason;
 | |
|     std::size_t byereasonlen;
 | |
| };
 | |
| 
 | |
| inline RTPPacket *RTPSourceData::GetNextPacket()
 | |
| {
 | |
|     if (!validated)
 | |
|         return 0;
 | |
| 
 | |
|     RTPPacket *p;
 | |
| 
 | |
|     if (packetlist.empty())
 | |
|         return 0;
 | |
|     p = *(packetlist.begin());
 | |
|     packetlist.pop_front();
 | |
|     return p;
 | |
| }
 | |
| 
 | |
| inline void RTPSourceData::FlushPackets()
 | |
| {
 | |
|     std::list<RTPPacket *>::const_iterator it;
 | |
| 
 | |
|     for (it = packetlist.begin(); it != packetlist.end(); ++it)
 | |
|         delete *it;
 | |
|     packetlist.clear();
 | |
| }
 | |
| 
 | |
| } // end namespace
 | |
| 
 | |
| #endif // RTPSOURCEDATA_H
 | |
| 
 |