diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-01-09 17:51:23 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-01-09 17:51:23 -0800 |
commit | b798689749c64baba81f02e10cf2157c747d6b46 (patch) | |
tree | da394a395ddb1a6cf69193314846b03fe47a397e /media/jni | |
parent | f013e1afd1e68af5e3b868c26a653bbfb39538f8 (diff) | |
download | frameworks_base-b798689749c64baba81f02e10cf2157c747d6b46.zip frameworks_base-b798689749c64baba81f02e10cf2157c747d6b46.tar.gz frameworks_base-b798689749c64baba81f02e10cf2157c747d6b46.tar.bz2 |
auto import from //branches/cupcake/...@125939
Diffstat (limited to 'media/jni')
-rw-r--r-- | media/jni/Android.mk | 3 | ||||
-rw-r--r-- | media/jni/android_media_MediaMetadataRetriever.cpp | 2 | ||||
-rw-r--r-- | media/jni/android_media_MediaPlayer.cpp | 6 | ||||
-rw-r--r-- | media/jni/android_media_ResampleInputStream.cpp | 143 |
4 files changed, 152 insertions, 2 deletions
diff --git a/media/jni/Android.mk b/media/jni/Android.mk index cb0fc83..3620494 100644 --- a/media/jni/Android.mk +++ b/media/jni/Android.mk @@ -7,7 +7,8 @@ LOCAL_SRC_FILES:= \ android_media_MediaRecorder.cpp \ android_media_MediaScanner.cpp \ android_media_MediaMetadataRetriever.cpp \ - android_media_AmrInputStream.cpp + android_media_AmrInputStream.cpp \ + android_media_ResampleInputStream.cpp LOCAL_SHARED_LIBRARIES := \ libopencoreplayer \ diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp index 5b0ecb8..4624a18 100644 --- a/media/jni/android_media_MediaMetadataRetriever.cpp +++ b/media/jni/android_media_MediaMetadataRetriever.cpp @@ -21,7 +21,7 @@ #include <assert.h> #include <utils/Log.h> #include <utils/threads.h> -#include <graphics/SkBitmap.h> +#include <core/SkBitmap.h> #include <media/mediametadataretriever.h> #include <private/media/VideoFrame.h> diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index 8083882..5562254 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -519,6 +519,7 @@ extern int register_android_media_MediaRecorder(JNIEnv *env); extern int register_android_media_MediaScanner(JNIEnv *env); extern int register_android_media_MediaMetadataRetriever(JNIEnv *env); extern int register_android_media_AmrInputStream(JNIEnv *env); +extern int register_android_media_ResampleInputStream(JNIEnv *env); jint JNI_OnLoad(JavaVM* vm, void* reserved) { @@ -556,6 +557,11 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) goto bail; } + if (register_android_media_ResampleInputStream(env) < 0) { + LOGE("ERROR: ResampleInputStream native registration failed\n"); + goto bail; + } + /* success -- return valid version number */ result = JNI_VERSION_1_4; diff --git a/media/jni/android_media_ResampleInputStream.cpp b/media/jni/android_media_ResampleInputStream.cpp new file mode 100644 index 0000000..0247cdb --- /dev/null +++ b/media/jni/android_media_ResampleInputStream.cpp @@ -0,0 +1,143 @@ +/* +** +** Copyright 2007, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +#define LOG_TAG "ResampleInputStream" +#include "utils/Log.h" + +#include <media/mediarecorder.h> +#include <stdio.h> +#include <assert.h> +#include <limits.h> +#include <unistd.h> +#include <fcntl.h> +#include <utils/threads.h> + +#include "jni.h" +#include "JNIHelp.h" +#include "android_runtime/AndroidRuntime.h" + + +// ---------------------------------------------------------------------------- + +using namespace android; + + +// +// helper function to throw an exception +// +static void throwException(JNIEnv *env, const char* ex, const char* fmt, int data) { + if (jclass cls = env->FindClass(ex)) { + char msg[1000]; + sprintf(msg, fmt, data); + env->ThrowNew(cls, msg); + env->DeleteLocalRef(cls); + } +} + + +#define FIR_COEF(coef) (short)(0x10000 * coef) +static const short fir21[] = { + FIR_COEF(-0.006965742326), + FIR_COEF(-0.008428945737), + FIR_COEF( 0.004241280174), + FIR_COEF( 0.022141096893), + FIR_COEF( 0.018765669437), + FIR_COEF(-0.009871891152), + FIR_COEF(-0.024842433247), + FIR_COEF( 0.006121772058), + FIR_COEF( 0.045890841611), + FIR_COEF( 0.021573503509), + FIR_COEF(-0.059681984668), + FIR_COEF(-0.076036275138), + FIR_COEF( 0.072405390275), + FIR_COEF( 0.308255674582), + FIR_COEF( 0.424321210495), + FIR_COEF( 0.308255674582), + FIR_COEF( 0.072405390275), + FIR_COEF(-0.076036275138), + FIR_COEF(-0.059681984668), + FIR_COEF( 0.021573503509), + FIR_COEF( 0.045890841611), + FIR_COEF( 0.006121772058), + FIR_COEF(-0.024842433247), + FIR_COEF(-0.009871891152), + FIR_COEF( 0.018765669437), + FIR_COEF( 0.022141096893), + FIR_COEF( 0.004241280174), + FIR_COEF(-0.008428945737), + FIR_COEF(-0.006965742326) +}; +static const int nFir21 = sizeof(fir21) / sizeof(fir21[0]); + +static const int BUF_SIZE = 2048; + + +static void android_media_ResampleInputStream_fir21(JNIEnv *env, jclass clazz, + jbyteArray jIn, jint jInOffset, + jbyteArray jOut, jint jOutOffset, + jint jNpoints) { + + // safety first! + if (nFir21 + jNpoints > BUF_SIZE) { + throwException(env, "java/lang/IllegalArgumentException", + "FIR+data too long %d", nFir21 + jNpoints); + return; + } + + // get input data + short in[BUF_SIZE]; + env->GetByteArrayRegion(jIn, jInOffset, (jNpoints * 2 + nFir21 - 1) * 2, (jbyte*)in); + + // compute filter + short out[BUF_SIZE]; + for (int i = 0; i < jNpoints; i++) { + long sum = 0; + const short* firp = &fir21[0]; + const short* inp = &in[i * 2]; + for (int n = nFir21; --n >= 0; ) { + sum += ((long)*firp++) * ((long)*inp++); + } + out[i] = (short)(sum >> 16); + } + + // save new values + env->SetByteArrayRegion(jOut, jOutOffset, jNpoints * 2, (jbyte*)out); +} + +// ---------------------------------------------------------------------------- + +static JNINativeMethod gMethods[] = { + {"fir21", "([BI[BII)V", (void*)android_media_ResampleInputStream_fir21}, +}; + + +int register_android_media_ResampleInputStream(JNIEnv *env) +{ + const char* const kClassPathName = "android/media/ResampleInputStream"; + jclass clazz; + + clazz = env->FindClass(kClassPathName); + if (clazz == NULL) { + LOGE("Can't find %s", kClassPathName); + return -1; + } + + return AndroidRuntime::registerNativeMethods(env, + kClassPathName, gMethods, NELEM(gMethods)); +} + + |