#include <RTPReceiverInfo.h>
This class, a subclass of RTPParticipantInfo, is used for storing information about other rtp endsystems. This class processes rtp packets, rtcp sender reports and rtcp sdes chunks originating from this endsystem.
Definition at line 36 of file RTPReceiverInfo.h.
RTPReceiverInfo::RTPReceiverInfo | ( | uint32 | ssrc = 0 |
) |
Default constructor.
Definition at line 28 of file RTPReceiverInfo.cc.
Referenced by dup().
: RTPParticipantInfo(ssrc) { _sequenceNumberBase = 0; _highestSequenceNumber = 0; _highestSequenceNumberPrior = 0; _sequenceNumberCycles = 0; _packetsReceived = 0; _packetsReceivedPrior = 0; _jitter = 0.0; _clockRate = 0; _lastSenderReportRTPTimeStamp = 0; _lastSenderReportNTPTimeStamp = 0; _lastPacketRTPTimeStamp = 0; _lastPacketArrivalTime = 0.0; _lastSenderReportArrivalTime = 0.0; _inactiveIntervals = 0; _startOfInactivity = 0.0; _itemsReceived = 0; //_jitterOutVector.setName("Jitter"); //_packetLostOutVector.setName("Packet Lost"); //packetSequenceLostLogFile = NULL; }
RTPReceiverInfo::RTPReceiverInfo | ( | const RTPReceiverInfo & | receiverInfo | ) |
Copy constructor.
Definition at line 56 of file RTPReceiverInfo.cc.
: RTPParticipantInfo() { operator=(receiverInfo); }
RTPReceiverInfo::~RTPReceiverInfo | ( | ) | [virtual] |
RTPReceiverInfo * RTPReceiverInfo::dup | ( | ) | const [virtual] |
Duplicates this RTPReceiverInfo by calling the copy constructor.
Reimplemented from RTPParticipantInfo.
Definition at line 93 of file RTPReceiverInfo.cc.
{ return new RTPReceiverInfo(*this); }
bool RTPReceiverInfo::isActive | ( | ) | [virtual] |
Returns true if this rtp end system is regarded active.
Definition at line 233 of file RTPReceiverInfo.cc.
Referenced by toBeDeleted().
{ return (_inactiveIntervals < 5); }
bool RTPReceiverInfo::isValid | ( | ) | [virtual] |
Returns true if this rtp end system is regarded valid.
Definition at line 238 of file RTPReceiverInfo.cc.
Referenced by toBeDeleted().
{ return (_itemsReceived >= 5); }
void RTPReceiverInfo::nextInterval | ( | simtime_t | now | ) | [virtual] |
Informs this RTPReceiverInfo that one rtcp interval has past.
Reimplemented from RTPParticipantInfo.
Definition at line 222 of file RTPReceiverInfo.cc.
{ _inactiveIntervals++; if (_inactiveIntervals == 5) { _startOfInactivity = now; } _highestSequenceNumberPrior = _highestSequenceNumber + _sequenceNumberCycles; _packetsReceivedPrior = _packetsReceived; RTPParticipantInfo::nextInterval(now); }
RTPReceiverInfo & RTPReceiverInfo::operator= | ( | const RTPReceiverInfo & | receiverInfo | ) |
Assignment operator.
Definition at line 65 of file RTPReceiverInfo.cc.
Referenced by RTPReceiverInfo().
{ RTPParticipantInfo::operator=(receiverInfo); _sequenceNumberBase = receiverInfo._sequenceNumberBase; _highestSequenceNumber = receiverInfo._highestSequenceNumber; _highestSequenceNumberPrior = receiverInfo._highestSequenceNumberPrior; _sequenceNumberCycles = receiverInfo._sequenceNumberCycles; _packetsReceived = receiverInfo._packetsReceived; _packetsReceivedPrior = receiverInfo._packetsReceivedPrior; _jitter = receiverInfo._jitter; _clockRate = receiverInfo._clockRate; _lastSenderReportRTPTimeStamp = receiverInfo._lastSenderReportRTPTimeStamp; _lastSenderReportNTPTimeStamp = receiverInfo._lastSenderReportNTPTimeStamp; _lastPacketRTPTimeStamp = receiverInfo._lastPacketRTPTimeStamp; _lastPacketArrivalTime = receiverInfo._lastPacketArrivalTime; _lastSenderReportArrivalTime = receiverInfo._lastSenderReportArrivalTime; _inactiveIntervals = receiverInfo._inactiveIntervals; _startOfInactivity = receiverInfo._startOfInactivity; _itemsReceived = receiverInfo._itemsReceived; return *this; }
void RTPReceiverInfo::processRTPPacket | ( | RTPPacket * | packet, | |
int | id, | |||
simtime_t | arrivalTime | |||
) | [virtual] |
Extracts information of the given RTPPacket. Also sets _inactiveIntervals to 0.
Reimplemented from RTPParticipantInfo.
Definition at line 98 of file RTPReceiverInfo.cc.
{ // this endsystem sends, it isn't inactive _inactiveIntervals = 0; _packetsReceived++; _itemsReceived++; if (_packetsReceived == 1) { _sequenceNumberBase = packet->getSequenceNumber(); } else { /*if (packet->getSequenceNumber() > _highestSequenceNumber+1) { _packetLostOutVector.record(packet->getSequenceNumber() - _highestSequenceNumber -1); for (int i = _highestSequenceNumber+1; i< packet->getSequenceNumber(); i++ ) { //std::cout << "id = "<< id <<" SequeceNumber loss = "<<i<<endl; packetSequenceLostLogFile = fopen ("PacketLossLog.log","+w"); if (packetSequenceLostLogFile != NULL) { //sprintf (line, "id = %d SequeceNumber loss = %f ", id,i); fputs (i, packetSequenceLostLogFile); fclose (packetSequenceLostLogFile); } } }*/ if (packet->getSequenceNumber() > _highestSequenceNumber) { // it is possible that this is a late packet from the // previous sequence wrap if (!(packet->getSequenceNumber() > 0xFFEF && _highestSequenceNumber < 0x10)) _highestSequenceNumber = packet->getSequenceNumber(); } else { // is it a sequence number wrap around 0xFFFF to 0x0000 ? if (packet->getSequenceNumber() < 0x10 && _highestSequenceNumber > 0xFFEF) { _sequenceNumberCycles += 0x00010000; _highestSequenceNumber = packet->getSequenceNumber(); } } // calculate interarrival jitter if (_clockRate != 0) { simtime_t d = packet->getTimeStamp() - _lastPacketRTPTimeStamp - (arrivalTime - _lastPacketArrivalTime) * (double)_clockRate; if (d < 0) d = -d; _jitter = _jitter + (d - _jitter) / 16; } _lastPacketRTPTimeStamp = packet->getTimeStamp(); _lastPacketArrivalTime = arrivalTime; } //_jitterOutVector.record((uint32)_jitter); RTPParticipantInfo::processRTPPacket(packet, id, arrivalTime); }
void RTPReceiverInfo::processSDESChunk | ( | SDESChunk * | sdesChunk, | |
simtime_t | arrivalTime | |||
) | [virtual] |
Extracts information of the given SDESChunk.
Reimplemented from RTPParticipantInfo.
Definition at line 177 of file RTPReceiverInfo.cc.
{ RTPParticipantInfo::processSDESChunk(sdesChunk, arrivalTime); _itemsReceived++; _inactiveIntervals = 0; }
void RTPReceiverInfo::processSenderReport | ( | SenderReport * | report, | |
simtime_t | arrivalTime | |||
) | [virtual] |
Extracts information of the given SenderReport.
Reimplemented from RTPParticipantInfo.
Definition at line 157 of file RTPReceiverInfo.cc.
{ _lastSenderReportArrivalTime = arrivalTime; if (_lastSenderReportRTPTimeStamp == 0) { _lastSenderReportRTPTimeStamp = report->getRTPTimeStamp(); _lastSenderReportNTPTimeStamp = report->getNTPTimeStamp(); } else if (_clockRate == 0) { uint32 rtpTicks = report->getRTPTimeStamp() - _lastSenderReportRTPTimeStamp; uint64 ntpDifference = report->getNTPTimeStamp() - _lastSenderReportNTPTimeStamp; long double ntpSeconds = (long double)ntpDifference / (long double)(0xFFFFFFFF); _clockRate = (int)((long double)rtpTicks / ntpSeconds); } _inactiveIntervals = 0; _itemsReceived++; delete report; }
ReceptionReport * RTPReceiverInfo::receptionReport | ( | simtime_t | now | ) | [virtual] |
Returns a ReceptionReport if this rtp end system is a sender, NULL otherwise.
Reimplemented from RTPParticipantInfo.
Definition at line 184 of file RTPReceiverInfo.cc.
{ if (isSender()) { ReceptionReport *receptionReport = new ReceptionReport(); receptionReport->setSSRC(getSSRC()); uint64 packetsExpected = _sequenceNumberCycles + (uint64)_highestSequenceNumber - (uint64)_sequenceNumberBase + (uint64)1; uint64 packetsLost = packetsExpected - _packetsReceived; int32 packetsExpectedInInterval = _sequenceNumberCycles + _highestSequenceNumber - _highestSequenceNumberPrior; int32 packetsReceivedInInterval = _packetsReceived - _packetsReceivedPrior; int32 packetsLostInInterval = packetsExpectedInInterval - packetsReceivedInInterval; uint8 fractionLost = 0; if (packetsLostInInterval > 0) { fractionLost = (packetsLostInInterval << 8) / packetsExpectedInInterval; } receptionReport->setFractionLost(fractionLost); receptionReport->setPacketsLostCumulative(packetsLost); receptionReport->setSequenceNumber(_sequenceNumberCycles + _highestSequenceNumber); receptionReport->setJitter((uint32)SIMTIME_DBL(_jitter)); //XXX ??? store it in secs? --Andras // the middle 32 bit of the ntp time stamp of the last sender report receptionReport->setLastSR((_lastSenderReportNTPTimeStamp >> 16) & 0xFFFFFFFF); // the delay since the arrival of the last sender report in units // of 1 / 65536 seconds // 0 if no sender report has ben received receptionReport->setDelaySinceLastSR(_lastSenderReportArrivalTime == 0.0 ? 0 : (uint32)(SIMTIME_DBL(now - _lastSenderReportArrivalTime) * 65536.0)); return receptionReport; } else return NULL; }
bool RTPReceiverInfo::toBeDeleted | ( | simtime_t | now | ) | [virtual] |
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.
Definition at line 243 of file RTPReceiverInfo.cc.
{ // an rtp system should be removed from the list of known systems // when it hasn't been validated and hasn't been active for // 5 rtcp intervals or if it has been validated and has been // inactive for 30 minutes return (!isValid() && !isActive()) || (isValid() && !isActive() && (now - _startOfInactivity > 60.0 * 30.0)); }
int RTPReceiverInfo::_clockRate [protected] |
The clock rate (in ticks per second) the sender increases the rtp timestamps. It is calculated when two sender reports have been received.
Definition at line 163 of file RTPReceiverInfo.h.
Referenced by operator=(), processRTPPacket(), processSenderReport(), and RTPReceiverInfo().
uint16 RTPReceiverInfo::_highestSequenceNumber [protected] |
The highest sequence number of an RTPPacket received.
Definition at line 121 of file RTPReceiverInfo.h.
Referenced by nextInterval(), operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().
uint32 RTPReceiverInfo::_highestSequenceNumberPrior [protected] |
The highest sequence number of an RTPPacket received before the beginning of the current rtcp interval.
Definition at line 127 of file RTPReceiverInfo.h.
Referenced by nextInterval(), operator=(), receptionReport(), and RTPReceiverInfo().
int RTPReceiverInfo::_inactiveIntervals [protected] |
The consecutive number of rtcp intervals this rtcp end system hasn't sent anything.
Definition at line 196 of file RTPReceiverInfo.h.
Referenced by isActive(), nextInterval(), operator=(), processRTPPacket(), processSDESChunk(), processSenderReport(), and RTPReceiverInfo().
int RTPReceiverInfo::_itemsReceived [protected] |
The number of rtp and rtcp packets received from this rtp end system.
Definition at line 207 of file RTPReceiverInfo.h.
Referenced by isValid(), operator=(), processRTPPacket(), processSDESChunk(), processSenderReport(), and RTPReceiverInfo().
simtime_t RTPReceiverInfo::_jitter [protected] |
The interarrival jitter. See rtp rfc for details.
Definition at line 148 of file RTPReceiverInfo.h.
Referenced by operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().
cOutVector RTPReceiverInfo::_jitterOutVector [protected] |
The output vector for jitter value
Definition at line 153 of file RTPReceiverInfo.h.
simtime_t RTPReceiverInfo::_lastPacketArrivalTime [protected] |
The arrival time of the last RTPPacket received from this sender. Needed for calculating the jitter.
Definition at line 185 of file RTPReceiverInfo.h.
Referenced by operator=(), processRTPPacket(), and RTPReceiverInfo().
uint32 RTPReceiverInfo::_lastPacketRTPTimeStamp [protected] |
The rtp time stamp of the last RTPPacket received from this sender. Needed for calculating the jitter.
Definition at line 179 of file RTPReceiverInfo.h.
Referenced by operator=(), processRTPPacket(), and RTPReceiverInfo().
simtime_t RTPReceiverInfo::_lastSenderReportArrivalTime [protected] |
The arrival time of the last SenderReport received from this sender.
Definition at line 190 of file RTPReceiverInfo.h.
Referenced by operator=(), processSenderReport(), receptionReport(), and RTPReceiverInfo().
uint64 RTPReceiverInfo::_lastSenderReportNTPTimeStamp [protected] |
The ntp time stamp of the last SenderReport received from this sender.
Definition at line 173 of file RTPReceiverInfo.h.
Referenced by operator=(), processSenderReport(), receptionReport(), and RTPReceiverInfo().
uint32 RTPReceiverInfo::_lastSenderReportRTPTimeStamp [protected] |
The rtp time stamp of the last SenderReport received from this sender.
Definition at line 168 of file RTPReceiverInfo.h.
Referenced by operator=(), processSenderReport(), and RTPReceiverInfo().
cOutVector RTPReceiverInfo::_packetLostOutVector [protected] |
The output vector for packet lost
Definition at line 157 of file RTPReceiverInfo.h.
uint32 RTPReceiverInfo::_packetsReceived [protected] |
How many rtp packets from this source have been received.
Definition at line 137 of file RTPReceiverInfo.h.
Referenced by nextInterval(), operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().
uint32 RTPReceiverInfo::_packetsReceivedPrior [protected] |
How many rtp packets have been received from this source before the current rtcp interval began.
Definition at line 143 of file RTPReceiverInfo.h.
Referenced by nextInterval(), operator=(), receptionReport(), and RTPReceiverInfo().
uint16 RTPReceiverInfo::_sequenceNumberBase [protected] |
The sequence number of the first RTPPacket received.
Definition at line 116 of file RTPReceiverInfo.h.
Referenced by operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().
uint32 RTPReceiverInfo::_sequenceNumberCycles [protected] |
The number of sequence number wrap arounds.
Definition at line 132 of file RTPReceiverInfo.h.
Referenced by nextInterval(), operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().
simtime_t RTPReceiverInfo::_startOfInactivity [protected] |
The time when this rtp end system has been inactive for five consecutive rtcp intervals.
Definition at line 202 of file RTPReceiverInfo.h.
Referenced by nextInterval(), operator=(), RTPReceiverInfo(), and toBeDeleted().
int RTPReceiverInfo::packetLoss [protected] |
Definition at line 209 of file RTPReceiverInfo.h.
FILE* RTPReceiverInfo::packetSequenceLostLogFile [protected] |
Definition at line 211 of file RTPReceiverInfo.h.