19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "ResampleInputStream" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/mediarecorder.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <limits.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define FIR_COEF(coef) (short)(0x10000 * coef) 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const short fir21[] = { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.006965742326), 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.008428945737), 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.004241280174), 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.022141096893), 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.018765669437), 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.009871891152), 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.024842433247), 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.006121772058), 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.045890841611), 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.021573503509), 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.059681984668), 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.076036275138), 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.072405390275), 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.308255674582), 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.424321210495), 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.308255674582), 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.072405390275), 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.076036275138), 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.059681984668), 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.021573503509), 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.045890841611), 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.006121772058), 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.024842433247), 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.009871891152), 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.018765669437), 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.022141096893), 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF( 0.004241280174), 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.008428945737), 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FIR_COEF(-0.006965742326) 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const int nFir21 = sizeof(fir21) / sizeof(fir21[0]); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const int BUF_SIZE = 2048; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 765a15d0d31b877ef512b3379eac033c6bb041c86aAndreas Gampestatic void android_media_ResampleInputStream_fir21(JNIEnv *env, jclass /* clazz */, 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray jIn, jint jInOffset, 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyteArray jOut, jint jOutOffset, 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint jNpoints) { 8015dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // safety first! 82196863d27407e23c69debdd061df58ce8fe76c20Gloria Wang if (nFir21 + jNpoints * 2 > BUF_SIZE) { 8315dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "FIR+data too long %d", nFir21 + jNpoints); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8715dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get input data 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short in[BUF_SIZE]; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetByteArrayRegion(jIn, jInOffset, (jNpoints * 2 + nFir21 - 1) * 2, (jbyte*)in); 9115dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // compute filter 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short out[BUF_SIZE]; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < jNpoints; i++) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long sum = 0; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const short* firp = &fir21[0]; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const short* inp = &in[i * 2]; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = nFir21; --n >= 0; ) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sum += ((long)*firp++) * ((long)*inp++); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out[i] = (short)(sum >> 16); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save new values 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetByteArrayRegion(jOut, jOutOffset, jNpoints * 2, (jbyte*)out); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11076f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"fir21", "([BI[BII)V", (void*)android_media_ResampleInputStream_fir21}, 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_media_ResampleInputStream(JNIEnv *env) 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* const kClassPathName = "android/media/ResampleInputStream"; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kClassPathName, gMethods, NELEM(gMethods)); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 122