| | |
| | | } |
| | | } |
| | | |
| | | jint Java_cn_com_basic_face_util_RtspFaceNative_getFaceImages(JNIEnv* env, jclass clazz, jint cameraIdx, jintArray faceImagesIdx, jbyteArray faceImages) |
| | | jobject Java_cn_com_basic_face_util_RtspFaceNative_getFaceImages(JNIEnv* env, jclass clazz, jint cameraIdx, jbyteArray faceImages) |
| | | { |
| | | LOG_DEBUG << "@@@ Java_cn_com_basic_face_util_RtspFaceNative_getFaceImages" << LOG_ENDL; |
| | | assert(cameraIdx > 0 && cameraIdx <= CAMERA_COUNT); |
| | | cameraIdx -= 1; |
| | | CameraWrapper& cameraWrapper(g_CameraWrappers[cameraIdx]); |
| | | |
| | | size_t count = 0; |
| | | int _faceImagesIdx[MAX_FACE] = {-1}; |
| | | std::vector<NativeImgIdx> imgIdxes; |
| | | uint8_t _faceImages[MAX_FACE * MAX_FACE_WIDTH * MAX_FACE_HEIGHT]; |
| | | size_t _faceImagesSize = sizeof(_faceImages); |
| | | size_t _faceImagesSize = std::min(sizeof(_faceImages), size_t(env->GetArrayLength(faceImages))); |
| | | |
| | | bool ret = false; |
| | | |
| | | const size_t faceImagesIdxArrSize = env->GetArrayLength(faceImagesIdx); // count of int |
| | | const size_t faceImagesArrSize = env->GetArrayLength(faceImages); |
| | | |
| | | #ifdef USE_ST_SDK |
| | | ret = cameraWrapper.faceCache.getFaceListImage(_faceImagesIdx, count, _faceImages, _faceImagesSize); |
| | | //bool getFaceListImage(std::vector<NativeImgIdx>& imgIdxes, uint8_t* buffImg, size_t& buffImgMaxSize); |
| | | ret = cameraWrapper.faceCache.getFaceListImage(imgIdxes, _faceImages, _faceImagesSize); |
| | | #endif |
| | | |
| | | if (!ret && count > 0) |
| | | if (imgIdxes.size() < 0) |
| | | { |
| | | LOG_INFO << "No face image captured" << LOG_ENDL; |
| | | return 0; |
| | | return nullptr; |
| | | } |
| | | |
| | | int _faceImagesIdxCount = std::min(count, faceImagesIdxArrSize); |
| | | env->SetIntArrayRegion(faceImagesIdx, 0, _faceImagesIdxCount, (const jint*)_faceImagesIdx); |
| | | |
| | | _faceImagesSize = std::min(_faceImagesSize, faceImagesArrSize); |
| | | env->SetByteArrayRegion(faceImages, 0, _faceImagesSize, (const jbyte*)_faceImages); |
| | | |
| | | return count; |
| | | jclass jcArrayList = env->FindClass("java/util/ArrayList"); |
| | | jmethodID jmArrayList_ctor = env->GetMethodID(jcArrayList, "<init>", "()V"); |
| | | jmethodID jmArrayList_add = env->GetMethodID(jcArrayList, "add", "(Ljava/lang/Object;)Z"); |
| | | |
| | | jclass jcNativeImgIdx = env->FindClass("cn/com/basic/face/util/NativeImgIdx"); |
| | | jmethodID jmNativeImgIdx_ctor = env->GetMethodID(jcNativeImgIdx, "<init>", "()V"); |
| | | jfieldID jfNativeImgIdx_offset = env->GetFieldID(jcNativeImgIdx, "offset","I"); |
| | | jfieldID jfNativeImgIdx_size = env->GetFieldID(jcNativeImgIdx, "size","I"); |
| | | jfieldID jfNativeImgIdx_type = env->GetFieldID(jcNativeImgIdx, "type","I"); |
| | | jfieldID jfNativeImgIdx_width = env->GetFieldID(jcNativeImgIdx, "width","I"); |
| | | jfieldID jfNativeImgIdx_height = env->GetFieldID(jcNativeImgIdx, "height","I"); |
| | | |
| | | jobject jobjArrayList_ImgIdxes = env->NewObject(jcArrayList , jmArrayList_ctor); |
| | | |
| | | for(size_t i = 0 ; i < imgIdxes.size(); i++) |
| | | { |
| | | jobject jobjNativeImgIdx = env->NewObject(jcNativeImgIdx , jmNativeImgIdx_ctor); |
| | | env->SetIntField(jobjNativeImgIdx, jfNativeImgIdx_offset, imgIdxes[i].offset); |
| | | env->SetIntField(jobjNativeImgIdx, jfNativeImgIdx_size, imgIdxes[i].size); |
| | | env->SetIntField(jobjNativeImgIdx, jfNativeImgIdx_type, imgIdxes[i].type); |
| | | env->SetIntField(jobjNativeImgIdx, jfNativeImgIdx_width, imgIdxes[i].width); |
| | | env->SetIntField(jobjNativeImgIdx, jfNativeImgIdx_height, imgIdxes[i].height); |
| | | |
| | | env->CallBooleanMethod(jobjArrayList_ImgIdxes , jmArrayList_add , jobjNativeImgIdx); |
| | | } |
| | | |
| | | return jobjArrayList_ImgIdxes; |
| | | } |
| | | |
| | | |