📄 cvideodatams.cpp
字号:
/////////////////////////////////////////////////////////////////////////
// Title: CVideoDataMs.cpp
//
// Comment: In this program,we have created a near-time video traffic
// model.
//
// Reference: 1xEV-DV evaluation methodology Strawman-V26
//
// Written by: Dou Zhongzhao
//
// Date: 08/28/2001
//
// Revised record:
//
/////////////////////////////////////////////////////////////////////////
#include "CVideoDataMs.h"
#include "CMsManager.h"
#include <fstream>
using namespace std;
extern int iVideoPacketSize[36000];
CVideoDataMs::CVideoDataMs()
{
}
CVideoDataMs::~CVideoDataMs()
{
}
///////////////////////////////////////////////////////////////////////////
// Title: CVideoDataMs::VideoInitialization()
//
// Function: Initialize the variables in video traffic model and
// fill the buffer with data (equal to 160kb)
//
// Sample call: CVideoDataMs *pVideoDataMs
// pVideoDataMs->VideoInitialization()
//
// Called by function: CMsManager::MsInitialization()
//
// Written by: Dou Zhongzhao
//
// Programming date: 08/28/2001
//
// Revised record:
//
//////////////////////////////////////////////////////////////////////////
void CVideoDataMs::VideoInitialization()
{
m_iVideoBufferSize=DelayLimit*1000; //缓冲器窗口长度为5s,5000ms,化为7500slot,相当于最大要求的时延
m_iVideoFrameInterval=0; //帧间隔为100ms,化为150slot
m_iVideoFrameSize=0; //初始化当前帧的数据量
m_iVideoGeneratedDataPerFrame=0; //当前帧已经生成的数据量
// m_iVideoTotalPacketNumInFrame=12; //每帧的分组数目,定为8
m_iVideoPacketSize=0; //数据包的大小初始化为0,以后将调用VideoPacketGeneration()函数生成
// m_iVideoPacketSizeK=160; //pareto分布参数K,单位:bit
// m_fVideoPacketSizeAlpha=float(1.2); //pareto分布参数α
// m_iVideoPacketSizeMaximum=1000; //单位:bit
m_iVideoPacketInterval=59; //packet间隔,初始化为40ms
// m_fVideoPacketIntervalK=2; //pareto分布参数K,单位:slot
// m_fVideoPacketIntervalAlpha=float(1.2); //pareto分布参数α
// m_iVideoPacketIntervalMaximum=10; //单位:slot
m_iVideoGeneratedPacketNumInFrame=0; //当前帧已经生成的packet的数量
m_bIsVideoFrameDataOver=false; //判断本帧最后一个packet是否已经生成
//zl 20060329
m_iVideoPacketPointer=(int)(36000*xUniform());
// if(m_iVideoPacketPointer>36000)
// m_iVideoPacketPointer=0;
//向缓冲器中存放数据比特为160kb,即将数据队列初始化为160kb
m_lDataQueueSize=iVideoPacketSize[m_iVideoPacketPointer]; //单位:bit
m_iCurrentSlotNum=0; //仿真中当前时隙
FLVIDEOPACKETARRIVALMESSAGE_TYPE *pFLVideoPacketArrivalMessage=new FLVIDEOPACKETARRIVALMESSAGE_TYPE;
pFLVideoPacketArrivalMessage->iPacketSize=iVideoPacketSize[m_iVideoPacketPointer];
pFLVideoPacketArrivalMessage->iPacketIndex=m_iVideoPacketPointer;
pFLVideoPacketArrivalMessage->iTimeOfGeneratePacket=m_iCurrentSlotNum;
pFLVideoPacketArrivalMessage->iPacketDropLimit=0;
pFLVideoPacketArrivalMessage->bIsSucfulTrans=true;
m_FLVideoPacketArrivalMsgList.AddTail(pFLVideoPacketArrivalMessage);
m_enTrafficType = VIDEO; //初始化业务类型 20051212
}
///////////////////////////////////////////////////////////////////////////
// Title: CVideoDataMs::VideoPacketGeneration()
//
// Function: With this function we complete the following operation:
// 1)According to pareto distribution,this function generates a packet and adds it to data queue
// 2)Judge if the last packet in the current frame has been generated.
// 3)Number the packet
// ***Note:complete this operation in the function VideoFrameProcess()
// 4)Generate the interval between packets
//
// Calling function: void VideoPacketIntervalGeneration()
// void IsVideoFrameDataOver()
//
// Called by function: CVideoDataMs::VideoFrameProcess()
//
// Written by: Dou Zhongzhao
//
// Programming date: 08/28/2001
//
// Revised record:
//
//////////////////////////////////////////////////////////////////////////
void CVideoDataMs::VideoPacketGeneration()
//根据packet的pareto分布生成一个packet的数据量,同时加入到数据队列中,
//用m_bIsVideoDataFrameOver判断当前的帧是否结束,将packet编号,
//并调用VideoPacketIntervalGenerator()函数生成packet的间隔,
//并把已经生成的packet数量加1,同时调用IsVideoFrameDataOver()函数。
{
//生成packet数据量
m_iVideoPacketSize=xPareto(m_fVideoPacketSizeAlpha,(float)m_iVideoPacketSizeK,m_iVideoPacketSizeMaximum);
//加入到数据队列中
m_lDataQueueSize+=m_iVideoPacketSize;
//累加当前帧的数据量
m_iVideoGeneratedDataPerFrame+=m_iVideoPacketSize;
//将当前帧中已经生成的packet数加1
m_iVideoGeneratedPacketNumInFrame++;
//判断当前帧中最后一个packet是否生成
IsVideoFrameDataOver();
//生成packet时间间隔
VideoPacketIntervalGeneration();
//zl 20060328
m_iTotalVideoPacketNum++;
}
///////////////////////////////////////////////////////////////////////////
// Title: CVideoDataMs::VideoPacketIntervalGeneration()
//
// Function: Generating interval between packets
//
// Calling function: no function
//
// Called by function: CVideoDataMs::VideoPacketGeneration()
//
// Written by: Dou Zhongzhao
//
// Programming date: 08/28/2001
//
// Revised record:
//
//////////////////////////////////////////////////////////////////////////
void CVideoDataMs::VideoPacketIntervalGeneration() //根据pareto分布产生数据包间隔,生成的结果以秒为单位,然后换算成时隙。
{
m_iVideoPacketInterval=xPareto(m_fVideoPacketIntervalAlpha,m_fVideoPacketIntervalK,m_iVideoPacketIntervalMaximum);
/************************** for test,to be delete!! *****************/
// cout<<"********************************************************"<<endl;
// cout<<"VideoPacketInterval="<<m_iVideoPacketInterval<<endl;
}
///////////////////////////////////////////////////////////////////////////
// Title: CVideoDataMs::IsVideoFrameDataOver()
//
// Function: Judge if the last packet of current frame have been generated.
//
// Calling function: call no function
//
// Called by function: CVideoDataMs::CVideoPacketGeneration()
// CVideoDataMs::CVideoFrameProcess()
//
// Written by: Dou Zhongzhao
//
// Programming date: 08/28/2001
//
// Revised record:
//
//////////////////////////////////////////////////////////////////////////
void CVideoDataMs::IsVideoFrameDataOver() //判断当前帧的最后一个packet是否已经生成的函数
{
if(m_iVideoGeneratedPacketNumInFrame>=m_iVideoTotalPacketNumInFrame)
m_bIsVideoFrameDataOver=true;
else
m_bIsVideoFrameDataOver=false;
}
///////////////////////////////////////////////////////////////////////////
// Title: CVideoDataMs::VideoFrameProcess()
//
// Function: This function is the main function of video traffic model.
// Please see the flowchart in the file "near-real time video traffic model".
//
// Calling function: void CVideoDataMs::VideoFrameSetUp()
// void CVideoDataMs::VideoPacketGeneration()
//
// Called by function: CMsManager::DataProcess()
//
// Sample call: CVideoDataMs *pVideoDataMs;
// pVideoDataMs->VideoFrameProcess();
//
// Written by: Dou Zhongzhao
//
// Programming date: 08/29/2001
//
// Revised record:
//
//////////////////////////////////////////////////////////////////////////
void CVideoDataMs::VideoFrameProcess() //帧处理函数
{
m_iCurrentSlotNum=m_pMsManager->m_iSlotCurrentNum; //20051212
// m_iVideoFrameInterval--;
/*--------------------------------------------------------------*/
//判断当前帧的最后一个分组是否已经生成
if(m_bIsVideoFrameDataOver==false)
{
//判断packet是否到达
if(m_iVideoPacketInterval<=0)
{
// VideoPacketGeneration();
m_iVideoPacketPointer++;
if(m_iVideoPacketPointer==36000)
{
m_iVideoPacketPointer=0;
}
m_iVideoPacketSize=iVideoPacketSize[m_iVideoPacketPointer];
m_lDataQueueSize += m_iVideoPacketSize;
m_iVideoPacketInterval=59;
m_iTotalVideoPacketNum++;
if(m_iVideoPacketPointer%12==0)
m_iTotalVideoIFrameNum++;
/*----------------------------------------------------------------*/
//为了统计packet吞吐量及时延特性,增加下面几句
//修改为链表用于时延统计 20060217
FLVIDEOPACKETARRIVALMESSAGE_TYPE *pFLVideoPacketArrivalMessage=new FLVIDEOPACKETARRIVALMESSAGE_TYPE;
pFLVideoPacketArrivalMessage->iPacketSize=m_iVideoPacketSize;
pFLVideoPacketArrivalMessage->iPacketIndex=m_iVideoPacketPointer;
pFLVideoPacketArrivalMessage->iTimeOfGeneratePacket=m_iCurrentSlotNum;
pFLVideoPacketArrivalMessage->iPacketDropLimit=0;
pFLVideoPacketArrivalMessage->bIsSucfulTrans=true;
m_FLVideoPacketArrivalMsgList.AddTail(pFLVideoPacketArrivalMessage);
/*
///////////////////////////////////////////////////////
//记录当前Packet消息
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -