INET Framework for OMNeT++/OMNEST
RTPReceiverInfo Class Reference

#include <RTPReceiverInfo.h>

Inheritance diagram for RTPReceiverInfo:
RTPParticipantInfo

List of all members.

Public Member Functions

 RTPReceiverInfo (uint32 ssrc=0)
 RTPReceiverInfo (const RTPReceiverInfo &receiverInfo)
virtual ~RTPReceiverInfo ()
RTPReceiverInfooperator= (const RTPReceiverInfo &receiverInfo)
virtual RTPReceiverInfodup () const
virtual void processRTPPacket (RTPPacket *packet, int id, simtime_t arrivalTime)
virtual void processSenderReport (SenderReport *report, simtime_t arrivalTime)
virtual void processSDESChunk (SDESChunk *sdesChunk, simtime_t arrivalTime)
virtual ReceptionReportreceptionReport (simtime_t now)
virtual void nextInterval (simtime_t now)
virtual bool isActive ()
virtual bool isValid ()
virtual bool toBeDeleted (simtime_t now)

Protected Attributes

uint16 _sequenceNumberBase
uint16 _highestSequenceNumber
uint32 _highestSequenceNumberPrior
uint32 _sequenceNumberCycles
uint32 _packetsReceived
uint32 _packetsReceivedPrior
simtime_t _jitter
cOutVector _jitterOutVector
cOutVector _packetLostOutVector
int _clockRate
uint32 _lastSenderReportRTPTimeStamp
uint64 _lastSenderReportNTPTimeStamp
uint32 _lastPacketRTPTimeStamp
simtime_t _lastPacketArrivalTime
simtime_t _lastSenderReportArrivalTime
int _inactiveIntervals
simtime_t _startOfInactivity
int _itemsReceived
int packetLoss
FILE * packetSequenceLostLogFile

Detailed Description

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.


Constructor & Destructor Documentation

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.

{
}

Member Function Documentation

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

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));
}

Member Data Documentation

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().

The highest sequence number of an RTPPacket received.

Referenced by nextInterval(), operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().

The highest sequence number of an RTPPacket received before the beginning of the current rtcp interval.

Referenced by nextInterval(), operator=(), receptionReport(), and RTPReceiverInfo().

The consecutive number of rtcp intervals this rtcp end system hasn't sent anything.

Referenced by isActive(), nextInterval(), operator=(), processRTPPacket(), processSDESChunk(), processSenderReport(), and RTPReceiverInfo().

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

The arrival time of the last RTPPacket received from this sender. Needed for calculating the jitter.

Referenced by operator=(), processRTPPacket(), and RTPReceiverInfo().

The rtp time stamp of the last RTPPacket received from this sender. Needed for calculating the jitter.

Referenced by operator=(), processRTPPacket(), and RTPReceiverInfo().

The arrival time of the last SenderReport received from this sender.

Referenced by operator=(), processSenderReport(), receptionReport(), and RTPReceiverInfo().

The ntp time stamp of the last SenderReport received from this sender.

Referenced by operator=(), processSenderReport(), receptionReport(), and RTPReceiverInfo().

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

How many rtp packets from this source have been received.

Referenced by nextInterval(), operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().

How many rtp packets have been received from this source before the current rtcp interval began.

Referenced by nextInterval(), operator=(), receptionReport(), and RTPReceiverInfo().

The sequence number of the first RTPPacket received.

Referenced by operator=(), processRTPPacket(), receptionReport(), and RTPReceiverInfo().

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]

The documentation for this class was generated from the following files: