pans
2017-08-15 e26a5550539fa0cad91313bf9670df605199a324
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()
@@ -148,14 +152,16 @@
   }
};
FaceCacheForPLBG::FaceCacheForPLBG() : _ctx(new FcPmBreackerContextPLBG)
FaceCacheForPLBG::FaceCacheForPLBG() : _ctx(new FcPmBreackerContextPLBG), resultBuffer(nullptr)
{
   resultBuffer = new uint8_t[FACECACHEFORPLBG_RESULT_BUFFSIZE];
}
FaceCacheForPLBG::~FaceCacheForPLBG()
{
   delete (FcPmBreackerContextPLBG*)_ctx;
   delete resultBuffer;
   resultBuffer = nullptr;
}
@@ -178,10 +184,49 @@
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;
}
bool FaceCacheForPLBG::getFaceListPb(uint8_t* buffer, size_t& buffMaxSize)
{
@@ -232,7 +277,6 @@
   return buffMaxSize > 0;
}
bool FaceCacheForPLBG::getFaceListImage(std::vector<NativeImgIdx>& imgIdxes, uint8_t* buffImg, size_t& buffImgMaxSize)
{
   FcPmBreackerContextPLBG& ctx(*(FcPmBreackerContextPLBG*)_ctx);
@@ -269,4 +313,3 @@
   return  true;
}