From d7dec3b8ce547916dce7e896dfc4df5189f36066 Mon Sep 17 00:00:00 2001 From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674> Date: 星期四, 23 三月 2017 16:29:13 +0800 Subject: [PATCH] add library --- VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCache.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 115 insertions(+), 0 deletions(-) diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCache.cpp b/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCache.cpp index bca2543..0b8e658 100644 --- a/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCache.cpp +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/FaceCache.cpp @@ -1,3 +1,118 @@ #include "FaceCache.h" +#include "PipeLine.h" +#include "MaterialBuffer.h" +#include "PL_SensetimeFaceTrack.h" #include <logger.h> #include <Logger/src/logger.hpp> + +struct FcPmBreackerContext +{ + uint8_t frameYUV[1920*1080*4]; + size_t frameYUVSize; + + uint8_t frameRGB[1920*1080*4]; + size_t frameRGBSize; + + st_ff_vect_t faceFeatures; + + bool dataAvailable; + + FcPmBreackerContext() : frameYUV(), frameYUVSize(0), frameRGB(), frameRGBSize(0), faceFeatures(), dataAvailable(false) + { + } + + void reset() + { + frameYUVSize = 0; + frameRGBSize = 0; + dataAvailable = false; + faceFeatures.clear(); + } + + bool convertYUV420ToRGB() + { + } +}; + +bool fc_pm_breaker_ptr(const PipeMaterial* pm, void* args) +{ + FcPmBreackerContext* ctx = (FcPmBreackerContext*)args; + + const st_ff_vect_t& faceFeatures(*(const st_ff_vect_t*)(pm->buffer)); + + ctx->faceFeatures = faceFeatures; + + ctx->dataAvailable &= true; + return false; +} + +bool fc_pm_breaker_frame(const PipeMaterial* pm, void* args) +{ + FcPmBreackerContext* ctx = (FcPmBreackerContext*)args; + + const MB_Frame* lastFrame((const MB_Frame*)(pm->buffer)); + if (lastFrame->type != MB_Frame::MBFT_YUV420) + { + ctx->dataAvailable &= false; + return false; + } + + if (lastFrame->buffSize == 0) + { + ctx->dataAvailable &= false; + return false; + } + + ctx->frameYUVSize = lastFrame->buffSize; + memcpy(ctx->frameYUV, lastFrame->buffer, ctx->frameYUVSize); + + ctx->dataAvailable &= true; + return false; +} + +FaceCache::FaceCache() : _ctx(new FcPmBreackerContext) +{ +} + +FaceCache::~FaceCache() +{ + delete (FcPmBreackerContext*)_ctx; +} + +// returns count of face +int FaceCache::cachePm(const PipeMaterial& pm) +{ + FcPmBreackerContext& ctx(*(FcPmBreackerContext*)_ctx); + ctx.reset(); + ctx.dataAvailable = true; + pm.breake(PipeMaterial::PMT_PTR, MB_Frame::MBFT__FIRST, fc_pm_breaker_ptr, _ctx); + pm.breake(PipeMaterial::PMT_FRAME, MB_Frame::MBFT__FIRST, fc_pm_breaker_frame, _ctx); + + if (ctx.dataAvailable) + return ctx.faceFeatures.size(); + else + return 0; +} + +bool FaceCache::getFaceListPb(uint8_t* buffer, size_t& buffSize) +{ + return false; +} + +bool FaceCache::getFaceListImage(int* buffIdx, size_t& count, uint8_t* buffImg, size_t& buffImgSize) +{ + return false; +} + +bool FaceCache::extractFace() +{ + FcPmBreackerContext& ctx(*(FcPmBreackerContext*)_ctx); + + if (ctx.frameRGBSize == 0) + { + if (! ctx.convertYUV420ToRGB()) + return false; + } + + +} -- Gitblit v1.8.0