LinuxC/C++编程基础(30) 视频包缓存的实现
2013-01-09 14:15
776 查看
1.定义cache_limit,如下:
enum CACHELIMIT {MAXSPEAKERS = 8,//表示连接对象的最大数
MAX_PKTS = 20 //表示每个连接对象缓存包的最大数
};
2.视频包的定义,如下:
struct VideoPkt{
uint32_t _from;
uint32_t _sid;
uint32_t _seq;
uint32_t _time_stamp;
std::string& payload;
static int parseFrom(const char* data, size_t len, videoPkt** out);
};
3.videoUidMap的定义,如下:
Poco::HashMap < uint32_t, std::map< uint32_t, Poco::SharedPtr< VideoPkt> > > videoUidMap;4.视频包的缓存,如下:
void onVideoRes(const char* pack, int length) {videoPkt *pkt = NULL;
videoPkt::parseFrom(pack, length, &pkt);
//把解析出来的视频数据回发给客户端,实现略去,这里着重讲缓存的实现
//delete pkt; //不删除解析出来的pkt,而是用来更新缓存
//update cache
Poco::HashMap< uint32_t, std::map< uint32_t, Poco::SharedPtr< VideoPkt> > >::Iterator itr = videoUidMap.find(pkt->_from);
if(itr == videoUidMap.end()) {//没有找到,说明是新的连接对象
if(videoUidMap.size() < MAX_SPEAKERS) {
std::map< uint32_t,Poco::SharedPtr< VideoPkt> > amap;
videoUidMap.insert( std::makepair(pkt->_from, amap));
itr = videoUidMap.find(pkt->_from);
} else {
return;
}
}
if(itr->second.size() == MAX_PKTS) {
itr->second.erase(itr->second.begin());
}
Poco::SharedPtr p(pkt);
itr->second.insert(std::makepair(pkt->_seq, p));
}
5.重传请求的实现,如下:
bool onReSendVideoReq(uint32_t uid,uint32_t seq) {Poco::HashMap< uint32t, std::map< uint32t, Poco::SharedPtr< VideoPkt> > >::Iterator itt = videoUidMap.find(uid);
if(itt != videoUidMap.end()) {
std::map< uint32_t, Poco::SharedPtr< VideoPkt> >::iterator ita = itt->second.find(seq);
if(ita != itt->second.end()) { //表示在本地缓存中找到了丢失的视频包
//判断监听Id是否无效,无效的话,返回false,这里略去
//把从缓存中找到的视频数据包回发给客户端,这里略去
return true;
}
return ReSendVideo(uid,seq);//缓存中没有找到,重新向视频前端请求,实现略去
}
转载请注明出处:山水间博客,/article/2317663.html
相关文章推荐
- LinuxC/C++编程基础(33) 视频包缓存的实现(续1)
- LinuxC/C++编程基础(1) 函数指针实现复数的加减乘除
- LinuxC/C++编程基础(9) 二叉查找树的实现
- LinuxC/C++编程基础(10) quicksort的简单实现
- LinuxC/C++编程基础(17) 视频关键帧长度和宽度的解析
- LinuxC/C++编程基础(8) 基于条件变量实现生产者与消费者的实例
- LinuxC/C++编程基础(36) Poco::BinaryReader的实现
- LinuxC/C++编程基础(37) Cumulus::BinaryReader的实现
- LinuxC/C++编程基础(5) 排序二叉树的实现
- LinuxC/C++编程基础(19) 不可复制类的原理及实现
- LinuxC/C++编程基础(12) 红黑树的实现
- LinuxC/C++编程基础(4) 基于泛型实现vector
- LinuxC/C++编程基础(18) 视频关键帧长度和宽度的解析(续)
- LinuxC/C++编程基础(6) 堆排序的实现
- linux基础编程 共享内存 通过消息队列实现同步 shmget
- LinuxC/C++编程基础(25) “心跳”信息的处理
- LinuxC/C++编程基础(28) “心跳”信息的处理
- Linux下使用Vim进行C/C++ 编程基础知识详解
- linux基础编程 共享内存 通过消息队列实现同步 shmget
- Linux下使用Vim进行C/C++ 编程基础知识详解