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