⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cvideodatams.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////
//  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 + -