#include "CameraWrapper.h"
|
#include <logger.h>
|
#include <Logger/src/logger.hpp>
|
|
CameraWrapper::~CameraWrapper()
|
{
|
stop();
|
delete pipeLine;
|
}
|
|
bool CameraWrapper::start()
|
{
|
LOG_INFO << "CameraWrapper::start" << LOG_ENDL;
|
|
running = true;
|
int ret = pthread_create(&live_daemon_thid, NULL, CameraWrapper::live_daemon_thd, this);
|
if(ret != 0)
|
{
|
LOGP(ERROR, "pthread_create: %s/n", strerror(ret));
|
running = false;
|
return false;
|
}
|
|
return true;
|
}
|
|
void CameraWrapper::stop()
|
{
|
LOG_INFO << "CameraWrapper::stop" << LOG_ENDL;
|
|
if (!running)
|
return;
|
|
running = false;
|
pthread_join(live_daemon_thid, NULL);
|
}
|
|
bool CameraWrapper::initPl()
|
{
|
PL_RTSPClient* rtspClient = (PL_RTSPClient*)pipeLine->push_elem("PL_RTSPClient");
|
bool ret = rtspClient->init(&rtspConfig);
|
if (!ret)
|
{
|
LOG_ERROR << "rtspClient.init error" << LOG_ENDL;
|
return false;
|
}
|
|
PL_AndroidMediaCodecDecoder* amcDecoder = (PL_AndroidMediaCodecDecoder*)pipeLine->push_elem("PL_AndroidMediaCodecDecoder");
|
ret = amcDecoder->init(&amcdConfig);
|
if (!ret)
|
{
|
LOG_ERROR << "amcDecoder.init error" << LOG_ENDL;
|
return false;
|
}
|
|
#ifdef USE_ST_SDK
|
PL_SensetimeFaceTrack* sfTrack = (PL_SensetimeFaceTrack*)pipeLine->push_elem("PL_SensetimeFaceTrack");
|
ret = sfTrack->init(&sftConfig);
|
if (!ret)
|
{
|
LOG_ERROR << "sfTrack.init error" << LOG_ENDL;
|
return false;
|
}
|
#endif
|
|
return true;
|
}
|
|
static void java_mt_callback() {
|
|
}
|
|
static void invokeCallback(CameraWrapper& cameraWrapper, int faceCount)
|
{
|
//jni thread may not able to invoke java callback
|
// double check it's all ok
|
int getEnvStat = cameraWrapper.javaVM->GetEnv((void **)&(cameraWrapper.javaEnv), JNI_VERSION_1_6);
|
if (getEnvStat == JNI_EDETACHED)
|
{
|
//LOG_WARN << "GetEnv: not attached" << std::endl;
|
if (cameraWrapper.javaVM->AttachCurrentThread(&(cameraWrapper.javaEnv), NULL) != 0)
|
LOG_WARN << "Failed to attach" << LOG_ENDL;
|
else
|
getEnvStat = JNI_OK;
|
}
|
else if (getEnvStat == JNI_OK)
|
{
|
}
|
else if (getEnvStat == JNI_EVERSION)
|
LOG_WARN << "GetEnv: version not supported" << LOG_ENDL;
|
else if (getEnvStat == JNI_ERR)
|
LOG_WARN << "GetEnv: JNI_ERR" << LOG_ENDL;
|
|
cameraWrapper.javaEnv->CallStaticVoidMethod(cameraWrapper.faceCallbackClazz, cameraWrapper.faceCallbackFunc, cameraWrapper.cameraIdx, faceCount);
|
|
if (cameraWrapper.javaEnv->ExceptionCheck())
|
cameraWrapper.javaEnv->ExceptionDescribe();
|
|
cameraWrapper.javaVM->DetachCurrentThread();
|
}
|
|
/*static*/ void* CameraWrapper::live_daemon_thd(void* arg)
|
{
|
LOG_INFO << "CameraWrapper::live_daemon_thd start" << LOG_ENDL;
|
|
CameraWrapper& cameraWrapper = *(CameraWrapper*)arg;
|
|
while(cameraWrapper.running)
|
{
|
PipeLineElem* last = cameraWrapper.pipeLine->pipe();
|
bool ret = cameraWrapper.pipeLine->check_pipe_complete(last);
|
LOG_DEBUG << "pipe ret=" << ret << LOG_ENDL;
|
|
if (!ret)
|
continue;
|
|
if (cameraWrapper.faceCacheLocked)
|
continue;
|
|
#ifdef USE_ST_SDK
|
PipeMaterial pm;
|
ret = last->gain(pm);
|
|
if (!ret)
|
continue;
|
|
int faceCount = cameraWrapper.faceCache.cachePm(pm);
|
|
if (faceCount > 0 && cameraWrapper.faceCallbackFunc != 0)
|
invokeCallback(cameraWrapper, faceCount);
|
#endif
|
}
|
|
LOG_INFO << "CameraWrapper::live_daemon_thd stop, ret=" << LOG_ENDL;
|
}
|
|
void CameraWrapper::lockFace()
|
{
|
faceCacheLocked = true;
|
}
|
|
void CameraWrapper::releaseFace()
|
{
|
faceCacheLocked = false;
|
}
|