From 7572cd33f27b512691b6acf39cd0d78d35017a46 Mon Sep 17 00:00:00 2001 From: pans <pans@454eff88-639b-444f-9e54-f578c98de674> Date: 星期五, 18 八月 2017 13:34:18 +0800 Subject: [PATCH] capnp fix bug --- VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp | 425 +++++++++++++++++++++++++++++----------------------- 1 files changed, 234 insertions(+), 191 deletions(-) diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp b/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp index 9bac863..b7502eb 100644 --- a/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp @@ -18,255 +18,298 @@ struct OutRGBBufferWrapper { - uint8_t* buffer; - size_t buffSize; + uint8_t* buffer; + size_t buffSize; - OutRGBBufferWrapper() : buffer(nullptr), buffSize(0) - { } + OutRGBBufferWrapper() : buffer(nullptr), buffSize(0) + { } - OutRGBBufferWrapper(uint8_t* _buffer, size_t _buffSize) : buffer(_buffer), buffSize(_buffSize) - { } + OutRGBBufferWrapper(uint8_t* _buffer, size_t _buffSize) : buffer(_buffer), buffSize(_buffSize) + { } }; struct FcPmBreackerContextPLBG { - plbg_output_vec_t lastOutputs; - std::vector<OutRGBBufferWrapper> lastOutputsRGBBufs; + plbg_output_vec_t lastOutputs; + std::vector<OutRGBBufferWrapper> lastOutputsRGBBufs; - uint8_t frameYUV[1920*1080*4]; - size_t frameYUVSize; - uint8_t frameRGB[1920*1080*4]; - size_t frameRGBSize; - bool frameTruncated; + uint8_t frameYUV[1920*1080*4]; + size_t frameYUVSize; + uint8_t frameRGB[1920*1080*4]; + size_t frameRGBSize; + bool frameTruncated; - FcPmBreackerContextPLBG() : - lastOutputs(), lastOutputsRGBBufs(), frameYUV(), frameYUVSize(0), frameRGB(),frameRGBSize(0), - frameTruncated(false) - {} + typedef std::map<int, float> block_score_filter_map_t; + block_score_filter_map_t blockScoreFilter; - void reset() - { - lastOutputs.clear(); - lastOutputsRGBBufs.clear(); - frameYUVSize = 0; - frameRGBSize = 0; - frameTruncated = false; - } + FcPmBreackerContextPLBG() : + lastOutputs(), lastOutputsRGBBufs(), frameYUV(), frameYUVSize(0), frameRGB(),frameRGBSize(0), + frameTruncated(false), + blockScoreFilter() + {} - void copy_data() - { - uint8_t* bufPtr = frameYUV; - for (plbg_output_vec_t::iterator iter = lastOutputs.begin(); iter != lastOutputs.end(); ++iter) - { - const uint8_t* originBuf = iter->croppedData; - if (originBuf == nullptr || iter->croppedDataSize == 0) - continue; + void reset() + { + lastOutputs.clear(); + lastOutputsRGBBufs.clear(); + frameYUVSize = 0; + frameRGBSize = 0; + frameTruncated = false; + } - if (sizeof(frameYUV) - (bufPtr - frameYUV) < iter->croppedDataSize) - { - frameTruncated = true; - LOG_WARN << "yuv buffer truncated" << LOG_ENDL; - break; - } + void copy_data() + { + uint8_t* bufPtr = frameYUV; + for (plbg_output_vec_t::iterator iter = lastOutputs.begin(); iter != lastOutputs.end(); ++iter) + { + const uint8_t* originBuf = iter->croppedData; + if (originBuf == nullptr || iter->croppedDataSize == 0) + continue; - iter->croppedData = bufPtr; - memcpy(bufPtr, originBuf, iter->croppedDataSize); - bufPtr += iter->croppedDataSize; - frameYUVSize += iter->croppedDataSize; - } - } + if (sizeof(frameYUV) - (bufPtr - frameYUV) < iter->croppedDataSize) + { + frameTruncated = true; + LOG_WARN << "yuv buffer truncated" << LOG_ENDL; + break; + } - void convert_data() - { - uint8_t* bufPtr = frameRGB; - for (plbg_output_vec_t::iterator iter = lastOutputs.begin(); iter != lastOutputs.end(); ++iter) - { - if (iter->croppedData == nullptr || iter->croppedDataSize == 0) - { - OutRGBBufferWrapper bw; - lastOutputsRGBBufs.push_back(bw); - continue; - } + iter->croppedData = bufPtr; + memcpy(bufPtr, originBuf, iter->croppedDataSize); + bufPtr += iter->croppedDataSize; + frameYUVSize += iter->croppedDataSize; + } + } - OutRGBBufferWrapper bw; - bw.buffer = bufPtr; - bw.buffSize = iter->rectInOriginFrame.rect.width() * iter->rectInOriginFrame.rect.height() * 2; //RGB565 - if (sizeof(frameRGB) - (bufPtr - frameRGB) < bw.buffSize) - { - frameTruncated = true; - OutRGBBufferWrapper bw; - lastOutputsRGBBufs.push_back(bw); - LOG_WARN << "rgb buffer truncated" << LOG_ENDL; - continue; - } + void convert_data() + { + uint8_t* bufPtr = frameRGB; + for (plbg_output_vec_t::iterator iter = lastOutputs.begin(); iter != lastOutputs.end(); ++iter) + { + if (iter->croppedData == nullptr || iter->croppedDataSize == 0) + { + OutRGBBufferWrapper bw; + lastOutputsRGBBufs.push_back(bw); + continue; + } - convertYUV420ToRGB565(*iter, bw.buffer); + OutRGBBufferWrapper bw; + bw.buffer = bufPtr; + bw.buffSize = iter->rectInOriginFrame.rect.width() * iter->rectInOriginFrame.rect.height() * 2; //RGB565 + if (sizeof(frameRGB) - (bufPtr - frameRGB) < bw.buffSize) + { + frameTruncated = true; + OutRGBBufferWrapper bw; + lastOutputsRGBBufs.push_back(bw); + LOG_WARN << "rgb buffer truncated" << LOG_ENDL; + continue; + } - lastOutputsRGBBufs.push_back(bw); - bufPtr += bw.buffSize; - frameRGBSize += bw.buffSize; - } - } + convertYUV420ToRGB565(*iter, bw.buffer); + + lastOutputsRGBBufs.push_back(bw); + bufPtr += bw.buffSize; + frameRGBSize += bw.buffSize; + } + } private: - bool convertYUV420ToRGB565(const PLBG_Output& out, uint8_t* rgbBuff) - { - int src_height = out.rectInOriginFrame.rect.height(); - int src_width = out.rectInOriginFrame.rect.width(); - const uint8* src_y = (const uint8*)(out.croppedData); - const uint8* src_u = (const uint8*)(src_y + (src_height * src_width)); - const uint8* src_v = (const uint8*)(src_u + (src_height * src_width / 4)); + bool convertYUV420ToRGB565(const PLBG_Output& out, uint8_t* rgbBuff) + { + int src_height = out.rectInOriginFrame.rect.height(); + int src_width = out.rectInOriginFrame.rect.width(); + const uint8* src_y = (const uint8*)(out.croppedData); + const uint8* src_u = (const uint8*)(src_y + (src_height * src_width)); + const uint8* src_v = (const uint8*)(src_u + (src_height * src_width / 4)); - if (out.originframe->type == MB_Frame::MBFT_YUV420) - { - libyuv::I420ToRGB565(src_y, src_width, - src_v, MH_SUBSAMPLE1(src_width, 2), - src_u, MH_SUBSAMPLE1(src_width, 2), - rgbBuff, 2 * src_width, - src_width, src_height); - } - else if (out.originframe->type == MB_Frame::MBFT_NV12) - { - libyuv::NV12ToRGB565(src_y, src_width, - src_u, src_width, - rgbBuff, 2 * src_width, - src_width, src_height); - } - else - return false; + if (out.originframe->type == MB_Frame::MBFT_YUV420) + { + libyuv::I420ToRGB565(src_y, src_width, + src_v, MH_SUBSAMPLE1(src_width, 2), + src_u, MH_SUBSAMPLE1(src_width, 2), + rgbBuff, 2 * src_width, + src_width, src_height); + } + else if (out.originframe->type == MB_Frame::MBFT_NV12) + { + libyuv::NV12ToRGB565(src_y, src_width, + src_u, src_width, + rgbBuff, 2 * src_width, + src_width, src_height); + } + else + return false; - //{ - // static size_t f = 0; - // char fname[50]; - // sprintf(fname, "/sdcard/face-%u-w%u-h%u.rgb", ++f, src_width, src_height); - // FILE *pFile = fopen(fname, "wb"); - // fwrite(rgbBuff, 1, src_height * src_width * 2, pFile); - // fclose(pFile); - // if (f > 20)exit(0); - //} - return true; - } + //{ + // static size_t f = 0; + // char fname[50]; + // sprintf(fname, "/sdcard/face-%u-w%u-h%u.rgb", ++f, src_width, src_height); + // FILE *pFile = fopen(fname, "wb"); + // fwrite(rgbBuff, 1, src_height * src_width * 2, pFile); + // fclose(pFile); + // if (f > 20)exit(0); + //} + return true; + } }; -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 (FcPmBreackerContextPLBG*)_ctx; + delete resultBuffer; + resultBuffer = nullptr; } // returns count of face int FaceCacheForPLBG::cachePm(const PipeMaterial& pm) { - FcPmBreackerContextPLBG& ctx(*(FcPmBreackerContextPLBG*)_ctx); - ctx.reset(); + FcPmBreackerContextPLBG& ctx(*(FcPmBreackerContextPLBG*)_ctx); + ctx.reset(); - plbg_output_vec_t* plbgOut = (plbg_output_vec_t*)pm.buffer; - if (plbgOut->size() == 0) - return 0; + plbg_output_vec_t* plbgOut = (plbg_output_vec_t*)pm.buffer; + if (plbgOut->size() == 0) + return 0; - ctx.lastOutputs = *plbgOut; - ctx.copy_data(); - ctx.convert_data(); + ctx.lastOutputs = *plbgOut; + ctx.copy_data(); + ctx.convert_data(); - return ctx.lastOutputs.size(); + return ctx.lastOutputs.size(); } size_t FaceCacheForPLBG::getFaceCount(const PipeMaterial& pm) const { - plbg_output_vec_t* plbgOut = (plbg_output_vec_t*)pm.buffer; - return plbgOut->size(); -} + FcPmBreackerContextPLBG& ctx(*(FcPmBreackerContextPLBG*)_ctx); + plbg_output_vec_t* plbgOut = (plbg_output_vec_t*)pm.buffer; + 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) { - FcPmBreackerContextPLBG& ctx(*(FcPmBreackerContextPLBG*)_ctx); - if (ctx.frameTruncated) - { - LOG_WARN << "ctx buffer truncated" << LOG_ENDL; - return false; - } + FcPmBreackerContextPLBG& ctx(*(FcPmBreackerContextPLBG*)_ctx); + if (ctx.frameTruncated) + { + LOG_WARN << "ctx buffer truncated" << LOG_ENDL; + return false; + } - PbFaceList pbFaceList; - pbFaceList.set_magic(pbFaceList.magic()); - pbFaceList.set_image_count(ctx.lastOutputs.size()); - pbFaceList.set_src_width(0); - pbFaceList.set_src_height(0); + PbFaceList pbFaceList; + pbFaceList.set_magic(pbFaceList.magic()); + pbFaceList.set_image_count(ctx.lastOutputs.size()); + pbFaceList.set_src_width(0); + pbFaceList.set_src_height(0); - for (int i = 0; i < ctx.lastOutputs.size(); i++) - { - PbFaceList_FaceListImage &pbFaceListImage(*(pbFaceList.add_images())); - pbFaceListImage.set_idx(i); - pbFaceListImage.set_st_track_id((int)(int64_t)(ctx.lastOutputs[i].rectInOriginFrame.userData)); - pbFaceListImage.set_size(ctx.lastOutputs[i].croppedDataSize); - pbFaceListImage.set_type(PbFaceList_FaceListImage_ImageType_MBFT_NV12); - pbFaceListImage.set_width(ctx.lastOutputs[i].rectInOriginFrame.rect.width()); - pbFaceListImage.set_height(ctx.lastOutputs[i].rectInOriginFrame.rect.height()); - pbFaceListImage.set_top_left_x(ctx.lastOutputs[i].rectInOriginFrame.rect.leftTop.X); - pbFaceListImage.set_top_left_y(ctx.lastOutputs[i].rectInOriginFrame.rect.leftTop.Y); + for (int i = 0; i < ctx.lastOutputs.size(); i++) + { + PbFaceList_FaceListImage &pbFaceListImage(*(pbFaceList.add_images())); + pbFaceListImage.set_idx(i); + pbFaceListImage.set_st_track_id((int)(int64_t)(ctx.lastOutputs[i].rectInOriginFrame.userData)); + pbFaceListImage.set_size(ctx.lastOutputs[i].croppedDataSize); + pbFaceListImage.set_type(PbFaceList_FaceListImage_ImageType_MBFT_NV12); + pbFaceListImage.set_width(ctx.lastOutputs[i].rectInOriginFrame.rect.width()); + pbFaceListImage.set_height(ctx.lastOutputs[i].rectInOriginFrame.rect.height()); + pbFaceListImage.set_top_left_x(ctx.lastOutputs[i].rectInOriginFrame.rect.leftTop.X); + pbFaceListImage.set_top_left_y(ctx.lastOutputs[i].rectInOriginFrame.rect.leftTop.Y); - pbFaceListImage.add_img(ctx.lastOutputs[i].croppedData, ctx.lastOutputs[i].croppedDataSize); + pbFaceListImage.add_img(ctx.lastOutputs[i].croppedData, ctx.lastOutputs[i].croppedDataSize); - //LOGP(ERROR, "bg output=%f", ctx.lastOutputs[i].score); + //LOGP(ERROR, "bg output=%f", ctx.lastOutputs[i].score); - //{ - // static size_t f = 0; - // char fname[50]; - // sprintf(fname, "/sdcard/face-%u-w%u-h%u.yuv420", ++f, ctx.lastOutputs[i].rectInOriginFrame.width(), ctx.lastOutputs[i].rectInOriginFrame.height()); - // FILE *pFile = fopen(fname, "wb"); - // fwrite(ctx.lastOutputs[i].croppedData, 1, ctx.lastOutputs[i].croppedDataSize, pFile); - // fclose(pFile); - // if (f > 10)exit(0); - //} - } + //{ + // static size_t f = 0; + // char fname[50]; + // sprintf(fname, "/sdcard/face-%u-w%u-h%u.yuv420", ++f, ctx.lastOutputs[i].rectInOriginFrame.width(), ctx.lastOutputs[i].rectInOriginFrame.height()); + // FILE *pFile = fopen(fname, "wb"); + // fwrite(ctx.lastOutputs[i].croppedData, 1, ctx.lastOutputs[i].croppedDataSize, pFile); + // fclose(pFile); + // if (f > 10)exit(0); + //} + } - size_t s = pbFaceList.ByteSize(); - buffMaxSize = std::min(s, buffMaxSize); - pbFaceList.SerializeToArray(buffer, buffMaxSize); + size_t s = pbFaceList.ByteSize(); + buffMaxSize = std::min(s, buffMaxSize); + pbFaceList.SerializeToArray(buffer, buffMaxSize); - return buffMaxSize > 0; + return buffMaxSize > 0; } - bool FaceCacheForPLBG::getFaceListImage(std::vector<NativeImgIdx>& imgIdxes, uint8_t* buffImg, size_t& buffImgMaxSize) { - FcPmBreackerContextPLBG& ctx(*(FcPmBreackerContextPLBG*)_ctx); - if (ctx.frameTruncated) - { - LOG_WARN << "ctx buffer truncated" << LOG_ENDL; - return false; - } - if (buffImgMaxSize < ctx.frameRGBSize) - { - LOG_WARN << "buffImg truncated" << LOG_ENDL; - return false; - } + FcPmBreackerContextPLBG& ctx(*(FcPmBreackerContextPLBG*)_ctx); + if (ctx.frameTruncated) + { + LOG_WARN << "ctx buffer truncated" << LOG_ENDL; + return false; + } + if (buffImgMaxSize < ctx.frameRGBSize) + { + LOG_WARN << "buffImg truncated" << LOG_ENDL; + return false; + } - imgIdxes.clear(); - size_t totalSize = 0; + imgIdxes.clear(); + size_t totalSize = 0; - for (int i = 0; i < ctx.lastOutputs.size(); i++) - { - NativeImgIdx imgidx; - imgidx.st_track_id = (int)(int64_t)(ctx.lastOutputs[i].rectInOriginFrame.userData); - imgidx.offset = ctx.lastOutputsRGBBufs[i].buffer - ctx.frameRGB; - imgidx.size = ctx.lastOutputsRGBBufs[i].buffSize; - imgidx.type = MB_Frame::MBFT_RGB565; - imgidx.width = ctx.lastOutputs[i].rectInOriginFrame.rect.width(); - imgidx.height = ctx.lastOutputs[i].rectInOriginFrame.rect.height(); + for (int i = 0; i < ctx.lastOutputs.size(); i++) + { + NativeImgIdx imgidx; + imgidx.st_track_id = (int)(int64_t)(ctx.lastOutputs[i].rectInOriginFrame.userData); + imgidx.offset = ctx.lastOutputsRGBBufs[i].buffer - ctx.frameRGB; + imgidx.size = ctx.lastOutputsRGBBufs[i].buffSize; + imgidx.type = MB_Frame::MBFT_RGB565; + imgidx.width = ctx.lastOutputs[i].rectInOriginFrame.rect.width(); + imgidx.height = ctx.lastOutputs[i].rectInOriginFrame.rect.height(); - imgIdxes.push_back(imgidx); - totalSize += ctx.lastOutputsRGBBufs[i].buffSize; - } + imgIdxes.push_back(imgidx); + totalSize += ctx.lastOutputsRGBBufs[i].buffSize; + } - memcpy(buffImg, ctx.frameRGB, totalSize); - buffImgMaxSize = totalSize; + memcpy(buffImg, ctx.frameRGB, totalSize); + buffImgMaxSize = totalSize; - return true; + return true; } - -- Gitblit v1.8.0