From 00fbeab326328aef416882ce3417b4906d385de3 Mon Sep 17 00:00:00 2001 From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674> Date: 星期四, 27 四月 2017 18:38:26 +0800 Subject: [PATCH] optimize --- VisitFace/RtspNativeCodec/app/src/main/cpp/CameraWrapper.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 49 insertions(+), 6 deletions(-) diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/CameraWrapper.cpp b/VisitFace/RtspNativeCodec/app/src/main/cpp/CameraWrapper.cpp index 1a276ee..c3e980a 100644 --- a/VisitFace/RtspNativeCodec/app/src/main/cpp/CameraWrapper.cpp +++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/CameraWrapper.cpp @@ -37,6 +37,11 @@ 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) @@ -47,11 +52,19 @@ PL_AndroidMediaCodecDecoder* amcDecoder = (PL_AndroidMediaCodecDecoder*)pipeLine->push_elem("PL_AndroidMediaCodecDecoder"); ret = amcDecoder->init(&amcdConfig); - if (!ret) + 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"); @@ -64,6 +77,39 @@ #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) @@ -93,11 +139,8 @@ int faceCount = cameraWrapper.faceCache.cachePm(pm); - if (faceCount != 0 && cameraWrapper.faceCallback != 0) - { - // #todo jni thread may not able to invoke java callback - //env->CallVoidMethod(obj, callback, cameraIdx , faceCount); - } + if (faceCount > 0 && cameraWrapper.faceCallbackFunc != 0) + invokeCallback(cameraWrapper, faceCount); #endif } -- Gitblit v1.8.0