#include "CameraWrapper.h" #include #include 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() { PipeLine::register_global_elem_creator("PL_RTSPClient", create_PL_RTSPClient); PipeLine::register_global_elem_creator("PL_AndroidMediaCodecDecoder", create_PL_AndroidMediaCodecDecoder); PipeLine::register_global_elem_creator("PL_AndroidSurfaceViewRender", create_PL_AndroidSurfaceViewRender); PipeLine::register_global_elem_creator("PL_SensetimeFaceTrack", create_PL_SensetimeFaceTrack); 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; } PL_AndroidSurfaceViewRender* asvRender = (PL_AndroidSurfaceViewRender*)pipeLine->push_elem("PL_AndroidSurfaceViewRender"); ret = asvRender->init(&asvrConfig); if (!ret) { LOG_ERROR << "asvRender.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 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; }