您的位置:首页 > 运维架构 > Linux

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: