#include <UDPVideoStreamSvr.h>
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 | |
virtual void | processStreamRequest (cMessage *msg) |
virtual 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 |
typedef std::vector<VideoStreamData *> UDPVideoStreamSvr::VideoStreamVector [protected] |
UDPVideoStreamSvr::~UDPVideoStreamSvr | ( | ) | [virtual] |
00041 { 00042 for (unsigned int i=0; i<streamVector.size(); i++) 00043 delete streamVector[i]; 00044 }
void UDPVideoStreamSvr::processStreamRequest | ( | cMessage * | msg | ) | [protected, virtual] |
Referenced by handleMessage().
00083 { 00084 // register video stream... 00085 UDPControlInfo *ctrl = check_and_cast<UDPControlInfo *>(msg->getControlInfo()); 00086 00087 VideoStreamData *d = new VideoStreamData; 00088 d->clientAddr = ctrl->getSrcAddr(); 00089 d->clientPort = ctrl->getSrcPort(); 00090 d->videoSize = (*videoSize); 00091 d->bytesLeft = d->videoSize; 00092 d->numPkSent = 0; 00093 streamVector.push_back(d); 00094 00095 cMessage *timer = new cMessage("VideoStreamTmr"); 00096 timer->setContextPointer(d); 00097 00098 // ... then transmit first packet right away 00099 sendStreamData(timer); 00100 00101 numStreams++; 00102 }
void UDPVideoStreamSvr::sendStreamData | ( | cMessage * | timer | ) | [protected, virtual] |
Referenced by handleMessage(), and processStreamRequest().
00106 { 00107 VideoStreamData *d = (VideoStreamData *) timer->getContextPointer(); 00108 00109 // generate and send a packet 00110 cPacket *pkt = new cPacket("VideoStrmPk"); 00111 long pktLen = packetLen->longValue(); 00112 if (pktLen > d->bytesLeft) 00113 pktLen = d->bytesLeft; 00114 pkt->setByteLength(pktLen); 00115 sendToUDP(pkt, serverPort, d->clientAddr, d->clientPort); 00116 00117 d->bytesLeft -= pktLen; 00118 d->numPkSent++; 00119 numPkSent++; 00120 00121 // reschedule timer if there's bytes left to send 00122 if (d->bytesLeft!=0) 00123 { 00124 simtime_t interval = (*waitInterval); 00125 scheduleAt(simTime()+interval, timer); 00126 } 00127 else 00128 { 00129 delete timer; 00130 // TBD find VideoStreamData in streamVector and delete it 00131 } 00132 }
void UDPVideoStreamSvr::initialize | ( | ) | [protected, virtual] |
00047 { 00048 waitInterval = &par("waitInterval"); 00049 packetLen = &par("packetLen"); 00050 videoSize = &par("videoSize"); 00051 serverPort = par("serverPort"); 00052 00053 numStreams = 0; 00054 numPkSent = 0; 00055 00056 WATCH_PTRVECTOR(streamVector); 00057 00058 bindToPort(serverPort); 00059 }
void UDPVideoStreamSvr::finish | ( | ) | [protected, virtual] |
00062 { 00063 recordScalar("streams served", numStreams); 00064 recordScalar("packets sent", numPkSent); 00065 }
void UDPVideoStreamSvr::handleMessage | ( | cMessage * | msg | ) | [protected, virtual] |
00068 { 00069 if (msg->isSelfMessage()) 00070 { 00071 // timer for a particular video stream expired, send packet 00072 sendStreamData(msg); 00073 } 00074 else 00075 { 00076 // start streaming 00077 processStreamRequest(msg); 00078 } 00079 }
VideoStreamVector UDPVideoStreamSvr::streamVector [protected] |
Referenced by initialize(), processStreamRequest(), and ~UDPVideoStreamSvr().
int UDPVideoStreamSvr::serverPort [protected] |
Referenced by initialize(), and sendStreamData().
cPar* UDPVideoStreamSvr::waitInterval [protected] |
Referenced by initialize().
cPar* UDPVideoStreamSvr::packetLen [protected] |
Referenced by initialize(), and sendStreamData().
cPar* UDPVideoStreamSvr::videoSize [protected] |
Referenced by initialize().
unsigned int UDPVideoStreamSvr::numStreams [protected] |
Referenced by finish(), initialize(), and processStreamRequest().
unsigned long UDPVideoStreamSvr::numPkSent [protected] |
Referenced by finish(), initialize(), and sendStreamData().