1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/* 2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright (C) 2012 The Android Open Source Project 3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License"); 5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License. 6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at 7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * http://www.apache.org/licenses/LICENSE-2.0 9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software 11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS, 12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and 14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License. 15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks// Native function to extract histogram from image (handed down as ByteBuffer). 18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "frametovalues.h" 20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <string.h> 22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <jni.h> 23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <unistd.h> 24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <android/log.h> 25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "imgprocutil.h" 27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksjboolean Java_androidx_media_filterpacks_image_ToGrayValuesFilter_toGrayValues( 29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks JNIEnv* env, jclass clazz, jobject imageBuffer, jobject grayBuffer ) 30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks{ 31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks unsigned char* pixelPtr = static_cast<unsigned char*>(env->GetDirectBufferAddress(imageBuffer)); 32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks unsigned char* grayPtr = static_cast<unsigned char*>(env->GetDirectBufferAddress(grayBuffer)); 33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (pixelPtr == 0 || grayPtr == 0) { 35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return JNI_FALSE; 36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int numPixels = env->GetDirectBufferCapacity(imageBuffer) / 4; 39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // TODO: the current implementation is focused on the correctness not performance. 41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // If performance becomes an issue, it is better to increment pixelPtr directly. 42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int disp = 0; 43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for(int idx = 0; idx < numPixels; idx++, disp+=4) { 44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int R = *(pixelPtr + disp); 45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int G = *(pixelPtr + disp + 1); 46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int B = *(pixelPtr + disp + 2); 47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int gray = getIntensityFast(R, G, B); 48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *(grayPtr+idx) = static_cast<unsigned char>(gray); 49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return JNI_TRUE; 52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksjboolean Java_androidx_media_filterpacks_image_ToRgbValuesFilter_toRgbValues( 55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks JNIEnv* env, jclass clazz, jobject imageBuffer, jobject rgbBuffer ) 56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks{ 57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks unsigned char* pixelPtr = static_cast<unsigned char*>(env->GetDirectBufferAddress(imageBuffer)); 58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks unsigned char* rgbPtr = static_cast<unsigned char*>(env->GetDirectBufferAddress(rgbBuffer)); 59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (pixelPtr == 0 || rgbPtr == 0) { 61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return JNI_FALSE; 62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int numPixels = env->GetDirectBufferCapacity(imageBuffer) / 4; 65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // TODO: this code could be revised to improve the performance as the TODO above. 67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int pixelDisp = 0; 68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int rgbDisp = 0; 69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for(int idx = 0; idx < numPixels; idx++, pixelDisp += 4, rgbDisp += 3) { 70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (int c = 0; c < 3; ++c) { 71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *(rgbPtr + rgbDisp + c) = *(pixelPtr + pixelDisp + c); 72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return JNI_TRUE; 75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 77