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// Stats (mean and stdev) scoring in the native. 18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "stats_scorer.h" 20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <jni.h> 22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <math.h> 23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksvoid Java_androidx_media_filterpacks_numeric_StatsFilter_score( 25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks JNIEnv* env, jobject thiz, jobject imageBuffer, jfloatArray statsArray) 26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks{ 27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks unsigned char* pImg = static_cast<unsigned char*>(env->GetDirectBufferAddress(imageBuffer)); 28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int numPixels = env->GetDirectBufferCapacity(imageBuffer); // 1 byte per pixel 29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float sum = 0.0; 30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float sumSquares = 0.0; 31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (int i = 0; i < numPixels; ++i) { 33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float val = static_cast<float>(pImg[i]); 34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks sum += val; 35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks sumSquares += val * val; 36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks jfloat result[2]; 38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks result[0] = sum / numPixels; // mean 39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks result[1] = sqrt((sumSquares - numPixels * result[0] * result[0]) / (numPixels - 1)); // stdev. 40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks env->SetFloatArrayRegion(statsArray, 0, 2, result); 41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksvoid Java_androidx_media_filterpacks_numeric_StatsFilter_regionscore( 44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks JNIEnv* env, jobject thiz, jobject imageBuffer, jint width, jint height, 45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks jfloat left, jfloat top, jfloat right, jfloat bottom, jfloatArray statsArray) 46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks{ 47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks unsigned char* pImg = static_cast<unsigned char*>(env->GetDirectBufferAddress(imageBuffer)); 48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int xStart = static_cast<int>(width * left); 49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int xEnd = static_cast<int>(width * right); 50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int yStart = static_cast<int>(height * top); 51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int yEnd = static_cast<int>(height * bottom); 52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int numPixels = (xEnd - xStart) * (yEnd - yStart); 53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float sum = 0.0; 54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float sumSquares = 0.0; 55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (int y = yStart; y < yEnd; y++) { 57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int disp = width * y; 58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (int x = xStart; x < xEnd; ++x) { 59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks float val = static_cast<float>(*(pImg + disp + x)); 60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks sum += val; 61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks sumSquares += val * val; 62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks jfloat result[2]; 65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks result[0] = sum / numPixels; // mean 66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks result[1] = (numPixels == 1) ? 67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 0 : sqrt((sumSquares - numPixels * result[0] * result[0]) / (numPixels - 1)); // stdev. 68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks env->SetFloatArrayRegion(statsArray, 0, 2, result); 69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 71