houxiao
2017-08-02 afcb649c8a2785c6095be5762c6077f9e15afd1a
VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp
@@ -39,9 +39,13 @@
   size_t frameRGBSize;
   bool frameTruncated;
   typedef std::map<int, float> block_score_filter_map_t;
   block_score_filter_map_t blockScoreFilter;
   FcPmBreackerContextPLBG() :
         lastOutputs(), lastOutputsRGBBufs(), frameYUV(), frameYUVSize(0), frameRGB(),frameRGBSize(0),
         frameTruncated(false)
         frameTruncated(false),
         blockScoreFilter()
   {}
   void reset()
@@ -178,8 +182,48 @@
size_t FaceCacheForPLBG::getFaceCount(const PipeMaterial& pm) const
{
   FcPmBreackerContextPLBG& ctx(*(FcPmBreackerContextPLBG*)_ctx);
   plbg_output_vec_t* plbgOut = (plbg_output_vec_t*)pm.buffer;
   return plbgOut->size();
   bool hasFiltedBlock = false;
   int min_st_track_id = 0;
   for (plbg_output_vec_t::iterator iterBGOut = plbgOut->begin(); iterBGOut != plbgOut->end(); ++iterBGOut)
   {
      int st_track_id = (int)(int64_t)(iterBGOut->rectInOriginFrame.userData);
      float score = iterBGOut->score;
      FcPmBreackerContextPLBG::block_score_filter_map_t::iterator iterFilter = ctx.blockScoreFilter.find(st_track_id);
      if (iterFilter == ctx.blockScoreFilter.end())
      {
         ctx.blockScoreFilter.insert(std::make_pair(st_track_id, score));
         hasFiltedBlock = true;
      }
      else
      {
         if (iterFilter->second < score)
         {
            iterFilter->second = score;
            hasFiltedBlock = true;
         }
      }
      if (min_st_track_id > st_track_id)
         min_st_track_id = st_track_id;
   }
   for(FcPmBreackerContextPLBG::block_score_filter_map_t::iterator iterFilter = ctx.blockScoreFilter.begin(); iterFilter != ctx.blockScoreFilter.end(); )
   {
      if (iterFilter->first < min_st_track_id)
         iterFilter = ctx.blockScoreFilter.erase(iterFilter);
      else
         ++iterFilter;
   }
   if (hasFiltedBlock)
      return plbgOut->size();
   else
      return 0;
}