SurfaceTexture.cpp revision c99db2bc460cc795947d99076da380e22a21e493
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> 22846db33313aa0899fa7928256c6734964bd92520Glenn Kasten#include <gui/SurfaceTextureClient.h> 236714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 246714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include <android_runtime/AndroidRuntime.h> 256714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 266714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include <utils/Log.h> 276714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include <utils/misc.h> 286714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 296714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis#include "jni.h" 30376590d668e22a918439877b55faf075427b13f3Jamie Gennis#include "JNIHelp.h" 316714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 326714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis// ---------------------------------------------------------------------------- 336714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 346714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisnamespace android { 356714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 366714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic const char* const OutOfResourcesException = 376714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis "android/graphics/SurfaceTexture$OutOfResourcesException"; 382b4bfa5efec7df408b4db127961cfc9aca9e57cfJamie Gennisstatic const char* const IllegalStateException = "java/lang/IllegalStateException"; 39050316184b01c0d1a01c46afae7429b89a27c31btedboconst char* const kSurfaceTextureClassPathName = "android/graphics/SurfaceTexture"; 406714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 41376590d668e22a918439877b55faf075427b13f3Jamie Gennisstruct fields_t { 42376590d668e22a918439877b55faf075427b13f3Jamie Gennis jfieldID surfaceTexture; 43c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin jfieldID frameAvailableListener; 44376590d668e22a918439877b55faf075427b13f3Jamie Gennis jmethodID postEvent; 456714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis}; 46376590d668e22a918439877b55faf075427b13f3Jamie Gennisstatic fields_t fields; 476714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 486714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis// ---------------------------------------------------------------------------- 496714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 50376590d668e22a918439877b55faf075427b13f3Jamie Gennisstatic void SurfaceTexture_setSurfaceTexture(JNIEnv* env, jobject thiz, 516714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis const sp<SurfaceTexture>& surfaceTexture) 526714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 536714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis SurfaceTexture* const p = 54376590d668e22a918439877b55faf075427b13f3Jamie Gennis (SurfaceTexture*)env->GetIntField(thiz, fields.surfaceTexture); 556714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis if (surfaceTexture.get()) { 56376590d668e22a918439877b55faf075427b13f3Jamie Gennis surfaceTexture->incStrong(thiz); 576714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 586714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis if (p) { 59376590d668e22a918439877b55faf075427b13f3Jamie Gennis p->decStrong(thiz); 606714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 61376590d668e22a918439877b55faf075427b13f3Jamie Gennis env->SetIntField(thiz, fields.surfaceTexture, (int)surfaceTexture.get()); 626714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 636714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 64c99db2bc460cc795947d99076da380e22a21e493Igor Murashkinstatic void SurfaceTexture_setFrameAvailableListener(JNIEnv* env, 65c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin jobject thiz, sp<SurfaceTexture::FrameAvailableListener> listener) 666714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 67c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin SurfaceTexture::FrameAvailableListener* const p = 68c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin (SurfaceTexture::FrameAvailableListener*) 69c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin env->GetIntField(thiz, fields.frameAvailableListener); 70c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin if (listener.get()) { 71c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin listener->incStrong(thiz); 72c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin } 73c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin if (p) { 74c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin p->decStrong(thiz); 75c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin } 76c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin env->SetIntField(thiz, fields.frameAvailableListener, (int)listener.get()); 77c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin} 78c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin 79c99db2bc460cc795947d99076da380e22a21e493Igor Murashkinsp<SurfaceTexture> SurfaceTexture_getSurfaceTexture(JNIEnv* env, 80c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin jobject thiz) 81c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin{ 82c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin return (SurfaceTexture*)env->GetIntField(thiz, fields.surfaceTexture); 836714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 846714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 85846db33313aa0899fa7928256c6734964bd92520Glenn Kastensp<ANativeWindow> android_SurfaceTexture_getNativeWindow( 86846db33313aa0899fa7928256c6734964bd92520Glenn Kasten JNIEnv* env, jobject thiz) 87846db33313aa0899fa7928256c6734964bd92520Glenn Kasten{ 88846db33313aa0899fa7928256c6734964bd92520Glenn Kasten sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 89846db33313aa0899fa7928256c6734964bd92520Glenn Kasten sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 90846db33313aa0899fa7928256c6734964bd92520Glenn Kasten new SurfaceTextureClient(surfaceTexture) : NULL); 91846db33313aa0899fa7928256c6734964bd92520Glenn Kasten return surfaceTextureClient; 92846db33313aa0899fa7928256c6734964bd92520Glenn Kasten} 93846db33313aa0899fa7928256c6734964bd92520Glenn Kasten 94050316184b01c0d1a01c46afae7429b89a27c31btedbobool android_SurfaceTexture_isInstanceOf(JNIEnv* env, jobject thiz) 95050316184b01c0d1a01c46afae7429b89a27c31btedbo{ 96050316184b01c0d1a01c46afae7429b89a27c31btedbo jclass surfaceTextureClass = env->FindClass(kSurfaceTextureClassPathName); 97050316184b01c0d1a01c46afae7429b89a27c31btedbo return env->IsInstanceOf(thiz, surfaceTextureClass); 98050316184b01c0d1a01c46afae7429b89a27c31btedbo} 99050316184b01c0d1a01c46afae7429b89a27c31btedbo 1006714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis// ---------------------------------------------------------------------------- 1016714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 102376590d668e22a918439877b55faf075427b13f3Jamie Gennisclass JNISurfaceTextureContext : public SurfaceTexture::FrameAvailableListener 1036714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 104376590d668e22a918439877b55faf075427b13f3Jamie Gennispublic: 105376590d668e22a918439877b55faf075427b13f3Jamie Gennis JNISurfaceTextureContext(JNIEnv* env, jobject weakThiz, jclass clazz); 106376590d668e22a918439877b55faf075427b13f3Jamie Gennis virtual ~JNISurfaceTextureContext(); 107376590d668e22a918439877b55faf075427b13f3Jamie Gennis virtual void onFrameAvailable(); 108376590d668e22a918439877b55faf075427b13f3Jamie Gennis 109376590d668e22a918439877b55faf075427b13f3Jamie Gennisprivate: 1100a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis static JNIEnv* getJNIEnv(bool* needsDetach); 1110a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis static void detachJNI(); 11284293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis 113376590d668e22a918439877b55faf075427b13f3Jamie Gennis jobject mWeakThiz; 114376590d668e22a918439877b55faf075427b13f3Jamie Gennis jclass mClazz; 115376590d668e22a918439877b55faf075427b13f3Jamie Gennis}; 116376590d668e22a918439877b55faf075427b13f3Jamie Gennis 117376590d668e22a918439877b55faf075427b13f3Jamie GennisJNISurfaceTextureContext::JNISurfaceTextureContext(JNIEnv* env, 118376590d668e22a918439877b55faf075427b13f3Jamie Gennis jobject weakThiz, jclass clazz) : 119376590d668e22a918439877b55faf075427b13f3Jamie Gennis mWeakThiz(env->NewGlobalRef(weakThiz)), 120376590d668e22a918439877b55faf075427b13f3Jamie Gennis mClazz((jclass)env->NewGlobalRef(clazz)) 121376590d668e22a918439877b55faf075427b13f3Jamie Gennis{} 122376590d668e22a918439877b55faf075427b13f3Jamie Gennis 1230a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie GennisJNIEnv* JNISurfaceTextureContext::getJNIEnv(bool* needsDetach) { 1240a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis *needsDetach = false; 1250a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis JNIEnv* env = AndroidRuntime::getJNIEnv(); 1260a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis if (env == NULL) { 1270a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis JavaVMAttachArgs args = {JNI_VERSION_1_4, NULL, NULL}; 1280a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis JavaVM* vm = AndroidRuntime::getJavaVM(); 1290a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis int result = vm->AttachCurrentThread(&env, (void*) &args); 1300a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis if (result != JNI_OK) { 1313762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("thread attach failed: %#x", result); 1320a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis return NULL; 1330a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis } 1340a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis *needsDetach = true; 1350a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis } 1360a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis return env; 1370a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis} 1380a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis 1390a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennisvoid JNISurfaceTextureContext::detachJNI() { 14084293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis JavaVM* vm = AndroidRuntime::getJavaVM(); 1410a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis int result = vm->DetachCurrentThread(); 14284293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis if (result != JNI_OK) { 1433762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("thread detach failed: %#x", result); 14484293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis } 14584293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis} 14684293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis 147376590d668e22a918439877b55faf075427b13f3Jamie GennisJNISurfaceTextureContext::~JNISurfaceTextureContext() 148376590d668e22a918439877b55faf075427b13f3Jamie Gennis{ 1490a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis bool needsDetach = false; 1500a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis JNIEnv* env = getJNIEnv(&needsDetach); 15184293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis if (env != NULL) { 15284293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis env->DeleteGlobalRef(mWeakThiz); 15384293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis env->DeleteGlobalRef(mClazz); 15484293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis } else { 1558564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("leaking JNI object references"); 15684293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis } 1570a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis if (needsDetach) { 1580a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis detachJNI(); 1590a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis } 160376590d668e22a918439877b55faf075427b13f3Jamie Gennis} 161376590d668e22a918439877b55faf075427b13f3Jamie Gennis 162376590d668e22a918439877b55faf075427b13f3Jamie Gennisvoid JNISurfaceTextureContext::onFrameAvailable() 163376590d668e22a918439877b55faf075427b13f3Jamie Gennis{ 1640a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis bool needsDetach = false; 1650a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis JNIEnv* env = getJNIEnv(&needsDetach); 16684293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis if (env != NULL) { 16784293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis env->CallStaticVoidMethod(mClazz, fields.postEvent, mWeakThiz); 16884293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis } else { 1698564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("onFrameAvailable event will not posted"); 17084293fb9625a3ab7d7d302436bea05441b8d7316Jamie Gennis } 1710a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis if (needsDetach) { 1720a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis detachJNI(); 1730a8fd9b610b2de92930c92d71ac184dc9e2bcb4dJamie Gennis } 174376590d668e22a918439877b55faf075427b13f3Jamie Gennis} 175376590d668e22a918439877b55faf075427b13f3Jamie Gennis 176376590d668e22a918439877b55faf075427b13f3Jamie Gennis// ---------------------------------------------------------------------------- 177376590d668e22a918439877b55faf075427b13f3Jamie Gennis 178376590d668e22a918439877b55faf075427b13f3Jamie Gennisstatic void SurfaceTexture_classInit(JNIEnv* env, jclass clazz) 179376590d668e22a918439877b55faf075427b13f3Jamie Gennis{ 180376590d668e22a918439877b55faf075427b13f3Jamie Gennis fields.surfaceTexture = env->GetFieldID(clazz, 181376590d668e22a918439877b55faf075427b13f3Jamie Gennis ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID, "I"); 182376590d668e22a918439877b55faf075427b13f3Jamie Gennis if (fields.surfaceTexture == NULL) { 1833762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("can't find android/graphics/SurfaceTexture.%s", 184376590d668e22a918439877b55faf075427b13f3Jamie Gennis ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID); 185376590d668e22a918439877b55faf075427b13f3Jamie Gennis } 186c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin fields.frameAvailableListener = env->GetFieldID(clazz, 187c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin ANDROID_GRAPHICS_FRAMEAVAILABLELISTENER_JNI_ID, "I"); 188c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin if (fields.frameAvailableListener == NULL) { 189c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin ALOGE("can't find android/graphics/SurfaceTexture.%s", 190c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin ANDROID_GRAPHICS_FRAMEAVAILABLELISTENER_JNI_ID); 191c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin } 192376590d668e22a918439877b55faf075427b13f3Jamie Gennis 193376590d668e22a918439877b55faf075427b13f3Jamie Gennis fields.postEvent = env->GetStaticMethodID(clazz, "postEventFromNative", 194376590d668e22a918439877b55faf075427b13f3Jamie Gennis "(Ljava/lang/Object;)V"); 195376590d668e22a918439877b55faf075427b13f3Jamie Gennis if (fields.postEvent == NULL) { 1963762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("can't find android/graphics/SurfaceTexture.postEventFromNative"); 197376590d668e22a918439877b55faf075427b13f3Jamie Gennis } 198376590d668e22a918439877b55faf075427b13f3Jamie Gennis} 1996714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 200376590d668e22a918439877b55faf075427b13f3Jamie Gennisstatic void SurfaceTexture_init(JNIEnv* env, jobject thiz, jint texName, 2010904d0af81e8a0a5404d6c03f4dcea02bea8170dGrace Kloba jobject weakThiz, jboolean allowSynchronous) 202376590d668e22a918439877b55faf075427b13f3Jamie Gennis{ 2030904d0af81e8a0a5404d6c03f4dcea02bea8170dGrace Kloba sp<SurfaceTexture> surfaceTexture(new SurfaceTexture(texName, allowSynchronous)); 2046714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis if (surfaceTexture == 0) { 205376590d668e22a918439877b55faf075427b13f3Jamie Gennis jniThrowException(env, OutOfResourcesException, 206376590d668e22a918439877b55faf075427b13f3Jamie Gennis "Unable to create native SurfaceTexture"); 207376590d668e22a918439877b55faf075427b13f3Jamie Gennis return; 208376590d668e22a918439877b55faf075427b13f3Jamie Gennis } 209376590d668e22a918439877b55faf075427b13f3Jamie Gennis SurfaceTexture_setSurfaceTexture(env, thiz, surfaceTexture); 210376590d668e22a918439877b55faf075427b13f3Jamie Gennis 211376590d668e22a918439877b55faf075427b13f3Jamie Gennis jclass clazz = env->GetObjectClass(thiz); 212376590d668e22a918439877b55faf075427b13f3Jamie Gennis if (clazz == NULL) { 213376590d668e22a918439877b55faf075427b13f3Jamie Gennis jniThrowRuntimeException(env, 214376590d668e22a918439877b55faf075427b13f3Jamie Gennis "Can't find android/graphics/SurfaceTexture"); 2156714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis return; 2166714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis } 217376590d668e22a918439877b55faf075427b13f3Jamie Gennis 218376590d668e22a918439877b55faf075427b13f3Jamie Gennis sp<JNISurfaceTextureContext> ctx(new JNISurfaceTextureContext(env, weakThiz, 219376590d668e22a918439877b55faf075427b13f3Jamie Gennis clazz)); 220376590d668e22a918439877b55faf075427b13f3Jamie Gennis surfaceTexture->setFrameAvailableListener(ctx); 221c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin SurfaceTexture_setFrameAvailableListener(env, thiz, ctx); 222376590d668e22a918439877b55faf075427b13f3Jamie Gennis} 223376590d668e22a918439877b55faf075427b13f3Jamie Gennis 224376590d668e22a918439877b55faf075427b13f3Jamie Gennisstatic void SurfaceTexture_finalize(JNIEnv* env, jobject thiz) 225376590d668e22a918439877b55faf075427b13f3Jamie Gennis{ 226376590d668e22a918439877b55faf075427b13f3Jamie Gennis sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 227376590d668e22a918439877b55faf075427b13f3Jamie Gennis surfaceTexture->setFrameAvailableListener(0); 228c99db2bc460cc795947d99076da380e22a21e493Igor Murashkin SurfaceTexture_setFrameAvailableListener(env, thiz, 0); 229376590d668e22a918439877b55faf075427b13f3Jamie Gennis SurfaceTexture_setSurfaceTexture(env, thiz, 0); 2306714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 2316714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 232050316184b01c0d1a01c46afae7429b89a27c31btedbostatic void SurfaceTexture_setDefaultBufferSize( 233050316184b01c0d1a01c46afae7429b89a27c31btedbo JNIEnv* env, jobject thiz, jint width, jint height) 234050316184b01c0d1a01c46afae7429b89a27c31btedbo{ 235050316184b01c0d1a01c46afae7429b89a27c31btedbo sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 236050316184b01c0d1a01c46afae7429b89a27c31btedbo surfaceTexture->setDefaultBufferSize(width, height); 237050316184b01c0d1a01c46afae7429b89a27c31btedbo} 238050316184b01c0d1a01c46afae7429b89a27c31btedbo 2392b4bfa5efec7df408b4db127961cfc9aca9e57cfJamie Gennisstatic void SurfaceTexture_updateTexImage(JNIEnv* env, jobject thiz) 2406714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 241376590d668e22a918439877b55faf075427b13f3Jamie Gennis sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 2422b4bfa5efec7df408b4db127961cfc9aca9e57cfJamie Gennis status_t err = surfaceTexture->updateTexImage(); 2432b4bfa5efec7df408b4db127961cfc9aca9e57cfJamie Gennis if (err == INVALID_OPERATION) { 2442b4bfa5efec7df408b4db127961cfc9aca9e57cfJamie Gennis jniThrowException(env, IllegalStateException, "Unable to update texture contents (see " 2452b4bfa5efec7df408b4db127961cfc9aca9e57cfJamie Gennis "logcat for details)"); 246721bfaa63d14f0ac858d32431ab2eff582143b0fJamie Gennis } else if (err < 0) { 2472b4bfa5efec7df408b4db127961cfc9aca9e57cfJamie Gennis jniThrowRuntimeException(env, "Error during updateTexImage (see logcat for details)"); 2482b4bfa5efec7df408b4db127961cfc9aca9e57cfJamie Gennis } 2496714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 2506714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 251c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennisstatic jint SurfaceTexture_detachFromGLContext(JNIEnv* env, jobject thiz) 252c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis{ 253c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 254c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis return surfaceTexture->detachFromContext(); 255c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis} 256c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis 257c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennisstatic jint SurfaceTexture_attachToGLContext(JNIEnv* env, jobject thiz, jint tex) 258c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis{ 259c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 260c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis return surfaceTexture->attachToContext((GLuint)tex); 261c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis} 262c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis 263376590d668e22a918439877b55faf075427b13f3Jamie Gennisstatic void SurfaceTexture_getTransformMatrix(JNIEnv* env, jobject thiz, 264b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis jfloatArray jmtx) 265b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis{ 266376590d668e22a918439877b55faf075427b13f3Jamie Gennis sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 267b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis float* mtx = env->GetFloatArrayElements(jmtx, NULL); 268b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis surfaceTexture->getTransformMatrix(mtx); 269b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis env->ReleaseFloatArrayElements(jmtx, mtx, 0); 270b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis} 271b0ba48c95ea8768a051100c5adb4c906caa1e080Jamie Gennis 272c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvalastatic jlong SurfaceTexture_getTimestamp(JNIEnv* env, jobject thiz) 273c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala{ 274c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 275c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala return surfaceTexture->getTimestamp(); 276c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala} 277c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala 278ec46b4e1ca89d7c3a9ad70ded58da08b5e19f08fMathias Agopianstatic void SurfaceTexture_release(JNIEnv* env, jobject thiz) 279ec46b4e1ca89d7c3a9ad70ded58da08b5e19f08fMathias Agopian{ 280ec46b4e1ca89d7c3a9ad70ded58da08b5e19f08fMathias Agopian sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 281ec46b4e1ca89d7c3a9ad70ded58da08b5e19f08fMathias Agopian surfaceTexture->abandon(); 282ec46b4e1ca89d7c3a9ad70ded58da08b5e19f08fMathias Agopian} 283ec46b4e1ca89d7c3a9ad70ded58da08b5e19f08fMathias Agopian 2846714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis// ---------------------------------------------------------------------------- 2856714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 2866714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisstatic JNINativeMethod gSurfaceTextureMethods[] = { 287c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis {"nativeClassInit", "()V", (void*)SurfaceTexture_classInit }, 288c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis {"nativeInit", "(ILjava/lang/Object;Z)V", (void*)SurfaceTexture_init }, 289c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis {"nativeFinalize", "()V", (void*)SurfaceTexture_finalize }, 290050316184b01c0d1a01c46afae7429b89a27c31btedbo {"nativeSetDefaultBufferSize", "(II)V", (void*)SurfaceTexture_setDefaultBufferSize }, 2912b4bfa5efec7df408b4db127961cfc9aca9e57cfJamie Gennis {"nativeUpdateTexImage", "()V", (void*)SurfaceTexture_updateTexImage }, 292c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis {"nativeDetachFromGLContext", "()I", (void*)SurfaceTexture_detachFromGLContext }, 293c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis {"nativeAttachToGLContext", "(I)I", (void*)SurfaceTexture_attachToGLContext }, 294c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis {"nativeGetTransformMatrix", "([F)V", (void*)SurfaceTexture_getTransformMatrix }, 295c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis {"nativeGetTimestamp", "()J", (void*)SurfaceTexture_getTimestamp }, 296c6d993077761fc737bbb0f4db44b961a4e7b6bbbJamie Gennis {"nativeRelease", "()V", (void*)SurfaceTexture_release }, 2976714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis}; 2986714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 2996714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennisint register_android_graphics_SurfaceTexture(JNIEnv* env) 3006714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis{ 3016714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis int err = 0; 3026714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis err = AndroidRuntime::registerNativeMethods(env, kSurfaceTextureClassPathName, 3036714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis gSurfaceTextureMethods, NELEM(gSurfaceTextureMethods)); 3046714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis return err; 3056714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} 3066714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis 3076714efc5e0c52953b65e774de0003e22377e7d39Jamie Gennis} // namespace android 308