From 109ffe9a777658936a38d0c146579a67c60a0d17 Mon Sep 17 00:00:00 2001 From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674> Date: 星期四, 11 五月 2017 17:48:48 +0800 Subject: [PATCH] --- RtspFace/main_face_daemon.cpp | 137 +++++++++++++++++++++++++++++++++------------ 1 files changed, 101 insertions(+), 36 deletions(-) diff --git a/RtspFace/main_face_daemon.cpp b/RtspFace/main_face_daemon.cpp index 917aa4a..9058ee4 100644 --- a/RtspFace/main_face_daemon.cpp +++ b/RtspFace/main_face_daemon.cpp @@ -12,6 +12,7 @@ #include "PL_Payer.h" #include "PL_Gainer.h" #include "PL_SensetimeFaceTrack.h" +#include "PL_SensetimeFaceDetect.h" #include "PL_DlibFaceTrack.h" #include "PipeLinePool.h" @@ -20,79 +21,143 @@ #include "ev_proto.h" #include "face_daemon_proto.h" +#include "SensetimeFaceAPIWrapper/src/FaceDBPool.h" +#include "SensetimeFaceAPIWrapper/src/faceAPI.h" + #include "logger.h" + +template<typename TPoolPtr, typename TPoolElem> +struct PoolElemLocker +{ + TPoolPtr pool; + TPoolElem elem; + PoolElemLocker(TPoolPtr _pool, TPoolElem _elem) : pool(_pool), elem(_elem) + { + + } + ~PoolElemLocker() + { + pool->release(elem); + pool->notify_free(); + } +}; + +template<typename TArrayPtr> +struct ArrayDeleter +{ + TArrayPtr array; + ArrayDeleter(TArrayPtr _array) : array(_array) + { + + } + ~ArrayDeleter() + { + delete[] array; + } +}; PipeLinePool g_PipeLinePool; +FaceDBPool g_faceAPIPool;//#todo config + evclient_proc_t evclient_proc; -void send_SensetimeFaceDetectResult(PipeMaterial& lastPm) +bool send_SensetimeFaceDetectResult(EVClientStub& client, PipeMaterial& lastPm) { - if (lastPm.type == PipeMaterial::PMT_PM_LIST) + //if (lastPm.type != PipeMaterial::PMT_PM_LIST) + + //PipeMaterial& facePM = ((PipeMaterial*)(lastPm.buffer))[1]; + //st_ff_vect_t& faceFeatures = *((st_ff_vect_t*)facePM.buffer); + //LOG_NOTICE << "faceFeatures " << faceFeatures.size() << std::endl; + //#todo send result packet + + if (lastPm.buffer == nullptr || lastPm.type != PipeMaterial::PMT_BYTES || lastPm.buffSize != sizeof(SensetimeFaceDetectResult)) { - PipeMaterial& facePM = ((PipeMaterial*)(lastPm.buffer))[1]; - st_ff_vect_t& faceFeatures = *((st_ff_vect_t*)facePM.buffer); - LOG_NOTICE << "faceFeatures " << faceFeatures.size(); - //#todo send result packet + LOG_WARN << "pm not available" << std::endl; + ev_send_status_packet(client, EVPStatus::EVPS_INTERNAL_ERROR); + return false; } + + const SensetimeFaceDetectResult* result = (const SensetimeFaceDetectResult*)lastPm.buffer; + + client.sendBuffSize = sizeof(EVPHeader)+sizeof(SensetimeFaceDetectResult); + client.sendBuff = new uint8_t[client.sendBuffSize]; + client.deleteSendBuff = true; + + EVPHeader* evpHeader = new (client.sendBuff) EVPHeader; + evpHeader->cmd = FaceDaemonCommand::FDC_SENSETIMEFACEDETECT_RESULT; + evpHeader->size = client.sendBuffSize; + + SensetimeFaceDetectResult* evpSub = new (client.sendBuff + sizeof(EVPHeader)) SensetimeFaceDetectResult; + evpSub->school_id = result->school_id; + evpSub->st_id = result->st_id; + + return true; } bool ev_proc_SensetimeFaceDetect(EVClientStub& client) { //#test send 01000B0000004142434445 - //LOG_DEBUG << "cmd=" << evpHeader->cmd << ", size=" << evpHeader->size << ", \t" << (char*)(evpHeader + sizeof(EVPHeader)); + //LOG_DEBUG << "cmd=" << evpHeader->cmd << ", size=" << evpHeader->size << ", \t" << (char*)(evpHeader + sizeof(EVPHeader)) << std::endl; //return true; FDP_Image* fdpImage = (FDP_Image*)(client.recvBuff + sizeof(EVPHeader)); + + FaceDB* _faceDB = g_faceAPIPool.get_free(fdpImage->school_id); + if (_faceDB == nullptr) + { + LOG_WARN << "can't get face db" << std::endl; + ev_send_status_packet(client, EVPStatus::EVPS_PARAMETER_ERROR); + return false; + } - PipeLine* pipeLine = nullptr; - if (g_PipeLinePool.wait_free()) - pipeLine = g_PipeLinePool.get_free(); - + PoolElemLocker<FaceDBPool*, int> _lock_faceAPI(&g_faceAPIPool, fdpImage->school_id); + + PipeLine* pipeLine = g_PipeLinePool.get_free(); if (pipeLine == nullptr) { - LOG_WARN << "can't get free pipeline"; + LOG_WARN << "can't get free pipeline" << std::endl; ev_send_status_packet(client, EVPStatus::EVPS_INTERNAL_ERROR); return false; } + PoolElemLocker<PipeLinePool*, PipeLine*> _lock_pipeLine(&g_PipeLinePool, pipeLine); + // fill - MB_Frame frame; - frame.type = (MB_Frame::MBFType)(fdpImage->mb_type); - frame.buffer = fdpImage->buff; - frame.buffSize = client.recvBuffSize - sizeof(EVPHeader) - sizeof(FDP_Image); - frame.width = fdpImage->width; - frame.height = fdpImage->height; - - PL_SensetimeFaceDetectPipeArgs args; - //#todo get db - + SensetimeFaceDetectDbFrame dbFrame; + dbFrame.type = (MB_Frame::MBFType)(fdpImage->mb_type); + dbFrame.buffSize = client.recvBuffSize - sizeof(EVPHeader) - sizeof(FDP_Image); + dbFrame.buffer = new uint8_t[dbFrame.buffSize]; + ArrayDeleter<uint8_t*> _del_img((uint8_t*)dbFrame.buffer); + memcpy(dbFrame.buffer, fdpImage->buff, dbFrame.buffSize); + dbFrame.width = fdpImage->width; + dbFrame.height = fdpImage->height; + dbFrame.school_id = fdpImage->school_id; + dbFrame._faceDB = _faceDB; + PipeMaterial pm; pm.type = PipeMaterial::PMT_FRAME; - pm.buffer = &frame; + pm.buffer = &dbFrame; pm.buffSize = 0; - pm.args = &args; PipeLineElem* plElem = pipeLine->pipe(&pm); if (! pipeLine->check_pipe_complete(plElem)) { - LOG_WARN << "pipeline not complete"; - g_PipeLinePool.release(pipeLine); + LOG_WARN << "pipeline not complete" << std::endl; ev_send_status_packet(client, EVPStatus::EVPS_INTERNAL_ERROR); return false; } if (!plElem->gain(pm)) { - LOG_WARN << "pipeline gain error"; - g_PipeLinePool.release(pipeLine); + LOG_WARN << "pipeline gain error" << std::endl; ev_send_status_packet(client, EVPStatus::EVPS_INTERNAL_ERROR); return false; } - send_SensetimeFaceDetectResult(pm); - - g_PipeLinePool.release(pipeLine); + // can not release pipleline unless pm not used + send_SensetimeFaceDetectResult(client, pm); + return false; } @@ -101,7 +166,7 @@ EVPHeader* evpHeader = (EVPHeader*)client.recvBuff; if (evpHeader->size != client.recvBuffSize) { - LOG_WARN << "Truncated buffer " << (evpHeader->size - client.recvBuffSize) << " bytes"; + LOG_WARN << "Truncated buffer " << (evpHeader->size - client.recvBuffSize) << " bytes" << std::endl; return false; } @@ -111,7 +176,7 @@ return ev_proc_SensetimeFaceDetect(client); break; default: - LOG_WARN << "Unknown command"; + LOG_WARN << "Unknown command" << std::endl; ev_send_status_packet(client, EVPStatus::EVPS_PARAMETER_ERROR); return false; break; @@ -136,12 +201,12 @@ { PL_Payer_Config config; - config.copyData = true; + config.copyData = true;//#todo false PL_Gainer* ple = (PL_Gainer*)pipeLine->push_elem("PL_Gainer"); bool ret = ple->init(&config); if (!ret) { - LOG_ERROR << "ple init error"; + LOG_ERROR << "ple init error" << std::endl; exit(EXIT_FAILURE); } } @@ -155,7 +220,7 @@ bool ret = ple->init(&config); if (!ret) { - LOG_ERROR << "ple init error"; + LOG_ERROR << "ple init error" << std::endl; exit(EXIT_FAILURE); } } -- Gitblit v1.8.0