/* * Copyright (C) 2012, Collabora Ltd. * Copyright (C) 2012, Cisco Systems, Inc. * Author: Youness Alaoui * * Copyright (C) 2015, Collabora Ltd. * Author: Justin Kim * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstjniutils.h" #include "gst-android-graphics-surfacetexture.h" static struct { jclass klass; jmethodID constructor; jmethodID release; } android_graphics_surfacetexture = { 0}; static gboolean _init_classes (void) { JNIEnv *env; GError *err = NULL; env = gst_amc_jni_get_env (); /* android.graphics.SurfaceTexture */ android_graphics_surfacetexture.klass = gst_amc_jni_get_class (env, &err, "android/graphics/SurfaceTexture"); if (!android_graphics_surfacetexture.klass) { GST_ERROR ("Failed to get android.graphics.SurfaceTexture class: %s", err->message); g_clear_error (&err); return FALSE; } android_graphics_surfacetexture.constructor = gst_amc_jni_get_method_id (env, &err, android_graphics_surfacetexture.klass, "", "(I)V"); android_graphics_surfacetexture.release = gst_amc_jni_get_method_id (env, &err, android_graphics_surfacetexture.klass, "release", "()V"); return TRUE; } gboolean gst_android_graphics_surfacetexture_init (void) { if (!_init_classes ()) { gst_android_graphics_surfacetexture_deinit (); return FALSE; } return TRUE; } void gst_android_graphics_surfacetexture_deinit (void) { JNIEnv *env = gst_amc_jni_get_env (); if (android_graphics_surfacetexture.klass) (*env)->DeleteGlobalRef (env, android_graphics_surfacetexture.klass); android_graphics_surfacetexture.klass = NULL; } /* android.graphics.SurfaceTexture */ GstAGSurfaceTexture * gst_ag_surfacetexture_new (gint texture_id) { JNIEnv *env = gst_amc_jni_get_env (); jobject object = NULL; GstAGSurfaceTexture *tex = NULL; object = (*env)->NewObject (env, android_graphics_surfacetexture.klass, android_graphics_surfacetexture.constructor, texture_id); if ((*env)->ExceptionCheck (env) || !object) { GST_ERROR ("Failed to call Java method"); (*env)->ExceptionClear (env); return NULL; } tex = g_slice_new0 (GstAGSurfaceTexture); tex->object = (*env)->NewGlobalRef (env, object); if (!tex->object) { GST_ERROR ("Failed to create global reference"); (*env)->ExceptionClear (env); g_slice_free (GstAGSurfaceTexture, tex); tex = NULL; } (*env)->DeleteLocalRef (env, object); return tex; } void gst_ag_surfacetexture_release (GstAGSurfaceTexture * self) { JNIEnv *env; GError *err = NULL; env = gst_amc_jni_get_env (); if (!gst_amc_jni_call_void_method (env, &err, self->object, android_graphics_surfacetexture.release)) { GST_ERROR ("Failed to call release: %s", err->message); g_clear_error (&err); } } void gst_ag_surfacetexture_free (GstAGSurfaceTexture * self) { JNIEnv *env = gst_amc_jni_get_env (); (*env)->DeleteGlobalRef (env, self->object); g_slice_free (GstAGSurfaceTexture, self); }