|
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] |