基于内存缓冲区的流媒体数据缓存(4)
结束
7、总算法框图
开始
数据包到来
多节目处理
decision=1?
数据包传送结束?
clearremainer函数
丢失和缓冲区大小限制
处理
重复数据包处理
乱序和多线程处理
顺序输出函数
delete类
结束 四、实验代码
#include
const int maxbaglength=1500; struct databag{ int length;
int indataoffset; int ID;
char data[maxbaglength];};//数据包,备注:节目类接收的数据包是具有乱序、丢失、重复和多节目ID的属性的
struct b{
vector
b* next;//指向下一个存储体
int judge;};//judge是一个判断该存储体是否被选中作为数据输出的源。为1,则被选中,每次输出完毕后,清除标志
const int programnumber=6;//存储池池位
b* bufferpond[programnumber];//构建缓冲区池,用来为每个节目分配缓冲区
class program{ public:
program();
void printdata(databag* bag); void clearremainer();
int computer(int baglength); int forceout(int baglength); int fence(int offset);
void receivedata(int indataoffset,int length,char* databag); int remaindata(int decision,char* &poutdata); void cleardata(int useddata); ~program(); private:
FILE* targetfilepoint;
b* buffer;
vector
int endnumber;//用来阻挡已经不需要的数据包
vector
program* next;};
program::program(int bagID) {
char targetfilename[500];
for(int i=0;i if(bufferpond[i]==NULL) { bufferpond[i]=new b; buffer=bufferpond[i]; buffer->judge=0; buffer->next=NULL; buffer->offset=0; cout<<\存储区分配成功!\ cout<<\输入%d节目的目的文件名:\ cin>>targetfilename; targetfilepoint=fopen(targetfilename,\ if(targetfilepoint==NULL) { cout<<\目的文件创建失败!\ return; }//初始化目的文件指针 break; } if((i==programnumber-1)) { cout<<\存储池已满!\ cout<<\新类创建失败!\ return; } }//存储池为该节目类分配缓冲区 endnumber=0; outdataoffset=NULL; ID=bagID; next=NULL; }//初始化类 void program::printdata(databag* bag,bool decision) { if(decision==1) { if(next!=NULL) next->printdata(bag,decision); clearremainer() ; return; }//数据包接收结束,输出当前类的剩余数据,并通知其他的类输出剩余数据 if(bag->ID!=ID) { if(next!=NULL) next->printdata(bag); else { next=new program(bag->ID); next->printdata(databag* bag); } }//数据包接收,比较数据包ID,如果现有的类可以接收这个ID的数据包,那么接收;否则在有池位的情况下,启动新的类 int offset=0; int remainer=0; char* poutdata=NULL; int useddata; if(bag->length>0) { offset=bag->length+bag->indataoffset; if(originalone.size()==1||originaltwo.size()==1) { if(originalone.size()==1) { if(bag->indataoffset>originalone[0]&&bag->indataoffset if(originaltwo.size()==1) { if(bag->indataoffset>originaltwo[0]&&bag->indataoffset } } //拦截目的文件中已不再需要的数据包 if(fence(offset)==1) continue;//栅栏拦截成功,重复数据包丢弃 if(bag->length>512*1024) continue;//如果数据包长度大于缓冲区限制,丢弃 while(computer(bag->length)>=1) { if(forceout(bag->length))==0) break; } //计算缓冲区数据量,如果当前数据包插入会溢出(512K),那么执行强制输出 receivedata(bag->indataoffset,bag->length,bag->data); remainer=remaindata(1,poutdata); if(remainer>1024) { useddata=remainer-100; fseek(targetfilepoint,outdataoffset,SEEK_SET); fwrite(poutdata,useddata,1,targetfilepoint); outdataoffset=outdataoffset+useddata; endnumber=endnumber+useddata; cleardata(useddata); } } }//当文件没有读取完毕时,同时进行文件输出函数 void program::clearremainer() { int remainer; char* poutdata; b* help; help=buffer->next; while(help!=NULL) { if(help->arra.size()!=0) { for(int i=0;i buffer->arra.push_back(help->arra[i]); help->arra.clear();
…… 此处隐藏:1090字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用模板]第八章:法国“新浪潮”与“左岸派”
- [实用模板]2021年北京上半年临床医学检验技师生物
- [实用模板]SAP GUI 7.10客户端安装配置文档
- [实用模板]2001年临床执业医师资格考试综合笔试试
- [实用模板]36机场工作实用英语词汇总结
- [实用模板](一)社会保险稽核通知书
- [实用模板]安全教育主题班会材料
- [实用模板]濉溪县春季呼吸道传染病防控应急演练方
- [实用模板]长沙房地产市场周报(1.30-2.3)
- [实用模板]六年级数学上册典中点 - 图文
- [实用模板]C程序设计(红皮书)习题官方参考答案
- [实用模板]中国证监会第一届创业板发行审核委员会
- [实用模板]桥梁工程复习题
- [实用模板]2011学而思数学及答案
- [实用模板]初中病句修改专项练习
- [实用模板]监理学习知识1 - 图文
- [实用模板]小机灵杯四年级试题
- [实用模板]国贸专业毕业论文模板
- [实用模板]教育学概论考试练习题-判断题4
- [实用模板]2015届高考英语一轮复习精品资料(译林
- 00Nkmhe_市场营销学工商管理_电子商务_
- 事业单位考试法律常识
- 诚信教育实施方案
- 吉大小天鹅食品安全检测箱方案(高中低
- 房地产销售培训资料
- 高一地理必修1复习提纲
- 新概念英语第二册lesson_1_练习题
- 证券公司内部培训资料
- 小学英语时间介词专项练习
- 新世纪英语专业综合教程(第二版)第1册U
- 【新课标】浙教版最新2018年八年级数学
- 工程建设管理纲要
- 外研版 必修一Module 4 A Social Surve
- Adobe认证考试 AE复习资料
- 基于H.264AVC与AVS标准的帧内预测技术
- 《食品检验机构资质认定管理办法》(质
- ABB变频器培训课件
- (完整版)小学说明文阅读练习题及答案
- 深思洛克(SenseLock) 深思IV,深思4,深
- 弟子规全文带拼音




