Protected Member Functions | Protected Attributes

RTPAVProfilePayload32Sender Class Reference

#include <RTPAVProfilePayload32Sender.h>

Inheritance diagram for RTPAVProfilePayload32Sender:
RTPPayloadSender

List of all members.

Protected Member Functions

virtual void initialize ()
virtual void initializeSenderModule (RTPInnerPacket *rinpIn)
virtual bool sendPacket ()

Protected Attributes

double _initialDelay
double _framesPerSecond
double _frameNumber

Detailed Description

An RTPAVProfilePayload32Sender is a module for sending data of payload type 32 in the rtp audio/video profile, which is mpeg video. This implementation doesn't send real mpeg data it just reads the gdf file created by Mpeg_Stat and sends rtp data packets which contain an RTPMpegPacket. The corresponding receiver module RTPAVProfilePayload32Receiver.

Definition at line 33 of file RTPAVProfilePayload32Sender.h.


Member Function Documentation

void RTPAVProfilePayload32Sender::initialize (  )  [protected, virtual]

Initializes the module. It sets the values for clock rate and payload type.

Reimplemented from RTPPayloadSender.

Definition at line 34 of file RTPAVProfilePayload32Sender.cc.

void RTPAVProfilePayload32Sender::initializeSenderModule ( RTPInnerPacket rinpIn  )  [protected, virtual]

The main method. This method reads the gdf file header.

Reimplemented from RTPPayloadSender.

Definition at line 116 of file RTPAVProfilePayload32Sender.cc.

{
    ev << "initializeSenderModule Enter"<<endl;
    char line[100];
    char unit[100];
    char description[100];

    RTPPayloadSender::initializeSenderModule(rinpIn);

    // first line: fps unit description
    _inputFileStream.get(line, 100, '\n');

    float fps;
    sscanf(line, "%f %s %s", &fps, unit, description);
    _framesPerSecond = fps;

    _frameNumber = 0;

    // get new line character
    char c;
    _inputFileStream.get(c);

    // second line: initial delay unit description
    _inputFileStream.get(line, 100, '\n');

    float delay;
    sscanf(line, "%f %s %s", &delay, unit, description);

    _initialDelay = delay;

    // wait initial delay
    // cPacket *reminderMessage = new cMessage("next frame");
    // scheduleAt(simTime() + _initialDelay, reminderMessage);
    ev << "initializeSenderModule Exit"<<endl;
}

bool RTPAVProfilePayload32Sender::sendPacket (  )  [protected, virtual]

This method sends one mpeg frame. It sends one or more rtp data packet. Returns false if there were no more frames.

Reimplemented from RTPPayloadSender.

Definition at line 153 of file RTPAVProfilePayload32Sender.cc.

{
    ev << "sendPacket() "<< endl;
    // read next frame line
    int bits;
    char unit[100];
    char description[100];

    _inputFileStream >> bits;
    _inputFileStream >> unit;
    _inputFileStream.get(description, 100, '\n');

    int pictureType = 0;

    if (strchr(description, 'I')) {
        pictureType = 1;
    }
    else if (strchr(description, 'P')) {
        pictureType = 2;
    }
    else if (strchr(description, 'B')) {
        pictureType = 3;
    }
    else if (strchr(description, 'D')) {
        pictureType = 4;
    }

    int bytesRemaining = bits / 8;

    if (!_inputFileStream.eof()) {
        while (bytesRemaining > 0) {
            RTPPacket *rtpPacket = new RTPPacket("RTPPacket");
            RTPMpegPacket *mpegPacket = new RTPMpegPacket("MpegPacket");

            // the only mpeg information we know is the picture type
            mpegPacket->setPictureType(pictureType);

            // the maximum number of real data bytes
            int maxDataSize = _mtu - rtpPacket->getBitLength() - mpegPacket->getBitLength();

            if (bytesRemaining > maxDataSize) {

                // we do not know where slices in the
                // mpeg picture begin
                // so we simulate by assuming a slice
                // has a length of 64 bytes
                int slicedDataSize = (maxDataSize / 64) * 64;

                mpegPacket->addBitLength(slicedDataSize);


                rtpPacket->encapsulate(mpegPacket);

                bytesRemaining = bytesRemaining - slicedDataSize;
            }
            else {
                mpegPacket->addBitLength(bytesRemaining);
                rtpPacket->encapsulate(mpegPacket);
                // set marker because this is
                // the last packet of the frame
                rtpPacket->setMarker(1);
                bytesRemaining = 0;
            }

            rtpPacket->setPayloadType(_payloadType);
            rtpPacket->setSequenceNumber(_sequenceNumber);
            _sequenceNumber++;


            rtpPacket->setTimeStamp(_timeStampBase + (_initialDelay + (1 / _framesPerSecond) * (double)_frameNumber) * _clockRate);
            rtpPacket->setSSRC(_ssrc);


            RTPInnerPacket *rinpOut = new RTPInnerPacket("dataOut()");


            rinpOut->dataOut(rtpPacket);

            send(rinpOut, "profileOut");

        }
        _frameNumber++;

        _reminderMessage = new cMessage("nextFrame");
        scheduleAt(simTime() + 1.0 / _framesPerSecond, _reminderMessage);
        return true;
    }
    else {
        std::cout <<"LastSequenceNumber "<< _sequenceNumber << endl;
        return false;
    }
    ev << "sendPacket() Exit"<< endl;
}


Member Data Documentation

The number of the current mpeg frame. Needed for calculating the rtp time stamp in the rtp data packets.

Definition at line 72 of file RTPAVProfilePayload32Sender.h.

Referenced by initializeSenderModule(), and sendPacket().

The number of frames per second of the mpeg video.

Definition at line 66 of file RTPAVProfilePayload32Sender.h.

Referenced by initializeSenderModule(), and sendPacket().

The initial delay of the mpeg video.

Definition at line 61 of file RTPAVProfilePayload32Sender.h.

Referenced by initializeSenderModule(), and sendPacket().


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