#include "image_pool.h" #include "yuv420sp2rgb.h" #include #include #define LOG_TAG "libandroid-opencv" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *env; LOGI("JNI_OnLoad called for opencv"); return JNI_VERSION_1_4; } JNIEXPORT void JNICALL Java_com_opencv_jni_opencvJNI_addYUVtoPool(JNIEnv * env, jclass thiz, jlong ppool, jobject _jpool, jbyteArray jbuffer, jint jidx, jint jwidth, jint jheight, jboolean jgrey) { image_pool *pool = (image_pool *) ppool; Ptr mat = pool->getYUV(jidx); if (mat.empty() || mat->cols != jwidth || mat->rows != jheight * 2) { //pool->deleteGrey(jidx); mat = new Mat(jheight * 2, jwidth, CV_8UC1); } jsize sz = env->GetArrayLength(jbuffer); uchar* buff = mat->ptr (0); env->GetByteArrayRegion(jbuffer, 0, sz, (jbyte*) buff); pool->addYUVMat(jidx, mat); Ptr color = pool->getImage(jidx); if (color.empty() || color->cols != jwidth || color->rows != jheight) { //pool->deleteImage(jidx); color = new Mat(jheight, jwidth, CV_8UC3); } if (!jgrey) { //doesn't work unfortunately.. //cvtColor(*mat,*color, CV_YCrCb2RGB); color_convert_common(buff, buff + jwidth * jheight, jwidth, jheight, color->ptr (0), false); } if (jgrey) { Mat grey; pool->getGrey(jidx, grey); cvtColor(grey, *color, CV_GRAY2RGB); } pool->addImage(jidx, color); } image_pool::image_pool() { } image_pool::~image_pool() { __android_log_print(ANDROID_LOG_INFO, "image_pool", "destructor called"); } cv::Ptr image_pool::getImage(int i) { return imagesmap[i]; } void image_pool::getGrey(int i, Mat & grey) { cv::Ptr tm = yuvImagesMap[i]; if (tm.empty()) return; grey = (*tm)(Range(0, tm->rows / 2), Range::all()); } cv::Ptr image_pool::getYUV(int i) { return yuvImagesMap[i]; } void image_pool::addYUVMat(int i, cv::Ptr mat) { yuvImagesMap[i] = mat; } void image_pool::addImage(int i, cv::Ptr mat) { imagesmap[i] = mat; }