User Manual, Developers Guide and API Documentation

Video.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002  * This file is part of openWNS (open Wireless Network Simulator)
00003  * _____________________________________________________________________________
00004  *
00005  * Copyright (C) 2004-2007
00006  * Chair of Communication Networks (ComNets)
00007  * Kopernikusstr. 5, D-52074 Aachen, Germany
00008  * phone: ++49-241-80-27910,
00009  * fax: ++49-241-80-22242
00010  * email: info@openwns.org
00011  * www: http://www.openwns.org
00012  * _____________________________________________________________________________
00013  *
00014  * openWNS is free software; you can redistribute it and/or modify it under the
00015  * terms of the GNU Lesser General Public License version 2 as published by the
00016  * Free Software Foundation;
00017  *
00018  * openWNS is distributed in the hope that it will be useful, but WITHOUT ANY
00019  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
00020  * A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00021  * details.
00022  *
00023  * You should have received a copy of the GNU Lesser General Public License
00024  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00025  *
00026  ******************************************************************************/
00027 
00028 #include <APPLICATIONS/session/server/Video.hpp>
00029 #include <math.h>
00030 #include <WNS/distribution/Norm.hpp>
00031 #include <WNS/distribution/LogNorm.hpp>
00032 
00033 using namespace applications::session::server;
00034 
00035 STATIC_FACTORY_REGISTER_WITH_CREATOR(applications::session::server::Video,
00036                      applications::session::Session,
00037                      "server.Video", wns::PyConfigViewCreator);
00038 
00039 Video::Video(const wns::pyconfig::View& _pyco) :
00040   Session(_pyco),
00041   j(0),
00042   idx(0),
00043   limit(1000),
00044 
00045   kI(1),
00046   pI(0.0),
00047   nI(0.0),
00048   dI(1.0),
00049   meanI(0.0),
00050   varianceI(1.0),
00051   logNormValueI(0.0),
00052   yI(0.0),
00053   mI(0.0),
00054   sqrValueI(0.0),
00055   autocorrI(NULL),
00056   phiInew(NULL),
00057   phiIold(NULL),
00058 
00059   kB(1),
00060   pB(0.0),
00061   nB(0.0),
00062   dB(1.0),
00063   meanB(0.0),
00064   varianceB(1.0),
00065   logNormValueB(0.0),
00066   yB(0.0),
00067   mB(0.0),
00068   sqrValueB(0.0),
00069   autocorrB(NULL),
00070   phiBnew(NULL),
00071   phiBold(NULL),
00072 
00073   kP(1),
00074   pP(0.0),
00075   nP(0.0),
00076   dP(1.0),
00077   meanP(0.0),
00078   varianceP(1.0),
00079   logNormValueP(0.0),
00080   yP(0.0),
00081   mP(0.0),
00082   sqrValueP(0.0),
00083   autocorrP(NULL),
00084   phiPnew(NULL),
00085   phiPold(NULL),
00086 
00087   mean(0.0),
00088   n(0),
00089   logNormDis(NULL),
00090   logNormDisI(NULL),
00091   logNormDisB(NULL),
00092   logNormDisP(NULL),
00093   logNormValue(0.0),
00094   normMean(0.0),
00095   normStd(0.0),
00096   projection(0.0),
00097   logNormVariance(0.0),
00098   value(0.0),
00099 
00100   bFrameCounter(1),
00101   gopCounter(1),
00102   newGOP(true)
00103 {
00104   frameGeneratingProcess = _pyco.get<std::string>("frameGeneratingProcess");
00105 
00106   settlingTime = _pyco.get<wns::simulator::Time>("settlingTime");
00107 
00108   byteFlag = _pyco.get<bool>("params.byteFlag");
00109   videoFrameRate = _pyco.get<int>("params.frameRate");
00110   videoPacketIat = 1 / double(videoFrameRate);
00111 
00112   MESSAGE_BEGIN(NORMAL, logger, m, "APPL: Starting new session with ");
00113   m << "videoFrameRate = " << videoFrameRate;
00114   m << ", videoPacketIat = " << videoPacketIat;
00115   MESSAGE_END();
00116 
00117   logMeanI = _pyco.get<double>("params.meanI");
00118   logStdI = _pyco.get<double>("params.stdI");
00119   hurstI = _pyco.get<double>("params.hurstI");
00120   phiI = _pyco.get<double>("params.phiI");
00121   thetaI = _pyco.get<double>("params.thetaI");
00122 
00123   logMeanP = _pyco.get<double>("params.meanP");
00124   logStdP = _pyco.get<double>("params.stdP");
00125   hurstP = _pyco.get<double>("params.hurstP");
00126   phiP = _pyco.get<double>("params.phiP");
00127   thetaP = _pyco.get<double>("params.thetaP");
00128 
00129   logMeanB = _pyco.get<double>("params.meanB");
00130   logStdB = _pyco.get<double>("params.stdB");
00131   hurstB = _pyco.get<double>("params.hurstB");
00132   phiB = _pyco.get<double>("params.phiB");
00133   thetaB = _pyco.get<double>("params.thetaB");
00134 
00135   state = idle;
00136 
00137   /* only for probing */
00138   sessionType = video;
00139 
00140   packetFrom = "server.Video";
00141 }
00142 
00143 Video::~Video()
00144 {
00145   autocorrI.clear();
00146   phiInew.clear();
00147   phiIold.clear();
00148   xI.clear();
00149 
00150   autocorrB.clear();
00151   phiBnew.clear();
00152   phiBold.clear();
00153   xB.clear();
00154 
00155   autocorrP.clear();
00156   phiPnew.clear();
00157   phiPold.clear();
00158   xP.clear();
00159 }
00160 
00161 void
00162 Video::onData(const wns::osi::PDUPtr& _pdu)
00163 {
00164   /* Request received. */
00165   state = running;
00166 
00167   assureType(_pdu.getPtr(), applications::session::PDU*);
00168 
00169   receivedPacketNumber = static_cast<applications::session::PDU*>(_pdu.getPtr())->getPacketNumber();
00170 
00171   MESSAGE_SINGLE(NORMAL, logger, "APPL: receivedPacketNumber = " << receivedPacketNumber << ".");
00172 
00173   applications::session::Session::incomingProbesCalculation(_pdu);
00174 
00175   calculateSLRangeDependency();
00176 
00177   onTimeout(frametimeout);
00178 }
00179 
00180 void
00181 Video::onTimeout(const Timeout& _t)
00182 {
00183   if(_t == frametimeout)
00184     {
00185       if(newGOP == false)
00186     {
00187       if(bFrameCounter <= 2)
00188         {
00189           /* B-Frame */
00190           MESSAGE_SINGLE(NORMAL, logger, "APPL: B-FRAME!");
00191 
00192           applications::session::Session::iatProbesCalculation();
00193 
00194           bFrameCounter += 1;
00195 
00196           if(frameGeneratingProcess == "PDF")
00197         {
00198           logNormalPDF(logMeanB, logStdB);
00199         }
00200           else if(frameGeneratingProcess == "P-AR")
00201         {
00202           logNormalProjectedAR(yB, phiB, mB, sqrValueB, kB, logMeanB, logStdB);
00203         }
00204           else if(frameGeneratingProcess == "P-ARMA")
00205         {
00206           logNormalProjectedARMA(yB, phiB, thetaB, mB, sqrValueB, kB, logMeanB, logStdB);
00207         }
00208           else if(frameGeneratingProcess == "P-FARIMA")
00209         {
00210           logNormalProjectedFarima(xB, phiBold, yB, phiB, thetaB, mB, sqrValueB,
00211                        varianceB, kB, logMeanB, logStdB);
00212         }
00213           else if(frameGeneratingProcess == "P-FDN")
00214         {
00215           logNormalProjectedFDN(xB, phiBold, yB, phiB, thetaB, mB, sqrValueB,
00216                     varianceB, kB, logMeanB, logStdB);
00217         }
00218           else if(frameGeneratingProcess == "AR")
00219         {
00220           videoAR(yB, phiB, logMeanB, logStdB);
00221         }
00222           else if(frameGeneratingProcess == "FARIMA")
00223         {
00224           videoFARIMA(xB, phiBold, yB, phiB, thetaB, varianceB, kB, logMeanB, logStdB);
00225         }
00226           else if(frameGeneratingProcess == "FDN")
00227         {
00228           videoFDN(xB, phiBold, yB, varianceB, kB, logMeanB, logStdB);
00229         }
00230           else
00231         {
00232           MESSAGE_SINGLE(NORMAL, logger, "APPL: No video B-frame generator!");
00233         }
00234 
00235           setTimeout(frametimeout, videoPacketIat);
00236         }
00237       else
00238         {
00239           // P-Frame
00240           bFrameCounter = 1;
00241 
00242           if(gopCounter < 4)
00243         {
00244           MESSAGE_SINGLE(NORMAL, logger, "APPL: P-FRAME!");
00245 
00246           applications::session::Session::iatProbesCalculation();
00247 
00248           gopCounter += 1;
00249 
00250           if(frameGeneratingProcess == "PDF")
00251             {
00252               logNormalPDF(logMeanP, logStdP);
00253             }
00254           else if(frameGeneratingProcess == "P-AR")
00255             {
00256               logNormalProjectedAR(yP, phiP, mP, sqrValueP, kP, logMeanP, logStdP);
00257             }
00258           else if(frameGeneratingProcess == "P-ARMA")
00259             {
00260               logNormalProjectedARMA(yP, phiP, thetaP, mP, sqrValueP, kP, logMeanP, logStdP);
00261             }
00262           else if(frameGeneratingProcess == "P-FARIMA")
00263             {
00264               logNormalProjectedFarima(xP, phiPold, yP, phiP, thetaP, mP, sqrValueP,
00265                            varianceP, kP, logMeanP, logStdP);
00266             }
00267           else if(frameGeneratingProcess == "P-FDN")
00268             {
00269               logNormalProjectedFDN(xP, phiPold, yP, phiP, thetaP, mP, sqrValueP,
00270                         varianceP, kP, logMeanP, logStdP);
00271             }
00272           else if(frameGeneratingProcess == "AR")
00273             {
00274               videoAR(yP, phiP, logMeanP, logStdP);
00275             }
00276           else if(frameGeneratingProcess == "FARIMA")
00277             {
00278               videoFARIMA(xP, phiPold, yP, phiP, thetaP, varianceP, kP, logMeanP, logStdP);
00279             }
00280           else if(frameGeneratingProcess == "FDN")
00281             {
00282               videoFDN(xP, phiPold, yP, varianceP, kP, logMeanP, logStdP);
00283             }
00284           else
00285             {
00286               MESSAGE_SINGLE(NORMAL, logger, "APPL: No video P-frame generator!");
00287             }
00288 
00289           setTimeout(frametimeout, videoPacketIat);
00290         }
00291           else
00292         {
00293           gopCounter = 1;
00294           newGOP = true;
00295           onTimeout(frametimeout);
00296         }
00297         }
00298     }
00299       else
00300     {
00301       // I-Frame
00302       MESSAGE_SINGLE(NORMAL, logger, "I-FRAME!");
00303 
00304       applications::session::Session::iatProbesCalculation();
00305 
00306       if(frameGeneratingProcess == "PDF")
00307         {
00308           logNormalPDF(logMeanI, logStdI);
00309         }
00310       else if(frameGeneratingProcess == "P-AR")
00311         {
00312           logNormalProjectedAR(yI, phiI, mI, sqrValueI, kI, logMeanI, logStdI);
00313         }
00314       else if(frameGeneratingProcess == "P-ARMA")
00315         {
00316           logNormalProjectedARMA(yI, phiI, thetaI, mI, sqrValueI, kI, logMeanI, logStdI);
00317         }
00318       else if(frameGeneratingProcess == "P-FARIMA")
00319         {
00320           logNormalProjectedFarima(xI, phiIold, yI, phiI, thetaI, mI, sqrValueI,
00321                        varianceI, kI, logMeanI, logStdI);
00322         }
00323       else if(frameGeneratingProcess == "P-FDN")
00324         {
00325           logNormalProjectedFDN(xI, phiIold, yI, phiI, thetaI, mI, sqrValueI,
00326                     varianceI, kI, logMeanI, logStdI);
00327         }
00328       else if(frameGeneratingProcess == "AR")
00329         {
00330           videoAR(yI, phiI, logMeanI, logStdI);
00331         }
00332       else if(frameGeneratingProcess == "FARIMA")
00333         {
00334           videoFARIMA(xI, phiPold, yI, phiI, thetaI, varianceI, kI, logMeanI, logStdI);
00335         }
00336       else if(frameGeneratingProcess == "FDN")
00337         {
00338           videoFDN(xI, phiIold, yI, varianceI, kI, logMeanI, logStdI);
00339         }
00340       else
00341         {
00342           MESSAGE_SINGLE(NORMAL, logger, "APPL: No video I-frame generator!");
00343         }
00344 
00345       newGOP = false;
00346 
00347       setTimeout(frametimeout, videoPacketIat);
00348     }
00349     }
00350   else if(_t == probetimeout)
00351     {
00352       applications::session::Session::onTimeout(_t);
00353     }
00354   else
00355     {
00356       assure(false, "APPL: Unknown timout type =" << _t);
00357     }
00358 }
00359 
00360 
00361 void
00362 Video::calculateSLRangeDependency()
00363 {
00364   /* Callculation of the short- and longrangedependencies.
00365      For detailed discription see diplomathesis of Cem Mengi 10.07.2006:
00366      "Conception and implementation of traffic Models for VoIP and Videotelephony". */
00367   MESSAGE_SINGLE(NORMAL, logger, "APPL: Callculation of the short- and longrange dependencies!");
00368 
00369   fracI = hurstI - 0.5;
00370   fracP = hurstP - 0.5;
00371   fracB = hurstB - 0.5;
00372 
00373   autocorrI.push_back(1.0);
00374   autocorrP.push_back(1.0);
00375   autocorrB.push_back(1.0);
00376 
00377   /* This distribution is just used one time and deleted after that.
00378      Next time a new distribution is used.*/
00379   logNormDisI = new wns::distribution::Norm(meanI, varianceI);
00380   logNormValueI = (*logNormDisI)();
00381   xI.push_back(logNormValueI);
00382 
00383   logNormDisP = new wns::distribution::Norm(meanP, varianceP);
00384   logNormValueP = (*logNormDisP)();
00385   xP.push_back(logNormValueP);
00386 
00387   logNormDisB = new wns::distribution::Norm(meanB, varianceB);
00388   logNormValueB = (*logNormDisB)();
00389   xB.push_back(logNormValueB);
00390 
00391   delete logNormDisI;
00392   logNormDisI = NULL;
00393 
00394   delete logNormDisP;
00395   logNormDisP = NULL;
00396 
00397   delete logNormDisB;
00398   logNormDisB = NULL;
00399 
00400   for(i = 1; i < limit; i++)
00401     {
00402       autocorrI.push_back(autocorrI[i - 1] * ((static_cast<float>(i - 1) + fracI)/ (static_cast<float>(i) - fracI)));
00403       autocorrP.push_back(autocorrP[i - 1] * ((static_cast<float>(i - 1) + fracP)/ (static_cast<float>(i) - fracP)));
00404       autocorrB.push_back(autocorrB[i - 1] * ((static_cast<float>(i - 1) + fracB)/ (static_cast<float>(i) - fracB)));
00405 
00406       pI = 0;
00407       pP = 0;
00408       pB = 0;
00409 
00410       for(j = 1; j <= (i-1); j++)
00411     {
00412       pI = pI + phiIold[j - 1] * autocorrI[i - j];
00413       pP = pP + phiPold[j - 1] * autocorrP[i - j];
00414       pB = pB + phiBold[j - 1] * autocorrB[i - j];
00415     }
00416 
00417       dI = dI - ((nI * nI) / dI);
00418       nI = autocorrI[i] - pI;
00419       dP = dP - ((nP * nP) / dP);
00420       nP = autocorrP[i] - pP;
00421       dB = dB - ((nB * nB) / dB);
00422       nB = autocorrB[i] - pB;
00423 
00424       phiInew.push_back(nI / dI);
00425       phiPnew.push_back(nP / dP);
00426       phiBnew.push_back(nB / dB);
00427 
00428       idx = i;
00429 
00430       meanI = phiInew[0] * xI[0];
00431       meanP = phiPnew[0] * xP[0];
00432       meanB = phiBnew[0] * xB[0];
00433 
00434       for(idx = i; idx > 1; idx--)
00435     {
00436       phiInew.push_front(phiIold[idx - 2] - (phiInew[i - idx] * phiIold[i - idx]));
00437       phiPnew.push_front(phiPold[idx - 2] - (phiPnew[i - idx] * phiPold[i - idx]));
00438       phiBnew.push_front(phiBold[idx - 2] - (phiBnew[i - idx] * phiBold[i - idx]));
00439 
00440       meanI = meanI + (phiInew[0] * xI[i - idx + 1]);
00441       meanP = meanP + (phiPnew[0] * xP[i - idx + 1]);
00442       meanB = meanB + (phiBnew[0] * xB[i - idx + 1]);
00443 
00444     }
00445       varianceI = (1 - pow(phiInew[i - 1], 2)) * varianceI;
00446       varianceP = (1 - pow(phiPnew[i - 1], 2)) * varianceP;
00447       varianceB = (1 - pow(phiBnew[i - 1], 2)) * varianceB;
00448 
00449       /* This distribution is just used one time and deleted after that.
00450      Next time a new distribution is used.*/
00451       logNormDisI = new wns::distribution::Norm(meanI, varianceI);
00452       logNormValueI = (*logNormDisI)();
00453       xI.push_back(logNormValueI);
00454 
00455       logNormDisP = new wns::distribution::Norm(meanP, varianceP);
00456       logNormValueP = (*logNormDisP)();
00457       xP.push_back(logNormValueP);
00458 
00459       logNormDisB = new wns::distribution::Norm(meanB, varianceB);
00460       logNormValueB = (*logNormDisB)();
00461       xB.push_back(logNormValueB);
00462 
00463       phiIold.clear();
00464       phiPold.clear();
00465       phiBold.clear();
00466 
00467       phiIold = phiInew;
00468       phiPold = phiPnew;
00469       phiBold = phiBnew;
00470 
00471       phiInew.clear();
00472       phiPnew.clear();
00473       phiBnew.clear();
00474 
00475       delete logNormDisI;
00476       logNormDisI = NULL;
00477 
00478       delete logNormDisP;
00479       logNormDisP = NULL;
00480 
00481       delete logNormDisB;
00482       logNormDisB = NULL;
00483     }
00484 
00485   xI.pop_front();
00486   xP.pop_front();
00487   xB.pop_front();
00488 
00489   autocorrI.clear();
00490   autocorrP.clear();
00491   autocorrB.clear();
00492 }
00493 
00494 void
00495 Video::logNormalProjectedFarima(std::deque<double> _x, std::deque<double> _phiold, double _y,
00496                 double _phi, double _theta, double _m, double _sqrValue,
00497                 double _variance, int _k, double _logMean, double _logStd)
00498 {
00499   mean = 0;
00500   n = 0;
00501 
00502   while(n < limit - 1)
00503     {
00504       mean = mean + _x[n] * _phiold[limit - n - 2];
00505 
00506       n = n + 1;
00507     }
00508 
00509   _variance = (1 - pow(_phiold[limit - 2], 2)) * _variance;
00510 
00511   normDis = new wns::distribution::Norm(mean, _variance);
00512   normValue = (*normDis)();
00513   _x.push_back(normValue);
00514 
00515   _y = _phi * _y + _x[limit - 1] + _theta * _x[limit - 2];
00516 
00517   _m = _m + _y;
00518 
00519   _sqrValue = _sqrValue + pow(_y, 2);
00520 
00521   normMean = _m / static_cast<int>((float)(_k + 1));
00522 
00523   normStd = ( _sqrValue - (pow(_m,2) / static_cast<int>((float)(_k + 1)))) / static_cast<int>((float)(_k));
00524 
00525   projection = exp(_logMean + (_logStd * ((_y - normMean) / sqrt(normStd))));
00526 
00527   if(byteFlag == true)
00528     {
00529       packetSize = (projection * 8.0) + 4.0;
00530     }
00531   else
00532     {
00533       packetSize = projection + 4.0;
00534     }
00535 
00536   _x.pop_front();
00537   _k = _k + 1;
00538 
00539   delete normDis;
00540   normDis = NULL;
00541 
00542   applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco);
00543   applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime());
00544 
00545   if(firstPacketNumber == true)
00546     {
00547       packetNumber = 1;
00548       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00549       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00550 
00551       firstPacketNumber = false;
00552     }
00553   else
00554     {
00555       ++packetNumber;
00556       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00557       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00558     }
00559 
00560   wns::osi::PDUPtr pdu(applicationPDU);
00561   applications::session::Session::outgoingProbesCalculation(pdu);
00562 
00563   connection->sendData(pdu);
00564 }
00565 
00566 
00567 void
00568 Video::logNormalPDF(double _logMean, double _logStd)
00569 {
00570   logNormVariance = pow(_logStd, 2);
00571 
00572   logNormDis = new wns::distribution::LogNorm(_logMean, logNormVariance);
00573   logNormValue = (*logNormDis)();
00574 
00575   value = exp(logNormValue);
00576 
00577   if(byteFlag == true)
00578     {
00579       packetSize = (value * 8.0) + 4.0;
00580     }
00581   else
00582     {
00583       packetSize = value + 4.0;
00584     }
00585 
00586   applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco);
00587   applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime());
00588 
00589   if(firstPacketNumber == true)
00590     {
00591       packetNumber = 1;
00592       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00593       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00594 
00595       firstPacketNumber = false;
00596     }
00597   else
00598     {
00599       ++packetNumber;
00600       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00601       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00602     }
00603 
00604   wns::osi::PDUPtr pdu(applicationPDU);
00605   applications::session::Session::outgoingProbesCalculation(pdu);
00606 
00607   connection->sendData(pdu);
00608 
00609   delete logNormDis;
00610   logNormDis = NULL;
00611 }
00612 
00613 
00614 void
00615 Video::logNormalProjectedAR(double _y, double _phi, double _m, double _sqrValue,
00616                 int _k, double _logMean, double _logStd)
00617 {
00618   normDis = new wns::distribution::Norm(0.0, 1.0);
00619   normValue = (*normDis)();
00620 
00621   _y = _phi * _y + normValue;
00622 
00623   _m = _m + _y;
00624 
00625   _sqrValue = _sqrValue + pow(_y, 2);
00626 
00627   normMean = _m / static_cast<int>((float)(_k + 1));
00628 
00629   normStd = ( _sqrValue - (pow(_m,2) / static_cast<int>((float)(_k + 1)))) / static_cast<int>((float)(_k));
00630 
00631   projection = exp(_logMean + (_logStd * ((_y - normMean) / sqrt(normStd))));
00632 
00633   if(byteFlag == true)
00634     {
00635       packetSize = (projection * 8.0) + 4.0;
00636     }
00637   else
00638     {
00639       packetSize = projection + 4.0;
00640     }
00641 
00642   applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco);
00643   applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime());
00644 
00645   if(firstPacketNumber == true)
00646     {
00647       packetNumber = 1;
00648       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00649       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00650 
00651       firstPacketNumber = false;
00652     }
00653   else
00654     {
00655       ++packetNumber;
00656       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00657       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00658     }
00659 
00660   wns::osi::PDUPtr pdu(applicationPDU);
00661   applications::session::Session::outgoingProbesCalculation(pdu);
00662 
00663   connection->sendData(pdu);
00664 
00665   delete normDis;
00666   normDis = NULL;
00667 
00668   _k = _k + 1;
00669 }
00670 
00671 
00672 void
00673 Video::logNormalProjectedARMA(double _y, double _phi, double _theta, double _m,
00674                   double _sqrValue, int _k, double _logMean, double _logStd)
00675 {
00676   normDis = new wns::distribution::Norm(0.0, 1.0);
00677   normValue = (*normDis)();
00678 
00679   _y = _phi * _y + _theta * normValue;
00680 
00681   _m = _m + _y;
00682 
00683   _sqrValue = _sqrValue + pow(_y, 2);
00684 
00685   normMean = _m / static_cast<int>((float)(_k + 1));
00686 
00687   normStd = (_sqrValue - (pow(_m, 2) / static_cast<int>((float)(_k + 1)))) / static_cast<int>((float)(_k));
00688 
00689   projection = exp(_logMean + (_logStd * ((_y - normMean) / sqrt(normStd))));
00690 
00691   if(byteFlag == true)
00692     {
00693       packetSize = (projection * 8.0) + 4.0;
00694     }
00695   else
00696     {
00697       packetSize = projection + 4.0;
00698     }
00699 
00700   applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco);
00701   applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime());
00702 
00703   if(firstPacketNumber == true)
00704     {
00705       packetNumber = 1;
00706       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00707       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00708 
00709       firstPacketNumber = false;
00710     }
00711   else
00712     {
00713       ++packetNumber;
00714       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00715       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00716     }
00717 
00718   wns::osi::PDUPtr pdu(applicationPDU);
00719   applications::session::Session::outgoingProbesCalculation(pdu);
00720 
00721   connection->sendData(pdu);
00722 
00723   delete normDis;
00724   normDis = NULL;
00725   _k = _k + 1;
00726 }
00727 
00728 
00729 void
00730 Video::logNormalProjectedFDN(std::deque<double> _x, std::deque<double> _phiold, double _y,
00731                  double _phi, double _theta, double _m, double _sqrValue,
00732                  double _variance, int _k, double _logMean, double _logStd)
00733 {
00734   mean = 0;
00735   n = 0;
00736 
00737   while(n < limit - 1)
00738     {
00739       mean = mean + _x[n] * _phiold[limit - n - 2];
00740 
00741       n = n + 1;
00742     }
00743 
00744   _variance = (1 - pow(_phiold[limit - 2], 2)) * _variance;
00745 
00746   normDis = new wns::distribution::Norm(mean, _variance);
00747   normValue = (*normDis)();
00748 
00749   _x.push_back(normValue);
00750 
00751   _y = _x[limit - 1];
00752 
00753   _m = _m + _y;
00754 
00755   _sqrValue = _sqrValue + pow(_y, 2);
00756 
00757   normMean = _m / static_cast<int>((float)(_k + 1));
00758 
00759   normStd = ( _sqrValue - (pow(_m, 2) / static_cast<int>((float)(_k + 1)))) / static_cast<int>((float)(_k));
00760 
00761   projection = exp(_logMean + (_logStd * ((_y - normMean) / sqrt(normStd))));
00762 
00763   if(byteFlag == true)
00764     {
00765       packetSize = (projection * 8.0) + 4.0;
00766     }
00767   else
00768     {
00769       packetSize = projection + 4.0;
00770     }
00771 
00772   _x.pop_front();
00773   _k = _k + 1;
00774   delete normDis;
00775   normDis = NULL;
00776 
00777   applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco);
00778   applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime());
00779 
00780   if(firstPacketNumber == true)
00781     {
00782       packetNumber = 1;
00783       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00784       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00785 
00786       firstPacketNumber = false;
00787     }
00788   else
00789     {
00790       ++packetNumber;
00791       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00792       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00793     }
00794 
00795   wns::osi::PDUPtr pdu(applicationPDU);
00796   applications::session::Session::outgoingProbesCalculation(pdu);
00797 
00798   connection->sendData(pdu);
00799 }
00800 
00801 
00802 void
00803 Video::videoAR(double _y, double _phi, double _logMean, double _logStd)
00804 {
00805   normDis = new wns::distribution::Norm(0.0, 1.0);
00806   normValue = (*normDis)();
00807 
00808   _y = _phi * _y + normValue;
00809 
00810   // Mean of lognormal distribution is exp(mu+sigma^2/2) and variance is (exp(sigma^2)-1)*exp(2*mu+sigma^2)
00811   projection = exp(_logMean + _logStd * _logStd / 2) +
00812     sqrt((exp(_logStd * _logStd) - 1) *
00813      exp(2 * _logMean + _logStd * _logStd)) * _y;
00814 
00815   if(byteFlag == true)
00816     {
00817       packetSize = (projection * 8.0) + 4.0;
00818     }
00819   else
00820     {
00821       packetSize = projection + 4.0;
00822     }
00823 
00824   applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco);
00825   applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime());
00826 
00827   if(firstPacketNumber == true)
00828     {
00829       packetNumber = 1;
00830       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00831       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00832 
00833       firstPacketNumber = false;
00834     }
00835   else
00836     {
00837       ++packetNumber;
00838       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00839       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00840     }
00841 
00842   wns::osi::PDUPtr pdu(applicationPDU);
00843   applications::session::Session::outgoingProbesCalculation(pdu);
00844 
00845   connection->sendData(pdu);
00846 
00847   delete normDis;
00848   normDis = NULL;
00849 }
00850 
00851 
00852 void
00853 Video::videoFARIMA(std::deque<double> _x, std::deque<double> _phiold, double _y, double _phi,
00854            double _theta, double _variance, int _k, double _logMean, double _logStd)
00855 {
00856   mean = 0;
00857   n = 0;
00858 
00859   while(n < limit - 1)
00860     {
00861       mean = mean + _x[n] * _phiold[limit - n - 2];
00862 
00863       n = n + 1;
00864     }
00865   _variance = (1 - pow(_phiold[limit - 2], 2)) * _variance;
00866 
00867   normDis = new wns::distribution::Norm(mean, _variance);
00868   normValue = (*normDis)();
00869   _x.push_back(normValue);
00870 
00871   _y = _phi * _y + _x[limit - 1] + _theta * _x[limit - 2];
00872 
00873   projection = exp(_logMean + _logStd * _logStd / 2) +
00874     sqrt((exp(_logStd * _logStd) - 1) *
00875      exp(2 * _logMean + _logStd * _logStd)) * _y;
00876 
00877   if(byteFlag == true)
00878     {
00879       packetSize = (projection * 8.0) + 4.0;
00880     }
00881   else
00882     {
00883       packetSize = projection + 4.0;
00884     }
00885 
00886   applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco);
00887   applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime());
00888 
00889   if(firstPacketNumber == true)
00890     {
00891       packetNumber = 1;
00892       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00893       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00894 
00895       firstPacketNumber = false;
00896     }
00897   else
00898     {
00899       ++packetNumber;
00900       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00901       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00902     }
00903 
00904   wns::osi::PDUPtr pdu(applicationPDU);
00905   applications::session::Session::outgoingProbesCalculation(pdu);
00906 
00907   connection->sendData(pdu);
00908 
00909   _x.pop_front();
00910   _k = _k + 1;
00911   delete normDis;
00912   normDis = NULL;
00913 }
00914 
00915 
00916 void
00917 Video::videoFDN(std::deque<double> _x, std::deque<double> _phiold, double _y,
00918         double _variance, int _k, double _logMean, double _logStd)
00919 {
00920   mean = 0;
00921   n = 0;
00922 
00923   while( n < limit - 1)
00924     {
00925       mean = mean + _x[n] * _phiold[limit - n - 2];
00926 
00927       n = n + 1;
00928     }
00929   _variance = (1 - pow(_phiold[limit - 2], 2)) * _variance;
00930 
00931   normDis = new wns::distribution::Norm(mean, _variance);
00932   normValue = (*normDis)();
00933   _x.push_back(normValue);
00934 
00935   _y = _x[limit - 1];
00936 
00937   projection = exp(_logMean + _logStd * _logStd / 2) +
00938     sqrt((exp(_logStd * _logStd) - 1) *
00939      exp(2 * _logMean + _logStd * _logStd)) * _y;
00940 
00941   if(byteFlag == true)
00942     {
00943       packetSize = (projection * 8.0) + 4.0;
00944     }
00945   else
00946     {
00947       packetSize = projection + 4.0;
00948     }
00949 
00950   applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco);
00951   applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime());
00952 
00953   if(firstPacketNumber == true)
00954     {
00955       packetNumber = 1;
00956       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00957       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00958 
00959       firstPacketNumber = false;
00960     }
00961   else
00962     {
00963       ++packetNumber;
00964       applicationPDU->setPacketNumber(packetNumber, packetFrom);
00965       MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << ".");
00966     }
00967 
00968   wns::osi::PDUPtr pdu(applicationPDU);
00969   applications::session::Session::outgoingProbesCalculation(pdu);
00970 
00971   connection->sendData(pdu);
00972 
00973   _x.pop_front();
00974   _k = _k + 1;
00975   delete normDis;
00976   normDis = NULL;
00977 }
00978 

Generated on Sun May 27 03:32:16 2012 for openWNS by  doxygen 1.5.5