Public Member Functions | Protected Attributes

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.

Definition at line 36 of file RTPReceiverInfo.h.


Constructor & Destructor Documentation

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]

Destructor.

Definition at line 61 of file RTPReceiverInfo.cc.

{
}


Member Function Documentation

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

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


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.

Definition at line 163 of file RTPReceiverInfo.h.

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

The highest sequence number of an RTPPacket received.

Definition at line 121 of file RTPReceiverInfo.h.

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

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

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

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.

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

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

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

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

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.

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

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

The sequence number of the first RTPPacket received.

Definition at line 116 of file RTPReceiverInfo.h.

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

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.

Definition at line 211 of file RTPReceiverInfo.h.


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