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