SurfaceTexture.cpp revision 0a8fd9b610b2de92930c92d71ac184dc9e2bcb4d
15d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch/* 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Copyright (C) 2010 The Android Open Source Project 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Licensed under the Apache License, Version 2.0 (the "License"); 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * you may not use this file except in compliance with the License. 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * You may obtain a copy of the License at 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * http://www.apache.org/licenses/LICENSE-2.0 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Unless required by applicable law or agreed to in writing, software 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * distributed under the License is distributed on an "AS IS" BASIS, 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * See the License for the specific language governing permissions and 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * limitations under the License. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */ 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define LOG_TAG "SurfaceTexture" 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <stdio.h> 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <gui/SurfaceTexture.h> 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <gui/SurfaceTextureClient.h> 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <android_runtime/AndroidRuntime.h> 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <utils/Log.h> 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <utils/misc.h> 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "jni.h" 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "JNIHelp.h" 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 34b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochnamespace android { 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 365d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdochstatic const char* const OutOfResourcesException = 37592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch "android/graphics/SurfaceTexture$OutOfResourcesException"; 38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* const kSurfaceTextureClassPathName = "android/graphics/SurfaceTexture"; 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstruct fields_t { 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block jfieldID surfaceTexture; 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block jmethodID postEvent; 43e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}; 44e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkestatic fields_t fields; 45e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 46e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// ---------------------------------------------------------------------------- 47e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 48e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkestatic void SurfaceTexture_setSurfaceTexture(JNIEnv* env, jobject thiz, 49e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke const sp<SurfaceTexture>& surfaceTexture) 50e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke{ 51e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke SurfaceTexture* const p = 52e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke (SurfaceTexture*)env->GetIntField(thiz, fields.surfaceTexture); 53e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke if (surfaceTexture.get()) { 54e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke surfaceTexture->incStrong(thiz); 55e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 56e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke if (p) { 57e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke p->decStrong(thiz); 58e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 59e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke env->SetIntField(thiz, fields.surfaceTexture, (int)surfaceTexture.get()); 60e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 61e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 62e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkesp<SurfaceTexture> SurfaceTexture_getSurfaceTexture(JNIEnv* env, jobject thiz) 63e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke{ 64e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke sp<SurfaceTexture> surfaceTexture( 65e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke (SurfaceTexture*)env->GetIntField(thiz, fields.surfaceTexture)); 66e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return surfaceTexture; 67e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 68e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 69e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkesp<ANativeWindow> android_SurfaceTexture_getNativeWindow( 70e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke JNIEnv* env, jobject thiz) 71e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke{ 72e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 73e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 74e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke new SurfaceTextureClient(surfaceTexture) : NULL); 75e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return surfaceTextureClient; 76e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 77e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 78e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkebool android_SurfaceTexture_isInstanceOf(JNIEnv* env, jobject thiz) 79e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke{ 80e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke jclass surfaceTextureClass = env->FindClass(kSurfaceTextureClassPathName); 81e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return env->IsInstanceOf(thiz, surfaceTextureClass); 82e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 83e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 84e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// ---------------------------------------------------------------------------- 85e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 86e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkeclass JNISurfaceTextureContext : public SurfaceTexture::FrameAvailableListener 87e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke{ 88e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkepublic: 89e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke JNISurfaceTextureContext(JNIEnv* env, jobject weakThiz, jclass clazz); 90e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke virtual ~JNISurfaceTextureContext(); 91e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke virtual void onFrameAvailable(); 92e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 93e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkeprivate: 94e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static JNIEnv* getJNIEnv(bool* needsDetach); 95e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static void detachJNI(); 96e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 97e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke jobject mWeakThiz; 98e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke jclass mClazz; 99e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke}; 100e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 101e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarkeJNISurfaceTextureContext::JNISurfaceTextureContext(JNIEnv* env, 102e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke jobject weakThiz, jclass clazz) : 103e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke mWeakThiz(env->NewGlobalRef(weakThiz)), 104e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke mClazz((jclass)env->NewGlobalRef(clazz)) 105e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke{} 106e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 107e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon ClarkeJNIEnv* JNISurfaceTextureContext::getJNIEnv(bool* needsDetach) { 108e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke *needsDetach = false; 109e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke JNIEnv* env = AndroidRuntime::getJNIEnv(); 110e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke if (env == NULL) { 111e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke JavaVMAttachArgs args = {JNI_VERSION_1_4, NULL, NULL}; 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JavaVM* vm = AndroidRuntime::getJavaVM(); 113e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke int result = vm->AttachCurrentThread(&env, (void*) &args); 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (result != JNI_OK) { 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LOGE("thread attach failed: %#x", result); 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return NULL; 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *needsDetach = true; 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return env; 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 122e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 123e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarkevoid JNISurfaceTextureContext::detachJNI() { 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JavaVM* vm = AndroidRuntime::getJavaVM(); 125e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke int result = vm->DetachCurrentThread(); 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (result != JNI_OK) { 12744f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOGE("thread detach failed: %#x", result); 12844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 12944f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 13044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 13144f0eee88ff00398ff7f715fab053374d808c90dSteve BlockJNISurfaceTextureContext::~JNISurfaceTextureContext() 13244f0eee88ff00398ff7f715fab053374d808c90dSteve Block{ 13344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool needsDetach = false; 13444f0eee88ff00398ff7f715fab053374d808c90dSteve Block JNIEnv* env = getJNIEnv(&needsDetach); 13544f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (env != NULL) { 13644f0eee88ff00398ff7f715fab053374d808c90dSteve Block env->DeleteGlobalRef(mWeakThiz); 13744f0eee88ff00398ff7f715fab053374d808c90dSteve Block env->DeleteGlobalRef(mClazz); 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 139e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke LOGW("leaking JNI object references"); 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 14144f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (needsDetach) { 14244f0eee88ff00398ff7f715fab053374d808c90dSteve Block detachJNI(); 143e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 144e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke} 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JNISurfaceTextureContext::onFrameAvailable() 14744f0eee88ff00398ff7f715fab053374d808c90dSteve Block{ 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool needsDetach = false; 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JNIEnv* env = getJNIEnv(&needsDetach); 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (env != NULL) { 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block env->CallStaticVoidMethod(mClazz, fields.postEvent, mWeakThiz); 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LOGW("onFrameAvailable event will not posted"); 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (needsDetach) { 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block detachJNI(); 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 15844f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void SurfaceTexture_classInit(JNIEnv* env, jclass clazz) 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block{ 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fields.surfaceTexture = env->GetFieldID(clazz, 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID, "I"); 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (fields.surfaceTexture == NULL) { 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LOGE("can't find android/graphics/SurfaceTexture.%s", 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID); 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fields.postEvent = env->GetStaticMethodID(clazz, "postEventFromNative", 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block "(Ljava/lang/Object;)V"); 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (fields.postEvent == NULL) { 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LOGE("can't find android/graphics/SurfaceTexture.postEventFromNative"); 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void SurfaceTexture_init(JNIEnv* env, jobject thiz, jint texName, 17944f0eee88ff00398ff7f715fab053374d808c90dSteve Block jobject weakThiz) 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block{ 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block sp<SurfaceTexture> surfaceTexture(new SurfaceTexture(texName)); 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (surfaceTexture == 0) { 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block jniThrowException(env, OutOfResourcesException, 18444f0eee88ff00398ff7f715fab053374d808c90dSteve Block "Unable to create native SurfaceTexture"); 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block SurfaceTexture_setSurfaceTexture(env, thiz, surfaceTexture); 188c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 189c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch jclass clazz = env->GetObjectClass(thiz); 190c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch if (clazz == NULL) { 19144f0eee88ff00398ff7f715fab053374d808c90dSteve Block jniThrowRuntimeException(env, 19244f0eee88ff00398ff7f715fab053374d808c90dSteve Block "Can't find android/graphics/SurfaceTexture"); 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 19544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 196c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch sp<JNISurfaceTextureContext> ctx(new JNISurfaceTextureContext(env, weakThiz, 1975d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch clazz)); 1985d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch surfaceTexture->setFrameAvailableListener(ctx); 1995d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch} 2005d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 2015d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdochstatic void SurfaceTexture_finalize(JNIEnv* env, jobject thiz) 2025d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch{ 2035d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 2045d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch surfaceTexture->setFrameAvailableListener(0); 2055d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch SurfaceTexture_setSurfaceTexture(env, thiz, 0); 2065d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch} 2075d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void SurfaceTexture_setDefaultBufferSize( 209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JNIEnv* env, jobject thiz, jint width, jint height) 2105d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch{ 2115d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block surfaceTexture->setDefaultBufferSize(width, height); 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic void SurfaceTexture_updateTexImage(JNIEnv* env, jobject thiz) 216c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch{ 217c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block surfaceTexture->updateTexImage(); 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2215d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdochstatic void SurfaceTexture_getTransformMatrix(JNIEnv* env, jobject thiz, 22244f0eee88ff00398ff7f715fab053374d808c90dSteve Block jfloatArray jmtx) 2235d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch{ 2245913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 2255d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch float* mtx = env->GetFloatArrayElements(jmtx, NULL); 2265d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch surfaceTexture->getTransformMatrix(mtx); 2275d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch env->ReleaseFloatArrayElements(jmtx, mtx, 0); 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic jlong SurfaceTexture_getTimestamp(JNIEnv* env, jobject thiz) 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block{ 2325913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 2335913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck return surfaceTexture->getTimestamp(); 2345913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck} 235c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockstatic jint SurfaceTexture_getQueuedCount(JNIEnv* env, jobject thiz) 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block{ 238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); 239c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return surfaceTexture->getQueuedCount(); 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 243592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 244c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochstatic JNINativeMethod gSurfaceTextureMethods[] = { 245592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch {"nativeClassInit", "()V", (void*)SurfaceTexture_classInit }, 246c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch {"nativeInit", "(ILjava/lang/Object;)V", (void*)SurfaceTexture_init }, 247c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch {"nativeFinalize", "()V", (void*)SurfaceTexture_finalize }, 248592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch {"nativeSetDefaultBufferSize", "(II)V", (void*)SurfaceTexture_setDefaultBufferSize }, 249592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch {"nativeUpdateTexImage", "()V", (void*)SurfaceTexture_updateTexImage }, 250c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch {"nativeGetTransformMatrix", "([F)V", (void*)SurfaceTexture_getTransformMatrix }, 251c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch {"nativeGetTimestamp", "()J", (void*)SurfaceTexture_getTimestamp }, 252c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch {"nativeGetQueuedCount", "()I", (void*)SurfaceTexture_getQueuedCount } 253c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}; 254c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 255c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochint register_android_graphics_SurfaceTexture(JNIEnv* env) 256c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch{ 257c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch int err = 0; 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block err = AndroidRuntime::registerNativeMethods(env, kSurfaceTextureClassPathName, 259c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch gSurfaceTextureMethods, NELEM(gSurfaceTextureMethods)); 260c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return err; 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 262c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 263c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} // namespace android 264c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch