#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 |
typedef std::vector<VideoStreamData *> UDPVideoStreamSvr::VideoStreamVector [protected] |
UDPVideoStreamSvr::~UDPVideoStreamSvr | ( | ) | [virtual] |
00042 { 00043 for (unsigned int i=0; i<streamVector.size(); i++) 00044 delete streamVector[i]; 00045 }
void UDPVideoStreamSvr::finish | ( | ) | [protected, virtual] |
00063 { 00064 recordScalar("streams served", numStreams); 00065 recordScalar("packets sent", numPkSent); 00066 }
void UDPVideoStreamSvr::handleMessage | ( | cMessage * | msg | ) | [protected, virtual] |
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 }
void UDPVideoStreamSvr::initialize | ( | ) | [protected, virtual] |
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 }
void UDPVideoStreamSvr::processStreamRequest | ( | cMessage * | msg | ) | [protected] |
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 }
void UDPVideoStreamSvr::sendStreamData | ( | cMessage * | timer | ) | [protected] |
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 }
unsigned long UDPVideoStreamSvr::numPkSent [protected] |
unsigned int UDPVideoStreamSvr::numStreams [protected] |
cPar* UDPVideoStreamSvr::packetLen [protected] |
int UDPVideoStreamSvr::serverPort [protected] |
VideoStreamVector UDPVideoStreamSvr::streamVector [protected] |
cPar* UDPVideoStreamSvr::videoSize [protected] |
cPar* UDPVideoStreamSvr::waitInterval [protected] |