diff --git a/sys/androidmedia/Makefile.am b/sys/androidmedia/Makefile.am index a04b0ade57..7ad9b6e936 100644 --- a/sys/androidmedia/Makefile.am +++ b/sys/androidmedia/Makefile.am @@ -1,22 +1,30 @@ plugin_LTLIBRARIES = libgstandroidmedia.la libgstandroidmedia_la_SOURCES = \ - gstamc.c \ + gstahcsrc.c \ gstamcaudiodec.c \ - gstamcvideodec.c \ - gstamcvideoenc.c \ + gstamc.c \ gstamcsurface.c \ gstamcsurfacetexture.c \ + gstamcvideodec.c \ + gstamcvideoenc.c \ + gst-android-graphics-imageformat.c \ + gst-android-graphics-surfacetexture.c \ + gst-android-hardware-camera.c \ gstjniutils.c noinst_HEADERS = \ - gstamc.h \ - gstamc-constants.h \ + gstahcsrc.h \ gstamcaudiodec.h \ - gstamcvideodec.h \ - gstamcvideoenc.h \ + gstamc-constants.h \ + gstamc.h \ gstamcsurface.h \ gstamcsurfacetexture.h \ + gstamcvideodec.h \ + gstamcvideoenc.h \ + gst-android-graphics-imageformat.h \ + gst-android-graphics-surfacetexture.h \ + gst-android-hardware-camera.h \ gstjniutils.h libgstandroidmedia_la_CFLAGS = \ @@ -25,8 +33,11 @@ libgstandroidmedia_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) \ - $(ORC_CFLAGS) + $(ORC_CFLAGS) \ + -DGST_USE_UNSTABLE_API + libgstandroidmedia_la_LIBADD = \ + $(top_builddir)/gst-libs/gst/interfaces/libgstphotography-$(GST_API_VERSION).la \ $(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la \ $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-@GST_API_VERSION@ \ @@ -39,4 +50,6 @@ libgstandroidmedia_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstandroidmedia_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS) androidmedia_java_classesdir = $(datadir)/gst-android/ndk-build/androidmedia/ -androidmedia_java_classes_DATA = org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java +androidmedia_java_classes_DATA = \ + org/freedesktop/gstreamer/androidmedia/GstAhcCallback.java \ + org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java diff --git a/sys/androidmedia/gst-android-graphics-imageformat.c b/sys/androidmedia/gst-android-graphics-imageformat.c index 577131f27b..a382e5827b 100644 --- a/sys/androidmedia/gst-android-graphics-imageformat.c +++ b/sys/androidmedia/gst-android-graphics-imageformat.c @@ -3,6 +3,9 @@ * 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 @@ -23,7 +26,7 @@ #include "config.h" #endif -#include +#include "gstjniutils.h" #include "gst-android-graphics-imageformat.h" @@ -31,7 +34,7 @@ static struct { jclass klass; - jmethodID getBitsPerPixel; + jmethodID get_bits_per_pixel; jint JPEG; jint NV16; jint NV21; @@ -53,30 +56,95 @@ gint ImageFormat_YV12; static gboolean _init_classes (void) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env; + + jfieldID fieldID; + jclass klass; + + GError *err = NULL; + + env = gst_amc_jni_get_env (); /* android.graphics.ImageFormat */ - GST_DVM_GET_CLASS (android_graphics_imageformat, - "android/graphics/ImageFormat"); - GST_DVM_GET_STATIC_METHOD (android_graphics_imageformat, getBitsPerPixel, - "(I)I"); + klass = android_graphics_imageformat.klass = + gst_amc_jni_get_class (env, &err, "android/graphics/ImageFormat"); - GST_DVM_GET_CONSTANT (android_graphics_imageformat, JPEG, Int, "I"); + if (err) + goto failed; + + android_graphics_imageformat.get_bits_per_pixel = + gst_amc_jni_get_static_method_id (env, &err, klass, + "getBitsPerPixel", "(I)I"); + + if (err) + goto failed; + + fieldID = gst_amc_jni_get_static_field_id (env, &err, klass, "JPEG", "I"); + if (err) + goto failed; + if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, + &android_graphics_imageformat.JPEG)) + goto failed; ImageFormat_JPEG = android_graphics_imageformat.JPEG; - GST_DVM_GET_CONSTANT (android_graphics_imageformat, NV16, Int, "I"); + + fieldID = gst_amc_jni_get_static_field_id (env, &err, klass, "NV16", "I"); + if (err) + goto failed; + if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, + &android_graphics_imageformat.NV16)) + goto failed; ImageFormat_NV16 = android_graphics_imageformat.NV16; - GST_DVM_GET_CONSTANT (android_graphics_imageformat, NV21, Int, "I"); + + fieldID = gst_amc_jni_get_static_field_id (env, &err, klass, "NV21", "I"); + if (err) + goto failed; + if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, + &android_graphics_imageformat.NV21)) + goto failed; ImageFormat_NV21 = android_graphics_imageformat.NV21; - GST_DVM_GET_CONSTANT (android_graphics_imageformat, RGB_565, Int, "I"); + + fieldID = gst_amc_jni_get_static_field_id (env, &err, klass, "RGB_565", "I"); + if (err) + goto failed; + if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, + &android_graphics_imageformat.RGB_565)) + goto failed; ImageFormat_RGB_565 = android_graphics_imageformat.RGB_565; - GST_DVM_GET_CONSTANT (android_graphics_imageformat, UNKNOWN, Int, "I"); + + fieldID = gst_amc_jni_get_static_field_id (env, &err, klass, "UNKNOWN", "I"); + if (err) + goto failed; + if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, + &android_graphics_imageformat.UNKNOWN)) + goto failed; ImageFormat_UNKNOWN = android_graphics_imageformat.UNKNOWN; - GST_DVM_GET_CONSTANT (android_graphics_imageformat, YUY2, Int, "I"); + + fieldID = gst_amc_jni_get_static_field_id (env, &err, klass, "YUY2", "I"); + if (err) + goto failed; + if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, + &android_graphics_imageformat.YUY2)) + goto failed; ImageFormat_YUY2 = android_graphics_imageformat.YUY2; - GST_DVM_GET_CONSTANT (android_graphics_imageformat, YV12, Int, "I"); + + fieldID = gst_amc_jni_get_static_field_id (env, &err, klass, "YV12", "I"); + if (err) + goto failed; + if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, + &android_graphics_imageformat.YV12)) + goto failed; ImageFormat_YV12 = android_graphics_imageformat.YV12; return TRUE; + +failed: + if (err) { + GST_ERROR ("Failed to get android.graphics.ImageFormat class: %s", + err->message); + g_clear_error (&err); + } + + return FALSE; } gboolean @@ -93,7 +161,7 @@ gst_android_graphics_imageformat_init (void) void gst_android_graphics_imageformat_deinit (void) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); if (android_graphics_imageformat.klass) (*env)->DeleteGlobalRef (env, android_graphics_imageformat.klass); @@ -104,11 +172,21 @@ gst_android_graphics_imageformat_deinit (void) gint gst_ag_imageformat_get_bits_per_pixel (gint format) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env; + GError *err = NULL; + + jclass klass = android_graphics_imageformat.klass; + jint bpp = 0; - bpp = GST_DVM_STATIC_CALL (return -1, Int, - android_graphics_imageformat, getBitsPerPixel, format); + env = gst_amc_jni_get_env (); + + if (!gst_amc_jni_call_static_int_method (env, &err, + klass, android_graphics_imageformat.get_bits_per_pixel, &bpp, format)) { + GST_ERROR ("Failed to get android.graphics.ImageFormat class: %s", + err->message); + g_clear_error (&err); + } return bpp; } diff --git a/sys/androidmedia/gst-android-graphics-imageformat.h b/sys/androidmedia/gst-android-graphics-imageformat.h index 257a30408f..aff218b955 100644 --- a/sys/androidmedia/gst-android-graphics-imageformat.h +++ b/sys/androidmedia/gst-android-graphics-imageformat.h @@ -3,6 +3,9 @@ * 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 @@ -23,8 +26,6 @@ #define __GST_ANDROID_GRAPHICS_IMAGEFORMAT_H__ #include -#include - G_BEGIN_DECLS diff --git a/sys/androidmedia/gst-android-graphics-surfacetexture.c b/sys/androidmedia/gst-android-graphics-surfacetexture.c index 709121fac2..84993a8c87 100644 --- a/sys/androidmedia/gst-android-graphics-surfacetexture.c +++ b/sys/androidmedia/gst-android-graphics-surfacetexture.c @@ -3,6 +3,9 @@ * 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 @@ -23,11 +26,10 @@ #include "config.h" #endif -#include +#include "gstjniutils.h" #include "gst-android-graphics-surfacetexture.h" - static struct { jclass klass; @@ -39,14 +41,28 @@ static struct static gboolean _init_classes (void) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env; + GError *err = NULL; + + env = gst_amc_jni_get_env (); /* android.graphics.SurfaceTexture */ - GST_DVM_GET_CLASS (android_graphics_surfacetexture, - "android/graphics/SurfaceTexture"); - GST_DVM_GET_CONSTRUCTOR (android_graphics_surfacetexture, constructor, - "(I)V"); - GST_DVM_GET_METHOD (android_graphics_surfacetexture, release, "()V"); + 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; } @@ -65,7 +81,7 @@ gst_android_graphics_surfacetexture_init (void) void gst_android_graphics_surfacetexture_deinit (void) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); if (android_graphics_surfacetexture.klass) (*env)->DeleteGlobalRef (env, android_graphics_surfacetexture.klass); @@ -76,7 +92,7 @@ gst_android_graphics_surfacetexture_deinit (void) GstAGSurfaceTexture * gst_ag_surfacetexture_new (gint texture_id) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject object = NULL; GstAGSurfaceTexture *tex = NULL; @@ -105,15 +121,23 @@ gst_ag_surfacetexture_new (gint texture_id) void gst_ag_surfacetexture_release (GstAGSurfaceTexture * self) { - JNIEnv *env = gst_dvm_get_env (); + 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); + } - GST_DVM_CALL (, self->object, Void, android_graphics_surfacetexture, release); } void gst_ag_surfacetexture_free (GstAGSurfaceTexture * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); (*env)->DeleteGlobalRef (env, self->object); g_slice_free (GstAGSurfaceTexture, self); diff --git a/sys/androidmedia/gst-android-graphics-surfacetexture.h b/sys/androidmedia/gst-android-graphics-surfacetexture.h index a9904d9798..3bb80ca5d4 100644 --- a/sys/androidmedia/gst-android-graphics-surfacetexture.h +++ b/sys/androidmedia/gst-android-graphics-surfacetexture.h @@ -3,6 +3,9 @@ * 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 diff --git a/sys/androidmedia/gst-android-hardware-camera.c b/sys/androidmedia/gst-android-hardware-camera.c index 59bdfd4da8..f28fe03252 100644 --- a/sys/androidmedia/gst-android-hardware-camera.c +++ b/sys/androidmedia/gst-android-hardware-camera.c @@ -3,6 +3,9 @@ * 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 @@ -23,12 +26,34 @@ #include "config.h" #endif -#include +#include "gstjniutils.h" -#include "gstahccallback.h" #include "gst-android-hardware-camera.h" #include "stdio.h" +GST_DEBUG_CATEGORY_STATIC (ahc_debug); +#define GST_CAT_DEFAULT ahc_debug + +#define GST_DVM_STATIC_CALL(error_statement, type, k, method, ...) \ + (*env)->CallStatic##type##Method (env, k.klass, k.method, ## __VA_ARGS__); \ + if ((*env)->ExceptionCheck (env)) { \ + GST_ERROR ("Failed to call Java method"); \ + (*env)->ExceptionDescribe (env); \ + (*env)->ExceptionClear (env); \ + error_statement; \ + } + +#define GST_DVM_CALL(error_statement, obj, type, k, method, ...) \ + (*env)->Call##type##Method (env, obj, k.method, ## __VA_ARGS__); \ + if ((*env)->ExceptionCheck (env)) { \ + GST_ERROR ("Failed to call Java method"); \ + (*env)->ExceptionDescribe (env); \ + (*env)->ExceptionClear (env); \ + error_statement; \ + } + + + static struct { jclass klass; @@ -260,7 +285,7 @@ static struct { jclass klass; jmethodID constructor; -} com_gstreamer_gstahccallback = { +} org_freedesktop_gstreamer_androidmedia_gstahccallback = { 0}; static void @@ -300,163 +325,332 @@ static JNINativeMethod native_methods[] = { {(gchar *) "gst_ah_camera_on_error", (gchar *) "(ILandroid/hardware/Camera;JJ)V", (void *) gst_ah_camera_on_error}, - {(gchar *) "gst_ah_camera_on_auto_focus", - (gchar *) "(ZLandroid/hardware/Camera;JJ)V", - (void *) gst_ah_camera_on_auto_focus} +// {(gchar *) "gst_ah_camera_on_auto_focus", +// (gchar *) "(ZLandroid/hardware/Camera;JJ)V", +// (void *) gst_ah_camera_on_auto_focus} }; static gboolean _init_classes (void) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env; + GError *err; + + jclass klass; + jfieldID fieldID; + + env = gst_amc_jni_get_env (); /* android.hardware.Camera */ - GST_DVM_GET_CLASS (android_hardware_camera, "android/hardware/Camera"); - GST_DVM_GET_METHOD (android_hardware_camera, addCallbackBuffer, "([B)V"); - GST_DVM_GET_METHOD (android_hardware_camera, autoFocus, - "(Landroid/hardware/Camera$AutoFocusCallback;)V"); - GST_DVM_GET_METHOD (android_hardware_camera, cancelAutoFocus, "()V"); - GST_DVM_GET_STATIC_METHOD (android_hardware_camera, getCameraInfo, - "(ILandroid/hardware/Camera$CameraInfo;)V"); - GST_DVM_GET_STATIC_METHOD (android_hardware_camera, getNumberOfCameras, - "()I"); - GST_DVM_GET_METHOD (android_hardware_camera, getParameters, - "()Landroid/hardware/Camera$Parameters;"); - GST_DVM_GET_METHOD (android_hardware_camera, lock, "()V"); - GST_DVM_GET_STATIC_METHOD (android_hardware_camera, open, - "(I)Landroid/hardware/Camera;"); - GST_DVM_GET_METHOD (android_hardware_camera, reconnect, "()V"); - GST_DVM_GET_METHOD (android_hardware_camera, release, "()V"); - GST_DVM_GET_METHOD (android_hardware_camera, setErrorCallback, + klass = android_hardware_camera.klass = + gst_amc_jni_get_class (env, &err, "android/hardware/Camera"); + if (!klass) + goto failed; + + android_hardware_camera.addCallbackBuffer = + gst_amc_jni_get_method_id (env, &err, klass, + "addCallbackBuffer", "([B)V"); + + android_hardware_camera.autoFocus = + gst_amc_jni_get_method_id (env, &err, klass, + "autoFocus", "(Landroid/hardware/Camera$AutoFocusCallback;)V"); + + android_hardware_camera.cancelAutoFocus = + gst_amc_jni_get_method_id (env, &err, klass, "cancelAutoFocus", "()V"); + + android_hardware_camera.getCameraInfo = + gst_amc_jni_get_static_method_id (env, &err, klass, + "getCameraInfo", "(ILandroid/hardware/Camera$CameraInfo;)V"); + + android_hardware_camera.getNumberOfCameras = + gst_amc_jni_get_static_method_id (env, &err, klass, + "getNumberOfCameras", "()I"); + + android_hardware_camera.getParameters = + gst_amc_jni_get_method_id (env, &err, klass, + "getParameters", "()Landroid/hardware/Camera$Parameters;"); + + android_hardware_camera.lock = + gst_amc_jni_get_method_id (env, &err, klass, "lock", "()V"); + + android_hardware_camera.open = + gst_amc_jni_get_static_method_id (env, &err, klass, + "open", "(I)Landroid/hardware/Camera;"); + + android_hardware_camera.reconnect = + gst_amc_jni_get_method_id (env, &err, klass, "reconnect", "()V"); + + android_hardware_camera.release = + gst_amc_jni_get_method_id (env, &err, klass, "release", "()V"); + + android_hardware_camera.setErrorCallback = + gst_amc_jni_get_method_id (env, &err, klass, "setErrorCallback", "(Landroid/hardware/Camera$ErrorCallback;)V"); - GST_DVM_GET_METHOD (android_hardware_camera, setParameters, + + android_hardware_camera.setParameters = + gst_amc_jni_get_method_id (env, &err, klass, "setParameters", "(Landroid/hardware/Camera$Parameters;)V"); - GST_DVM_GET_METHOD (android_hardware_camera, setPreviewCallbackWithBuffer, + + android_hardware_camera.setPreviewCallbackWithBuffer = + gst_amc_jni_get_method_id (env, &err, klass, + "setPreviewCallbackWithBuffer", "(Landroid/hardware/Camera$PreviewCallback;)V"); - GST_DVM_GET_METHOD (android_hardware_camera, setPreviewTexture, - "(Landroid/graphics/SurfaceTexture;)V"); - GST_DVM_GET_METHOD (android_hardware_camera, startPreview, "()V"); - GST_DVM_GET_METHOD (android_hardware_camera, startSmoothZoom, "(I)V"); - GST_DVM_GET_METHOD (android_hardware_camera, stopPreview, "()V"); - GST_DVM_GET_METHOD (android_hardware_camera, stopSmoothZoom, "()V"); - GST_DVM_GET_METHOD (android_hardware_camera, unlock, "()V"); + + android_hardware_camera.setPreviewTexture = + gst_amc_jni_get_method_id (env, &err, klass, + "setPreviewTexture", "(Landroid/graphics/SurfaceTexture;)V"); + + android_hardware_camera.startPreview = + gst_amc_jni_get_method_id (env, &err, klass, "startPreview", "()V"); + + android_hardware_camera.startSmoothZoom = + gst_amc_jni_get_method_id (env, &err, klass, "startSmoothZoom", "(I)V"); + + android_hardware_camera.stopPreview = + gst_amc_jni_get_method_id (env, &err, klass, "stopPreview", "()V"); + + android_hardware_camera.stopPreview = + gst_amc_jni_get_method_id (env, &err, klass, "stopPreview", "()V"); + + android_hardware_camera.unlock = + gst_amc_jni_get_method_id (env, &err, klass, "unlock", "()V"); /* android.hardware.Camera.CameraInfo */ - GST_DVM_GET_CLASS (android_hardware_camera_camerainfo, - "android/hardware/Camera$CameraInfo"); - GST_DVM_GET_CONSTRUCTOR (android_hardware_camera_camerainfo, - constructor, "()V"); - GST_DVM_GET_FIELD (android_hardware_camera_camerainfo, facing, "I"); - GST_DVM_GET_FIELD (android_hardware_camera_camerainfo, orientation, "I"); - GST_DVM_GET_CONSTANT (android_hardware_camera_camerainfo, CAMERA_FACING_BACK, - Int, "I"); + klass = android_hardware_camera_camerainfo.klass = + gst_amc_jni_get_class (env, &err, "android/hardware/Camera$CameraInfo"); + if (!klass) + goto failed; + + android_hardware_camera_camerainfo.constructor = + gst_amc_jni_get_method_id (env, &err, klass, "", "()V"); + + android_hardware_camera_camerainfo.facing = + gst_amc_jni_get_field_id (env, &err, klass, "facing", "I"); + + android_hardware_camera_camerainfo.orientation = + gst_amc_jni_get_field_id (env, &err, klass, "orientation", "I"); + + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "CAMERA_FACING_BACK", + "I"); + if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, + &android_hardware_camera_camerainfo.CAMERA_FACING_BACK)) + goto failed; CameraInfo_CAMERA_FACING_BACK = android_hardware_camera_camerainfo.CAMERA_FACING_BACK; - GST_DVM_GET_CONSTANT (android_hardware_camera_camerainfo, CAMERA_FACING_FRONT, - Int, "I"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "CAMERA_FACING_FRONT", + "I"); + if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID, + &android_hardware_camera_camerainfo.CAMERA_FACING_FRONT)) + goto failed; CameraInfo_CAMERA_FACING_FRONT = android_hardware_camera_camerainfo.CAMERA_FACING_FRONT; /* android.hardware.Camera.Size */ - GST_DVM_GET_CLASS (android_hardware_camera_size, - "android/hardware/Camera$Size"); - GST_DVM_GET_FIELD (android_hardware_camera_size, width, "I"); - GST_DVM_GET_FIELD (android_hardware_camera_size, height, "I"); + klass = android_hardware_camera_size.klass = + gst_amc_jni_get_class (env, &err, "android/hardware/Camera$Size"); + if (!klass) + goto failed; + + android_hardware_camera_size.width = + gst_amc_jni_get_field_id (env, &err, klass, "width", "I"); + android_hardware_camera_size.height = + gst_amc_jni_get_field_id (env, &err, klass, "height", "I"); /* android.hardware.Camera.Parameters */ - GST_DVM_GET_CLASS (android_hardware_camera_parameters, - "android/hardware/Camera$Parameters"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, flatten, + klass = android_hardware_camera_parameters.klass = + gst_amc_jni_get_class (env, &err, "android/hardware/Camera$Parameters"); + if (!klass) + goto failed; + + android_hardware_camera_parameters.flatten = + gst_amc_jni_get_method_id (env, &err, klass, "flatten", "()Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getAntibanding, + + android_hardware_camera_parameters.getAntibanding = + gst_amc_jni_get_method_id (env, &err, klass, "getAntibanding", "()Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getColorEffect, + + android_hardware_camera_parameters.getColorEffect = + gst_amc_jni_get_method_id (env, &err, klass, "getColorEffect", "()Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getExposureCompensation, "()I"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getExposureCompensationStep, "()F"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getFlashMode, - "()Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getFocalLength, - "()F"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getFocusMode, - "()Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getHorizontalViewAngle, "()F"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getMaxExposureCompensation, "()I"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getMaxZoom, "()I"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getMinExposureCompensation, "()I"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getPreviewFormat, + + android_hardware_camera_parameters.getExposureCompensation = + gst_amc_jni_get_method_id (env, &err, klass, "getExposureCompensation", "()I"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getPreviewFpsRange, - "([I)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getPreviewSize, - "()Landroid/hardware/Camera$Size;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getSceneMode, + + android_hardware_camera_parameters.getExposureCompensationStep = + gst_amc_jni_get_method_id (env, &err, klass, + "getExposureCompensationStep", "()F"); + + android_hardware_camera_parameters.getFlashMode = + gst_amc_jni_get_method_id (env, &err, klass, "getFlashMode", "()Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getSupportedAntibanding, "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getSupportedColorEffects, "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getSupportedFlashModes, "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getSupportedFocusModes, "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getSupportedPreviewFormats, "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getSupportedPreviewFpsRange, "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getSupportedPreviewSizes, "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getSupportedSceneModes, "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - getSupportedWhiteBalance, "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getVerticalViewAngle, + + android_hardware_camera_parameters.getFocalLength = + gst_amc_jni_get_method_id (env, &err, klass, "getFocalLength", "()F"); + + android_hardware_camera_parameters.getFocusMode = + gst_amc_jni_get_method_id (env, &err, klass, "getFocusMode", + "()Ljava/lang/String;"); + + android_hardware_camera_parameters.getHorizontalViewAngle = + gst_amc_jni_get_method_id (env, &err, klass, "getHorizontalViewAngle", "()F"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getVideoStabilization, - "()Z"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getWhiteBalance, + + android_hardware_camera_parameters.getMaxExposureCompensation = + gst_amc_jni_get_method_id (env, &err, klass, "getMaxExposureCompensation", + "()I"); + + android_hardware_camera_parameters.getMaxZoom = + gst_amc_jni_get_method_id (env, &err, klass, "getMaxZoom", "()I"); + + android_hardware_camera_parameters.getMinExposureCompensation = + gst_amc_jni_get_method_id (env, &err, klass, "getMinExposureCompensation", + "()I"); + + android_hardware_camera_parameters.getPreviewFormat = + gst_amc_jni_get_method_id (env, &err, klass, "getPreviewFormat", "()I"); + + android_hardware_camera_parameters.getPreviewFpsRange = + gst_amc_jni_get_method_id (env, &err, klass, "getPreviewFpsRange", + "([I)V"); + + android_hardware_camera_parameters.getPreviewSize = + gst_amc_jni_get_method_id (env, &err, klass, "getPreviewSize", + "()Landroid/hardware/Camera$Size;"); + + android_hardware_camera_parameters.getSceneMode = + gst_amc_jni_get_method_id (env, &err, klass, "getSceneMode", "()Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getZoom, "()I"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, getZoomRatios, + + android_hardware_camera_parameters.getSupportedAntibanding = + gst_amc_jni_get_method_id (env, &err, klass, "getSupportedAntibanding", "()Ljava/util/List;"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, isSmoothZoomSupported, + + android_hardware_camera_parameters.getSupportedColorEffects = + gst_amc_jni_get_method_id (env, &err, klass, "getSupportedColorEffects", + "()Ljava/util/List;"); + + android_hardware_camera_parameters.getSupportedFlashModes = + gst_amc_jni_get_method_id (env, &err, klass, "getSupportedFlashModes", + "()Ljava/util/List;"); + + android_hardware_camera_parameters.getSupportedFocusModes = + gst_amc_jni_get_method_id (env, &err, klass, "getSupportedFocusModes", + "()Ljava/util/List;"); + + android_hardware_camera_parameters.getSupportedPreviewFormats = + gst_amc_jni_get_method_id (env, &err, klass, "getSupportedPreviewFormats", + "()Ljava/util/List;"); + + android_hardware_camera_parameters.getSupportedPreviewFpsRange = + gst_amc_jni_get_method_id (env, &err, klass, + "getSupportedPreviewFpsRange", "()Ljava/util/List;"); + + android_hardware_camera_parameters.getSupportedPreviewSizes = + gst_amc_jni_get_method_id (env, &err, klass, "getSupportedPreviewSizes", + "()Ljava/util/List;"); + + android_hardware_camera_parameters.getSupportedSceneModes = + gst_amc_jni_get_method_id (env, &err, klass, "getSupportedSceneModes", + "()Ljava/util/List;"); + + android_hardware_camera_parameters.getSupportedWhiteBalance = + gst_amc_jni_get_method_id (env, &err, klass, "getSupportedWhiteBalance", + "()Ljava/util/List;"); + + android_hardware_camera_parameters.getVerticalViewAngle = + gst_amc_jni_get_method_id (env, &err, klass, "getVerticalViewAngle", + "()F"); + + android_hardware_camera_parameters.getVideoStabilization = + gst_amc_jni_get_method_id (env, &err, klass, "getVideoStabilization", "()Z"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - isVideoStabilizationSupported, "()Z"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, isZoomSupported, + + android_hardware_camera_parameters.getWhiteBalance = + gst_amc_jni_get_method_id (env, &err, klass, "getWhiteBalance", + "()Ljava/lang/String;"); + + android_hardware_camera_parameters.getZoom = + gst_amc_jni_get_method_id (env, &err, klass, "getZoom", "()I"); + + android_hardware_camera_parameters.getZoomRatios = + gst_amc_jni_get_method_id (env, &err, klass, "getZoomRatios", + "()Ljava/util/List;"); + + android_hardware_camera_parameters.isSmoothZoomSupported = + gst_amc_jni_get_method_id (env, &err, klass, "isSmoothZoomSupported", "()Z"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setAntibanding, + + android_hardware_camera_parameters.isVideoStabilizationSupported = + gst_amc_jni_get_method_id (env, &err, klass, + "isVideoStabilizationSupported", "()Z"); + + android_hardware_camera_parameters.isZoomSupported = + gst_amc_jni_get_method_id (env, &err, klass, "isZoomSupported", "()Z"); + + android_hardware_camera_parameters.setAntibanding = + gst_amc_jni_get_method_id (env, &err, klass, "setAntibanding", "(Ljava/lang/String;)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setColorEffect, + + android_hardware_camera_parameters.setColorEffect = + gst_amc_jni_get_method_id (env, &err, klass, "setColorEffect", "(Ljava/lang/String;)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, - setExposureCompensation, "(I)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setFlashMode, - "(Ljava/lang/String;)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setFocusMode, - "(Ljava/lang/String;)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setPreviewFormat, + + android_hardware_camera_parameters.setExposureCompensation = + gst_amc_jni_get_method_id (env, &err, klass, "setExposureCompensation", "(I)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setPreviewFpsRange, - "(II)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setPreviewSize, - "(II)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setSceneMode, + + android_hardware_camera_parameters.setFlashMode = + gst_amc_jni_get_method_id (env, &err, klass, "setFlashMode", "(Ljava/lang/String;)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setWhiteBalance, + + android_hardware_camera_parameters.setFocusMode = + gst_amc_jni_get_method_id (env, &err, klass, "setFocusMode", "(Ljava/lang/String;)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setVideoStabilization, + + android_hardware_camera_parameters.setPreviewFormat = + gst_amc_jni_get_method_id (env, &err, klass, "setPreviewFormat", "(I)V"); + + android_hardware_camera_parameters.setPreviewFpsRange = + gst_amc_jni_get_method_id (env, &err, klass, "setPreviewFpsRange", + "(II)V"); + + android_hardware_camera_parameters.setPreviewSize = + gst_amc_jni_get_method_id (env, &err, klass, "setPreviewSize", "(II)V"); + + android_hardware_camera_parameters.setSceneMode = + gst_amc_jni_get_method_id (env, &err, klass, "setSceneMode", + "(Ljava/lang/String;)V"); + + android_hardware_camera_parameters.setWhiteBalance = + gst_amc_jni_get_method_id (env, &err, klass, "setWhiteBalance", + "(Ljava/lang/String;)V"); + + android_hardware_camera_parameters.setVideoStabilization = + gst_amc_jni_get_method_id (env, &err, klass, "setVideoStabilization", "(Z)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, setZoom, "(I)V"); - GST_DVM_GET_METHOD (android_hardware_camera_parameters, unflatten, + + android_hardware_camera_parameters.setZoom = + gst_amc_jni_get_method_id (env, &err, klass, "setZoom", "(I)V"); + + android_hardware_camera_parameters.unflatten = + gst_amc_jni_get_method_id (env, &err, klass, "unflatten", "(Ljava/lang/String;)V"); - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, WHITE_BALANCE_AUTO, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "WHITE_BALANCE_AUTO", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.WHITE_BALANCE_AUTO)) + goto failed; + Parameters_WHITE_BALANCE_AUTO = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.WHITE_BALANCE_AUTO, NULL); @@ -467,8 +661,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - WHITE_BALANCE_INCANDESCENT, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "WHITE_BALANCE_INCANDESCENT", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT)) + goto failed; + Parameters_WHITE_BALANCE_INCANDESCENT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT, NULL); @@ -480,8 +682,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - WHITE_BALANCE_FLUORESCENT, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "WHITE_BALANCE_FLUORESCENT", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT)) + goto failed; + Parameters_WHITE_BALANCE_FLUORESCENT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT, NULL); @@ -493,8 +703,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - WHITE_BALANCE_WARM_FLUORESCENT, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "WHITE_BALANCE_WARM_FLUORESCENT", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT)) + goto failed; + Parameters_WHITE_BALANCE_WARM_FLUORESCENT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT, NULL); @@ -506,8 +724,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - WHITE_BALANCE_DAYLIGHT, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "WHITE_BALANCE_DAYLIGHT", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT)) + goto failed; + Parameters_WHITE_BALANCE_DAYLIGHT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT, NULL); @@ -518,8 +744,15 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - WHITE_BALANCE_CLOUDY_DAYLIGHT, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "WHITE_BALANCE_CLOUDY_DAYLIGHT", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT)) + goto failed; Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT, NULL); @@ -531,8 +764,15 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - WHITE_BALANCE_TWILIGHT, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "WHITE_BALANCE_TWILIGHT", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT)) + goto failed; Parameters_WHITE_BALANCE_TWILIGHT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT, NULL); @@ -543,8 +783,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, WHITE_BALANCE_SHADE, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "WHITE_BALANCE_SHADE", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.WHITE_BALANCE_SHADE)) + goto failed; + Parameters_WHITE_BALANCE_SHADE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.WHITE_BALANCE_SHADE, NULL); @@ -555,8 +803,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, EFFECT_NONE, Object, + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_NONE", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.EFFECT_NONE)) + goto failed; + Parameters_EFFECT_NONE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.EFFECT_NONE, NULL); @@ -567,8 +823,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, EFFECT_MONO, Object, + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_MONO", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.EFFECT_MONO)) + goto failed; + Parameters_EFFECT_MONO = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.EFFECT_MONO, NULL); @@ -579,8 +843,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, EFFECT_NEGATIVE, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_NEGATIVE", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.EFFECT_NEGATIVE)) + goto failed; + Parameters_EFFECT_NEGATIVE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.EFFECT_NEGATIVE, NULL); @@ -591,8 +863,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, EFFECT_SOLARIZE, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_SOLARIZE", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.EFFECT_SOLARIZE)) + goto failed; + Parameters_EFFECT_SOLARIZE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.EFFECT_SOLARIZE, NULL); @@ -603,8 +883,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, EFFECT_SEPIA, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_SEPIA", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.EFFECT_SEPIA)) + goto failed; + Parameters_EFFECT_SEPIA = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.EFFECT_SEPIA, NULL); @@ -615,8 +903,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, EFFECT_POSTERIZE, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_POSTERIZE", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.EFFECT_POSTERIZE)) + goto failed; + Parameters_EFFECT_POSTERIZE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.EFFECT_POSTERIZE, NULL); @@ -627,8 +923,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, EFFECT_WHITEBOARD, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_WHITEBOARD", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.EFFECT_WHITEBOARD)) + goto failed; + Parameters_EFFECT_WHITEBOARD = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.EFFECT_WHITEBOARD, NULL); @@ -639,8 +943,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, EFFECT_BLACKBOARD, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_BLACKBOARD", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.EFFECT_BLACKBOARD)) + goto failed; + Parameters_EFFECT_BLACKBOARD = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.EFFECT_BLACKBOARD, NULL); @@ -651,8 +963,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, EFFECT_AQUA, Object, + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_AQUA", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.EFFECT_AQUA)) + goto failed; + Parameters_EFFECT_AQUA = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.EFFECT_AQUA, NULL); @@ -663,8 +983,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, ANTIBANDING_AUTO, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "ANTIBANDING_AUTO", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.ANTIBANDING_AUTO)) + goto failed; + Parameters_ANTIBANDING_AUTO = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.ANTIBANDING_AUTO, NULL); @@ -675,8 +1003,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, ANTIBANDING_50HZ, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "ANTIBANDING_50HZ", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.ANTIBANDING_50HZ)) + goto failed; + Parameters_ANTIBANDING_50HZ = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.ANTIBANDING_50HZ, NULL); @@ -687,8 +1023,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, ANTIBANDING_60HZ, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "ANTIBANDING_60HZ", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.ANTIBANDING_60HZ)) + goto failed; + Parameters_ANTIBANDING_60HZ = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.ANTIBANDING_60HZ, NULL); @@ -699,8 +1043,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, ANTIBANDING_OFF, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "ANTIBANDING_OFF", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.ANTIBANDING_OFF)) + goto failed; + Parameters_ANTIBANDING_OFF = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.ANTIBANDING_OFF, NULL); @@ -711,8 +1063,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FLASH_MODE_OFF, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_OFF", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FLASH_MODE_OFF)) + goto failed; + Parameters_FLASH_MODE_OFF = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FLASH_MODE_OFF, NULL); @@ -723,8 +1083,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FLASH_MODE_AUTO, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_AUTO", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FLASH_MODE_AUTO)) + goto failed; + Parameters_FLASH_MODE_AUTO = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FLASH_MODE_AUTO, NULL); @@ -735,8 +1103,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FLASH_MODE_ON, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_ON", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FLASH_MODE_ON)) + goto failed; + Parameters_FLASH_MODE_ON = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FLASH_MODE_ON, NULL); @@ -747,8 +1123,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FLASH_MODE_RED_EYE, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_RED_EYE", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FLASH_MODE_RED_EYE)) + goto failed; + Parameters_FLASH_MODE_RED_EYE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FLASH_MODE_RED_EYE, NULL); @@ -759,8 +1143,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FLASH_MODE_TORCH, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_TORCH", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FLASH_MODE_TORCH)) + goto failed; + Parameters_FLASH_MODE_TORCH = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FLASH_MODE_TORCH, NULL); @@ -771,8 +1163,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_AUTO, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_AUTO", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_AUTO)) + goto failed; + Parameters_SCENE_MODE_AUTO = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_AUTO, NULL); @@ -783,8 +1183,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_ACTION, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_ACTION", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_ACTION)) + goto failed; + Parameters_SCENE_MODE_ACTION = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_ACTION, NULL); @@ -795,8 +1203,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_PORTRAIT, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_PORTRAIT", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_PORTRAIT)) + goto failed; + Parameters_SCENE_MODE_PORTRAIT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_PORTRAIT, NULL); @@ -807,8 +1223,15 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - SCENE_MODE_LANDSCAPE, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_LANDSCAPE", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE)) + goto failed; Parameters_SCENE_MODE_LANDSCAPE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE, NULL); @@ -819,8 +1242,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_NIGHT, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_NIGHT", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_NIGHT)) + goto failed; + Parameters_SCENE_MODE_NIGHT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_NIGHT, NULL); @@ -831,8 +1262,15 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - SCENE_MODE_NIGHT_PORTRAIT, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "SCENE_MODE_NIGHT_PORTRAIT", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT)) + goto failed; Parameters_SCENE_MODE_NIGHT_PORTRAIT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT, NULL); @@ -844,8 +1282,15 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_THEATRE, - Object, "Ljava/lang/String;"); + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_THEATRE", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_THEATRE)) + goto failed; + Parameters_SCENE_MODE_THEATRE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_THEATRE, NULL); @@ -856,8 +1301,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_BEACH, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_BEACH", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_BEACH)) + goto failed; + Parameters_SCENE_MODE_BEACH = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_BEACH, NULL); @@ -868,8 +1321,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_SNOW, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_SNOW", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_SNOW)) + goto failed; + Parameters_SCENE_MODE_SNOW = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_SNOW, NULL); @@ -880,8 +1341,17 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_SUNSET, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_SUNSET", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_SUNSET)) + goto failed; + + Parameters_SCENE_MODE_SUNSET = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_SUNSET, NULL); @@ -892,8 +1362,17 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - SCENE_MODE_STEADYPHOTO, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "SCENE_MODE_STEADYPHOTO", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO)) + goto failed; + + Parameters_SCENE_MODE_STEADYPHOTO = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO, NULL); @@ -904,8 +1383,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - SCENE_MODE_FIREWORKS, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_FIREWORKS", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_FIREWORKS)) + goto failed; + Parameters_SCENE_MODE_FIREWORKS = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_FIREWORKS, NULL); @@ -916,8 +1403,17 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_SPORTS, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_SPORTS", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_SPORTS)) + goto failed; + + Parameters_SCENE_MODE_SPORTS = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_SPORTS, NULL); @@ -928,8 +1424,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_PARTY, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_PARTY", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_PARTY)) + goto failed; + Parameters_SCENE_MODE_PARTY = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_PARTY, NULL); @@ -940,8 +1444,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - SCENE_MODE_CANDLELIGHT, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "SCENE_MODE_CANDLELIGHT", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT)) + goto failed; + Parameters_SCENE_MODE_CANDLELIGHT = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT, NULL); @@ -952,8 +1464,17 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, SCENE_MODE_BARCODE, - Object, "Ljava/lang/String;"); + + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_BARCODE", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.SCENE_MODE_BARCODE)) + goto failed; + Parameters_SCENE_MODE_BARCODE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.SCENE_MODE_BARCODE, NULL); @@ -964,8 +1485,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FOCUS_MODE_AUTO, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_AUTO", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FOCUS_MODE_AUTO)) + goto failed; + Parameters_FOCUS_MODE_AUTO = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FOCUS_MODE_AUTO, NULL); @@ -976,8 +1505,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FOCUS_MODE_INFINITY, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_INFINITY", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FOCUS_MODE_INFINITY)) + goto failed; + Parameters_FOCUS_MODE_INFINITY = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FOCUS_MODE_INFINITY, NULL); @@ -988,8 +1525,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FOCUS_MODE_MACRO, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_MACRO", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FOCUS_MODE_MACRO)) + goto failed; + Parameters_FOCUS_MODE_MACRO = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FOCUS_MODE_MACRO, NULL); @@ -1000,8 +1545,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FOCUS_MODE_FIXED, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_FIXED", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FOCUS_MODE_FIXED)) + goto failed; + Parameters_FOCUS_MODE_FIXED = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FOCUS_MODE_FIXED, NULL); @@ -1012,8 +1565,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, FOCUS_MODE_EDOF, - Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_EDOF", + "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FOCUS_MODE_EDOF)) + goto failed; + Parameters_FOCUS_MODE_EDOF = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FOCUS_MODE_EDOF, NULL); @@ -1024,8 +1585,16 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - FOCUS_MODE_CONTINUOUS_VIDEO, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "FOCUS_MODE_CONTINUOUS_VIDEO", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) + goto failed; + Parameters_FOCUS_MODE_CONTINUOUS_VIDEO = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO, NULL); @@ -1037,8 +1606,17 @@ _init_classes (void) (*env)->NewGlobalRef (env, local); (*env)->DeleteLocalRef (env, local); } - GST_DVM_GET_CONSTANT (android_hardware_camera_parameters, - FOCUS_MODE_CONTINUOUS_PICTURE, Object, "Ljava/lang/String;"); + + fieldID = + gst_amc_jni_get_static_field_id (env, &err, klass, + "FOCUS_MODE_CONTINUOUS_PICTURE", "Ljava/lang/String;"); + if (!fieldID) + goto failed; + if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID, + &android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) + goto failed; + + Parameters_FOCUS_MODE_CONTINUOUS_PICTURE = (*env)->GetStringUTFChars (env, android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE, NULL); @@ -1052,137 +1630,65 @@ _init_classes (void) } /* java.lang.String */ - GST_DVM_GET_CLASS (java_lang_string, "java/lang/String"); - GST_DVM_GET_METHOD (java_lang_string, equals, "(Ljava/lang/Object;)Z"); + klass = java_lang_string.klass = + gst_amc_jni_get_class (env, &err, "java/lang/String"); + java_lang_string.equals = + gst_amc_jni_get_method_id (env, &err, klass, "equals", + "(Ljava/lang/Object;)Z"); /* java.util.List */ - GST_DVM_GET_CLASS (java_util_list, "java/util/List"); - GST_DVM_GET_METHOD (java_util_list, iterator, "()Ljava/util/Iterator;"); + klass = java_util_list.klass = + gst_amc_jni_get_class (env, &err, "java/util/List"); + java_util_list.iterator = + gst_amc_jni_get_method_id (env, &err, klass, "iterator", + "()Ljava/util/Iterator;"); /* java.util.Iterator */ - GST_DVM_GET_CLASS (java_util_iterator, "java/util/Iterator"); - GST_DVM_GET_METHOD (java_util_iterator, hasNext, "()Z"); - GST_DVM_GET_METHOD (java_util_iterator, next, "()Ljava/lang/Object;"); + klass = java_util_iterator.klass = + gst_amc_jni_get_class (env, &err, "java/util/Iterator"); + java_util_iterator.hasNext = + gst_amc_jni_get_method_id (env, &err, klass, "hasNext", "()Z"); + java_util_iterator.next = + gst_amc_jni_get_method_id (env, &err, klass, "next", + "()Ljava/lang/Object;"); /* java.lang.Integer */ - GST_DVM_GET_CLASS (java_lang_integer, "java/lang/Integer"); - GST_DVM_GET_METHOD (java_lang_integer, intValue, "()I"); + klass = java_lang_integer.klass = + gst_amc_jni_get_class (env, &err, "java/lang/Integer"); + java_lang_integer.intValue = + gst_amc_jni_get_method_id (env, &err, klass, "intValue", "()I"); - /* com.gstreamer.GstAhcCallback */ - if (gst_ahc_callback_jar && g_getenv ("TMP")) { - jclass dex_loader = NULL; - gchar *path = g_strdup_printf ("%s/GstAhcCallback.jar", g_getenv ("TMP")); - FILE *fd = fopen (path, "wb"); - - GST_DEBUG ("Found embedded GstAhcCallback.jar, trying to load dynamically" - "from %s", path); - if (fd) { - if (fwrite (gst_ahc_callback_jar, gst_ahc_callback_jar_size, 1, fd) == 1) { - dex_loader = (*env)->FindClass (env, "dalvik/system/DexClassLoader"); - (*env)->ExceptionClear (env); - } - fclose (fd); - } - - if (dex_loader) { - jmethodID constructor; - jmethodID load_class; - - constructor = (*env)->GetMethodID (env, dex_loader, "", - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;" - "Ljava/lang/ClassLoader;)V"); - load_class = (*env)->GetMethodID (env, dex_loader, "loadClass", - "(Ljava/lang/String;)Ljava/lang/Class;"); - (*env)->ExceptionClear (env); - if (constructor && load_class) { - jstring dex_path = NULL; - jstring optimized_directory = NULL; - - dex_path = (*env)->NewStringUTF (env, path); - if (g_getenv ("DEX")) - optimized_directory = (*env)->NewStringUTF (env, g_getenv ("DEX")); - else - optimized_directory = (*env)->NewStringUTF (env, g_getenv ("TMP")); - (*env)->ExceptionClear (env); - if (dex_path && optimized_directory) { - jobject loader; - jobject parent = NULL; - jclass klass; - - klass = (*env)->FindClass (env, "java/lang/Class"); - (*env)->ExceptionClear (env); - if (klass) { - jmethodID get_class_loader; - - get_class_loader = (*env)->GetMethodID (env, klass, - "getClassLoader", "()Ljava/lang/ClassLoader;"); - (*env)->ExceptionClear (env); - if (get_class_loader) { - parent = (*env)->CallObjectMethod (env, klass, get_class_loader); - (*env)->ExceptionClear (env); - } - (*env)->DeleteLocalRef (env, klass); - } - loader = (*env)->NewObject (env, dex_loader, constructor, dex_path, - optimized_directory, NULL, parent); - (*env)->ExceptionClear (env); - if (loader) { - jstring class_name = NULL; - - class_name = (*env)->NewStringUTF (env, - "com/gstreamer/GstAhcCallback"); - (*env)->ExceptionClear (env); - if (class_name) { - jclass temp; - - temp = (*env)->CallObjectMethod (env, loader, load_class, - class_name); - (*env)->ExceptionClear (env); - if (temp) { - - GST_DEBUG ("Successfully loaded embedded GstAhcCallback"); - com_gstreamer_gstahccallback.klass = (*env)->NewGlobalRef (env, - temp); - (*env)->DeleteLocalRef (env, temp); - } - (*env)->DeleteLocalRef (env, class_name); - } - (*env)->DeleteLocalRef (env, loader); - } - if (parent) - (*env)->DeleteLocalRef (env, parent); - } - if (dex_path) - (*env)->DeleteLocalRef (env, dex_path); - if (optimized_directory) - (*env)->DeleteLocalRef (env, optimized_directory); - } - (*env)->DeleteLocalRef (env, dex_loader); - g_free (path); - } - } else { - GST_WARNING ("Did not find embedded GstAhcCallback.jar, fallback to" - " FindClass"); + if (!org_freedesktop_gstreamer_androidmedia_gstahccallback.klass) { + org_freedesktop_gstreamer_androidmedia_gstahccallback.klass = + gst_amc_jni_get_class (env, &err, "org/freedesktop/gstreamer/androidmedia/GstAhcCallback"); } - if (!com_gstreamer_gstahccallback.klass) { - GST_DVM_GET_CLASS (com_gstreamer_gstahccallback, - "com/gstreamer/GstAhcCallback"); - } - GST_DVM_GET_CONSTRUCTOR (com_gstreamer_gstahccallback, constructor, "(JJ)V"); + org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor = + gst_amc_jni_get_method_id (env, &err, org_freedesktop_gstreamer_androidmedia_gstahccallback.klass, + "", "(JJ)V"); - if ((*env)->RegisterNatives (env, com_gstreamer_gstahccallback.klass, + if ((*env)->RegisterNatives (env, org_freedesktop_gstreamer_androidmedia_gstahccallback.klass, native_methods, G_N_ELEMENTS (native_methods))) { GST_ERROR ("Failed to register native methods for GstAhcCallback"); return FALSE; } return TRUE; + +failed: + if (err) { + GST_ERROR ("Failed to get android.hardware.Camera class: %s", err->message); + g_clear_error (&err); + } + + return FALSE; + } gboolean gst_android_hardware_camera_init (void) { + GST_DEBUG_CATEGORY_INIT (ahc_debug, "ahc", 0, "Android Gstreamer Hardware Camera"); if (!_init_classes ()) { gst_android_hardware_camera_deinit (); return FALSE; @@ -1194,7 +1700,7 @@ gst_android_hardware_camera_init (void) void gst_android_hardware_camera_deinit (void) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); if (android_hardware_camera.klass) (*env)->DeleteGlobalRef (env, android_hardware_camera.klass); @@ -1666,11 +2172,11 @@ gst_android_hardware_camera_deinit (void) (*env)->DeleteGlobalRef (env, java_lang_integer.klass); java_lang_integer.klass = NULL; - if (com_gstreamer_gstahccallback.klass) { - (*env)->UnregisterNatives (env, com_gstreamer_gstahccallback.klass); - (*env)->DeleteGlobalRef (env, com_gstreamer_gstahccallback.klass); + if (org_freedesktop_gstreamer_androidmedia_gstahccallback.klass) { + (*env)->UnregisterNatives (env, org_freedesktop_gstreamer_androidmedia_gstahccallback.klass); + (*env)->DeleteGlobalRef (env, org_freedesktop_gstreamer_androidmedia_gstahccallback.klass); } - com_gstreamer_gstahccallback.klass = NULL; + org_freedesktop_gstreamer_androidmedia_gstahccallback.klass = NULL; } /* android.hardware.Camera */ @@ -1684,7 +2190,9 @@ gst_android_hardware_camera_deinit (void) void gst_ah_camera_add_callback_buffer (GstAHCamera * self, jbyteArray buffer) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); + + GST_DEBUG ("add callback_buffer %p", buffer); AHC_CALL (, Void, addCallbackBuffer, buffer); } @@ -1693,14 +2201,14 @@ gboolean gst_ah_camera_auto_focus (GstAHCamera * self, GstAHCAutoFocusCallback cb, gpointer user_data) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject object = NULL; gboolean ret = FALSE; if (cb) { object = (*env)->NewObject (env, - com_gstreamer_gstahccallback.klass, - com_gstreamer_gstahccallback.constructor, + org_freedesktop_gstreamer_androidmedia_gstahccallback.klass, + org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor, *((jlong *) & cb), *((jlong *) & user_data)); if (!object) { GST_ERROR ("Failed to create callback object"); @@ -1722,7 +2230,7 @@ done: gboolean gst_ah_camera_cancel_auto_focus (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (return FALSE, Void, cancelAutoFocus); @@ -1732,7 +2240,7 @@ gst_ah_camera_cancel_auto_focus (GstAHCamera * self) gboolean gst_ah_camera_get_camera_info (gint camera_id, GstAHCCameraInfo * camera_info) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject jcamera_info = NULL; gboolean ret = FALSE; @@ -1774,7 +2282,7 @@ done: gint gst_ah_camera_get_number_of_cameras (void) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gint num_cameras; num_cameras = AHC_STATIC_CALL (return -1, Int, getNumberOfCameras); @@ -1785,7 +2293,7 @@ gst_ah_camera_get_number_of_cameras (void) GstAHCParameters * gst_ah_camera_get_parameters (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject object = NULL; GstAHCParameters *params = NULL; @@ -1802,13 +2310,15 @@ gst_ah_camera_get_parameters (GstAHCamera * self) } } + GST_DEBUG ("return parameters %p", params->object); + return params; } gboolean gst_ah_camera_lock (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (return FALSE, Void, lock); @@ -1818,7 +2328,7 @@ gst_ah_camera_lock (GstAHCamera * self) GstAHCamera * gst_ah_camera_open (gint camera_id) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject object = NULL; GstAHCamera *camera = NULL; @@ -1842,7 +2352,7 @@ done: gboolean gst_ah_camera_reconnect (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (return FALSE, Void, reconnect); @@ -1852,15 +2362,15 @@ gst_ah_camera_reconnect (GstAHCamera * self) void gst_ah_camera_release (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (, Void, release); } void -gst_ah_camera_release (GstAHCamera * self) +gst_ah_camera_free (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); (*env)->DeleteGlobalRef (env, self->object); g_slice_free (GstAHCamera, self); @@ -1870,7 +2380,7 @@ gst_ah_camera_release (GstAHCamera * self) gboolean gst_ah_camera_set_parameters (GstAHCamera * self, GstAHCParameters * params) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (return FALSE, Void, setParameters, params->object); @@ -1881,14 +2391,14 @@ gboolean gst_ah_camera_set_error_callback (GstAHCamera * self, GstAHCErrorCallback cb, gpointer user_data) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject object = NULL; gboolean ret = FALSE; if (cb) { object = (*env)->NewObject (env, - com_gstreamer_gstahccallback.klass, - com_gstreamer_gstahccallback.constructor, + org_freedesktop_gstreamer_androidmedia_gstahccallback.klass, + org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor, *((jlong *) & cb), *((jlong *) & user_data)); if (!object) { GST_ERROR ("Failed to create callback object"); @@ -1911,14 +2421,14 @@ gboolean gst_ah_camera_set_preview_callback_with_buffer (GstAHCamera * self, GstAHCPreviewCallback cb, gpointer user_data) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject object = NULL; gboolean ret = FALSE; if (cb) { object = (*env)->NewObject (env, - com_gstreamer_gstahccallback.klass, - com_gstreamer_gstahccallback.constructor, + org_freedesktop_gstreamer_androidmedia_gstahccallback.klass, + org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor, *((jlong *) & cb), *((jlong *) & user_data)); if (!object) { GST_ERROR ("Failed to create callback object"); @@ -1941,7 +2451,7 @@ void gst_ah_camera_set_preview_texture (GstAHCamera * self, GstAGSurfaceTexture * surfaceTexture) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (, Void, setPreviewTexture, surfaceTexture->object); } @@ -1949,7 +2459,7 @@ gst_ah_camera_set_preview_texture (GstAHCamera * self, gboolean gst_ah_camera_start_preview (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (return FALSE, Void, startPreview); @@ -1959,7 +2469,7 @@ gst_ah_camera_start_preview (GstAHCamera * self) gboolean gst_ah_camera_start_smooth_zoom (GstAHCamera * self, gint value) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (return FALSE, Void, startSmoothZoom, value); @@ -1969,7 +2479,7 @@ gst_ah_camera_start_smooth_zoom (GstAHCamera * self, gint value) gboolean gst_ah_camera_stop_preview (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (return FALSE, Void, stopPreview); @@ -1979,7 +2489,7 @@ gst_ah_camera_stop_preview (GstAHCamera * self) gboolean gst_ah_camera_stop_smooth_zoom (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (return FALSE, Void, stopSmoothZoom); @@ -1989,7 +2499,7 @@ gst_ah_camera_stop_smooth_zoom (GstAHCamera * self) gboolean gst_ah_camera_unlock (GstAHCamera * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHC_CALL (return FALSE, Void, unlock); @@ -2051,10 +2561,12 @@ java_lang_integer_int_value (JNIEnv * env, jobject obj) return (*env)->CallIntMethod (env, obj, java_lang_integer.intValue); } + /* android.hardware.Camera.Parameters */ #define AHCP_CALL(error_statement, type, method, ...) \ GST_DVM_CALL (error_statement, self->object, type, \ android_hardware_camera_parameters, method, ## __VA_ARGS__); + #define AHCP_STATIC_CALL(error_statement, type, method, ...) \ GST_DVM_STATIC_CALL (error_statement, type, \ android_hardware_camera_parameters, method, ## __VA_ARGS__); @@ -2428,7 +2940,7 @@ _focus_mode_to_jstring (const gchar * focus_mode) gchar * gst_ahc_parameters_flatten (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jstring v_str = NULL; const gchar *v = NULL; gchar *ret = NULL; @@ -2454,7 +2966,7 @@ done: const gchar * gst_ahc_parameters_get_antibanding (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); const gchar *ret = NULL; jstring antibanding; @@ -2471,7 +2983,7 @@ gst_ahc_parameters_get_antibanding (GstAHCParameters * self) const gchar * gst_ahc_parameters_get_color_effect (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); const gchar *ret = NULL; jstring color_effect; @@ -2488,7 +3000,7 @@ gst_ahc_parameters_get_color_effect (GstAHCParameters * self) gint gst_ahc_parameters_get_exposure_compensation (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gint ev; ev = AHCP_CALL (return -1, Int, getExposureCompensation); @@ -2499,7 +3011,7 @@ gst_ahc_parameters_get_exposure_compensation (GstAHCParameters * self) gfloat gst_ahc_parameters_get_exposure_compensation_step (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gfloat step; step = AHCP_CALL (return 0.0, Float, getExposureCompensationStep); @@ -2510,7 +3022,7 @@ gst_ahc_parameters_get_exposure_compensation_step (GstAHCParameters * self) const gchar * gst_ahc_parameters_get_flash_mode (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); const gchar *ret = NULL; jstring flash_mode; @@ -2527,7 +3039,7 @@ gst_ahc_parameters_get_flash_mode (GstAHCParameters * self) gfloat gst_ahc_parameters_get_focal_length (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gfloat length; length = AHCP_CALL (return 0.0, Float, getFocalLength); @@ -2538,7 +3050,7 @@ gst_ahc_parameters_get_focal_length (GstAHCParameters * self) const gchar * gst_ahc_parameters_get_focus_mode (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); const gchar *ret = NULL; jstring focus_mode; @@ -2555,7 +3067,7 @@ gst_ahc_parameters_get_focus_mode (GstAHCParameters * self) gfloat gst_ahc_parameters_get_horizontal_view_angle (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gfloat angle; angle = AHCP_CALL (return 0.0, Float, getHorizontalViewAngle); @@ -2566,7 +3078,7 @@ gst_ahc_parameters_get_horizontal_view_angle (GstAHCParameters * self) gint gst_ahc_parameters_get_max_exposure_compensation (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gint max; max = AHCP_CALL (return 0, Int, getMaxExposureCompensation); @@ -2577,7 +3089,7 @@ gst_ahc_parameters_get_max_exposure_compensation (GstAHCParameters * self) gint gst_ahc_parameters_get_max_zoom (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gint max; max = AHCP_CALL (return -1, Int, getMaxZoom); @@ -2588,7 +3100,7 @@ gst_ahc_parameters_get_max_zoom (GstAHCParameters * self) gint gst_ahc_parameters_get_min_exposure_compensation (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gint min; min = AHCP_CALL (return 0, Int, getMinExposureCompensation); @@ -2599,7 +3111,7 @@ gst_ahc_parameters_get_min_exposure_compensation (GstAHCParameters * self) gint gst_ahc_parameters_get_preview_format (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gint format; format = AHCP_CALL (return 0, Int, getPreviewFormat); @@ -2611,7 +3123,7 @@ gboolean gst_ahc_parameters_get_preview_fps_range (GstAHCParameters * self, gint * min, gint * max) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gboolean ret = FALSE; jintArray range = NULL; jint *fps = NULL; @@ -2649,7 +3161,7 @@ done: GstAHCSize * gst_ahc_parameters_get_preview_size (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject jsize = NULL; GstAHCSize *size = NULL; @@ -2687,7 +3199,7 @@ done: const gchar * gst_ahc_parameters_get_scene_mode (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); const gchar *ret = NULL; jstring scene_mode; @@ -2704,7 +3216,7 @@ gst_ahc_parameters_get_scene_mode (GstAHCParameters * self) GList * gst_ahc_parameters_get_supported_antibanding (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -2742,7 +3254,7 @@ gst_ahc_parameters_supported_antibanding_free (GList * list) GList * gst_ahc_parameters_get_supported_color_effects (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -2780,7 +3292,7 @@ gst_ahc_parameters_supported_color_effects_free (GList * list) GList * gst_ahc_parameters_get_supported_flash_modes (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -2818,7 +3330,7 @@ gst_ahc_parameters_supported_flash_modes_free (GList * list) GList * gst_ahc_parameters_get_supported_focus_modes (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -2856,7 +3368,7 @@ gst_ahc_parameters_supported_focus_modes_free (GList * list) GList * gst_ahc_parameters_get_supported_preview_formats (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -2894,7 +3406,7 @@ gst_ahc_parameters_supported_preview_formats_free (GList * list) GList * gst_ahc_parameters_get_supported_preview_fps_range (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -2934,7 +3446,7 @@ gst_ahc_parameters_supported_preview_fps_range_free (GList * list) GList * gst_ahc_parameters_get_supported_preview_sizes (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -2978,7 +3490,7 @@ gst_ahc_parameters_supported_preview_sizes_free (GList * list) GList * gst_ahc_parameters_get_supported_scene_modes (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -3016,7 +3528,7 @@ gst_ahc_parameters_supported_scene_modes_free (GList * list) GList * gst_ahc_parameters_get_supported_white_balance (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -3054,7 +3566,7 @@ gst_ahc_parameters_supported_white_balance_free (GList * list) gfloat gst_ahc_parameters_get_vertical_view_angle (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gfloat angle; angle = AHCP_CALL (return 0.0, Float, getVerticalViewAngle); @@ -3065,7 +3577,7 @@ gst_ahc_parameters_get_vertical_view_angle (GstAHCParameters * self) gboolean gst_ahc_parameters_get_video_stabilization (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gboolean ret; ret = AHCP_CALL (return FALSE, Boolean, getVideoStabilization); @@ -3076,7 +3588,7 @@ gst_ahc_parameters_get_video_stabilization (GstAHCParameters * self) const gchar * gst_ahc_parameters_get_white_balance (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); const gchar *ret = NULL; jstring white_balance; @@ -3093,7 +3605,7 @@ gst_ahc_parameters_get_white_balance (GstAHCParameters * self) gint gst_ahc_parameters_get_zoom (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gint zoom; zoom = AHCP_CALL (return -1, Int, getZoom); @@ -3104,7 +3616,7 @@ gst_ahc_parameters_get_zoom (GstAHCParameters * self) GList * gst_ahc_parameters_get_zoom_ratios (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jobject list = NULL; GList *ret = NULL; @@ -3142,7 +3654,7 @@ gst_ahc_parameters_zoom_ratios_free (GList * list) gboolean gst_ahc_parameters_is_smooth_zoom_supported (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gboolean supported; supported = AHCP_CALL (return FALSE, Boolean, isSmoothZoomSupported); @@ -3153,7 +3665,7 @@ gst_ahc_parameters_is_smooth_zoom_supported (GstAHCParameters * self) gboolean gst_ahc_parameters_is_video_stabilization_supported (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gboolean supported; supported = AHCP_CALL (return FALSE, Boolean, isVideoStabilizationSupported); @@ -3164,7 +3676,7 @@ gst_ahc_parameters_is_video_stabilization_supported (GstAHCParameters * self) gboolean gst_ahc_parameters_is_zoom_supported (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gboolean supported; supported = AHCP_CALL (return FALSE, Boolean, isZoomSupported); @@ -3176,7 +3688,7 @@ gboolean gst_ahc_parameters_set_antibanding (GstAHCParameters * self, const gchar * value) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jstring antibanding; antibanding = _antibanding_to_jstring (value); @@ -3192,7 +3704,7 @@ gboolean gst_ahc_parameters_set_color_effect (GstAHCParameters * self, const gchar * value) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jstring color_effect; color_effect = _color_effect_to_jstring (value); @@ -3208,7 +3720,7 @@ gboolean gst_ahc_parameters_set_exposure_compensation (GstAHCParameters * self, gint value) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHCP_CALL (return FALSE, Void, setExposureCompensation, value); @@ -3218,7 +3730,7 @@ gst_ahc_parameters_set_exposure_compensation (GstAHCParameters * self, gboolean gst_ahc_parameters_set_flash_mode (GstAHCParameters * self, const gchar * value) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jstring flash_mode; flash_mode = _flash_mode_to_jstring (value); @@ -3233,7 +3745,7 @@ gst_ahc_parameters_set_flash_mode (GstAHCParameters * self, const gchar * value) gboolean gst_ahc_parameters_set_focus_mode (GstAHCParameters * self, const gchar * value) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jstring focus_mode; focus_mode = _focus_mode_to_jstring (value); @@ -3248,7 +3760,7 @@ gst_ahc_parameters_set_focus_mode (GstAHCParameters * self, const gchar * value) gboolean gst_ahc_parameters_set_preview_format (GstAHCParameters * self, gint format) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHCP_CALL (return FALSE, Void, setPreviewFormat, format); @@ -3259,7 +3771,7 @@ gboolean gst_ahc_parameters_set_preview_fps_range (GstAHCParameters * self, gint min, gint max) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHCP_CALL (return FALSE, Void, setPreviewFpsRange, min, max); @@ -3270,7 +3782,7 @@ gboolean gst_ahc_parameters_set_preview_size (GstAHCParameters * self, gint width, gint height) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHCP_CALL (return FALSE, Void, setPreviewSize, width, height); @@ -3280,7 +3792,7 @@ gst_ahc_parameters_set_preview_size (GstAHCParameters * self, gboolean gst_ahc_parameters_set_scene_mode (GstAHCParameters * self, const gchar * value) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jstring scene_mode; scene_mode = _scene_mode_to_jstring (value); @@ -3297,7 +3809,7 @@ gboolean gst_ahc_parameters_set_video_stabilization (GstAHCParameters * self, gboolean toggle) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHCP_CALL (return FALSE, Void, setVideoStabilization, toggle); @@ -3308,7 +3820,7 @@ gboolean gst_ahc_parameters_set_white_balance (GstAHCParameters * self, const gchar * value) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jstring white_balance; white_balance = _white_balance_to_jstring (value); @@ -3323,7 +3835,7 @@ gst_ahc_parameters_set_white_balance (GstAHCParameters * self, gboolean gst_ahc_parameters_set_zoom (GstAHCParameters * self, gint value) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); AHCP_CALL (return FALSE, Void, setZoom, value); @@ -3333,7 +3845,7 @@ gst_ahc_parameters_set_zoom (GstAHCParameters * self, gint value) gboolean gst_ahc_parameters_unflatten (GstAHCParameters * self, const gchar * flattened) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); jstring v_str = NULL; gboolean ret = TRUE; @@ -3351,7 +3863,12 @@ gst_ahc_parameters_unflatten (GstAHCParameters * self, const gchar * flattened) void gst_ahc_parameters_free (GstAHCParameters * self) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); + + g_return_if_fail (self != NULL); + g_return_if_fail (self->object != NULL); + + GST_DEBUG ("freeing parameters %p", self->object); (*env)->DeleteGlobalRef (env, self->object); g_slice_free (GstAHCParameters, self); diff --git a/sys/androidmedia/gst-android-hardware-camera.h b/sys/androidmedia/gst-android-hardware-camera.h index 03db671df4..44e7842657 100644 --- a/sys/androidmedia/gst-android-hardware-camera.h +++ b/sys/androidmedia/gst-android-hardware-camera.h @@ -3,6 +3,9 @@ * 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 diff --git a/sys/androidmedia/gst-android-media-mediacodec.c b/sys/androidmedia/gst-android-media-mediacodec.c deleted file mode 100644 index c676efd752..0000000000 --- a/sys/androidmedia/gst-android-media-mediacodec.c +++ /dev/null @@ -1,531 +0,0 @@ -/* - * Copyright (C) 2012, Collabora Ltd. - * Author: Sebastian Dröge - * Author: Youness Alaoui - * - * 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 - -#include "gst-android-media-mediacodec.h" - - -static struct -{ - jclass klass; - jmethodID constructor; - jfieldID flags; - jfieldID offset; - jfieldID presentationTimeUs; - jfieldID size; -} android_media_mediacodec_bufferinfo; - -static struct -{ - jclass klass; - jmethodID configure; - jmethodID createByCodecName; - jmethodID createDecoderByType; - jmethodID createEncoderByType; - jmethodID dequeueInputBuffer; - jmethodID dequeueOutputBuffer; - jmethodID flush; - jmethodID getInputBuffers; - jmethodID getOutputBuffers; - jmethodID getOutputFormat; - jmethodID queueInputBuffer; - jmethodID release; - jmethodID releaseOutputBuffer; - jmethodID start; - jmethodID stop; - jint BUFFER_FLAG_SYNC_FRAME; - jint BUFFER_FLAG_CODEC_CONFIG; - jint BUFFER_FLAG_END_OF_STREAM; - jint CONFIGURE_FLAG_ENCODE; - jint INFO_TRY_AGAIN_LATER; - jint INFO_OUTPUT_FORMAT_CHANGED; - jint INFO_OUTPUT_BUFFERS_CHANGED; -} android_media_mediacodec; - -gint MediaCodec_BUFFER_FLAG_SYNC_FRAME; -gint MediaCodec_BUFFER_FLAG_CODEC_CONFIG; -gint MediaCodec_BUFFER_FLAG_END_OF_STREAM; - -gint MediaCodec_CONFIGURE_FLAG_ENCODE; - -gint MediaCodec_INFO_TRY_AGAIN_LATER; -gint MediaCodec_INFO_OUTPUT_FORMAT_CHANGED; -gint MediaCodec_INFO_OUTPUT_BUFFERS_CHANGED; - -static gboolean -_init_classes (void) -{ - JNIEnv *env = gst_dvm_get_env (); - - /* android.media.MediaCodec */ - GST_DVM_GET_CLASS (android_media_mediacodec, "android/media/MediaCodec"); - GST_DVM_GET_STATIC_METHOD (android_media_mediacodec, createByCodecName, - "(Ljava/lang/String;)Landroid/media/MediaCodec;"); - GST_DVM_GET_STATIC_METHOD (android_media_mediacodec, createDecoderByType, - "(Ljava/lang/String;)Landroid/media/MediaCodec;"); - GST_DVM_GET_STATIC_METHOD (android_media_mediacodec, createEncoderByType, - "(Ljava/lang/String;)Landroid/media/MediaCodec;"); - GST_DVM_GET_METHOD (android_media_mediacodec, configure, - "(Landroid/media/MediaFormat;Landroid/view/Surface;" - "Landroid/media/MediaCrypto;I)V"); - GST_DVM_GET_METHOD (android_media_mediacodec, dequeueInputBuffer, "(J)I"); - GST_DVM_GET_METHOD (android_media_mediacodec, dequeueOutputBuffer, - "(Landroid/media/MediaCodec$BufferInfo;J)I"); - GST_DVM_GET_METHOD (android_media_mediacodec, flush, "()V"); - GST_DVM_GET_METHOD (android_media_mediacodec, getInputBuffers, - "()[Ljava/nio/ByteBuffer;"); - GST_DVM_GET_METHOD (android_media_mediacodec, getOutputBuffers, - "()[Ljava/nio/ByteBuffer;"); - GST_DVM_GET_METHOD (android_media_mediacodec, getOutputFormat, - "()Landroid/media/MediaFormat;"); - GST_DVM_GET_METHOD (android_media_mediacodec, queueInputBuffer, "(IIIJI)V"); - GST_DVM_GET_METHOD (android_media_mediacodec, release, "()V"); - GST_DVM_GET_METHOD (android_media_mediacodec, releaseOutputBuffer, "(IZ)V"); - GST_DVM_GET_METHOD (android_media_mediacodec, start, "()V"); - GST_DVM_GET_METHOD (android_media_mediacodec, stop, "()V"); - - - GST_DVM_GET_CONSTANT (android_media_mediacodec, BUFFER_FLAG_SYNC_FRAME, Int, - "I"); - MediaCodec_BUFFER_FLAG_SYNC_FRAME = - android_media_mediacodec.BUFFER_FLAG_SYNC_FRAME; - GST_DVM_GET_CONSTANT (android_media_mediacodec, BUFFER_FLAG_CODEC_CONFIG, Int, - "I"); - MediaCodec_BUFFER_FLAG_CODEC_CONFIG = - android_media_mediacodec.BUFFER_FLAG_CODEC_CONFIG; - GST_DVM_GET_CONSTANT (android_media_mediacodec, BUFFER_FLAG_END_OF_STREAM, - Int, "I"); - MediaCodec_BUFFER_FLAG_END_OF_STREAM = - android_media_mediacodec.BUFFER_FLAG_END_OF_STREAM; - - GST_DVM_GET_CONSTANT (android_media_mediacodec, CONFIGURE_FLAG_ENCODE, Int, - "I"); - MediaCodec_CONFIGURE_FLAG_ENCODE = - android_media_mediacodec.CONFIGURE_FLAG_ENCODE; - - GST_DVM_GET_CONSTANT (android_media_mediacodec, INFO_TRY_AGAIN_LATER, Int, - "I"); - MediaCodec_INFO_TRY_AGAIN_LATER = - android_media_mediacodec.INFO_TRY_AGAIN_LATER; - GST_DVM_GET_CONSTANT (android_media_mediacodec, INFO_OUTPUT_FORMAT_CHANGED, - Int, "I"); - MediaCodec_INFO_OUTPUT_FORMAT_CHANGED = - android_media_mediacodec.INFO_OUTPUT_FORMAT_CHANGED; - GST_DVM_GET_CONSTANT (android_media_mediacodec, INFO_OUTPUT_BUFFERS_CHANGED, - Int, "I"); - MediaCodec_INFO_OUTPUT_BUFFERS_CHANGED = - android_media_mediacodec.INFO_OUTPUT_BUFFERS_CHANGED; - - /* android.media.MediaCodec.BufferInfo */ - GST_DVM_GET_CLASS (android_media_mediacodec_bufferinfo, - "android/media/MediaCodec$BufferInfo"); - GST_DVM_GET_CONSTRUCTOR (android_media_mediacodec_bufferinfo, constructor, - "()V"); - GST_DVM_GET_FIELD (android_media_mediacodec_bufferinfo, flags, "I"); - GST_DVM_GET_FIELD (android_media_mediacodec_bufferinfo, offset, "I"); - GST_DVM_GET_FIELD (android_media_mediacodec_bufferinfo, presentationTimeUs, - "J"); - GST_DVM_GET_FIELD (android_media_mediacodec_bufferinfo, size, "I"); - - return TRUE; -} - -gboolean -gst_android_media_mediacodec_init (void) -{ - if (!_init_classes ()) { - gst_android_media_mediacodec_deinit (); - return FALSE; - } - - return TRUE; -} - -void -gst_android_media_mediacodec_deinit (void) -{ - JNIEnv *env = gst_dvm_get_env (); - - if (android_media_mediacodec.klass) - (*env)->DeleteGlobalRef (env, android_media_mediacodec.klass); - android_media_mediacodec.klass = NULL; - - if (android_media_mediacodec_bufferinfo.klass) - (*env)->DeleteGlobalRef (env, android_media_mediacodec_bufferinfo.klass); - android_media_mediacodec_bufferinfo.klass = NULL; -} - -/* android.media.MediaCodec */ - -#define AMMC_CALL(error_statement, type, method, ...) \ - GST_DVM_CALL (error_statement, self->object, type, \ - android_media_mediacodec, method, ## __VA_ARGS__); -#define AMMC_STATIC_CALL(error_statement, type, method, ...) \ - GST_DVM_STATIC_CALL (error_statement, type, \ - android_media_mediacodec, method, ## __VA_ARGS__); - -gboolean -gst_am_mediacodec_configure (GstAmMediaCodec * self, GstAmMediaFormat * format, - gint flags) -{ - JNIEnv *env = gst_dvm_get_env (); - - AMMC_CALL (return FALSE, Void, configure, format->object, NULL, NULL, flags); - - return TRUE; -} - -GstAmMediaCodec * -gst_am_mediacodec_create_by_codec_name (const gchar * name) -{ - JNIEnv *env = gst_dvm_get_env (); - GstAmMediaCodec *codec = NULL; - jobject object = NULL; - jstring name_str; - - name_str = (*env)->NewStringUTF (env, name); - if (name_str == NULL) - goto done; - - object = AMMC_STATIC_CALL (goto done, Object, createByCodecName, name_str); - if (object) { - codec = g_slice_new0 (GstAmMediaCodec); - codec->object = (*env)->NewGlobalRef (env, object); - (*env)->DeleteLocalRef (env, object); - if (!codec->object) { - GST_ERROR ("Failed to create global reference"); - (*env)->ExceptionClear (env); - g_slice_free (GstAmMediaCodec, codec); - codec = NULL; - } - } - -done: - if (name_str) - (*env)->DeleteLocalRef (env, name_str); - - return codec; -} - - -GstAmMediaFormat * -gst_am_mediacodec_get_output_format (GstAmMediaCodec * self) -{ - JNIEnv *env = gst_dvm_get_env (); - GstAmMediaFormat *format = NULL; - jobject object = NULL; - - object = AMMC_CALL (return NULL, Object, getOutputFormat); - if (object) { - format = g_slice_new0 (GstAmMediaFormat); - format->object = (*env)->NewGlobalRef (env, object); - (*env)->DeleteLocalRef (env, object); - if (!format->object) { - GST_ERROR ("Failed to create global reference"); - (*env)->ExceptionClear (env); - g_slice_free (GstAmMediaFormat, format); - return NULL; - } - } - - return format; -} - -gboolean -gst_am_mediacodec_start (GstAmMediaCodec * self) -{ - JNIEnv *env = gst_dvm_get_env (); - - AMMC_CALL (return FALSE, Void, start); - - return TRUE; -} - -gboolean -gst_am_mediacodec_stop (GstAmMediaCodec * self) -{ - JNIEnv *env = gst_dvm_get_env (); - - AMMC_CALL (return FALSE, Void, stop); - - return TRUE; -} - -gboolean -gst_am_mediacodec_flush (GstAmMediaCodec * self) -{ - JNIEnv *env = gst_dvm_get_env (); - - AMMC_CALL (return FALSE, Void, flush); - - return TRUE; -} - -void -gst_am_mediacodec_free (GstAmMediaCodec * self) -{ - JNIEnv *env = gst_dvm_get_env (); - - (*env)->DeleteGlobalRef (env, self->object); - g_slice_free (GstAmMediaCodec, self); -} - -void -gst_am_mediacodec_release (GstAmMediaCodec * self) -{ - JNIEnv *env = gst_dvm_get_env (); - - AMMC_CALL (, Void, release); -} - -void -gst_am_mediacodec_free_buffers (GstAmMediaCodecBuffer * buffers, - gsize n_buffers) -{ - JNIEnv *env = gst_dvm_get_env (); - jsize i; - - for (i = 0; i < n_buffers; i++) { - if (buffers[i].object) - (*env)->DeleteGlobalRef (env, buffers[i].object); - } - g_free (buffers); -} - -GstAmMediaCodecBuffer * -gst_am_mediacodec_get_output_buffers (GstAmMediaCodec * self, gsize * n_buffers) -{ - JNIEnv *env = gst_dvm_get_env (); - jobject output_buffers = NULL; - jsize n_output_buffers; - GstAmMediaCodecBuffer *ret = NULL; - jsize i; - - *n_buffers = 0; - output_buffers = AMMC_CALL (goto done, Object, getOutputBuffers); - if (!output_buffers) - goto done; - - n_output_buffers = (*env)->GetArrayLength (env, output_buffers); - if ((*env)->ExceptionCheck (env)) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get output buffers array length"); - goto done; - } - - *n_buffers = n_output_buffers; - ret = g_new0 (GstAmMediaCodecBuffer, n_output_buffers); - - for (i = 0; i < n_output_buffers; i++) { - jobject buffer = NULL; - - buffer = (*env)->GetObjectArrayElement (env, output_buffers, i); - if ((*env)->ExceptionCheck (env) || !buffer) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get output buffer %d", i); - goto error; - } - - ret[i].object = (*env)->NewGlobalRef (env, buffer); - (*env)->DeleteLocalRef (env, buffer); - if (!ret[i].object) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to create global reference %d", i); - goto error; - } - - ret[i].data = (*env)->GetDirectBufferAddress (env, ret[i].object); - if (!ret[i].data) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get buffer address %d", i); - goto error; - } - ret[i].size = (*env)->GetDirectBufferCapacity (env, ret[i].object); - } - -done: - if (output_buffers) - (*env)->DeleteLocalRef (env, output_buffers); - output_buffers = NULL; - - return ret; -error: - if (ret) - gst_am_mediacodec_free_buffers (ret, n_output_buffers); - ret = NULL; - *n_buffers = 0; - goto done; -} - -GstAmMediaCodecBuffer * -gst_am_mediacodec_get_input_buffers (GstAmMediaCodec * self, gsize * n_buffers) -{ - JNIEnv *env = gst_dvm_get_env (); - jobject input_buffers = NULL; - jsize n_input_buffers; - GstAmMediaCodecBuffer *ret = NULL; - jsize i; - - *n_buffers = 0; - - input_buffers = AMMC_CALL (goto done, Object, getOutputBuffers); - if (!input_buffers) - goto done; - - n_input_buffers = (*env)->GetArrayLength (env, input_buffers); - if ((*env)->ExceptionCheck (env)) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get input buffers array length"); - goto done; - } - - *n_buffers = n_input_buffers; - ret = g_new0 (GstAmMediaCodecBuffer, n_input_buffers); - - for (i = 0; i < n_input_buffers; i++) { - jobject buffer = NULL; - - buffer = (*env)->GetObjectArrayElement (env, input_buffers, i); - if ((*env)->ExceptionCheck (env) || !buffer) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get input buffer %d", i); - goto error; - } - - ret[i].object = (*env)->NewGlobalRef (env, buffer); - (*env)->DeleteLocalRef (env, buffer); - if (!ret[i].object) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to create global reference %d", i); - goto error; - } - - ret[i].data = (*env)->GetDirectBufferAddress (env, ret[i].object); - if (!ret[i].data) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get buffer address %d", i); - goto error; - } - ret[i].size = (*env)->GetDirectBufferCapacity (env, ret[i].object); - } - -done: - if (input_buffers) - (*env)->DeleteLocalRef (env, input_buffers); - input_buffers = NULL; - - return ret; -error: - if (ret) - gst_am_mediacodec_free_buffers (ret, n_input_buffers); - ret = NULL; - *n_buffers = 0; - goto done; -} - -gint -gst_am_mediacodec_dequeue_input_buffer (GstAmMediaCodec * self, - gint64 timeoutUs) -{ - JNIEnv *env = gst_dvm_get_env (); - gint ret = G_MININT; - - ret = AMMC_CALL (return G_MININT, Int, dequeueInputBuffer, timeoutUs); - - return ret; -} - -#define AMMCBI_FIELD(error_statement, type, field) \ - GST_DVM_FIELD (error_statement, buffer_info, type, \ - android_media_mediacodec_bufferinfo, field); - -static gboolean -_fill_buffer_info (JNIEnv * env, jobject buffer_info, - GstAmMediaCodecBufferInfo * info) -{ - info->flags = AMMCBI_FIELD (return FALSE, Int, flags); - info->offset = AMMCBI_FIELD (return FALSE, Int, offset); - info->presentation_time_us = - AMMCBI_FIELD (return FALSE, Long, presentationTimeUs); - info->size = AMMCBI_FIELD (return FALSE, Int, size); - - return TRUE; -} - -gint -gst_am_mediacodec_dequeue_output_buffer (GstAmMediaCodec * self, - GstAmMediaCodecBufferInfo * info, gint64 timeoutUs) -{ - JNIEnv *env = gst_dvm_get_env (); - gint ret = G_MININT; - jobject info_o = NULL; - - info_o = (*env)->NewObject (env, android_media_mediacodec_bufferinfo.klass, - android_media_mediacodec_bufferinfo.constructor); - if (!info_o) { - GST_ERROR ("Failed to call Java method"); - (*env)->ExceptionClear (env); - goto done; - } - - ret = AMMC_CALL (goto error, Int, dequeueOutputBuffer, info_o, timeoutUs); - - if (!_fill_buffer_info (env, info_o, info)) - goto error; - -done: - if (info_o) - (*env)->DeleteLocalRef (env, info_o); - info_o = NULL; - - return ret; - -error: - ret = G_MININT; - goto done; -} - -gboolean -gst_am_mediacodec_queue_input_buffer (GstAmMediaCodec * self, gint index, - const GstAmMediaCodecBufferInfo * info) -{ - JNIEnv *env = gst_dvm_get_env (); - - AMMC_CALL (return FALSE, Void, queueInputBuffer, index, info->offset, - info->size, info->presentation_time_us, info->flags); - - return TRUE; -} - -gboolean -gst_am_mediacodec_release_output_buffer (GstAmMediaCodec * self, gint index) -{ - JNIEnv *env = gst_dvm_get_env (); - - AMMC_CALL (return FALSE, Void, releaseOutputBuffer, index, JNI_FALSE); - - return TRUE; -} diff --git a/sys/androidmedia/gst-android-media-mediacodec.h b/sys/androidmedia/gst-android-media-mediacodec.h deleted file mode 100644 index 709d0b720c..0000000000 --- a/sys/androidmedia/gst-android-media-mediacodec.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2012, Collabora Ltd. - * Author: Sebastian Dröge - * Author: Youness Alaoui - * - * 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 - * - */ - -#ifndef __GST_ANDROID_MEDIA_MEDIACODEC_H__ -#define __GST_ANDROID_MEDIA_MEDIACODEC_H__ - -#include -#include - -#include "gst-android-media-mediaformat.h" - -G_BEGIN_DECLS - -typedef struct _GstAmMediaCodecBuffer GstAmMediaCodecBuffer; -typedef struct _GstAmMediaCodecBufferInfo GstAmMediaCodecBufferInfo; -typedef struct _GstAmMediaCodec GstAmMediaCodec; - -struct _GstAmMediaCodecBuffer { - guint8 *data; - gsize size; - /*< private >*/ - jobject object; /* global reference */ -}; - -struct _GstAmMediaCodecBufferInfo { - gint flags; - gint offset; - gint64 presentation_time_us; - gint size; -}; - -struct _GstAmMediaCodec { - /*< private >*/ - jobject object; /* global reference */ -}; - -extern gint MediaCodec_BUFFER_FLAG_SYNC_FRAME; -extern gint MediaCodec_BUFFER_FLAG_CODEC_CONFIG; -extern gint MediaCodec_BUFFER_FLAG_END_OF_STREAM; - -extern gint MediaCodec_CONFIGURE_FLAG_ENCODE; - -extern gint MediaCodec_INFO_TRY_AGAIN_LATER; -extern gint MediaCodec_INFO_OUTPUT_FORMAT_CHANGED; -extern gint MediaCodec_INFO_OUTPUT_BUFFERS_CHANGED; - -gboolean gst_android_media_mediacodec_init (void); -void gst_android_media_mediacodec_deinit (void); - -gboolean gst_am_mediacodec_configure (GstAmMediaCodec * self, - GstAmMediaFormat * format, gint flags); - -GstAmMediaCodec * gst_am_mediacodec_create_by_codec_name (const gchar *name); -GstAmMediaCodec * gst_am_mediacodec_create_decoder_by_type (const gchar *type); -GstAmMediaCodec * gst_am_mediacodec_create_encoder_by_type (const gchar *type); - -void gst_am_mediacodec_free (GstAmMediaCodec * self); - -gint gst_am_mediacodec_dequeue_input_buffer (GstAmMediaCodec * self, - gint64 timeoutUs); -gint gst_am_mediacodec_dequeue_output_buffer (GstAmMediaCodec * self, - GstAmMediaCodecBufferInfo *info, gint64 timeoutUs); -gboolean gst_am_mediacodec_flush (GstAmMediaCodec * self); - -GstAmMediaCodecBuffer * gst_am_mediacodec_get_input_buffers (GstAmMediaCodec * self, - gsize * n_buffers); -GstAmMediaCodecBuffer * gst_am_mediacodec_get_output_buffers (GstAmMediaCodec * self, - gsize * n_buffers); -void gst_am_mediacodec_free_buffers (GstAmMediaCodecBuffer * buffers, gsize n_buffers); -GstAmMediaFormat * gst_am_mediacodec_get_output_format (GstAmMediaCodec * self); - -gboolean gst_am_mediacodec_queue_input_buffer (GstAmMediaCodec * self, - gint index, const GstAmMediaCodecBufferInfo *info); -void gst_am_mediacodec_release (GstAmMediaCodec * self); -gboolean gst_am_mediacodec_release_output_buffer (GstAmMediaCodec * self, - gint index); - -gboolean gst_am_mediacodec_start (GstAmMediaCodec * self); -gboolean gst_am_mediacodec_stop (GstAmMediaCodec * self); - -G_END_DECLS - -#endif /* __GST_ANDROID_MEDIA_MEDIACODEC_H__ */ diff --git a/sys/androidmedia/gst-android-media-mediacodecinfo.c b/sys/androidmedia/gst-android-media-mediacodecinfo.c deleted file mode 100644 index abaec7326a..0000000000 --- a/sys/androidmedia/gst-android-media-mediacodecinfo.c +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright (C) 2012, Collabora Ltd. - * Author: Sebastian Dröge - * Author: Youness Alaoui - * - * 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 - -#include "gst-android-media-mediacodecinfo.h" - -static struct -{ - jclass klass; - jmethodID getCapabilitiesForType; - jmethodID getName; - jmethodID getSupportedTypes; - jmethodID isEncoder; -} android_media_mediacodecinfo; - -static struct -{ - jclass klass; - jfieldID colorFormats; - jfieldID profileLevels; -} android_media_mediacodeccapabilities; - -static struct -{ - jclass klass; - jfieldID level; - jfieldID profile; -} android_media_mediacodecprofilelevel; - -static struct -{ - jclass klass; - - jint CHANNEL_OUT_FRONT_LEFT; - jint CHANNEL_OUT_FRONT_RIGHT; - jint CHANNEL_OUT_FRONT_CENTER; - jint CHANNEL_OUT_LOW_FREQUENCY; - jint CHANNEL_OUT_BACK_LEFT; - jint CHANNEL_OUT_BACK_RIGHT; - jint CHANNEL_OUT_FRONT_LEFT_OF_CENTER; - jint CHANNEL_OUT_FRONT_RIGHT_OF_CENTER; - jint CHANNEL_OUT_BACK_CENTER; - jint CHANNEL_OUT_SIDE_LEFT; - jint CHANNEL_OUT_SIDE_RIGHT; - jint CHANNEL_OUT_TOP_CENTER; - jint CHANNEL_OUT_TOP_FRONT_LEFT; - jint CHANNEL_OUT_TOP_FRONT_CENTER; - jint CHANNEL_OUT_TOP_FRONT_RIGHT; - jint CHANNEL_OUT_TOP_BACK_LEFT; - jint CHANNEL_OUT_TOP_BACK_CENTER; - jint CHANNEL_OUT_TOP_BACK_RIGHT; -} android_media_audioformat; - -gint AudioFormat_CHANNEL_OUT_FRONT_LEFT; -gint AudioFormat_CHANNEL_OUT_FRONT_RIGHT; -gint AudioFormat_CHANNEL_OUT_FRONT_CENTER; -gint AudioFormat_CHANNEL_OUT_LOW_FREQUENCY; -gint AudioFormat_CHANNEL_OUT_BACK_LEFT; -gint AudioFormat_CHANNEL_OUT_BACK_RIGHT; -gint AudioFormat_CHANNEL_OUT_FRONT_LEFT_OF_CENTER; -gint AudioFormat_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER; -gint AudioFormat_CHANNEL_OUT_BACK_CENTER; -gint AudioFormat_CHANNEL_OUT_SIDE_LEFT; -gint AudioFormat_CHANNEL_OUT_SIDE_RIGHT; -gint AudioFormat_CHANNEL_OUT_TOP_CENTER; -gint AudioFormat_CHANNEL_OUT_TOP_FRONT_LEFT; -gint AudioFormat_CHANNEL_OUT_TOP_FRONT_CENTER; -gint AudioFormat_CHANNEL_OUT_TOP_FRONT_RIGHT; -gint AudioFormat_CHANNEL_OUT_TOP_BACK_LEFT; -gint AudioFormat_CHANNEL_OUT_TOP_BACK_CENTER; -gint AudioFormat_CHANNEL_OUT_TOP_BACK_RIGHT; - - -static gboolean -_init_classes (void) -{ - JNIEnv *env = gst_dvm_get_env (); - - /* android.media.MediaCodecInfo */ - GST_DVM_GET_CLASS (android_media_mediacodecinfo, - "android/media/MediaCodecInfo"); - GST_DVM_GET_METHOD (android_media_mediacodecinfo, getCapabilitiesForType, - "(Ljava/lang/String;)Landroid/media/MediaCodecInfo$CodecCapabilities;"); - GST_DVM_GET_METHOD (android_media_mediacodecinfo, getName, - "()Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_media_mediacodecinfo, getSupportedTypes, - "()[java/lang/String;"); - GST_DVM_GET_METHOD (android_media_mediacodecinfo, isEncoder, "()Z"); - - GST_DVM_GET_CLASS (android_media_mediacodeccapabilities, - "android/media/MediaCodecInfo$CodecCapabilities"); - GST_DVM_GET_FIELD (android_media_mediacodeccapabilities, colorFormats, "[I"); - GST_DVM_GET_FIELD (android_media_mediacodeccapabilities, profileLevels, - "[Landroid/media/MediaCodecInfo$CodecProfileLevel;"); - - GST_DVM_GET_CLASS (android_media_mediacodecprofilelevel, - "android/media/MediaCodecInfo$ProfileLevel"); - GST_DVM_GET_FIELD (android_media_mediacodecprofilelevel, level, "I"); - GST_DVM_GET_FIELD (android_media_mediacodecprofilelevel, profile, "I"); - - GST_DVM_GET_CLASS (android_media_audioformat, "android/media/AudioFormat"); - - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_FRONT_LEFT, Int, - "I"); - AudioFormat_CHANNEL_OUT_FRONT_LEFT = - android_media_audioformat.CHANNEL_OUT_FRONT_LEFT; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_FRONT_RIGHT, Int, - "I"); - AudioFormat_CHANNEL_OUT_FRONT_RIGHT = - android_media_audioformat.CHANNEL_OUT_FRONT_RIGHT; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_FRONT_CENTER, - Int, "I"); - AudioFormat_CHANNEL_OUT_FRONT_CENTER = - android_media_audioformat.CHANNEL_OUT_FRONT_CENTER; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_LOW_FREQUENCY, - Int, "I"); - AudioFormat_CHANNEL_OUT_LOW_FREQUENCY = - android_media_audioformat.CHANNEL_OUT_LOW_FREQUENCY; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_BACK_LEFT, Int, - "I"); - AudioFormat_CHANNEL_OUT_BACK_LEFT = - android_media_audioformat.CHANNEL_OUT_BACK_LEFT; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_BACK_RIGHT, Int, - "I"); - AudioFormat_CHANNEL_OUT_BACK_RIGHT = - android_media_audioformat.CHANNEL_OUT_BACK_RIGHT; - GST_DVM_GET_CONSTANT (android_media_audioformat, - CHANNEL_OUT_FRONT_LEFT_OF_CENTER, Int, "I"); - AudioFormat_CHANNEL_OUT_FRONT_LEFT_OF_CENTER = - android_media_audioformat.CHANNEL_OUT_FRONT_LEFT_OF_CENTER; - GST_DVM_GET_CONSTANT (android_media_audioformat, - CHANNEL_OUT_FRONT_RIGHT_OF_CENTER, Int, "I"); - AudioFormat_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = - android_media_audioformat.CHANNEL_OUT_FRONT_RIGHT_OF_CENTER; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_BACK_CENTER, Int, - "I"); - AudioFormat_CHANNEL_OUT_BACK_CENTER = - android_media_audioformat.CHANNEL_OUT_BACK_CENTER; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_SIDE_LEFT, Int, - "I"); - AudioFormat_CHANNEL_OUT_SIDE_LEFT = - android_media_audioformat.CHANNEL_OUT_SIDE_LEFT; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_SIDE_RIGHT, Int, - "I"); - AudioFormat_CHANNEL_OUT_SIDE_RIGHT = - android_media_audioformat.CHANNEL_OUT_SIDE_RIGHT; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_TOP_CENTER, Int, - "I"); - AudioFormat_CHANNEL_OUT_TOP_CENTER = - android_media_audioformat.CHANNEL_OUT_TOP_CENTER; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_TOP_FRONT_LEFT, - Int, "I"); - AudioFormat_CHANNEL_OUT_TOP_FRONT_LEFT = - android_media_audioformat.CHANNEL_OUT_TOP_FRONT_LEFT; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_TOP_FRONT_CENTER, - Int, "I"); - AudioFormat_CHANNEL_OUT_TOP_FRONT_CENTER = - android_media_audioformat.CHANNEL_OUT_TOP_FRONT_CENTER; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_TOP_FRONT_RIGHT, - Int, "I"); - AudioFormat_CHANNEL_OUT_TOP_FRONT_RIGHT = - android_media_audioformat.CHANNEL_OUT_TOP_FRONT_RIGHT; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_TOP_BACK_LEFT, - Int, "I"); - AudioFormat_CHANNEL_OUT_TOP_BACK_LEFT = - android_media_audioformat.CHANNEL_OUT_TOP_BACK_LEFT; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_TOP_BACK_CENTER, - Int, "I"); - AudioFormat_CHANNEL_OUT_TOP_BACK_CENTER = - android_media_audioformat.CHANNEL_OUT_TOP_BACK_CENTER; - GST_DVM_GET_CONSTANT (android_media_audioformat, CHANNEL_OUT_TOP_BACK_RIGHT, - Int, "I"); - AudioFormat_CHANNEL_OUT_TOP_BACK_RIGHT = - android_media_audioformat.CHANNEL_OUT_TOP_BACK_RIGHT; - - return TRUE; -} - -gboolean -gst_android_media_mediacodecinfo_init (void) -{ - if (!_init_classes ()) { - gst_android_media_mediacodecinfo_deinit (); - return FALSE; - } - - return TRUE; -} - -void -gst_android_media_mediacodecinfo_deinit (void) -{ - JNIEnv *env = gst_dvm_get_env (); - - if (android_media_mediacodecinfo.klass) - (*env)->DeleteGlobalRef (env, android_media_mediacodecinfo.klass); - android_media_mediacodecinfo.klass = NULL; - - if (android_media_mediacodeccapabilities.klass) - (*env)->DeleteGlobalRef (env, android_media_mediacodeccapabilities.klass); - android_media_mediacodeccapabilities.klass = NULL; - - if (android_media_mediacodecprofilelevel.klass) - (*env)->DeleteGlobalRef (env, android_media_mediacodecprofilelevel.klass); - android_media_mediacodecprofilelevel.klass = NULL; - - if (android_media_audioformat.klass) - (*env)->DeleteGlobalRef (env, android_media_audioformat.klass); - android_media_audioformat.klass = NULL; -} - -/* android.media.MediaCodecInfo */ -#define AMMCI_CALL(error_statement, type, method, ...) \ - GST_DVM_CALL (error_statement, self->object, type, \ - android_media_mediacodecinfo, method, ## __VA_ARGS__); - -void -gst_am_mediacodecinfo_free (GstAmMediaCodecInfo * self) -{ - JNIEnv *env = gst_dvm_get_env (); - - (*env)->DeleteGlobalRef (env, self->object); - g_slice_free (GstAmMediaCodecInfo, self); -} - -void -gst_am_mediacodeccapabilities_free (GstAmMediaCodecCapabilities * self) -{ - JNIEnv *env = gst_dvm_get_env (); - - (*env)->DeleteGlobalRef (env, self->object); - g_slice_free (GstAmMediaCodecCapabilities, self); -} - -void -gst_am_mediacodecprofilelevel_free (GstAmMediaCodecProfileLevel * self) -{ - JNIEnv *env = gst_dvm_get_env (); - - (*env)->DeleteGlobalRef (env, self->object); - g_slice_free (GstAmMediaCodecProfileLevel, self); -} - - -GstAmMediaCodecCapabilities * -gst_am_mediacodecinfo_get_capabilities_for_type (GstAmMediaCodecInfo * self, - const gchar * type) -{ - JNIEnv *env = gst_dvm_get_env (); - jobject object = NULL; - jstring type_str = NULL; - GstAmMediaCodecCapabilities *caps = NULL; - - type_str = (*env)->NewStringUTF (env, type); - if (!type_str) - goto done; - - object = AMMCI_CALL (goto done, Object, getCapabilitiesForType, type_str); - - if (object) { - caps = g_slice_new0 (GstAmMediaCodecCapabilities); - caps->object = (*env)->NewGlobalRef (env, object); - (*env)->DeleteLocalRef (env, object); - if (!caps->object) { - GST_ERROR ("Failed to create global reference"); - (*env)->ExceptionClear (env); - g_slice_free (GstAmMediaCodecCapabilities, caps); - caps = NULL; - } - } - -done: - if (type_str) - (*env)->DeleteLocalRef (env, type_str); - - return caps; -} - -gchar * -gst_am_mediacodecinfo_get_name (GstAmMediaCodecInfo * self) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring v_str = NULL; - const gchar *v = NULL; - gchar *ret = NULL; - - v_str = AMMCI_CALL (return NULL, Object, getName); - if (v_str) { - v = (*env)->GetStringUTFChars (env, v_str, NULL); - if (!v) { - GST_ERROR ("Failed to convert string to UTF8"); - (*env)->ExceptionClear (env); - goto done; - } - ret = g_strdup (v); - } - -done: - if (v) - (*env)->ReleaseStringUTFChars (env, v_str, v); - if (v_str) - (*env)->DeleteLocalRef (env, v_str); - - return ret; -} - -GList * -gst_am_mediacodecinfo_get_supported_types (GstAmMediaCodecInfo * self) -{ - JNIEnv *env = gst_dvm_get_env (); - jarray arr = NULL; - jint arr_len = 0; - GList *ret = NULL; - gint i; - - arr = AMMCI_CALL (goto done, Object, getSupportedTypes); - if (!arr) - goto done; - arr_len = (*env)->GetArrayLength (env, arr); - if ((*env)->ExceptionCheck (env)) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get array length"); - goto done; - } - - for (i = 0; i < arr_len; i++) { - jstring str = NULL; - const gchar *str_v = NULL; - - str = (*env)->GetObjectArrayElement (env, arr, i); - if ((*env)->ExceptionCheck (env)) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get array element %d", i); - continue; - } - if (!str) - continue; - - str_v = (*env)->GetStringUTFChars (env, str, NULL); - if ((*env)->ExceptionCheck (env)) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get string characters"); - (*env)->DeleteLocalRef (env, str); - str = NULL; - continue; - } - ret = g_list_append (ret, g_strdup (str_v)); - (*env)->ReleaseStringUTFChars (env, str, str_v); - str_v = NULL; - (*env)->DeleteLocalRef (env, str); - str = NULL; - } - -done: - if (arr) - (*env)->DeleteLocalRef (env, arr); - - return ret; -} - -gboolean -gst_am_mediacodecinfo_is_encoder (GstAmMediaCodecInfo * self) -{ - JNIEnv *env = gst_dvm_get_env (); - gboolean ret = FALSE; - - ret = AMMCI_CALL (return FALSE, Boolean, isEncoder); - - return ret; -} - -#define AMMCC_FIELD(error_statement, type, field) \ - GST_DVM_FIELD (error_statement, self->object, type, \ - android_media_mediacodeccapabilities, field); - -GList * -gst_am_mediacodeccapabilities_get_color_formats (GstAmMediaCodecCapabilities * - self) -{ - JNIEnv *env = gst_dvm_get_env (); - GList *ret = NULL; - jarray arr = NULL; - jint arr_len = 0; - jint *arr_n = NULL; - gint i; - - arr = AMMCC_FIELD (goto done, Object, colorFormats); - arr_len = (*env)->GetArrayLength (env, arr); - if ((*env)->ExceptionCheck (env)) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get array length"); - goto done; - } - - arr_n = (*env)->GetIntArrayElements (env, arr, NULL); - if ((*env)->ExceptionCheck (env)) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get array elements"); - goto done; - } - - for (i = 0; i < arr_len; i++) - ret = g_list_append (ret, GINT_TO_POINTER (arr_n[i])); - -done: - if (arr_n) - (*env)->ReleaseIntArrayElements (env, arr, arr_n, JNI_ABORT); - if (arr) - (*env)->DeleteLocalRef (env, arr); - - return ret; -} - -GList * -gst_am_mediacodeccapabilities_get_profile_levels (GstAmMediaCodecCapabilities * - self) -{ - JNIEnv *env = gst_dvm_get_env (); - jarray arr = NULL; - jint arr_len = 0; - GList *ret = NULL; - gint i; - - arr = AMMCC_FIELD (goto done, Object, profileLevels); - if (!arr) - goto done; - arr_len = (*env)->GetArrayLength (env, arr); - if ((*env)->ExceptionCheck (env)) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get array length"); - goto done; - } - - for (i = 0; i < arr_len; i++) { - jobject object = NULL; - - object = (*env)->GetObjectArrayElement (env, arr, i); - if ((*env)->ExceptionCheck (env)) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get array element %d", i); - continue; - } - if (!object) - continue; - - if (object) { - GstAmMediaCodecProfileLevel *profile_level = - g_slice_new0 (GstAmMediaCodecProfileLevel); - - profile_level->object = (*env)->NewGlobalRef (env, object); - (*env)->DeleteLocalRef (env, object); - object = NULL; - if (!profile_level->object) { - GST_ERROR ("Failed to create global reference"); - (*env)->ExceptionClear (env); - g_slice_free (GstAmMediaCodecProfileLevel, profile_level); - } else { - ret = g_list_append (ret, profile_level); - } - } - } - -done: - if (arr) - (*env)->DeleteLocalRef (env, arr); - - return ret; -} - -#define AMMCPL_FIELD(error_statement, type, field) \ - GST_DVM_FIELD (error_statement, self->object, type, \ - android_media_mediacodecprofilelevel, field); - -gint -gst_am_mediacodecprofilelevel_get_level (GstAmMediaCodecProfileLevel * self) -{ - JNIEnv *env = gst_dvm_get_env (); - gint ret; - - ret = AMMCPL_FIELD (return -1, Int, level); - - return ret; -} - -gint -gst_am_mediacodecprofilelevel_get_profile (GstAmMediaCodecProfileLevel * self) -{ - JNIEnv *env = gst_dvm_get_env (); - gint ret; - - ret = AMMCPL_FIELD (return -1, Int, profile); - - return ret; -} diff --git a/sys/androidmedia/gst-android-media-mediacodecinfo.h b/sys/androidmedia/gst-android-media-mediacodecinfo.h deleted file mode 100644 index bcdb91f770..0000000000 --- a/sys/androidmedia/gst-android-media-mediacodecinfo.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2012, Collabora Ltd. - * Author: Sebastian Dröge - * Author: Youness Alaoui - * - * 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 - * - */ - -#ifndef __GST_ANDROID_MEDIA_MEDIACODECINFO_H__ -#define __GST_ANDROID_MEDIA_MEDIACODECINFO_H__ - -#include -#include - -G_BEGIN_DECLS - -typedef struct _GstAmMediaCodecInfo GstAmMediaCodecInfo; -typedef struct _GstAmMediaCodecCapabilities GstAmMediaCodecCapabilities; -typedef struct _GstAmMediaCodecProfileLevel GstAmMediaCodecProfileLevel; - -struct _GstAmMediaCodecInfo { - /*< private >*/ - jobject object; /* global reference */ -}; - -struct _GstAmMediaCodecCapabilities { - /*< private >*/ - jobject object; /* global reference */ -}; - -struct _GstAmMediaCodecProfileLevel { - /*< private >*/ - jobject object; /* global reference */ -}; - -gboolean gst_android_media_mediacodecinfo_init (void); -void gst_android_media_mediacodecinfo_deinit (void); - -void gst_am_mediacodecinfo_free (GstAmMediaCodecInfo * self); -void gst_am_mediacodeccapabilities_free (GstAmMediaCodecCapabilities * self); -void gst_am_mediacodecprofilelevel_free (GstAmMediaCodecProfileLevel * self); - -GstAmMediaCodecCapabilities * gst_am_mediacodecinfo_get_capabilities_for_type (GstAmMediaCodecInfo * self, const gchar *type); -gchar * gst_am_mediacodecinfo_get_name (GstAmMediaCodecInfo * self); -/* GList */ -GList * gst_am_mediacodecinfo_get_supported_types (GstAmMediaCodecInfo * self); -gboolean gst_am_mediacodecinfo_is_encoder (GstAmMediaCodecInfo * self); - -/* GList */ -GList * gst_am_mediacodeccapabilities_get_color_formats (GstAmMediaCodecCapabilities *self); -/* GList */ -GList * gst_am_mediacodeccapabilities_get_profile_levels (GstAmMediaCodecCapabilities *self); - -gint gst_am_mediacodecprofilelevel_get_level (GstAmMediaCodecProfileLevel *self); -gint gst_am_mediacodecprofilelevel_get_profile (GstAmMediaCodecProfileLevel *self); - -extern gint AudioFormat_CHANNEL_OUT_FRONT_LEFT; -extern gint AudioFormat_CHANNEL_OUT_FRONT_RIGHT; -extern gint AudioFormat_CHANNEL_OUT_FRONT_CENTER; -extern gint AudioFormat_CHANNEL_OUT_LOW_FREQUENCY; -extern gint AudioFormat_CHANNEL_OUT_BACK_LEFT; -extern gint AudioFormat_CHANNEL_OUT_BACK_RIGHT; -extern gint AudioFormat_CHANNEL_OUT_FRONT_LEFT_OF_CENTER; -extern gint AudioFormat_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER; -extern gint AudioFormat_CHANNEL_OUT_BACK_CENTER; -extern gint AudioFormat_CHANNEL_OUT_SIDE_LEFT; -extern gint AudioFormat_CHANNEL_OUT_SIDE_RIGHT; -extern gint AudioFormat_CHANNEL_OUT_TOP_CENTER; -extern gint AudioFormat_CHANNEL_OUT_TOP_FRONT_LEFT; -extern gint AudioFormat_CHANNEL_OUT_TOP_FRONT_CENTER; -extern gint AudioFormat_CHANNEL_OUT_TOP_FRONT_RIGHT; -extern gint AudioFormat_CHANNEL_OUT_TOP_BACK_LEFT; -extern gint AudioFormat_CHANNEL_OUT_TOP_BACK_CENTER; -extern gint AudioFormat_CHANNEL_OUT_TOP_BACK_RIGHT; - -G_END_DECLS - -#endif /* __GST_ANDROID_MEDIA_MEDIACODECINFO_H__ */ diff --git a/sys/androidmedia/gst-android-media-mediacodeclist.c b/sys/androidmedia/gst-android-media-mediacodeclist.c deleted file mode 100644 index dddcf13dd1..0000000000 --- a/sys/androidmedia/gst-android-media-mediacodeclist.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2012, Collabora Ltd. - * Author: Sebastian Dröge - * Author: Youness Alaoui - * - * 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 - -#include "gst-android-media-mediacodeclist.h" - -static struct -{ - jclass klass; - jmethodID getCodecCount; - jmethodID getCodecInfoAt; -} android_media_mediacodeclist; - - -static gboolean -_init_classes (void) -{ - JNIEnv *env = gst_dvm_get_env (); - - /* android.media.MediaCodecList */ - GST_DVM_GET_CLASS (android_media_mediacodeclist, - "android/media/MediaCodecList"); - GST_DVM_GET_STATIC_METHOD (android_media_mediacodeclist, getCodecCount, - "()I;"); - GST_DVM_GET_STATIC_METHOD (android_media_mediacodeclist, getCodecInfoAt, - "(I)Landroid/media/MediaCodecInfo;"); - - return TRUE; -} - -gboolean -gst_android_media_mediacodeclist_init (void) -{ - if (!_init_classes ()) { - gst_android_media_mediacodeclist_deinit (); - return FALSE; - } - - return TRUE; -} - -void -gst_android_media_mediacodeclist_deinit (void) -{ - JNIEnv *env = gst_dvm_get_env (); - - if (android_media_mediacodeclist.klass) - (*env)->DeleteGlobalRef (env, android_media_mediacodeclist.klass); - android_media_mediacodeclist.klass = NULL; -} - -/* android.media.MediaFormat */ -#define AMMCL_STATIC_CALL(error_statement, type, method, ...) \ - GST_DVM_STATIC_CALL (error_statement, type, \ - android_media_mediacodeclist, method, ## __VA_ARGS__); - -gint -gst_am_mediacodeclist_get_codec_count (void) -{ - JNIEnv *env = gst_dvm_get_env (); - gint count = 0; - - count = AMMCL_STATIC_CALL (goto done, Int, getCodecCount); - -done: - - return count; -} - -GstAmMediaCodecInfo * -gst_am_mediacodeclist_get_codec_info_at (gint index) -{ - JNIEnv *env = gst_dvm_get_env (); - GstAmMediaCodecInfo *info = NULL; - jobject object = NULL; - - object = AMMCL_STATIC_CALL (goto done, Object, getCodecInfoAt, index); - if (object) { - info = g_slice_new0 (GstAmMediaCodecInfo); - info->object = (*env)->NewGlobalRef (env, object); - (*env)->DeleteLocalRef (env, object); - if (!info->object) { - GST_ERROR ("Failed to create global reference"); - (*env)->ExceptionClear (env); - g_slice_free (GstAmMediaCodecInfo, info); - info = NULL; - } - } - -done: - - return info; -} diff --git a/sys/androidmedia/gst-android-media-mediacodeclist.h b/sys/androidmedia/gst-android-media-mediacodeclist.h deleted file mode 100644 index e0241022e4..0000000000 --- a/sys/androidmedia/gst-android-media-mediacodeclist.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2012, Collabora Ltd. - * Author: Sebastian Dröge - * Author: Youness Alaoui - * - * 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 - * - */ - -#ifndef __GST_ANDROID_MEDIA_MEDIACODECLIST_H__ -#define __GST_ANDROID_MEDIA_MEDIACODECLIST_H__ - -#include -#include - -#include "gst-android-media-mediacodecinfo.h" - -G_BEGIN_DECLS - -gboolean gst_android_media_mediacodeclist_init (void); -void gst_android_media_mediacodeclist_deinit (void); - -gint gst_am_mediacodeclist_get_codec_count (void); -GstAmMediaCodecInfo * gst_am_mediacodeclist_get_codec_info_at (int index); - -G_END_DECLS - -#endif /* __GST_ANDROID_MEDIA_MEDIACODECLIST_H__ */ diff --git a/sys/androidmedia/gst-android-media-mediaformat.c b/sys/androidmedia/gst-android-media-mediaformat.c deleted file mode 100644 index ee1529b6cb..0000000000 --- a/sys/androidmedia/gst-android-media-mediaformat.c +++ /dev/null @@ -1,554 +0,0 @@ -/* - * Copyright (C) 2012, Collabora Ltd. - * Author: Sebastian Dröge - * Author: Youness Alaoui - * - * 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 -#include - -#include "gst-android-media-mediaformat.h" - -static struct -{ - jclass klass; - jmethodID constructor; - jmethodID containsKey; - jmethodID createAudioFormat; - jmethodID createVideoFormat; - jmethodID getByteBuffer; - jmethodID getFloat; - jmethodID getInteger; - jmethodID getLong; - jmethodID getString; - jmethodID setByteBuffer; - jmethodID setFloat; - jmethodID setInteger; - jmethodID setLong; - jmethodID setString; - jmethodID toString; -} android_media_mediaformat; - - -static gboolean -_init_classes (void) -{ - JNIEnv *env = gst_dvm_get_env (); - - /* android.media.MediaFormat */ - GST_DVM_GET_CLASS (android_media_mediaformat, "android/media/MediaFormat"); - GST_DVM_GET_CONSTRUCTOR (android_media_mediaformat, constructor, "()V"); - GST_DVM_GET_STATIC_METHOD (android_media_mediaformat, createAudioFormat, - "(Ljava/lang/String;II)Landroid/media/MediaFormat;"); - GST_DVM_GET_STATIC_METHOD (android_media_mediaformat, createVideoFormat, - "(Ljava/lang/String;II)Landroid/media/MediaFormat;"); - GST_DVM_GET_METHOD (android_media_mediaformat, toString, - "()Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_media_mediaformat, containsKey, - "(Ljava/lang/String;)Z"); - GST_DVM_GET_METHOD (android_media_mediaformat, getFloat, - "(Ljava/lang/String;)F"); - GST_DVM_GET_METHOD (android_media_mediaformat, setFloat, - "(Ljava/lang/String;F)V"); - GST_DVM_GET_METHOD (android_media_mediaformat, getInteger, - "(Ljava/lang/String;)I"); - GST_DVM_GET_METHOD (android_media_mediaformat, setInteger, - "(Ljava/lang/String;I)V"); - GST_DVM_GET_METHOD (android_media_mediaformat, getLong, - "(Ljava/lang/String;)J"); - GST_DVM_GET_METHOD (android_media_mediaformat, setLong, - "(Ljava/lang/String;J)V"); - GST_DVM_GET_METHOD (android_media_mediaformat, getString, - "(Ljava/lang/String;)Ljava/lang/String;"); - GST_DVM_GET_METHOD (android_media_mediaformat, setString, - "(Ljava/lang/String;Ljava/lang/String;)V"); - GST_DVM_GET_METHOD (android_media_mediaformat, getByteBuffer, - "(Ljava/lang/String;)Ljava/nio/ByteBuffer;"); - GST_DVM_GET_METHOD (android_media_mediaformat, setByteBuffer, - "(Ljava/lang/String;Ljava/nio/ByteBuffer;)V"); - - return TRUE; -} - -gboolean -gst_android_media_mediaformat_init (void) -{ - if (!_init_classes ()) { - gst_android_media_mediaformat_deinit (); - return FALSE; - } - - return TRUE; -} - -void -gst_android_media_mediaformat_deinit (void) -{ - JNIEnv *env = gst_dvm_get_env (); - - if (android_media_mediaformat.klass) - (*env)->DeleteGlobalRef (env, android_media_mediaformat.klass); - android_media_mediaformat.klass = NULL; -} - -/* android.media.MediaFormat */ -#define AMMF_CALL(error_statement, type, method, ...) \ - GST_DVM_CALL (error_statement, self->object, type, \ - android_media_mediaformat, method, ## __VA_ARGS__); -#define AMMF_STATIC_CALL(error_statement, type, method, ...) \ - GST_DVM_STATIC_CALL (error_statement, type, \ - android_media_mediaformat, method, ## __VA_ARGS__); - -GstAmMediaFormat * -gst_am_mediaformat_new (void) -{ - JNIEnv *env = gst_dvm_get_env (); - GstAmMediaFormat *format = NULL; - jobject object = NULL; - - object = (*env)->NewObject (env, android_media_mediaformat.klass, - android_media_mediaformat.constructor); - if ((*env)->ExceptionCheck (env) || !object) { - GST_ERROR ("Failed to create callback object"); - (*env)->ExceptionClear (env); - return NULL; - } - - format = g_slice_new0 (GstAmMediaFormat); - format->object = (*env)->NewGlobalRef (env, object); - (*env)->DeleteLocalRef (env, object); - if (!format->object) { - GST_ERROR ("Failed to create global reference"); - (*env)->ExceptionClear (env); - g_slice_free (GstAmMediaFormat, format); - return NULL; - } - - return format; -} - -GstAmMediaFormat * -gst_am_mediaformat_create_audio_format (const gchar * mime, - gint sample_rate, gint channels) -{ - JNIEnv *env = gst_dvm_get_env (); - GstAmMediaFormat *format = NULL; - jstring mime_str; - jobject object = NULL; - - mime_str = (*env)->NewStringUTF (env, mime); - if (mime_str == NULL) - goto done; - - object = AMMF_STATIC_CALL (goto done, Object, createAudioFormat, mime_str, - sample_rate, channels); - if (object) { - format = g_slice_new0 (GstAmMediaFormat); - format->object = (*env)->NewGlobalRef (env, object); - (*env)->DeleteLocalRef (env, object); - if (!format->object) { - GST_ERROR ("Failed to create global reference"); - (*env)->ExceptionClear (env); - g_slice_free (GstAmMediaFormat, format); - format = NULL; - } - } - -done: - if (mime_str) - (*env)->DeleteLocalRef (env, mime_str); - - return format; -} - -GstAmMediaFormat * -gst_am_mediaformat_create_video_format (const gchar * mime, - gint width, gint height) -{ - JNIEnv *env = gst_dvm_get_env (); - GstAmMediaFormat *format = NULL; - jstring mime_str; - jobject object = NULL; - - mime_str = (*env)->NewStringUTF (env, mime); - if (mime_str == NULL) - goto done; - - object = AMMF_STATIC_CALL (goto done, Object, createVideoFormat, mime_str, - width, height); - if (object) { - format = g_slice_new0 (GstAmMediaFormat); - format->object = (*env)->NewGlobalRef (env, object); - (*env)->DeleteLocalRef (env, object); - if (!format->object) { - GST_ERROR ("Failed to create global reference"); - (*env)->ExceptionClear (env); - g_slice_free (GstAmMediaFormat, format); - format = NULL; - } - } - -done: - if (mime_str) - (*env)->DeleteLocalRef (env, mime_str); - - return format; -} - -void -gst_am_mediaformat_free (GstAmMediaFormat * self) -{ - JNIEnv *env = gst_dvm_get_env (); - - (*env)->DeleteGlobalRef (env, self->object); - g_slice_free (GstAmMediaFormat, self); -} - -gchar * -gst_am_mediaformat_to_string (GstAmMediaFormat * self) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring v_str = NULL; - const gchar *v = NULL; - gchar *ret = NULL; - - v_str = AMMF_CALL (return NULL, Object, toString); - if (v_str) { - v = (*env)->GetStringUTFChars (env, v_str, NULL); - if (!v) { - GST_ERROR ("Failed to convert string to UTF8"); - (*env)->ExceptionClear (env); - goto done; - } - ret = g_strdup (v); - } - -done: - if (v) - (*env)->ReleaseStringUTFChars (env, v_str, v); - if (v_str) - (*env)->DeleteLocalRef (env, v_str); - - return ret; -} - -gboolean -gst_am_mediaformat_contains_key (GstAmMediaFormat * self, const gchar * key) -{ - JNIEnv *env = gst_dvm_get_env (); - gboolean ret = FALSE; - jstring key_str = NULL; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - ret = AMMF_CALL (ret = FALSE; goto done, Boolean, containsKey, key_str); - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - - return ret; -} - -gboolean -gst_am_mediaformat_get_float (GstAmMediaFormat * self, const gchar * key, - gfloat * value) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring key_str = NULL; - gboolean ret = FALSE; - - *value = 0; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - *value = AMMF_CALL (goto done, Float, getFloat, key_str); - ret = TRUE; - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - - return ret; -} - -gboolean -gst_am_mediaformat_set_float (GstAmMediaFormat * self, const gchar * key, - gfloat value) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring key_str = NULL; - gboolean ret = FALSE; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - AMMF_CALL (goto done, Void, setFloat, key_str, value); - ret = TRUE; - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - - return ret; -} - -gboolean -gst_am_mediaformat_get_int (GstAmMediaFormat * self, const gchar * key, - gint * value) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring key_str = NULL; - gboolean ret = FALSE; - - *value = 0; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - *value = AMMF_CALL (goto done, Int, getInteger, key_str); - ret = TRUE; - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - - return ret; - -} - -gboolean -gst_am_mediaformat_set_int (GstAmMediaFormat * self, const gchar * key, - gint value) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring key_str = NULL; - gboolean ret = FALSE; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - AMMF_CALL (goto done, Void, setInteger, key_str, value); - ret = TRUE; - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - - return ret; -} - -gboolean -gst_am_mediaformat_get_long (GstAmMediaFormat * self, const gchar * key, - glong * value) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring key_str = NULL; - gboolean ret = FALSE; - jlong long_value; - - *value = 0; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - long_value = AMMF_CALL (goto done, Long, getLong, key_str); - *value = long_value; - ret = TRUE; - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - - return ret; - -} - -gboolean -gst_am_mediaformat_set_long (GstAmMediaFormat * self, const gchar * key, - glong value) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring key_str = NULL; - gboolean ret = FALSE; - jlong long_value = value; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - AMMF_CALL (goto done, Void, setLong, key_str, long_value); - ret = TRUE; - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - - return ret; -} - -gboolean -gst_am_mediaformat_get_string (GstAmMediaFormat * self, const gchar * key, - gchar ** value) -{ - JNIEnv *env = gst_dvm_get_env (); - gboolean ret = FALSE; - jstring key_str = NULL; - jstring v_str = NULL; - const gchar *v = NULL; - - *value = 0; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - v_str = AMMF_CALL (goto done, Object, getString, key_str); - - v = (*env)->GetStringUTFChars (env, v_str, NULL); - if (!v) { - GST_ERROR ("Failed to convert string to UTF8"); - (*env)->ExceptionClear (env); - goto done; - } - - *value = g_strdup (v); - - ret = TRUE; - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - if (v) - (*env)->ReleaseStringUTFChars (env, v_str, v); - if (v_str) - (*env)->DeleteLocalRef (env, v_str); - - return ret; -} - -gboolean -gst_am_mediaformat_set_string (GstAmMediaFormat * self, const gchar * key, - const gchar * value) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring key_str = NULL; - jstring v_str = NULL; - gboolean ret = FALSE; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - v_str = (*env)->NewStringUTF (env, value); - if (!v_str) - goto done; - - AMMF_CALL (goto done, Void, setString, key_str, v_str); - ret = TRUE; -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - if (v_str) - (*env)->DeleteLocalRef (env, v_str); - - return ret; -} - -gboolean -gst_am_mediaformat_get_buffer (GstAmMediaFormat * self, const gchar * key, - GstBuffer ** value) -{ - JNIEnv *env = gst_dvm_get_env (); - gboolean ret = FALSE; - jstring key_str = NULL; - jobject v = NULL; - guint8 *data; - gsize size; - - *value = 0; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - v = AMMF_CALL (goto done, Object, getByteBuffer, key_str); - - data = (*env)->GetDirectBufferAddress (env, v); - if (!data) { - (*env)->ExceptionClear (env); - GST_ERROR ("Failed to get buffer address"); - goto done; - } - size = (*env)->GetDirectBufferCapacity (env, v); - *value = gst_buffer_new_and_alloc (size); - memcpy (GST_BUFFER_DATA (*value), data, size); - - ret = TRUE; - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - if (v) - (*env)->DeleteLocalRef (env, v); - - return ret; -} - -gboolean -gst_am_mediaformat_set_buffer (GstAmMediaFormat * self, const gchar * key, - GstBuffer * value) -{ - JNIEnv *env = gst_dvm_get_env (); - jstring key_str = NULL; - jobject v = NULL; - gboolean ret = FALSE; - - key_str = (*env)->NewStringUTF (env, key); - if (!key_str) - goto done; - - /* FIXME: The buffer must remain valid until the codec is stopped */ - v = (*env)->NewDirectByteBuffer (env, GST_BUFFER_DATA (value), - GST_BUFFER_SIZE (value)); - if (!v) - goto done; - - AMMF_CALL (goto done, Void, setByteBuffer, key_str, v); - ret = TRUE; - -done: - if (key_str) - (*env)->DeleteLocalRef (env, key_str); - if (v) - (*env)->DeleteLocalRef (env, v); - - return ret; -} diff --git a/sys/androidmedia/gst-android-media-mediaformat.h b/sys/androidmedia/gst-android-media-mediaformat.h deleted file mode 100644 index a909d12737..0000000000 --- a/sys/androidmedia/gst-android-media-mediaformat.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2012, Collabora Ltd. - * Author: Sebastian Dröge - * Author: Youness Alaoui - * - * 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 - * - */ - -#ifndef __GST_ANDROID_MEDIA_MEDIAFORMAT_H__ -#define __GST_ANDROID_MEDIA_MEDIAFORMAT_H__ - -#include -#include - -G_BEGIN_DECLS - -typedef struct _GstAmMediaFormat GstAmMediaFormat; - -struct _GstAmMediaFormat { - /*< private >*/ - jobject object; /* global reference */ -}; - -gboolean gst_android_media_mediaformat_init (void); -void gst_android_media_mediaformat_deinit (void); - -GstAmMediaFormat * gst_am_mediaformat_new (void); -GstAmMediaFormat * gst_am_mediaformat_create_audio_format (const gchar *mime, - gint sample_rate, gint channels); -GstAmMediaFormat * gst_am_mediaformat_create_video_format (const gchar *mime, - gint width, gint height); -void gst_am_mediaformat_free (GstAmMediaFormat * self); - -gboolean gst_am_mediaformat_get_float (GstAmMediaFormat * self, - const gchar *key, gfloat *value); -gboolean gst_am_mediaformat_set_float (GstAmMediaFormat * self, - const gchar *key, gfloat value); -gboolean gst_am_mediaformat_get_int (GstAmMediaFormat * self, - const gchar *key, gint *value); -gboolean gst_am_mediaformat_set_int (GstAmMediaFormat * self, - const gchar *key, gint value); -gboolean gst_am_mediaformat_get_long (GstAmMediaFormat * self, - const gchar *key, glong *value); -gboolean gst_am_mediaformat_set_long (GstAmMediaFormat * self, - const gchar *key, glong value); -gboolean gst_am_mediaformat_get_string (GstAmMediaFormat * self, - const gchar *key, gchar **value); -gboolean gst_am_mediaformat_set_string (GstAmMediaFormat * self, - const gchar *key, const gchar *value); -gboolean gst_am_mediaformat_get_buffer (GstAmMediaFormat * self, - const gchar *key, GstBuffer **value); -gboolean gst_am_mediaformat_set_buffer (GstAmMediaFormat * self, - const gchar *key, GstBuffer *value); - - -gboolean gst_am_mediaformat_contains_key (GstAmMediaFormat * self, - const gchar *key); -gchar * gst_am_mediaformat_to_string (GstAmMediaFormat * self); - -G_END_DECLS - -#endif /* __GST_ANDROID_MEDIA_MEDIAFORMAT_H__ */ diff --git a/sys/androidmedia/gstahcsrc.c b/sys/androidmedia/gstahcsrc.c index a61c60b780..d67ea03aea 100644 --- a/sys/androidmedia/gstahcsrc.c +++ b/sys/androidmedia/gstahcsrc.c @@ -69,11 +69,10 @@ # include "config.h" #endif -#define GST_USE_UNSTABLE_API #include -#include #include -#include + +#include "gstjniutils.h" #include "gstahcsrc.h" @@ -89,9 +88,9 @@ static GstStateChangeReturn gst_ahc_src_change_state (GstElement * element, GstStateChange transition); /* GstBaseSrc */ -static GstCaps *gst_ahc_src_getcaps (GstBaseSrc * src); +static GstCaps *gst_ahc_src_getcaps (GstBaseSrc * src, GstCaps * filter); static gboolean gst_ahc_src_setcaps (GstBaseSrc * src, GstCaps * caps); -static void gst_ahc_src_fixate (GstBaseSrc * basesrc, GstCaps * caps); +static GstCaps *gst_ahc_src_fixate (GstBaseSrc * basesrc, GstCaps * caps); static gboolean gst_ahc_src_start (GstBaseSrc * bsrc); static gboolean gst_ahc_src_stop (GstBaseSrc * bsrc); static gboolean gst_ahc_src_unlock (GstBaseSrc * bsrc); @@ -99,58 +98,54 @@ static gboolean gst_ahc_src_unlock_stop (GstBaseSrc * bsrc); static GstFlowReturn gst_ahc_src_create (GstPushSrc * src, GstBuffer ** buffer); static gboolean gst_ahc_src_query (GstBaseSrc * bsrc, GstQuery * query); -/* GstPropertyProbe */ -static void gst_ahc_src_implements_interface_init (GstImplementsInterfaceClass - * klass); -static void gst_ahc_src_property_probe_interface_init (GstPropertyProbeInterface - * iface); -static void gst_ahc_src_photography_interface_init (GstPhotographyInterface - * iface); -static void gst_ahc_src_init_interfaces (GType type); - /* GstPhotography */ +static void gst_ahc_src_photography_init (gpointer g_iface, + gpointer iface_data); static gboolean gst_ahc_src_get_ev_compensation (GstPhotography * photo, gfloat * ev_comp); static gboolean _white_balance_to_enum (const gchar * white_balance, - GstWhiteBalanceMode * mode); + GstPhotographyWhiteBalanceMode * mode); static gboolean gst_ahc_src_get_white_balance_mode (GstPhotography * photo, - GstWhiteBalanceMode * wb_mode); + GstPhotographyWhiteBalanceMode * wb_mode); static gboolean _color_effects_to_enum (const gchar * color_effect, - GstColourToneMode * mode); + GstPhotographyColorToneMode * mode); static gboolean gst_ahc_src_get_colour_tone_mode (GstPhotography * photo, - GstColourToneMode * tone_mode); -static gboolean _scene_modes_to_enum (const gchar * scene, GstSceneMode * mode); + GstPhotographyColorToneMode * tone_mode); +static gboolean _scene_modes_to_enum (const gchar * scene, + GstPhotographySceneMode * mode); static gboolean gst_ahc_src_get_scene_mode (GstPhotography * photo, - GstSceneMode * scene_mode); -static gboolean _flash_modes_to_enum (const gchar * flash, GstFlashMode * mode); + GstPhotographySceneMode * scene_mode); +static gboolean _flash_modes_to_enum (const gchar * flash, + GstPhotographyFlashMode * mode); static gboolean gst_ahc_src_get_flash_mode (GstPhotography * photo, - GstFlashMode * flash_mode); + GstPhotographyFlashMode * flash_mode); static gboolean gst_ahc_src_get_zoom (GstPhotography * photo, gfloat * zoom); static gboolean _antibanding_to_enum (const gchar * antibanding, - GstFlickerReductionMode * mode); + GstPhotographyFlickerReductionMode * mode); static gboolean gst_ahc_src_get_flicker_mode (GstPhotography * photo, - GstFlickerReductionMode * flicker_mode); -static gboolean _focus_modes_to_enum (const gchar * focus, GstFocusMode * mode); + GstPhotographyFlickerReductionMode * flicker_mode); +static gboolean _focus_modes_to_enum (const gchar * focus, + GstPhotographyFocusMode * mode); static gboolean gst_ahc_src_get_focus_mode (GstPhotography * photo, - GstFocusMode * focus_mode); + GstPhotographyFocusMode * focus_mode); static gboolean gst_ahc_src_set_ev_compensation (GstPhotography * photo, gfloat ev_comp); static gboolean gst_ahc_src_set_white_balance_mode (GstPhotography * photo, - GstWhiteBalanceMode wb_mode); + GstPhotographyWhiteBalanceMode wb_mode); static gboolean gst_ahc_src_set_colour_tone_mode (GstPhotography * photo, - GstColourToneMode tone_mode); + GstPhotographyColorToneMode tone_mode); static gboolean gst_ahc_src_set_scene_mode (GstPhotography * photo, - GstSceneMode scene_mode); + GstPhotographySceneMode scene_mode); static gboolean gst_ahc_src_set_flash_mode (GstPhotography * photo, - GstFlashMode flash_mode); + GstPhotographyFlashMode flash_mode); static gboolean gst_ahc_src_set_zoom (GstPhotography * photo, gfloat zoom); static gboolean gst_ahc_src_set_flicker_mode (GstPhotography * photo, - GstFlickerReductionMode flicker_mode); + GstPhotographyFlickerReductionMode flicker_mode); static gboolean gst_ahc_src_set_focus_mode (GstPhotography * photo, - GstFocusMode focus_mode); + GstPhotographyFocusMode focus_mode); -static GstPhotoCaps gst_ahc_src_get_capabilities (GstPhotography * photo); +static GstPhotographyCaps gst_ahc_src_get_capabilities (GstPhotography * photo); static void gst_ahc_src_set_autofocus (GstPhotography * photo, gboolean on); /* GstAHCSrc */ @@ -162,8 +157,7 @@ static void gst_ahc_src_on_auto_focus (gboolean success, gpointer user_data); #define NUM_CALLBACK_BUFFERS 5 #define GST_AHC_SRC_CAPS_STR \ - GST_VIDEO_CAPS_YUV (" { YV12 , YUY2 , NV21 , NV16 }") ";" \ - GST_VIDEO_CAPS_RGB_16 + GST_VIDEO_CAPS_MAKE_WITH_FEATURES("ANY", " { YV12, YUY2, NV21, NV16, RGB16 }") static GstStaticPadTemplate gst_ahc_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", @@ -174,6 +168,8 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_DEBUG_CATEGORY_STATIC (gst_ahc_src_debug); #define GST_CAT_DEFAULT gst_ahc_src_debug +#define parent_class gst_ahc_src_parent_class + enum { PROP_0, @@ -194,13 +190,20 @@ enum PROP_EV_COMP, PROP_ISO_SPEED, PROP_APERTURE, - PROP_EXPOSURE, + PROP_EXPOSURE_MODE, PROP_IMAGE_CAPTURE_SUPPORTED_CAPS, PROP_IMAGE_PREVIEW_SUPPORTED_CAPS, PROP_FLICKER_MODE, PROP_FOCUS_MODE, PROP_ZOOM, PROP_SMOOTH_ZOOM, + PROP_WHITE_POINT, + PROP_MIN_EXPOSURE_TIME, + PROP_MAX_EXPOSURE_TIME, + PROP_LENS_FOCUS, + PROP_EXPOSURE_TIME, + PROP_COLOR_TEMPERATURE, + PROP_ANALOG_GAIN, PROP_LAST }; @@ -208,8 +211,8 @@ static GParamSpec *properties[PROP_LAST]; #define DEFAULT_DEVICE "0" -GST_BOILERPLATE_FULL (GstAHCSrc, gst_ahc_src, GstPushSrc, GST_TYPE_PUSH_SRC, - gst_ahc_src_init_interfaces); +G_DEFINE_TYPE_WITH_CODE (GstAHCSrc, gst_ahc_src, GST_TYPE_PUSH_SRC, + G_IMPLEMENT_INTERFACE (GST_TYPE_PHOTOGRAPHY, gst_ahc_src_photography_init)); #define CAMERA_FACING_BACK 0 #define CAMERA_FACING_FRONT 1 @@ -233,47 +236,30 @@ gst_ahc_src_facing_get_type (void) #define GST_AHC_SRC_FACING_TYPE (gst_ahc_src_facing_get_type()) static void -gst_ahc_src_init_interfaces (GType type) +gst_ahc_src_photography_init (gpointer g_iface, gpointer iface_data) { - static const GInterfaceInfo ahcsrc_propertyprobe_info = { - (GInterfaceInitFunc) gst_ahc_src_property_probe_interface_init, - NULL, - NULL, - }; - static const GInterfaceInfo ahcsrc_photography_info = { - (GInterfaceInitFunc) gst_ahc_src_photography_interface_init, - NULL, - NULL, - }; - static const GInterfaceInfo ahcsrc_implements_interface_info = { - (GInterfaceInitFunc) gst_ahc_src_implements_interface_init, - NULL, - NULL, - }; + GstPhotographyInterface *iface = g_iface; - g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, - &ahcsrc_propertyprobe_info); - g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE, - &ahcsrc_implements_interface_info); - g_type_add_interface_static (type, GST_TYPE_PHOTOGRAPHY, - &ahcsrc_photography_info); -} + iface->get_ev_compensation = gst_ahc_src_get_ev_compensation; + iface->get_white_balance_mode = gst_ahc_src_get_white_balance_mode; + iface->get_color_tone_mode = gst_ahc_src_get_colour_tone_mode; + iface->get_scene_mode = gst_ahc_src_get_scene_mode; + iface->get_flash_mode = gst_ahc_src_get_flash_mode; + iface->get_zoom = gst_ahc_src_get_zoom; + iface->get_flicker_mode = gst_ahc_src_get_flicker_mode; + iface->get_focus_mode = gst_ahc_src_get_focus_mode; -static void -gst_ahc_src_base_init (gpointer g_class) -{ - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + iface->set_ev_compensation = gst_ahc_src_set_ev_compensation; + iface->set_white_balance_mode = gst_ahc_src_set_white_balance_mode; + iface->set_color_tone_mode = gst_ahc_src_set_colour_tone_mode; + iface->set_scene_mode = gst_ahc_src_set_scene_mode; + iface->set_flash_mode = gst_ahc_src_set_flash_mode; + iface->set_zoom = gst_ahc_src_set_zoom; + iface->set_flicker_mode = gst_ahc_src_set_flicker_mode; + iface->set_focus_mode = gst_ahc_src_set_focus_mode; - GST_DEBUG_CATEGORY_INIT (gst_ahc_src_debug, "ahcsrc", 0, - "android.hardware.Camera source element"); - - gst_element_class_add_static_pad_template (gstelement_class, - &gst_ahc_src_pad_template); - gst_element_class_set_details_simple (gstelement_class, - "Android Camera Source", - "Source/Video", - "Reads frames from android.hardware.Camera class into buffers", - "Youness Alaoui "); + iface->get_capabilities = gst_ahc_src_get_capabilities; + iface->set_autofocus = gst_ahc_src_set_autofocus; } static void @@ -301,6 +287,9 @@ gst_ahc_src_class_init (GstAHCSrcClass * klass) gstpushsrc_class->create = gst_ahc_src_create; + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_ahc_src_pad_template)); + /** * GstAHCSrc:device: * @@ -420,9 +409,9 @@ gst_ahc_src_class_init (GstAHCSrcClass * klass) GST_PHOTOGRAPHY_PROP_WB_MODE); g_object_class_override_property (gobject_class, PROP_COLOUR_TONE, - GST_PHOTOGRAPHY_PROP_COLOUR_TONE); + GST_PHOTOGRAPHY_PROP_COLOR_TONE); properties[PROP_COLOUR_TONE] = g_object_class_find_property (gobject_class, - GST_PHOTOGRAPHY_PROP_COLOUR_TONE); + GST_PHOTOGRAPHY_PROP_COLOR_TONE); g_object_class_override_property (gobject_class, PROP_SCENE_MODE, GST_PHOTOGRAPHY_PROP_SCENE_MODE); @@ -460,10 +449,12 @@ gst_ahc_src_class_init (GstAHCSrcClass * klass) properties[PROP_APERTURE] = g_object_class_find_property (gobject_class, GST_PHOTOGRAPHY_PROP_APERTURE); - g_object_class_override_property (gobject_class, PROP_EXPOSURE, - GST_PHOTOGRAPHY_PROP_EXPOSURE); +#if 0 + g_object_class_override_property (gobject_class, PROP_EXPOSURE_MODE, + GST_PHOTOGRAPHY_PROP_EXPOSURE_MODE); properties[PROP_EXPOSURE] = g_object_class_find_property (gobject_class, - GST_PHOTOGRAPHY_PROP_EXPOSURE); + GST_PHOTOGRAPHY_PROP_EXPOSURE_MODE); +#endif g_object_class_override_property (gobject_class, PROP_IMAGE_CAPTURE_SUPPORTED_CAPS, @@ -494,7 +485,56 @@ gst_ahc_src_class_init (GstAHCSrcClass * klass) properties[PROP_ZOOM] = g_object_class_find_property (gobject_class, GST_PHOTOGRAPHY_PROP_ZOOM); + g_object_class_override_property (gobject_class, PROP_WHITE_POINT, + GST_PHOTOGRAPHY_PROP_WHITE_POINT); + properties[PROP_WHITE_POINT] = g_object_class_find_property (gobject_class, + GST_PHOTOGRAPHY_PROP_WHITE_POINT); + + g_object_class_override_property (gobject_class, PROP_MIN_EXPOSURE_TIME, + GST_PHOTOGRAPHY_PROP_MIN_EXPOSURE_TIME); + properties[PROP_MIN_EXPOSURE_TIME] = + g_object_class_find_property (gobject_class, + GST_PHOTOGRAPHY_PROP_MIN_EXPOSURE_TIME); + + g_object_class_override_property (gobject_class, PROP_MAX_EXPOSURE_TIME, + GST_PHOTOGRAPHY_PROP_MAX_EXPOSURE_TIME); + properties[PROP_MAX_EXPOSURE_TIME] = + g_object_class_find_property (gobject_class, + GST_PHOTOGRAPHY_PROP_MAX_EXPOSURE_TIME); + + g_object_class_override_property (gobject_class, PROP_LENS_FOCUS, + GST_PHOTOGRAPHY_PROP_LENS_FOCUS); + properties[PROP_LENS_FOCUS] = g_object_class_find_property (gobject_class, + GST_PHOTOGRAPHY_PROP_LENS_FOCUS); + + g_object_class_override_property (gobject_class, PROP_EXPOSURE_TIME, + GST_PHOTOGRAPHY_PROP_EXPOSURE_TIME); + properties[PROP_EXPOSURE_TIME] = g_object_class_find_property (gobject_class, + GST_PHOTOGRAPHY_PROP_EXPOSURE_TIME); + + g_object_class_override_property (gobject_class, PROP_COLOR_TEMPERATURE, + GST_PHOTOGRAPHY_PROP_COLOR_TEMPERATURE); + properties[PROP_COLOR_TEMPERATURE] = + g_object_class_find_property (gobject_class, + GST_PHOTOGRAPHY_PROP_COLOR_TEMPERATURE); + + g_object_class_override_property (gobject_class, PROP_ANALOG_GAIN, + GST_PHOTOGRAPHY_PROP_ANALOG_GAIN); + properties[PROP_ANALOG_GAIN] = g_object_class_find_property (gobject_class, + GST_PHOTOGRAPHY_PROP_ANALOG_GAIN); + + + klass->probe_properties = NULL; + + gst_element_class_set_static_metadata (element_class, + "Android Camera Source", + "Source/Video", + "Reads frames from android.hardware.Camera class into buffers", + "Youness Alaoui "); + + GST_DEBUG_CATEGORY_INIT (gst_ahc_src_debug, "ahcsrc", 0, + "android.hardware.Camera source element"); } static gboolean @@ -505,7 +545,7 @@ _data_queue_check_full (GstDataQueue * queue, guint visible, } static void -gst_ahc_src_init (GstAHCSrc * self, GstAHCSrcClass * klass) +gst_ahc_src_init (GstAHCSrc * self) { gst_base_src_set_live (GST_BASE_SRC (self), TRUE); gst_base_src_set_format (GST_BASE_SRC (self), GST_FORMAT_TIME); @@ -514,9 +554,11 @@ gst_ahc_src_init (GstAHCSrc * self, GstAHCSrcClass * klass) self->camera = NULL; self->texture = NULL; self->data = NULL; - self->queue = gst_data_queue_new (_data_queue_check_full, NULL); + self->queue = gst_data_queue_new (_data_queue_check_full, NULL, NULL, NULL); self->start = FALSE; self->previous_ts = GST_CLOCK_TIME_NONE; + + g_mutex_init (&self->mutex); } static void @@ -528,6 +570,8 @@ gst_ahc_src_dispose (GObject * object) g_object_unref (self->queue); self->queue = NULL; + g_mutex_clear (&self->mutex); + G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -536,7 +580,8 @@ gst_ahc_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAHCSrc *self = GST_AHC_SRC (object); - (void) self; + + GST_DEBUG_OBJECT (self, "set props %d", prop_id); switch (prop_id) { case PROP_DEVICE:{ @@ -566,25 +611,25 @@ gst_ahc_src_set_property (GObject * object, guint prop_id, self->smooth_zoom = g_value_get_boolean (value); break; case PROP_WB_MODE:{ - GstWhiteBalanceMode wb = g_value_get_enum (value); + GstPhotographyWhiteBalanceMode wb = g_value_get_enum (value); gst_ahc_src_set_white_balance_mode (GST_PHOTOGRAPHY (self), wb); } break; case PROP_COLOUR_TONE:{ - GstColourToneMode tone = g_value_get_enum (value); + GstPhotographyColorToneMode tone = g_value_get_enum (value); gst_ahc_src_set_colour_tone_mode (GST_PHOTOGRAPHY (self), tone); } break; case PROP_SCENE_MODE:{ - GstSceneMode scene = g_value_get_enum (value); + GstPhotographySceneMode scene = g_value_get_enum (value); gst_ahc_src_set_scene_mode (GST_PHOTOGRAPHY (self), scene); } break; case PROP_FLASH_MODE:{ - GstFlashMode flash = g_value_get_enum (value); + GstPhotographyFlashMode flash = g_value_get_enum (value); gst_ahc_src_set_flash_mode (GST_PHOTOGRAPHY (self), flash); } @@ -596,13 +641,13 @@ gst_ahc_src_set_property (GObject * object, guint prop_id, } break; case PROP_FLICKER_MODE:{ - GstFlickerReductionMode flicker = g_value_get_enum (value); + GstPhotographyFlickerReductionMode flicker = g_value_get_enum (value); gst_ahc_src_set_flicker_mode (GST_PHOTOGRAPHY (self), flicker); } break; case PROP_FOCUS_MODE:{ - GstFocusMode focus = g_value_get_enum (value); + GstPhotographyFocusMode focus = g_value_get_enum (value); gst_ahc_src_set_focus_mode (GST_PHOTOGRAPHY (self), focus); } @@ -616,9 +661,16 @@ gst_ahc_src_set_property (GObject * object, guint prop_id, case PROP_NOISE_REDUCTION: case PROP_ISO_SPEED: case PROP_APERTURE: - case PROP_EXPOSURE: + case PROP_EXPOSURE_MODE: case PROP_IMAGE_CAPTURE_SUPPORTED_CAPS: case PROP_IMAGE_PREVIEW_SUPPORTED_CAPS: + case PROP_WHITE_POINT: + case PROP_MIN_EXPOSURE_TIME: + case PROP_MAX_EXPOSURE_TIME: + case PROP_LENS_FOCUS: + case PROP_EXPOSURE_TIME: + case PROP_COLOR_TEMPERATURE: + case PROP_ANALOG_GAIN: break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -724,35 +776,35 @@ gst_ahc_src_get_property (GObject * object, guint prop_id, g_value_set_boolean (value, self->smooth_zoom); break; case PROP_WB_MODE:{ - GstWhiteBalanceMode wb; + GstPhotographyWhiteBalanceMode wb; if (gst_ahc_src_get_white_balance_mode (GST_PHOTOGRAPHY (self), &wb)) g_value_set_enum (value, wb); } break; case PROP_COLOUR_TONE:{ - GstColourToneMode tone; + GstPhotographyColorToneMode tone; if (gst_ahc_src_get_colour_tone_mode (GST_PHOTOGRAPHY (self), &tone)) g_value_set_enum (value, tone); } break; case PROP_SCENE_MODE:{ - GstSceneMode scene; + GstPhotographySceneMode scene; if (gst_ahc_src_get_scene_mode (GST_PHOTOGRAPHY (self), &scene)) g_value_set_enum (value, scene); } break; case PROP_FLASH_MODE:{ - GstFlashMode flash; + GstPhotographyFlashMode flash; if (gst_ahc_src_get_flash_mode (GST_PHOTOGRAPHY (self), &flash)) g_value_set_enum (value, flash); } break; case PROP_CAPABILITIES:{ - GstPhotoCaps caps; + GstPhotographyCaps caps; caps = gst_ahc_src_get_capabilities (GST_PHOTOGRAPHY (self)); g_value_set_ulong (value, caps); @@ -766,14 +818,14 @@ gst_ahc_src_get_property (GObject * object, guint prop_id, } break; case PROP_FLICKER_MODE:{ - GstFlickerReductionMode flicker; + GstPhotographyFlickerReductionMode flicker; if (gst_ahc_src_get_flicker_mode (GST_PHOTOGRAPHY (self), &flicker)) g_value_set_enum (value, flicker); } break; case PROP_FOCUS_MODE:{ - GstFocusMode focus; + GstPhotographyFocusMode focus; if (gst_ahc_src_get_focus_mode (GST_PHOTOGRAPHY (self), &focus)) g_value_set_enum (value, focus); @@ -791,7 +843,14 @@ gst_ahc_src_get_property (GObject * object, guint prop_id, case PROP_NOISE_REDUCTION: case PROP_ISO_SPEED: case PROP_APERTURE: - case PROP_EXPOSURE: + case PROP_EXPOSURE_MODE: + case PROP_WHITE_POINT: + case PROP_MIN_EXPOSURE_TIME: + case PROP_MAX_EXPOSURE_TIME: + case PROP_LENS_FOCUS: + case PROP_EXPOSURE_TIME: + case PROP_COLOR_TEMPERATURE: + case PROP_ANALOG_GAIN: break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -799,23 +858,7 @@ gst_ahc_src_get_property (GObject * object, guint prop_id, } } -static gboolean -gst_ahc_src_interface_supported (GstImplementsInterface * iface, - GType iface_type) -{ - if (iface_type == GST_TYPE_PHOTOGRAPHY || - iface_type == GST_TYPE_PROPERTY_PROBE) - return TRUE; - else - return FALSE; -} - -static void -gst_ahc_src_implements_interface_init (GstImplementsInterfaceClass * klass) -{ - klass->supported = gst_ahc_src_interface_supported; -} - +#if 0 static const GList * gst_ahc_src_probe_get_properties (GstPropertyProbe * probe) { @@ -952,36 +995,33 @@ gst_ahc_src_probe_get_values (GstPropertyProbe * probe, } } else if (pspec == properties[PROP_WB_MODE]) { PROBE_GET_ENUM_VALUES (white_balance, GST_TYPE_WHITE_BALANCE_MODE, - GstWhiteBalanceMode); + GstPhotographyWhiteBalanceMode); } else if (pspec == properties[PROP_COLOUR_TONE]) { PROBE_GET_ENUM_VALUES (color_effects, GST_TYPE_COLOUR_TONE_MODE, - GstColourToneMode); + GstPhotographyColorToneMode); } else if (pspec == properties[PROP_FLASH_MODE]) { - PROBE_GET_ENUM_VALUES (flash_modes, GST_TYPE_FLASH_MODE, GstFlashMode); + PROBE_GET_ENUM_VALUES (flash_modes, GST_TYPE_FLASH_MODE, + GstPhotographyFlashMode); } else if (pspec == properties[PROP_FOCUS_MODE]) { - PROBE_GET_ENUM_VALUES (focus_modes, GST_TYPE_FOCUS_MODE, GstFocusMode); + PROBE_GET_ENUM_VALUES (focus_modes, GST_TYPE_FOCUS_MODE, + GstPhotographyFocusMode); } else if (pspec == properties[PROP_SCENE_MODE]) { - PROBE_GET_ENUM_VALUES (scene_modes, GST_TYPE_SCENE_MODE, GstSceneMode); + PROBE_GET_ENUM_VALUES (scene_modes, GST_TYPE_SCENE_MODE, + GstPhotographySceneMode); } else if (pspec == properties[PROP_FLICKER_MODE]) { PROBE_GET_ENUM_VALUES (antibanding, GST_TYPE_FLICKER_REDUCTION_MODE, - GstFlickerReductionMode); + GstPhotographyFlickerReductionMode); } else { G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); } return array; } - -static void -gst_ahc_src_property_probe_interface_init (GstPropertyProbeInterface * iface) -{ - iface->get_properties = gst_ahc_src_probe_get_properties; - iface->get_values = gst_ahc_src_probe_get_values; -} - +#endif static gboolean -_antibanding_to_enum (const gchar * antibanding, GstFlickerReductionMode * mode) +_antibanding_to_enum (const gchar * antibanding, + GstPhotographyFlickerReductionMode * mode) { if (antibanding == Parameters_ANTIBANDING_AUTO) *mode = GST_PHOTOGRAPHY_FLICKER_REDUCTION_AUTO; @@ -998,7 +1038,8 @@ _antibanding_to_enum (const gchar * antibanding, GstFlickerReductionMode * mode) } static gboolean -_white_balance_to_enum (const gchar * white_balance, GstWhiteBalanceMode * mode) +_white_balance_to_enum (const gchar * white_balance, + GstPhotographyWhiteBalanceMode * mode) { if (white_balance == Parameters_WHITE_BALANCE_AUTO) *mode = GST_PHOTOGRAPHY_WB_MODE_AUTO; @@ -1023,26 +1064,27 @@ _white_balance_to_enum (const gchar * white_balance, GstWhiteBalanceMode * mode) } static gboolean -_color_effects_to_enum (const gchar * color_effect, GstColourToneMode * mode) +_color_effects_to_enum (const gchar * color_effect, + GstPhotographyColorToneMode * mode) { if (color_effect == Parameters_EFFECT_NONE) - *mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NORMAL; + *mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_NORMAL; else if (color_effect == Parameters_EFFECT_MONO) - *mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_GRAYSCALE; + *mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_GRAYSCALE; else if (color_effect == Parameters_EFFECT_NEGATIVE) - *mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NEGATIVE; + *mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_NEGATIVE; else if (color_effect == Parameters_EFFECT_SOLARIZE) - *mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SOLARIZE; + *mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_SOLARIZE; else if (color_effect == Parameters_EFFECT_SEPIA) - *mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SEPIA; + *mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_SEPIA; else if (color_effect == Parameters_EFFECT_POSTERIZE) - *mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_POSTERIZE; + *mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_POSTERIZE; else if (color_effect == Parameters_EFFECT_WHITEBOARD) - *mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_WHITEBOARD; + *mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_WHITEBOARD; else if (color_effect == Parameters_EFFECT_BLACKBOARD) - *mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_BLACKBOARD; + *mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_BLACKBOARD; else if (color_effect == Parameters_EFFECT_AQUA) - *mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_AQUA; + *mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_AQUA; else return FALSE; @@ -1050,7 +1092,7 @@ _color_effects_to_enum (const gchar * color_effect, GstColourToneMode * mode) } static gboolean -_scene_modes_to_enum (const gchar * scene, GstSceneMode * mode) +_scene_modes_to_enum (const gchar * scene, GstPhotographySceneMode * mode) { if (scene == Parameters_SCENE_MODE_AUTO) *mode = GST_PHOTOGRAPHY_SCENE_MODE_AUTO; @@ -1091,7 +1133,7 @@ _scene_modes_to_enum (const gchar * scene, GstSceneMode * mode) } static gboolean -_flash_modes_to_enum (const gchar * flash, GstFlashMode * mode) +_flash_modes_to_enum (const gchar * flash, GstPhotographyFlashMode * mode) { if (flash == Parameters_FLASH_MODE_OFF) *mode = GST_PHOTOGRAPHY_FLASH_MODE_OFF; @@ -1110,7 +1152,7 @@ _flash_modes_to_enum (const gchar * flash, GstFlashMode * mode) } static gboolean -_focus_modes_to_enum (const gchar * focus, GstFocusMode * mode) +_focus_modes_to_enum (const gchar * focus, GstPhotographyFocusMode * mode) { if (focus == Parameters_FOCUS_MODE_AUTO) *mode = GST_PHOTOGRAPHY_FOCUS_MODE_AUTO; @@ -1165,7 +1207,7 @@ gst_ahc_src_get_ev_compensation (GstPhotography * photo, gfloat * ev_comp) static gboolean gst_ahc_src_get_white_balance_mode (GstPhotography * photo, - GstWhiteBalanceMode * wb_mode) + GstPhotographyWhiteBalanceMode * wb_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1176,7 +1218,7 @@ gst_ahc_src_get_white_balance_mode (GstPhotography * photo, params = gst_ah_camera_get_parameters (self->camera); if (params) { const gchar *wb = gst_ahc_parameters_get_white_balance (params); - GstWhiteBalanceMode mode = GST_PHOTOGRAPHY_WB_MODE_AUTO; + GstPhotographyWhiteBalanceMode mode = GST_PHOTOGRAPHY_WB_MODE_AUTO; if (_white_balance_to_enum (wb, &mode)) { ret = TRUE; @@ -1194,7 +1236,7 @@ gst_ahc_src_get_white_balance_mode (GstPhotography * photo, static gboolean gst_ahc_src_get_colour_tone_mode (GstPhotography * photo, - GstColourToneMode * tone_mode) + GstPhotographyColorToneMode * tone_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1205,7 +1247,7 @@ gst_ahc_src_get_colour_tone_mode (GstPhotography * photo, params = gst_ah_camera_get_parameters (self->camera); if (params) { const gchar *effect = gst_ahc_parameters_get_color_effect (params); - GstColourToneMode mode = GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NORMAL; + GstPhotographyColorToneMode mode = GST_PHOTOGRAPHY_COLOR_TONE_MODE_NORMAL; if (_color_effects_to_enum (effect, &mode)) { ret = TRUE; @@ -1222,7 +1264,8 @@ gst_ahc_src_get_colour_tone_mode (GstPhotography * photo, } static gboolean -gst_ahc_src_get_scene_mode (GstPhotography * photo, GstSceneMode * scene_mode) +gst_ahc_src_get_scene_mode (GstPhotography * photo, + GstPhotographySceneMode * scene_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1233,7 +1276,7 @@ gst_ahc_src_get_scene_mode (GstPhotography * photo, GstSceneMode * scene_mode) params = gst_ah_camera_get_parameters (self->camera); if (params) { const gchar *scene = gst_ahc_parameters_get_scene_mode (params); - GstSceneMode mode = GST_PHOTOGRAPHY_SCENE_MODE_AUTO; + GstPhotographySceneMode mode = GST_PHOTOGRAPHY_SCENE_MODE_AUTO; if (_scene_modes_to_enum (scene, &mode)) { ret = TRUE; @@ -1250,7 +1293,8 @@ gst_ahc_src_get_scene_mode (GstPhotography * photo, GstSceneMode * scene_mode) } static gboolean -gst_ahc_src_get_flash_mode (GstPhotography * photo, GstFlashMode * flash_mode) +gst_ahc_src_get_flash_mode (GstPhotography * photo, + GstPhotographyFlashMode * flash_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1261,7 +1305,7 @@ gst_ahc_src_get_flash_mode (GstPhotography * photo, GstFlashMode * flash_mode) params = gst_ah_camera_get_parameters (self->camera); if (params) { const gchar *flash = gst_ahc_parameters_get_flash_mode (params); - GstFlashMode mode = GST_PHOTOGRAPHY_FLASH_MODE_OFF; + GstPhotographyFlashMode mode = GST_PHOTOGRAPHY_FLASH_MODE_OFF; if (_flash_modes_to_enum (flash, &mode)) { ret = TRUE; @@ -1313,7 +1357,7 @@ gst_ahc_src_get_zoom (GstPhotography * photo, gfloat * zoom) static gboolean gst_ahc_src_get_flicker_mode (GstPhotography * photo, - GstFlickerReductionMode * flicker_mode) + GstPhotographyFlickerReductionMode * flicker_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1324,7 +1368,8 @@ gst_ahc_src_get_flicker_mode (GstPhotography * photo, params = gst_ah_camera_get_parameters (self->camera); if (params) { const gchar *antibanding = gst_ahc_parameters_get_antibanding (params); - GstFlickerReductionMode mode = GST_PHOTOGRAPHY_FLICKER_REDUCTION_AUTO; + GstPhotographyFlickerReductionMode mode = + GST_PHOTOGRAPHY_FLICKER_REDUCTION_AUTO; if (_antibanding_to_enum (antibanding, &mode)) { ret = TRUE; @@ -1341,7 +1386,8 @@ gst_ahc_src_get_flicker_mode (GstPhotography * photo, } static gboolean -gst_ahc_src_get_focus_mode (GstPhotography * photo, GstFocusMode * focus_mode) +gst_ahc_src_get_focus_mode (GstPhotography * photo, + GstPhotographyFocusMode * focus_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1352,7 +1398,7 @@ gst_ahc_src_get_focus_mode (GstPhotography * photo, GstFocusMode * focus_mode) params = gst_ah_camera_get_parameters (self->camera); if (params) { const gchar *focus = gst_ahc_parameters_get_focus_mode (params); - GstFocusMode mode = GST_PHOTOGRAPHY_FOCUS_MODE_AUTO; + GstPhotographyFocusMode mode = GST_PHOTOGRAPHY_FOCUS_MODE_AUTO; if (_focus_modes_to_enum (focus, &mode)) { ret = TRUE; @@ -1404,7 +1450,7 @@ gst_ahc_src_set_ev_compensation (GstPhotography * photo, gfloat ev_comp) static gboolean gst_ahc_src_set_white_balance_mode (GstPhotography * photo, - GstWhiteBalanceMode wb_mode) + GstPhotographyWhiteBalanceMode wb_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1459,7 +1505,7 @@ gst_ahc_src_set_white_balance_mode (GstPhotography * photo, static gboolean gst_ahc_src_set_colour_tone_mode (GstPhotography * photo, - GstColourToneMode tone_mode) + GstPhotographyColorToneMode tone_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1472,40 +1518,40 @@ gst_ahc_src_set_colour_tone_mode (GstPhotography * photo, const gchar *color_effect = NULL; switch (tone_mode) { - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NORMAL: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_NORMAL: color_effect = Parameters_EFFECT_NONE; break; - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SEPIA: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_SEPIA: color_effect = Parameters_EFFECT_SEPIA; break; - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NEGATIVE: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_NEGATIVE: color_effect = Parameters_EFFECT_NEGATIVE; break; - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_GRAYSCALE: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_GRAYSCALE: color_effect = Parameters_EFFECT_MONO; break; - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SOLARIZE: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_SOLARIZE: color_effect = Parameters_EFFECT_SOLARIZE; break; - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_POSTERIZE: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_POSTERIZE: color_effect = Parameters_EFFECT_POSTERIZE; break; - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_WHITEBOARD: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_WHITEBOARD: color_effect = Parameters_EFFECT_WHITEBOARD; break; - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_BLACKBOARD: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_BLACKBOARD: color_effect = Parameters_EFFECT_BLACKBOARD; break; - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_AQUA: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_AQUA: color_effect = Parameters_EFFECT_AQUA; break; - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NATURAL: - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_VIVID: - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_COLORSWAP: - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_OUT_OF_FOCUS: - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SKY_BLUE: - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_GRASS_GREEN: - case GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SKIN_WHITEN: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_NATURAL: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_VIVID: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_COLORSWAP: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_OUT_OF_FOCUS: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_SKY_BLUE: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_GRASS_GREEN: + case GST_PHOTOGRAPHY_COLOR_TONE_MODE_SKIN_WHITEN: default: color_effect = NULL; break; @@ -1523,7 +1569,8 @@ gst_ahc_src_set_colour_tone_mode (GstPhotography * photo, } static gboolean -gst_ahc_src_set_scene_mode (GstPhotography * photo, GstSceneMode scene_mode) +gst_ahc_src_set_scene_mode (GstPhotography * photo, + GstPhotographySceneMode scene_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1603,7 +1650,8 @@ gst_ahc_src_set_scene_mode (GstPhotography * photo, GstSceneMode scene_mode) } static gboolean -gst_ahc_src_set_flash_mode (GstPhotography * photo, GstFlashMode flash_mode) +gst_ahc_src_set_flash_mode (GstPhotography * photo, + GstPhotographyFlashMode flash_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1696,7 +1744,7 @@ gst_ahc_src_set_zoom (GstPhotography * photo, gfloat zoom) static gboolean gst_ahc_src_set_flicker_mode (GstPhotography * photo, - GstFlickerReductionMode flicker_mode) + GstPhotographyFlickerReductionMode flicker_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1738,7 +1786,8 @@ gst_ahc_src_set_flicker_mode (GstPhotography * photo, } static gboolean -gst_ahc_src_set_focus_mode (GstPhotography * photo, GstFocusMode focus_mode) +gst_ahc_src_set_focus_mode (GstPhotography * photo, + GstPhotographyFocusMode focus_mode) { GstAHCSrc *self = GST_AHC_SRC (photo); gboolean ret = FALSE; @@ -1789,12 +1838,12 @@ gst_ahc_src_set_focus_mode (GstPhotography * photo, GstFocusMode focus_mode) return ret; } -static GstPhotoCaps +static GstPhotographyCaps gst_ahc_src_get_capabilities (GstPhotography * photo) { GstAHCSrc *self = GST_AHC_SRC (photo); - GstPhotoCaps caps = GST_PHOTOGRAPHY_CAPS_EV_COMP | + GstPhotographyCaps caps = GST_PHOTOGRAPHY_CAPS_EV_COMP | GST_PHOTOGRAPHY_CAPS_WB_MODE | GST_PHOTOGRAPHY_CAPS_TONE | GST_PHOTOGRAPHY_CAPS_SCENE | GST_PHOTOGRAPHY_CAPS_FLASH | GST_PHOTOGRAPHY_CAPS_FOCUS | GST_PHOTOGRAPHY_CAPS_ZOOM; @@ -1820,7 +1869,7 @@ gst_ahc_src_on_auto_focus (gboolean success, gpointer user_data) GST_WARNING_OBJECT (self, "Auto focus completed : %d", success); gst_element_post_message (GST_ELEMENT (self), gst_message_new_custom (GST_MESSAGE_ELEMENT, GST_OBJECT (self), - gst_structure_new (GST_PHOTOGRAPHY_AUTOFOCUS_DONE, NULL))); + gst_structure_new_empty (GST_PHOTOGRAPHY_AUTOFOCUS_DONE))); } static void @@ -1837,31 +1886,6 @@ gst_ahc_src_set_autofocus (GstPhotography * photo, gboolean on) } -static void -gst_ahc_src_photography_interface_init (GstPhotographyInterface * iface) -{ - iface->get_ev_compensation = gst_ahc_src_get_ev_compensation; - iface->get_white_balance_mode = gst_ahc_src_get_white_balance_mode; - iface->get_colour_tone_mode = gst_ahc_src_get_colour_tone_mode; - iface->get_scene_mode = gst_ahc_src_get_scene_mode; - iface->get_flash_mode = gst_ahc_src_get_flash_mode; - iface->get_zoom = gst_ahc_src_get_zoom; - iface->get_flicker_mode = gst_ahc_src_get_flicker_mode; - iface->get_focus_mode = gst_ahc_src_get_focus_mode; - - iface->set_ev_compensation = gst_ahc_src_set_ev_compensation; - iface->set_white_balance_mode = gst_ahc_src_set_white_balance_mode; - iface->set_colour_tone_mode = gst_ahc_src_set_colour_tone_mode; - iface->set_scene_mode = gst_ahc_src_set_scene_mode; - iface->set_flash_mode = gst_ahc_src_set_flash_mode; - iface->set_zoom = gst_ahc_src_set_zoom; - iface->set_flicker_mode = gst_ahc_src_set_flicker_mode; - iface->set_focus_mode = gst_ahc_src_set_focus_mode; - - iface->get_capabilities = gst_ahc_src_get_capabilities; - iface->set_autofocus = gst_ahc_src_set_autofocus; -} - static gint _compare_formats (int f1, int f2) { @@ -1900,7 +1924,7 @@ _compare_ranges (int *r1, int *r2) } static GstCaps * -gst_ahc_src_getcaps (GstBaseSrc * src) +gst_ahc_src_getcaps (GstBaseSrc * src, GstCaps * filter) { GstAHCSrc *self = GST_AHC_SRC (src); @@ -1924,6 +1948,7 @@ gst_ahc_src_getcaps (GstBaseSrc * src) for (i = formats; i; i = i->next) { int f = GPOINTER_TO_INT (i->data); + gchar *format_string = NULL; GstStructure *format = NULL; /* Ignore duplicates */ @@ -1933,36 +1958,31 @@ gst_ahc_src_getcaps (GstBaseSrc * src) /* Can't use switch/case because the values are not constants */ if (f == ImageFormat_NV16) { GST_DEBUG_OBJECT (self, " NV16 (%d)", f); - format = gst_structure_new ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('N', 'V', '1', '6'), - NULL); + format_string = g_strdup ("NV16"); } else if (f == ImageFormat_NV21) { GST_DEBUG_OBJECT (self, " NV21 (%d)", f); - format = gst_structure_new ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('N', 'V', '2', '1'), - NULL); + format_string = g_strdup ("NV21"); } else if (f == ImageFormat_RGB_565) { + GstVideoFormat vformat; + vformat = gst_video_format_from_masks (16, 16, G_LITTLE_ENDIAN, + 0xf800, 0x07e0, 0x001f, 0x0); GST_DEBUG_OBJECT (self, " RGB565 (%d)", f); - format = gst_structure_new ("video/x-raw-rgb", - "bpp", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, - "red_mask", G_TYPE_INT, 0xf800, - "green_mask", G_TYPE_INT, 0x07e0, - "blue_mask", G_TYPE_INT, 0x001f, - "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, NULL); + format_string = g_strdup (gst_video_format_to_string (vformat)); } else if (f == ImageFormat_YUY2) { GST_DEBUG_OBJECT (self, " YUY2 (%d)", f); - format = gst_structure_new ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'), - NULL); + format_string = g_strdup ("YUY2"); } else if (f == ImageFormat_YV12) { GST_DEBUG_OBJECT (self, " YV12 (%d)", f); - format = gst_structure_new ("video/x-raw-yuv", - "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('Y', 'V', '1', '2'), - NULL); + format_string = g_strdup ("YV12"); } previous_format = f; + if (format_string) { + format = gst_structure_new ("video/x-raw", + "format", G_TYPE_STRING, format_string, NULL); + g_free (format_string); + } + if (format) { for (j = sizes; j; j = j->next) { GstAHCSize *s = j->data; @@ -2018,7 +2038,7 @@ gst_ahc_src_getcaps (GstBaseSrc * src) } } -static void +static GstCaps * gst_ahc_src_fixate (GstBaseSrc * src, GstCaps * caps) { GstAHCSrc *self = GST_AHC_SRC (src); @@ -2026,12 +2046,18 @@ gst_ahc_src_fixate (GstBaseSrc * src, GstCaps * caps) GST_DEBUG_OBJECT (self, "Fixating : %" GST_PTR_FORMAT, caps); + caps = gst_caps_make_writable (caps); + /* Width/height will be fixed already here, format will * be left for fixation by the default handler. * We only have to fixate framerate here, to the * highest possible framerate. */ gst_structure_fixate_field_nearest_fraction (s, "framerate", G_MAXINT, 1); + + caps = GST_BASE_SRC_CLASS (parent_class)->fixate (src, caps); + + return caps; } static gboolean @@ -2048,17 +2074,23 @@ gst_ahc_src_setcaps (GstBaseSrc * src, GstCaps * caps) params = gst_ah_camera_get_parameters (self->camera); if (params) { + GstStructure *s; + const gchar *format_str = NULL; GstVideoFormat format; gint fmt; gint width, height, fps_n, fps_d, buffer_size; GList *ranges, *l; gint range_size = G_MAXINT; - if (!gst_video_format_parse_caps (caps, &format, &width, &height) || - !gst_video_parse_caps_framerate (caps, &fps_n, &fps_d)) { - GST_WARNING_OBJECT (self, "unable to parse video caps"); - goto end; - } + s = gst_caps_get_structure (caps, 0); + + format_str = gst_structure_get_string (s, "format"); + format = gst_video_format_from_string (format_str); + + gst_structure_get_int (s, "width", &width); + gst_structure_get_int (s, "height", &height); + gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d); + fps_n *= 1000 / fps_d; /* Select the best range that contains our framerate. @@ -2110,7 +2142,7 @@ gst_ahc_src_setcaps (GstBaseSrc * src, GstCaps * caps) } if (fmt == ImageFormat_UNKNOWN) { - GST_WARNING_OBJECT (self, "unsupported video format"); + GST_WARNING_OBJECT (self, "unsupported video format (%s)", format_str); goto end; } @@ -2132,8 +2164,9 @@ gst_ahc_src_setcaps (GstBaseSrc * src, GstCaps * caps) self->format = fmt; buffer_size = width * height * ((double) gst_ag_imageformat_get_bits_per_pixel (fmt) / 8); + if (buffer_size > self->buffer_size) { - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); gint i; for (i = 0; i < NUM_CALLBACK_BUFFERS; i++) { @@ -2146,6 +2179,10 @@ gst_ahc_src_setcaps (GstBaseSrc * src, GstCaps * caps) } } self->buffer_size = buffer_size; + + GST_DEBUG_OBJECT (self, "setting buffer w:%d h:%d buffer_size: %d", + self->width, self->height, self->buffer_size); + ret = TRUE; } @@ -2180,20 +2217,29 @@ gst_ahc_src_buffer_free_func (gpointer priv) { FreeFuncBuffer *data = (FreeFuncBuffer *) priv; GstAHCSrc *self = data->self; - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); + + g_mutex_lock (&self->mutex); + + GST_DEBUG_OBJECT (self, "release %p->%p", data, data->array); (*env)->ReleaseByteArrayElements (env, data->array, data->data, JNI_ABORT); if (self->camera) gst_ah_camera_add_callback_buffer (self->camera, data->array); + (*env)->DeleteGlobalRef (env, data->array); - gst_object_unref (self); g_slice_free (FreeFuncBuffer, data); + + g_mutex_unlock (&self->mutex); + gst_object_unref (self); } static void _data_queue_item_free (GstDataQueueItem * item) { + GST_DEBUG ("release %p", item->object); + gst_buffer_unref (GST_BUFFER (item->object)); g_slice_free (GstDataQueueItem, item); } @@ -2202,7 +2248,7 @@ static void gst_ahc_src_on_preview_frame (jbyteArray array, gpointer user_data) { GstAHCSrc *self = GST_AHC_SRC (user_data); - JNIEnv *env = gst_dvm_get_env (); + JNIEnv *env = gst_amc_jni_get_env (); GstBuffer *buffer; GstDataQueueItem *item = NULL; FreeFuncBuffer *malloc_data = NULL; @@ -2210,9 +2256,12 @@ gst_ahc_src_on_preview_frame (jbyteArray array, gpointer user_data) GstClockTime duration = 0; GstClock *clock; + + g_mutex_lock (&self->mutex); + if (array == NULL) { GST_DEBUG_OBJECT (self, "Size of array in queue is too small, dropping it"); - return; + goto done; } if ((clock = GST_ELEMENT_CLOCK (self))) { @@ -2230,37 +2279,50 @@ gst_ahc_src_on_preview_frame (jbyteArray array, gpointer user_data) /* Drop the first buffer */ self->previous_ts = current_ts; gst_ah_camera_add_callback_buffer (self->camera, array); - return; + GST_DEBUG_OBJECT (self, "dropping the first buffer"); + goto done; } } else { + GST_DEBUG_OBJECT (self, "element clock hasn't created yet."); gst_ah_camera_add_callback_buffer (self->camera, array); - return; + goto done; } - //GST_WARNING_OBJECT (self, "Received data buffer %p", data); + + GST_DEBUG_OBJECT (self, "Received data buffer %p", array); + malloc_data = g_slice_new0 (FreeFuncBuffer); malloc_data->self = gst_object_ref (self); malloc_data->array = (*env)->NewGlobalRef (env, array); malloc_data->data = (*env)->GetByteArrayElements (env, array, NULL); - buffer = gst_buffer_new (); - GST_BUFFER_DATA (buffer) = (guint8 *) malloc_data->data; - GST_BUFFER_SIZE (buffer) = self->buffer_size; - GST_BUFFER_MALLOCDATA (buffer) = (gpointer) malloc_data; - GST_BUFFER_FREE_FUNC (buffer) = gst_ahc_src_buffer_free_func; + buffer = + gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, malloc_data->data, + self->buffer_size, 0, self->buffer_size, malloc_data, + gst_ahc_src_buffer_free_func); GST_BUFFER_DURATION (buffer) = duration; - GST_BUFFER_TIMESTAMP (buffer) = timestamp; + GST_BUFFER_PTS (buffer) = timestamp; + + GST_DEBUG_OBJECT (self, "creating wrapped buffer (size: %d)", + self->buffer_size); item = g_slice_new0 (GstDataQueueItem); item->object = GST_MINI_OBJECT (buffer); - item->size = GST_BUFFER_SIZE (buffer); + item->size = gst_buffer_get_size (buffer); item->duration = GST_BUFFER_DURATION (buffer); item->visible = TRUE; item->destroy = (GDestroyNotify) _data_queue_item_free; + GST_DEBUG_OBJECT (self, "wrapping jni array %p->%p %p->%p", item, + item->object, malloc_data, malloc_data->array); + if (!gst_data_queue_push (self->queue, item)) { + GST_INFO_OBJECT (self, "can't add buffer to queue"); /* Can't add buffer to queue. Must be flushing. */ _data_queue_item_free (item); } + +done: + g_mutex_unlock (&self->mutex); } static void @@ -2408,8 +2470,12 @@ gst_ahc_src_create (GstPushSrc * src, GstBuffer ** buffer) GstAHCSrc *self = GST_AHC_SRC (src); GstDataQueueItem *item; - if (!gst_data_queue_pop (self->queue, &item)) - return GST_FLOW_WRONG_STATE; + if (!gst_data_queue_pop (self->queue, &item)) { + GST_INFO_OBJECT (self, "empty queue"); + return GST_FLOW_FLUSHING; + } + + GST_DEBUG_OBJECT (self, "creating buffer %p->%p", item, item->object); *buffer = GST_BUFFER (item->object); g_slice_free (GstDataQueueItem, item); diff --git a/sys/androidmedia/gstahcsrc.h b/sys/androidmedia/gstahcsrc.h index 005cd36704..fc24989277 100644 --- a/sys/androidmedia/gstahcsrc.h +++ b/sys/androidmedia/gstahcsrc.h @@ -3,6 +3,9 @@ * 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 Library General Public * License as published by the Free Software Foundation; either @@ -68,6 +71,7 @@ struct _GstAHCSrc gint fps_max; gboolean start; gboolean smooth_zoom; + GMutex mutex; /* Properties */ gint device; diff --git a/sys/androidmedia/gstamc.c b/sys/androidmedia/gstamc.c index f333820789..5a72e0e1d5 100644 --- a/sys/androidmedia/gstamc.c +++ b/sys/androidmedia/gstamc.c @@ -29,6 +29,8 @@ #define orc_memcpy memcpy #endif +#include "gstahcsrc.h" + #include "gstamc.h" #include "gstamc-constants.h" @@ -3316,6 +3318,28 @@ plugin_init (GstPlugin * plugin) if (!register_codecs (plugin)) return FALSE; + if (!gst_android_graphics_surfacetexture_init ()) { + GST_ERROR ("Failed to init android surface texture"); + return FALSE; + } + + if (!gst_android_graphics_imageformat_init ()) { + GST_ERROR ("Failed to init android image format"); + gst_android_graphics_surfacetexture_deinit (); + return FALSE; + } + + if (!gst_android_hardware_camera_init ()) { + gst_android_graphics_surfacetexture_deinit (); + gst_android_graphics_imageformat_deinit (); + return FALSE; + } + + if (!gst_element_register (plugin, "ahcsrc", GST_RANK_NONE, GST_TYPE_AHC_SRC)) { + GST_ERROR ("Failed to register android camera source"); + return FALSE; + } + return TRUE; } diff --git a/sys/androidmedia/org/freedesktop/gstreamer/androidmedia/GstAhcCallback.java b/sys/androidmedia/org/freedesktop/gstreamer/androidmedia/GstAhcCallback.java new file mode 100644 index 0000000000..53811a9d33 --- /dev/null +++ b/sys/androidmedia/org/freedesktop/gstreamer/androidmedia/GstAhcCallback.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2012, Collabora Ltd. + * 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 + * + */ + +package org.freedesktop.gstreamer.androidmedia; + +import android.hardware.Camera; + +public class GstAhcCallback implements Camera.PreviewCallback, + Camera.ErrorCallback, + Camera.AutoFocusCallback { + public long mUserData; + public long mCallback; + + public static native void gst_ah_camera_on_preview_frame(byte[] data, Camera camera, + long callback, long user_data); + public static native void gst_ah_camera_on_error(int error, Camera camera, + long callback, long user_data); + public static native void gst_ah_camera_on_auto_focus(boolean success, Camera camera, + long callback, long user_data); + + public GstAhcCallback(long callback, long user_data) { + mCallback = callback; + mUserData = user_data; + } + + @Override + public void onPreviewFrame(byte[] data, Camera camera) { + gst_ah_camera_on_preview_frame(data, camera, mCallback, mUserData); + } + + @Override + public void onError(int error, Camera camera) { + gst_ah_camera_on_error(error, camera, mCallback, mUserData); + } + + @Override + public void onAutoFocus(boolean success, Camera camera) { + gst_ah_camera_on_auto_focus(success, camera, mCallback, mUserData); + } +}