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 exposure from image (handed down as ByteBuffer). 18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "exposure.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 Hendricks 28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksjfloat 29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin HendricksJava_androidx_media_filterfw_samples_simplecamera_ExposureFilter_overExposureOperator( 30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks JNIEnv* env, jclass clazz, jint width, jint height, jobject imageBuffer) { 31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (imageBuffer == 0) { 32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return 0.0f; 33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks const int numPixels = width * height; 35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks unsigned char* srcPtr = static_cast<unsigned char*>(env->GetDirectBufferAddress(imageBuffer)); 36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int output = 0; 37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float tempLuminance = 0.0f; 38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (int i = 0; i < numPixels; i++) { 40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks tempLuminance = (0.2126f * *(srcPtr + 4 * i) + 41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 0.7152f * *(srcPtr + 4 * i + 1) + 42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 0.0722f * *(srcPtr + 4 * i + 2)); 43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (tempLuminance + 5 >= 255) { 44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks output++; 45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return (static_cast<float>(output)) / numPixels; 48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksjfloat 51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin HendricksJava_androidx_media_filterfw_samples_simplecamera_ExposureFilter_underExposureOperator( 52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks JNIEnv* env, jclass clazz, jint width, jint height, jobject imageBuffer) { 53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (imageBuffer == 0) { 54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return 0.0f; 55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks const int numPixels = width * height; 57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks unsigned char* srcPtr = static_cast<unsigned char*>(env->GetDirectBufferAddress(imageBuffer)); 58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int output = 0; 59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float tempLuminance = 0.0f; 60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (int i = 0; i < numPixels; i++) { 62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks tempLuminance = (0.2126f * *(srcPtr + 4 * i) + 63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 0.7152f * *(srcPtr + 4 * i + 1) + 64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 0.0722f * *(srcPtr + 4 * i + 2)); 65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (tempLuminance - 5 <= 0) { 66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks output++; 67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return (static_cast<float>(output)) / numPixels; 70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 71