#include <UDPVideoStreamSvr.h>
Inheritance diagram for UDPVideoStreamSvr:

Cooperates with UDPVideoStreamCli. UDPVideoStreamCli requests a stream and UDPVideoStreamSvr starts streaming to them. Capable of handling streaming to multiple clients.
Public Member Functions | |
| UDPVideoStreamSvr () | |
| virtual | ~UDPVideoStreamSvr () |
Protected Types | |
| typedef std::vector< VideoStreamData * > | VideoStreamVector |
Protected Member Functions | |
| void | processStreamRequest (cMessage *msg) |
| void | sendStreamData (cMessage *timer) |
Overidden cSimpleModule functions | |
| virtual void | initialize () |
| virtual void | finish () |
| virtual void | handleMessage (cMessage *msg) |
Protected Attributes | |
| VideoStreamVector | streamVector |
| int | serverPort |
| cPar * | waitInterval |
| cPar * | packetLen |
| cPar * | videoSize |
| unsigned int | numStreams |
| unsigned long | numPkSent |
Classes | |
| struct | VideoStreamData |
|
|
|
|
|
00038 {
00039 }
|
|
|
00042 {
00043 for (unsigned int i=0; i<streamVector.size(); i++)
00044 delete streamVector[i];
00045 }
|
|
|
00063 {
00064 recordScalar("streams served", numStreams);
00065 recordScalar("packets sent", numPkSent);
00066 }
|
|
|
00069 {
00070 if (msg->isSelfMessage())
00071 {
00072 // timer for a particular video stream expired, send packet
00073 sendStreamData(msg);
00074 }
00075 else
00076 {
00077 // start streaming
00078 processStreamRequest(msg);
00079 }
00080 }
|
|
|
00048 {
00049 waitInterval = &par("waitInterval");
00050 packetLen = &par("packetLen");
00051 videoSize = &par("videoSize");
00052 serverPort = par("serverPort");
00053
00054 numStreams = 0;
00055 numPkSent = 0;
00056
00057 WATCH_PTRVECTOR(streamVector);
00058
00059 bindToPort(serverPort);
00060 }
|
|
|
00084 {
00085 // register video stream...
00086 UDPControlInfo *ctrl = check_and_cast<UDPControlInfo *>(msg->controlInfo());
00087
00088 VideoStreamData *d = new VideoStreamData;
00089 d->clientAddr = ctrl->srcAddr();
00090 d->clientPort = ctrl->srcPort();
00091 d->videoSize = (*videoSize);
00092 d->bytesLeft = d->videoSize;
00093 d->numPkSent = 0;
00094 streamVector.push_back(d);
00095
00096 cMessage *timer = new cMessage("VideoStreamTmr");
00097 timer->setContextPointer(d);
00098
00099 // ... then transmit first packet right away
00100 sendStreamData(timer);
00101
00102 numStreams++;
00103 }
|
|
|
00107 {
00108 VideoStreamData *d = (VideoStreamData *) timer->contextPointer();
00109
00110 // generate and send a packet
00111 cMessage *pkt = new cMessage("VideoStrmPk");
00112 int pktLen = (*packetLen);
00113 if (pktLen > d->bytesLeft)
00114 pktLen = d->bytesLeft;
00115 pkt->setByteLength(pktLen);
00116 sendToUDP(pkt, serverPort, d->clientAddr, d->clientPort);
00117
00118 d->bytesLeft -= pktLen;
00119 d->numPkSent++;
00120 numPkSent++;
00121
00122 // reschedule timer if there's bytes left to send
00123 if (d->bytesLeft!=0)
00124 {
00125 double interval = (*waitInterval);
00126 scheduleAt(simTime()+interval, timer);
00127 }
00128 else
00129 {
00130 delete timer;
00131 // TBD find VideoStreamData in streamVector and delete it
00132 }
00133 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.4.1