SurfaceTexture.cpp revision b0ba48c95ea8768a051100c5adb4c906caa1e080
16714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis/* 26714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Copyright (C) 2010 The Android Open Source Project 36714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * 46714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 56714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * you may not use this file except in compliance with the License. 66714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * You may obtain a copy of the License at 76714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * 86714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 96714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * 106714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * Unless required by applicable law or agreed to in writing, software 116714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 126714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * See the License for the specific language governing permissions and 146714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis * limitations under the License. 156714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis */ 166714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 176714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#define LOG_TAG "SurfaceTexture" 186714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 196714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include <stdio.h> 206714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 216714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include <gui/SurfaceTexture.h> 226714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 236714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include <android_runtime/AndroidRuntime.h> 246714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 256714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include <utils/Log.h> 266714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include <utils/misc.h> 276714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 286714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include "android/graphics/GraphicsJNI.h" 296714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include "jni.h" 306714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 316714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis// ---------------------------------------------------------------------------- 326714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 336714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisnamespace android { 346714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 356714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic const char* const OutOfResourcesException = 366714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis "android/graphics/SurfaceTexture$OutOfResourcesException"; 376714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 386714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstruct st_t { 396714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis jfieldID surfaceTexture; 406714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis}; 416714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic st_t st; 426714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 436714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis// ---------------------------------------------------------------------------- 446714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 456714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic void setSurfaceTexture(JNIEnv* env, jobject clazz, 466714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis const sp<SurfaceTexture>& surfaceTexture) 476714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 486714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis SurfaceTexture* const p = 496714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis (SurfaceTexture*)env->GetIntField(clazz, st.surfaceTexture); 506714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis if (surfaceTexture.get()) { 516714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis surfaceTexture->incStrong(clazz); 526714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 536714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis if (p) { 546714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis p->decStrong(clazz); 556714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 566714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis env->SetIntField(clazz, st.surfaceTexture, (int)surfaceTexture.get()); 576714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 586714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 596714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennissp<SurfaceTexture> getSurfaceTexture(JNIEnv* env, jobject clazz) 606714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 616714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis sp<SurfaceTexture> surfaceTexture( 626714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis (SurfaceTexture*)env->GetIntField(clazz, st.surfaceTexture)); 636714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis return surfaceTexture; 646714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 656714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 666714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis// ---------------------------------------------------------------------------- 676714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 686714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic void SurfaceTexture_init(JNIEnv* env, jobject clazz, jint texName) 696714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 706714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis sp<SurfaceTexture> surfaceTexture(new SurfaceTexture(texName)); 716714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 726714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis if (surfaceTexture == 0) { 736714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis doThrow(env, OutOfResourcesException); 746714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis return; 756714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 766714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis setSurfaceTexture(env, clazz, surfaceTexture); 776714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 786714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 796714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic void SurfaceTexture_updateTexImage(JNIEnv* env, jobject clazz) 806714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 816714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis sp<SurfaceTexture> surfaceTexture(getSurfaceTexture(env, clazz)); 826714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis surfaceTexture->updateTexImage(); 836714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 846714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 85b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennisstatic void SurfaceTexture_getTransformMatrix(JNIEnv* env, jobject clazz, 86b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis jfloatArray jmtx) 87b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis{ 88b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis sp<SurfaceTexture> surfaceTexture(getSurfaceTexture(env, clazz)); 89b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis float* mtx = env->GetFloatArrayElements(jmtx, NULL); 90b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis surfaceTexture->getTransformMatrix(mtx); 91b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis env->ReleaseFloatArrayElements(jmtx, mtx, 0); 92b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis} 93b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis 946714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis// ---------------------------------------------------------------------------- 956714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 966714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisconst char* const kSurfaceTextureClassPathName = "android/graphics/SurfaceTexture"; 976714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic void nativeClassInit(JNIEnv* env, jclass clazz); 986714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 996714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic JNINativeMethod gSurfaceTextureMethods[] = { 1006714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis {"nativeClassInit", "()V", (void*)nativeClassInit }, 1016714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis {"init", "(I)V", (void*)SurfaceTexture_init }, 1026714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis {"updateTexImage", "()V", (void*)SurfaceTexture_updateTexImage }, 103b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis {"getTransformMatrixImpl", "([F)V", (void*)SurfaceTexture_getTransformMatrix }, 1046714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis}; 1056714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 1066714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic void nativeClassInit(JNIEnv* env, jclass clazz) 1076714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 1086714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis st.surfaceTexture = env->GetFieldID(clazz, 1096714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID, "I"); 1106714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 1116714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 1126714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisint register_android_graphics_SurfaceTexture(JNIEnv* env) 1136714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 1146714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis int err = 0; 1156714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis err = AndroidRuntime::registerNativeMethods(env, kSurfaceTextureClassPathName, 1166714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis gSurfaceTextureMethods, NELEM(gSurfaceTextureMethods)); 1176714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis return err; 1186714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 1196714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 1206714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} // namespace android 121