1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/* 2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright (C) 2013 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 contrast ratio from image (handed down as ByteBuffer). 18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "contrast.h" 20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <math.h> 22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <string.h> 23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <jni.h> 24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <unistd.h> 25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <android/log.h> 26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksjfloat 28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin HendricksJava_androidx_media_filterfw_samples_simplecamera_ContrastRatioFilter_contrastOperator( 29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks JNIEnv* env, jclass clazz, jint width, jint height, jobject imageBuffer) { 30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (imageBuffer == 0) { 32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return 0.0f; 33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float total = 0; 35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks const int numPixels = width * height; 36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks unsigned char* srcPtr = static_cast<unsigned char*>(env->GetDirectBufferAddress(imageBuffer)); 37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float* lumArray = new float[numPixels]; 38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (int i = 0; i < numPixels; i++) { 39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks lumArray[i] = (0.2126f * *(srcPtr + 4 * i) + 0.7152f * 40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *(srcPtr + 4 * i + 1) + 0.0722f * *(srcPtr + 4 * i + 2)) / 255; 41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks total += lumArray[i]; 42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks const float avg = total / numPixels; 44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float sum = 0; 45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (int i = 0; i < numPixels; i++) { 47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks sum += (lumArray[i] - avg) * (lumArray[i] - avg); 48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks delete[] lumArray; 50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return ((float) sqrt(sum / numPixels)); 51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 52