INET Framework for OMNeT++/OMNEST
|
#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.
RTPReceiverInfo::RTPReceiverInfo | ( | uint32 | ssrc = 0 | ) |
Default constructor.
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.
: RTPParticipantInfo() { operator=(receiverInfo); }
RTPReceiverInfo::~RTPReceiverInfo | ( | ) | [virtual] |
Destructor.
{ }
RTPReceiverInfo * RTPReceiverInfo::dup | ( | ) | const [virtual] |
Duplicates this RTPReceiverInfo by calling the copy constructor.
Reimplemented from RTPParticipantInfo.
{ return new RTPReceiverInfo(*this); }
bool RTPReceiverInfo::isActive | ( | ) | [virtual] |
Returns true if this rtp end system is regarded active.
Referenced by toBeDeleted().
{ return (_inactiveIntervals < 5); }
bool RTPReceiverInfo::isValid | ( | ) | [virtual] |
Returns true if this rtp end system is regarded valid.
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.
{ _inactiveIntervals++; if (_inactiveIntervals == 5) { _startOfInactivity = now; } _highestSequenceNumberPrior = _highestSequenceNumber + _sequenceNumberCycles; _packetsReceivedPrior = _packetsReceived; RTPParticipantInfo::nextInterval(now); }
RTPReceiverInfo & RTPReceiverInfo::operator= | ( | const RTPReceiverInfo & | receiverInfo | ) |
Assignment operator.
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.
{ // 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.
{ 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.
{ _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.
{ 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.
{ // 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.
Referenced by operator=(), processRTPPacket(), processSenderReport(), and RTPReceiverInfo().
uint16 RTPReceiverInfo::_highestSequenceNumber [protected] |
The highest sequence number of an RTPPacket received.
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.
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.
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.
Referenced by isValid(), operator=(), processRTPPacket(), processSDESChunk(), processSenderReport(), and RTPReceiverInfo().
simtime_t RTPReceiverInfo::_jitter [protected] |
The interarrival jitter. See rtp rfc for details.
Referenced by operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().
cOutVector RTPReceiverInfo::_jitterOutVector [protected] |
The output vector for jitter value
simtime_t RTPReceiverInfo::_lastPacketArrivalTime [protected] |
The arrival time of the last RTPPacket received from this sender. Needed for calculating the jitter.
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.
Referenced by operator=(), processRTPPacket(), and RTPReceiverInfo().
simtime_t RTPReceiverInfo::_lastSenderReportArrivalTime [protected] |
The arrival time of the last SenderReport received from this sender.
Referenced by operator=(), processSenderReport(), receptionReport(), and RTPReceiverInfo().
uint64 RTPReceiverInfo::_lastSenderReportNTPTimeStamp [protected] |
The ntp time stamp of the last SenderReport received from this sender.
Referenced by operator=(), processSenderReport(), receptionReport(), and RTPReceiverInfo().
uint32 RTPReceiverInfo::_lastSenderReportRTPTimeStamp [protected] |
The rtp time stamp of the last SenderReport received from this sender.
Referenced by operator=(), processSenderReport(), and RTPReceiverInfo().
cOutVector RTPReceiverInfo::_packetLostOutVector [protected] |
The output vector for packet lost
uint32 RTPReceiverInfo::_packetsReceived [protected] |
How many rtp packets from this source have been received.
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.
Referenced by nextInterval(), operator=(), receptionReport(), and RTPReceiverInfo().
uint16 RTPReceiverInfo::_sequenceNumberBase [protected] |
The sequence number of the first RTPPacket received.
Referenced by operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().
uint32 RTPReceiverInfo::_sequenceNumberCycles [protected] |
The number of sequence number wrap arounds.
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.
Referenced by nextInterval(), operator=(), RTPReceiverInfo(), and toBeDeleted().
int RTPReceiverInfo::packetLoss [protected] |
FILE* RTPReceiverInfo::packetSequenceLostLogFile [protected] |