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