LinuxC/C++编程基础(30) 视频包缓存的实现

来源:互联网 发布:stc单片机iap存储数据 编辑:程序博客网 时间:2024/05/24 15:40

1.定义cache_limit,如下:

enum CACHELIMIT {
  MAX
SPEAKERS = 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::make
pair(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);//缓存中没有找到,重新向视频前端请求,实现略去
}

转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8485475

原创粉丝点击