#include <RTPReceiverInfo.h>
Inheritance diagram for RTPReceiverInfo:
|
Default constructor. 00031 : RTPParticipantInfo(ssrc) { 00032 00033 _sequenceNumberBase = 0; 00034 _highestSequenceNumber = 0; 00035 _highestSequenceNumberPrior = 0; 00036 _sequenceNumberCycles = 0; 00037 00038 _packetsReceived = 0; 00039 _packetsReceivedPrior = 0; 00040 00041 _jitter = 0.0; 00042 _clockRate = 0; 00043 _lastSenderReportRTPTimeStamp = 0; 00044 _lastSenderReportNTPTimeStamp = 0; 00045 _lastPacketRTPTimeStamp = 0; 00046 00047 _lastPacketArrivalTime = 0.0; 00048 _lastSenderReportArrivalTime = 0.0; 00049 00050 _inactiveIntervals = 0; 00051 _startOfInactivity = 0.0; 00052 _itemsReceived = 0; 00053 };
|
|
Copy constructor. 00056 : RTPParticipantInfo() { 00057 setName(receiverInfo.name()); 00058 operator=(receiverInfo); 00059 };
|
|
Destructor. 00062 { 00063 }
|
|
Returns true if this rtp end system is regarded active. 00225 {
00226 return (_inactiveIntervals < 5);
00227 };
|
|
Returns the class name "RTPReceiverInfo". Reimplemented from RTPParticipantInfo. 00099 { 00100 return "RTPReceiverInfo"; 00101 };
|
|
Duplicates this RTPReceiverInfo by calling the copy constructor. Reimplemented from RTPParticipantInfo. 00094 { 00095 return new RTPReceiverInfo(*this); 00096 };
|
|
Informs this RTPReceiverInfo that one rtcp interval has past. Reimplemented from RTPParticipantInfo. 00214 { 00215 _inactiveIntervals++; 00216 if (_inactiveIntervals == 5) { 00217 _startOfInactivity = now; 00218 } 00219 _highestSequenceNumberPrior = _highestSequenceNumber + _sequenceNumberCycles; 00220 _packetsReceivedPrior = _packetsReceived; 00221 RTPParticipantInfo::nextInterval(now); 00222 };
|
|
|
Extracts information of the given RTPPacket. Also sets _inactiveIntervals to 0. Reimplemented from RTPParticipantInfo. 00104 { 00105 00106 // this endsystem sends, it isn't inactive 00107 _inactiveIntervals = 0; 00108 00109 _packetsReceived++; 00110 _itemsReceived++; 00111 00112 if (_packetsReceived == 1) { 00113 _sequenceNumberBase = packet->sequenceNumber(); 00114 } 00115 else { 00116 if (packet->sequenceNumber() > _highestSequenceNumber) { 00117 // it is possible that this is a late packet from the 00118 // previous sequence wrap 00119 if (!(packet->sequenceNumber() > 0xFFEF && _highestSequenceNumber < 0x10)) 00120 _highestSequenceNumber = packet->sequenceNumber(); 00121 } 00122 else { 00123 // is it a sequence number wrap around 0xFFFF to 0x0000 ? 00124 if (packet->sequenceNumber() < 0x10 && _highestSequenceNumber > 0xFFEF) { 00125 _sequenceNumberCycles += 0x00010000; 00126 _highestSequenceNumber = packet->sequenceNumber(); 00127 } 00128 }; 00129 // calculate interarrival jitter 00130 if (_clockRate != 0) { 00131 double d = (double)(packet->timeStamp() - _lastPacketRTPTimeStamp) - (arrivalTime - _lastPacketArrivalTime) * (double)_clockRate; 00132 if (d < 0) 00133 d = -d; 00134 _jitter = _jitter + (d - _jitter) / 16; 00135 }; 00136 _lastPacketRTPTimeStamp = packet->timeStamp(); 00137 _lastPacketArrivalTime = arrivalTime; 00138 }; 00139 00140 00141 00142 RTPParticipantInfo::processRTPPacket(packet, arrivalTime); 00143 00144 };
|
|
Extracts information of the given SDESChunk. Reimplemented from RTPParticipantInfo. 00168 { 00169 RTPParticipantInfo::processSDESChunk(sdesChunk, arrivalTime); 00170 _itemsReceived++; 00171 _inactiveIntervals = 0; 00172 };
|
|
Extracts information of the given SenderReport. Reimplemented from RTPParticipantInfo. 00147 { 00148 00149 _lastSenderReportArrivalTime = arrivalTime; 00150 if (_lastSenderReportRTPTimeStamp == 0) { 00151 _lastSenderReportRTPTimeStamp = report->rtpTimeStamp(); 00152 _lastSenderReportNTPTimeStamp = report->ntpTimeStamp(); 00153 } 00154 else if (_clockRate == 0) { 00155 u_int32 rtpTicks = report->rtpTimeStamp() - _lastSenderReportRTPTimeStamp; 00156 u_int64 ntpDifference = report->ntpTimeStamp() - _lastSenderReportNTPTimeStamp; 00157 long double ntpSeconds = (long double)ntpDifference / (long double)(0xFFFFFFFF); 00158 _clockRate = (int)((long double)rtpTicks / ntpSeconds); 00159 } 00160 00161 _inactiveIntervals = 0; 00162 _itemsReceived++; 00163 00164 delete report; 00165 };
|
|
Returns a ReceptionReport if this rtp end system is a sender, NULL otherwise. Reimplemented from RTPParticipantInfo. 00175 { 00176 00177 if (isSender()) { 00178 ReceptionReport *receptionReport = new ReceptionReport("ReceiverReport"); 00179 receptionReport->setSSRC(ssrc()); 00180 00181 u_int64 packetsExpected = _sequenceNumberCycles + (u_int64)_highestSequenceNumber - (u_int64)_sequenceNumberBase + (u_int64)1; 00182 u_int64 packetsLost = packetsExpected - _packetsReceived; 00183 00184 int32 packetsExpectedInInterval = _sequenceNumberCycles + _highestSequenceNumber - _highestSequenceNumberPrior; 00185 int32 packetsReceivedInInterval = _packetsReceived - _packetsReceivedPrior; 00186 int32 packetsLostInInterval = packetsExpectedInInterval - packetsReceivedInInterval; 00187 u_int8 fractionLost = 0; 00188 if (packetsLostInInterval > 0) { 00189 fractionLost = (packetsLostInInterval << 8) / packetsExpectedInInterval; 00190 }; 00191 00192 receptionReport->setFractionLost(fractionLost); 00193 receptionReport->setPacketsLostCumulative(packetsLost); 00194 receptionReport->setSequenceNumber(_sequenceNumberCycles + _highestSequenceNumber); 00195 00196 receptionReport->setJitter((u_int32)_jitter); 00197 00198 // the middle 32 bit of the ntp time stamp of the last sender report 00199 receptionReport->setLastSR((_lastSenderReportNTPTimeStamp >> 16) & 0xFFFFFFFF); 00200 00201 // the delay since the arrival of the last sender report in units 00202 // of 1 / 65536 seconds 00203 // 0 if no sender report has ben received 00204 00205 receptionReport->setDelaySinceLastSR(_lastSenderReportArrivalTime == 0.0 ? 0 : (u_int32)((now - _lastSenderReportArrivalTime) * 65536.0)); 00206 00207 return receptionReport; 00208 } 00209 else 00210 return NULL; 00211 };
|
|
Returns true if this rtp end system should be deleted from the list of known rtp session participant. This method should be called directly after nextInterval(). Reimplemented from RTPParticipantInfo. 00235 { 00236 // an rtp system should be removed from the list of known systems 00237 // when it hasn't been validated and hasn't been active for 00238 // 5 rtcp intervals or if it has been validated and has been 00239 // inactive for 30 minutes 00240 return (!valid() && !active()) || (valid() && !active() && (now - _startOfInactivity > 60.0 * 30.0)); 00241 };
|
|
Returns true if this rtp end system is regarded valid. 00230 {
00231 return (_itemsReceived >= 5);
00232 };
|
|
The clock rate (in ticks per second) the sender increases the rtp timestamps. It is calculated when two sender reports have been received. |
|
The highest sequence number of an RTPPacket received. |
|
The highest sequence number of an RTPPacket received before the beginning of the current rtcp interval. |
|
The consecutive number of rtcp intervals this rtcp end system hasn't sent anything. |
|
The number of rtp and rtcp packets received from this rtp end system. |
|
The interarrival jitter. See rtp rfc for details. |
|
The arrival time of the last RTPPacket received from this sender. Needed for calculating the jitter. |
|
The rtp time stamp of the last RTPPacket received from this sender. Needed for calculating the jitter. |
|
The arrival time of the last SenderReport received from this sender. |
|
The ntp time stamp of the last SenderReport received from this sender. |
|
The rtp time stamp of the last SenderReport received from this sender. |
|
How many rtp packets from this source have been received. |
|
How many rtp packets have been received from this source before the current rtcp interval began. |
|
The sequence number of the first RTPPacket received. |
|
The number of sequence number wrap arounds. |
|
The time when this rtp end system has been inactive for five consecutive rtcp intervals. |