From 869f3e8a2cb216c1e7fa3c69f684407e1960a197 Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期一, 24 七月 2017 15:24:20 +0800
Subject: [PATCH]
---
VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp | 371 ++++++++++++++++++++++++++--------------------------
1 files changed, 186 insertions(+), 185 deletions(-)
diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp b/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp
index 00b75d4..9c1fc23 100644
--- a/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp
+++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCacheForPLBG.cpp
@@ -18,134 +18,134 @@
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)
- {}
+ FcPmBreackerContextPLBG() :
+ lastOutputs(), lastOutputsRGBBufs(), frameYUV(), frameYUVSize(0), frameRGB(),frameRGBSize(0),
+ frameTruncated(false)
+ {}
- void reset()
- {
- lastOutputs.clear();
- lastOutputsRGBBufs.clear();
- frameYUVSize = 0;
- frameRGBSize = 0;
- frameTruncated = false;
- }
+ void reset()
+ {
+ lastOutputs.clear();
+ lastOutputsRGBBufs.clear();
+ frameYUVSize = 0;
+ frameRGBSize = 0;
+ frameTruncated = false;
+ }
- 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 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;
- if (sizeof(frameYUV) - (bufPtr - frameYUV) < iter->croppedDataSize)
- {
- frameTruncated = true;
- LOG_WARN << "yuv buffer truncated" << LOG_ENDL;
- break;
- }
+ if (sizeof(frameYUV) - (bufPtr - frameYUV) < iter->croppedDataSize)
+ {
+ frameTruncated = true;
+ LOG_WARN << "yuv buffer truncated" << LOG_ENDL;
+ break;
+ }
- iter->croppedData = bufPtr;
- memcpy(bufPtr, originBuf, iter->croppedDataSize);
- bufPtr += iter->croppedDataSize;
- frameYUVSize += iter->croppedDataSize;
- }
- }
+ iter->croppedData = bufPtr;
+ memcpy(bufPtr, originBuf, iter->croppedDataSize);
+ bufPtr += iter->croppedDataSize;
+ frameYUVSize += iter->croppedDataSize;
+ }
+ }
- 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;
- }
+ 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;
+ }
- OutRGBBufferWrapper bw;
- bw.buffer = bufPtr;
- bw.buffSize = iter->rectInOriginFrame.width() * iter->rectInOriginFrame.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;
- }
+ 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;
+ }
- convertYUV420ToRGB565(*iter, bw.buffer);
+ convertYUV420ToRGB565(*iter, bw.buffer);
- lastOutputsRGBBufs.push_back(bw);
- bufPtr += bw.buffSize;
- frameRGBSize += bw.buffSize;
- }
- }
+ 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.height();
- int src_width = out.rectInOriginFrame.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)
@@ -155,117 +155,118 @@
FaceCacheForPLBG::~FaceCacheForPLBG()
{
- delete (FcPmBreackerContextPLBG*)_ctx;
+ delete (FcPmBreackerContextPLBG*)_ctx;
}
// 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();
+ plbg_output_vec_t* plbgOut = (plbg_output_vec_t*)pm.buffer;
+ return plbgOut->size();
}
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(1111111111111111);
- pbFaceListImage.set_size(ctx.lastOutputs[i].croppedDataSize);
- pbFaceListImage.set_type(PbFaceList_FaceListImage_ImageType_MBFT_NV12);
- pbFaceListImage.set_width(ctx.lastOutputs[i].rectInOriginFrame.width());
- pbFaceListImage.set_height(ctx.lastOutputs[i].rectInOriginFrame.height());
- pbFaceListImage.set_top_left_x(ctx.lastOutputs[i].rectInOriginFrame.leftTop.X);
- pbFaceListImage.set_top_left_y(ctx.lastOutputs[i].rectInOriginFrame.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.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.width();
- imgidx.height = ctx.lastOutputs[i].rectInOriginFrame.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