165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/* 265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project 365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License. 665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at 765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * http://www.apache.org/licenses/LICENSE-2.0 965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software 1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS, 1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and 1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License. 1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <string> 1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <vector> 1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "jni/jni_native_program.h" 2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "jni/jni_util.h" 2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "native/base/logging.h" 2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "native/core/native_frame.h" 2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "native/core/native_program.h" 2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennusing android::filterfw::NativeFrame; 2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennusing android::filterfw::NativeProgram; 2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_allocate(JNIEnv* env, jobject thiz) { 3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(WrapObjectInJava(new NativeProgram(), env, thiz, true)); 3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_deallocate(JNIEnv* env, jobject thiz) { 3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(DeleteNativeObject<NativeProgram>(env, thiz)); 3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_nativeInit(JNIEnv* env, jobject thiz) { 3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && program->CallInit()); 4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_openNativeLibrary(JNIEnv* env, 4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring lib_name) { 4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && lib_name && program->OpenLibrary(ToCppString(env, lib_name))); 4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_bindInitFunction(JNIEnv* env, 5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring func_name) { 5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && func_name && program->BindInitFunction(ToCppString(env, func_name))); 5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_bindSetValueFunction(JNIEnv* env, 5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring func_name) { 6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && 6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn func_name && 6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn program->BindSetValueFunction(ToCppString(env, func_name))); 6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_bindGetValueFunction(JNIEnv* env, 6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring func_name) { 6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && 7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn func_name && 7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn program->BindGetValueFunction(ToCppString(env, func_name))); 7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_bindProcessFunction(JNIEnv* env, 7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring func_name) { 7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && func_name && program->BindProcessFunction(ToCppString(env, func_name))); 8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_bindResetFunction(JNIEnv* env, 8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring func_name) { 8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && 8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn func_name && 8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn program->BindResetFunction(ToCppString(env, func_name))); 8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_bindTeardownFunction(JNIEnv* env, 9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring func_name) { 9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && 9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn func_name && 9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn program->BindTeardownFunction(ToCppString(env, func_name))); 9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_callNativeInit(JNIEnv* env, jobject thiz) { 10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && program->CallInit()); 10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_callNativeSetValue(JNIEnv* env, 10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring key, 10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring value) { 10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (!value) { 11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ALOGE("Native Program: Attempting to set null value for key %s!", 11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ToCppString(env, key).c_str()); 11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::string c_value = ToCppString(env, value); 11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::string c_key = ToCppString(env, key); 11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && program->CallSetValue(c_key, c_value)); 11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjstring Java_android_filterfw_core_NativeProgram_callNativeGetValue(JNIEnv* env, 12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jstring key) { 12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const std::string c_key = ToCppString(env, key); 12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (program) { 12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJString(env, program->CallGetValue(c_key)); 12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return JNI_FALSE; 12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_callNativeProcess(JNIEnv* env, 13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject thiz, 13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobjectArray inputs, 13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject output) { 13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Sanity checks 13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (!program || !inputs) { 13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return JNI_FALSE; 13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Get the input buffers 14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const int input_count = env->GetArrayLength(inputs); 14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn std::vector<const char*> input_buffers(input_count, NULL); 14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn std::vector<int> input_sizes(input_count, 0); 14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn for (int i = 0 ; i < input_count; ++i) { 14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn const char* input_data = NULL; 14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int input_size = 0; 14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn jobject input = env->GetObjectArrayElement(inputs, i); 14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (input) { 15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeFrame* native_frame = ConvertFromJava<NativeFrame>(env, input); 15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (!native_frame) { 15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ALOGE("NativeProgram: Could not grab NativeFrame input %d!", i); 15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return JNI_FALSE; 15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn input_data = reinterpret_cast<const char*>(native_frame->Data()); 15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn input_size = native_frame->Size(); 15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn input_buffers[i] = input_data; 15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn input_sizes[i] = input_size; 16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Get the output buffer 16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn char* output_data = NULL; 16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn int output_size = 0; 16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (output) { 16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeFrame* output_frame = ConvertFromJava<NativeFrame>(env, output); 16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (!output_frame) { 16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ALOGE("NativeProgram: Could not grab NativeFrame output!"); 16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return JNI_FALSE; 17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn output_data = reinterpret_cast<char*>(output_frame->MutableData()); 17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn output_size = output_frame->Size(); 17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Process the frames! 17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program->CallProcess(input_buffers, input_sizes, output_data, output_size)); 17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_callNativeReset(JNIEnv* env, jobject thiz) { 18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && program->CallReset()); 18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_NativeProgram_callNativeTeardown(JNIEnv* env, jobject thiz) { 18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn NativeProgram* program = ConvertFromJava<NativeProgram>(env, thiz); 18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return ToJBool(program && program->CallTeardown()); 18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 188