amc: actually use the provided application class loader
[platform/upstream/gst-plugins-bad.git] / sys / androidmedia / gst-android-hardware-camera.c
1 /*
2  * Copyright (C) 2012, Collabora Ltd.
3  * Copyright (C) 2012, Cisco Systems, Inc.
4  *   Author: Youness Alaoui <youness.alaoui@collabora.co.uk>
5  *
6  * Copyright (C) 2015, Collabora Ltd.
7  *   Author: Justin Kim <justin.kim@collabora.com>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation
12  * version 2.1 of the License.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
22  *
23  */
24
25 #ifdef HAVE_CONFIG_H
26 #include "config.h"
27 #endif
28
29 #include "gstjniutils.h"
30
31 #include "gst-android-hardware-camera.h"
32
33 GST_DEBUG_CATEGORY_STATIC (ahc_debug);
34 #define GST_CAT_DEFAULT ahc_debug
35
36 static struct
37 {
38   jclass klass;
39   jmethodID addCallbackBuffer;
40   jmethodID autoFocus;
41   jmethodID cancelAutoFocus;
42   jmethodID getCameraInfo;
43   jmethodID getNumberOfCameras;
44   jmethodID getParameters;
45   jmethodID lock;
46   jmethodID open;
47   jmethodID reconnect;
48   jmethodID release;
49   jmethodID setErrorCallback;
50   jmethodID setParameters;
51   jmethodID setPreviewCallbackWithBuffer;
52   jmethodID setPreviewTexture;
53   jmethodID startPreview;
54   jmethodID startSmoothZoom;
55   jmethodID stopPreview;
56   jmethodID stopSmoothZoom;
57   jmethodID unlock;
58 } android_hardware_camera = {
59 0};
60
61 static struct
62 {
63   jclass klass;
64   jmethodID constructor;
65   jfieldID facing;
66   jfieldID orientation;
67   jint CAMERA_FACING_BACK;
68   jint CAMERA_FACING_FRONT;
69 } android_hardware_camera_camerainfo = {
70 0};
71
72 gint CameraInfo_CAMERA_FACING_BACK;
73 gint CameraInfo_CAMERA_FACING_FRONT;
74
75 static struct
76 {
77   jclass klass;
78   jfieldID width;
79   jfieldID height;
80 } android_hardware_camera_size = {
81 0};
82
83 static struct
84 {
85   jclass klass;
86   jmethodID flatten;
87   jmethodID getAntibanding;
88   jmethodID getColorEffect;
89   jmethodID getExposureCompensation;
90   jmethodID getExposureCompensationStep;
91   jmethodID getFlashMode;
92   jmethodID getFocalLength;
93   jmethodID getFocusMode;
94   jmethodID getHorizontalViewAngle;
95   jmethodID getMaxExposureCompensation;
96   jmethodID getMaxZoom;
97   jmethodID getMinExposureCompensation;
98   jmethodID getPreviewFormat;
99   jmethodID getPreviewFpsRange;
100   jmethodID getPreviewSize;
101   jmethodID getSceneMode;
102   jmethodID getSupportedAntibanding;
103   jmethodID getSupportedColorEffects;
104   jmethodID getSupportedFlashModes;
105   jmethodID getSupportedFocusModes;
106   jmethodID getSupportedPreviewFormats;
107   jmethodID getSupportedPreviewFpsRange;
108   jmethodID getSupportedPreviewSizes;
109   jmethodID getSupportedSceneModes;
110   jmethodID getSupportedWhiteBalance;
111   jmethodID getVerticalViewAngle;
112   jmethodID getVideoStabilization;
113   jmethodID getWhiteBalance;
114   jmethodID getZoom;
115   jmethodID getZoomRatios;
116   jmethodID isSmoothZoomSupported;
117   jmethodID isVideoStabilizationSupported;
118   jmethodID isZoomSupported;
119   jmethodID setAntibanding;
120   jmethodID setColorEffect;
121   jmethodID setExposureCompensation;
122   jmethodID setFlashMode;
123   jmethodID setFocusMode;
124   jmethodID setPreviewFormat;
125   jmethodID setPreviewFpsRange;
126   jmethodID setPreviewSize;
127   jmethodID setSceneMode;
128   jmethodID setVideoStabilization;
129   jmethodID setWhiteBalance;
130   jmethodID setZoom;
131   jmethodID unflatten;
132   jstring WHITE_BALANCE_AUTO;
133   jstring WHITE_BALANCE_INCANDESCENT;
134   jstring WHITE_BALANCE_FLUORESCENT;
135   jstring WHITE_BALANCE_WARM_FLUORESCENT;
136   jstring WHITE_BALANCE_DAYLIGHT;
137   jstring WHITE_BALANCE_CLOUDY_DAYLIGHT;
138   jstring WHITE_BALANCE_TWILIGHT;
139   jstring WHITE_BALANCE_SHADE;
140   jstring EFFECT_NONE;
141   jstring EFFECT_MONO;
142   jstring EFFECT_NEGATIVE;
143   jstring EFFECT_SOLARIZE;
144   jstring EFFECT_SEPIA;
145   jstring EFFECT_POSTERIZE;
146   jstring EFFECT_WHITEBOARD;
147   jstring EFFECT_BLACKBOARD;
148   jstring EFFECT_AQUA;
149   jstring ANTIBANDING_AUTO;
150   jstring ANTIBANDING_50HZ;
151   jstring ANTIBANDING_60HZ;
152   jstring ANTIBANDING_OFF;
153   jstring FLASH_MODE_OFF;
154   jstring FLASH_MODE_AUTO;
155   jstring FLASH_MODE_ON;
156   jstring FLASH_MODE_RED_EYE;
157   jstring FLASH_MODE_TORCH;
158   jstring SCENE_MODE_AUTO;
159   jstring SCENE_MODE_ACTION;
160   jstring SCENE_MODE_PORTRAIT;
161   jstring SCENE_MODE_LANDSCAPE;
162   jstring SCENE_MODE_NIGHT;
163   jstring SCENE_MODE_NIGHT_PORTRAIT;
164   jstring SCENE_MODE_THEATRE;
165   jstring SCENE_MODE_BEACH;
166   jstring SCENE_MODE_SNOW;
167   jstring SCENE_MODE_SUNSET;
168   jstring SCENE_MODE_STEADYPHOTO;
169   jstring SCENE_MODE_FIREWORKS;
170   jstring SCENE_MODE_SPORTS;
171   jstring SCENE_MODE_PARTY;
172   jstring SCENE_MODE_CANDLELIGHT;
173   jstring SCENE_MODE_BARCODE;
174   jstring FOCUS_MODE_AUTO;
175   jstring FOCUS_MODE_INFINITY;
176   jstring FOCUS_MODE_MACRO;
177   jstring FOCUS_MODE_FIXED;
178   jstring FOCUS_MODE_EDOF;
179   jstring FOCUS_MODE_CONTINUOUS_VIDEO;
180   jstring FOCUS_MODE_CONTINUOUS_PICTURE;
181 } android_hardware_camera_parameters = {
182 0};
183
184 const gchar *Parameters_WHITE_BALANCE_AUTO;
185 const gchar *Parameters_WHITE_BALANCE_INCANDESCENT;
186 const gchar *Parameters_WHITE_BALANCE_FLUORESCENT;
187 const gchar *Parameters_WHITE_BALANCE_WARM_FLUORESCENT;
188 const gchar *Parameters_WHITE_BALANCE_DAYLIGHT;
189 const gchar *Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT;
190 const gchar *Parameters_WHITE_BALANCE_TWILIGHT;
191 const gchar *Parameters_WHITE_BALANCE_SHADE;
192 const gchar *Parameters_EFFECT_NONE;
193 const gchar *Parameters_EFFECT_MONO;
194 const gchar *Parameters_EFFECT_NEGATIVE;
195 const gchar *Parameters_EFFECT_SOLARIZE;
196 const gchar *Parameters_EFFECT_SEPIA;
197 const gchar *Parameters_EFFECT_POSTERIZE;
198 const gchar *Parameters_EFFECT_WHITEBOARD;
199 const gchar *Parameters_EFFECT_BLACKBOARD;
200 const gchar *Parameters_EFFECT_AQUA;
201 const gchar *Parameters_ANTIBANDING_AUTO;
202 const gchar *Parameters_ANTIBANDING_50HZ;
203 const gchar *Parameters_ANTIBANDING_60HZ;
204 const gchar *Parameters_ANTIBANDING_OFF;
205 const gchar *Parameters_FLASH_MODE_OFF;
206 const gchar *Parameters_FLASH_MODE_AUTO;
207 const gchar *Parameters_FLASH_MODE_ON;
208 const gchar *Parameters_FLASH_MODE_RED_EYE;
209 const gchar *Parameters_FLASH_MODE_TORCH;
210 const gchar *Parameters_SCENE_MODE_AUTO;
211 const gchar *Parameters_SCENE_MODE_ACTION;
212 const gchar *Parameters_SCENE_MODE_PORTRAIT;
213 const gchar *Parameters_SCENE_MODE_LANDSCAPE;
214 const gchar *Parameters_SCENE_MODE_NIGHT;
215 const gchar *Parameters_SCENE_MODE_NIGHT_PORTRAIT;
216 const gchar *Parameters_SCENE_MODE_THEATRE;
217 const gchar *Parameters_SCENE_MODE_BEACH;
218 const gchar *Parameters_SCENE_MODE_SNOW;
219 const gchar *Parameters_SCENE_MODE_SUNSET;
220 const gchar *Parameters_SCENE_MODE_STEADYPHOTO;
221 const gchar *Parameters_SCENE_MODE_FIREWORKS;
222 const gchar *Parameters_SCENE_MODE_SPORTS;
223 const gchar *Parameters_SCENE_MODE_PARTY;
224 const gchar *Parameters_SCENE_MODE_CANDLELIGHT;
225 const gchar *Parameters_SCENE_MODE_BARCODE;
226 const gchar *Parameters_FOCUS_MODE_AUTO;
227 const gchar *Parameters_FOCUS_MODE_INFINITY;
228 const gchar *Parameters_FOCUS_MODE_MACRO;
229 const gchar *Parameters_FOCUS_MODE_FIXED;
230 const gchar *Parameters_FOCUS_MODE_EDOF;
231 const gchar *Parameters_FOCUS_MODE_CONTINUOUS_VIDEO;
232 const gchar *Parameters_FOCUS_MODE_CONTINUOUS_PICTURE;
233
234 static struct
235 {
236   jclass klass;
237   jmethodID iterator;
238 } java_util_list = {
239 0};
240
241 static struct
242 {
243   jclass klass;
244   jmethodID hasNext;
245   jmethodID next;
246 } java_util_iterator = {
247 0};
248
249 static struct
250 {
251   jclass klass;
252   jmethodID intValue;
253 } java_lang_integer = {
254 0};
255
256 static struct
257 {
258   jclass klass;
259   jmethodID equals;
260 } java_lang_string = {
261 0};
262
263 static struct
264 {
265   jclass klass;
266   jmethodID constructor;
267 } org_freedesktop_gstreamer_androidmedia_gstahccallback = {
268 0};
269
270 static void
271 gst_ah_camera_on_preview_frame (JNIEnv * env, jclass klass, jbyteArray data,
272     jobject camera, jlong callback, jlong user_data)
273 {
274   GstAHCPreviewCallback cb = (GstAHCPreviewCallback) (gsize) callback;
275
276   if (cb)
277     cb (data, (gpointer) (gsize) user_data);
278 }
279
280 static void
281 gst_ah_camera_on_error (JNIEnv * env, jclass klass, jint error,
282     jobject camera, jlong callback, jlong user_data)
283 {
284   GstAHCErrorCallback cb = (GstAHCErrorCallback) (gsize) callback;
285
286   if (cb)
287     cb (error, (gpointer) (gsize) user_data);
288 }
289
290 static void
291 gst_ah_camera_on_auto_focus (JNIEnv * env, jclass klass, jboolean success,
292     jobject camera, jlong callback, jlong user_data)
293 {
294   GstAHCAutoFocusCallback cb = (GstAHCAutoFocusCallback) (gsize) callback;
295
296   if (cb)
297     cb (success, (gpointer) (gsize) user_data);
298 }
299
300 static JNINativeMethod native_methods[] = {
301   {(gchar *) "gst_ah_camera_on_preview_frame",
302         (gchar *) "([BLandroid/hardware/Camera;JJ)V",
303       (void *) gst_ah_camera_on_preview_frame},
304   {(gchar *) "gst_ah_camera_on_error",
305         (gchar *) "(ILandroid/hardware/Camera;JJ)V",
306       (void *) gst_ah_camera_on_error},
307 //  {(gchar *) "gst_ah_camera_on_auto_focus",
308 //        (gchar *) "(ZLandroid/hardware/Camera;JJ)V",
309 //      (void *) gst_ah_camera_on_auto_focus}
310 };
311
312 static gboolean
313 _init_classes (void)
314 {
315   JNIEnv *env;
316   GError *err = NULL;
317
318   jclass klass;
319   jfieldID fieldID;
320
321   env = gst_amc_jni_get_env ();
322
323   /* android.hardware.Camera */
324   klass = android_hardware_camera.klass =
325       gst_amc_jni_get_class (env, &err, "android/hardware/Camera");
326   if (!klass)
327     goto failed;
328
329   android_hardware_camera.addCallbackBuffer =
330       gst_amc_jni_get_method_id (env, &err, klass,
331       "addCallbackBuffer", "([B)V");
332
333   android_hardware_camera.autoFocus =
334       gst_amc_jni_get_method_id (env, &err, klass,
335       "autoFocus", "(Landroid/hardware/Camera$AutoFocusCallback;)V");
336
337   android_hardware_camera.cancelAutoFocus =
338       gst_amc_jni_get_method_id (env, &err, klass, "cancelAutoFocus", "()V");
339
340   android_hardware_camera.getCameraInfo =
341       gst_amc_jni_get_static_method_id (env, &err, klass,
342       "getCameraInfo", "(ILandroid/hardware/Camera$CameraInfo;)V");
343
344   android_hardware_camera.getNumberOfCameras =
345       gst_amc_jni_get_static_method_id (env, &err, klass,
346       "getNumberOfCameras", "()I");
347
348   android_hardware_camera.getParameters =
349       gst_amc_jni_get_method_id (env, &err, klass,
350       "getParameters", "()Landroid/hardware/Camera$Parameters;");
351
352   android_hardware_camera.lock =
353       gst_amc_jni_get_method_id (env, &err, klass, "lock", "()V");
354
355   android_hardware_camera.open =
356       gst_amc_jni_get_static_method_id (env, &err, klass,
357       "open", "(I)Landroid/hardware/Camera;");
358
359   android_hardware_camera.reconnect =
360       gst_amc_jni_get_method_id (env, &err, klass, "reconnect", "()V");
361
362   android_hardware_camera.release =
363       gst_amc_jni_get_method_id (env, &err, klass, "release", "()V");
364
365   android_hardware_camera.setErrorCallback =
366       gst_amc_jni_get_method_id (env, &err, klass, "setErrorCallback",
367       "(Landroid/hardware/Camera$ErrorCallback;)V");
368
369   android_hardware_camera.setParameters =
370       gst_amc_jni_get_method_id (env, &err, klass, "setParameters",
371       "(Landroid/hardware/Camera$Parameters;)V");
372
373   android_hardware_camera.setPreviewCallbackWithBuffer =
374       gst_amc_jni_get_method_id (env, &err, klass,
375       "setPreviewCallbackWithBuffer",
376       "(Landroid/hardware/Camera$PreviewCallback;)V");
377
378   android_hardware_camera.setPreviewTexture =
379       gst_amc_jni_get_method_id (env, &err, klass,
380       "setPreviewTexture", "(Landroid/graphics/SurfaceTexture;)V");
381
382   android_hardware_camera.startPreview =
383       gst_amc_jni_get_method_id (env, &err, klass, "startPreview", "()V");
384
385   android_hardware_camera.startSmoothZoom =
386       gst_amc_jni_get_method_id (env, &err, klass, "startSmoothZoom", "(I)V");
387
388   android_hardware_camera.stopPreview =
389       gst_amc_jni_get_method_id (env, &err, klass, "stopPreview", "()V");
390
391   android_hardware_camera.stopPreview =
392       gst_amc_jni_get_method_id (env, &err, klass, "stopPreview", "()V");
393
394   android_hardware_camera.unlock =
395       gst_amc_jni_get_method_id (env, &err, klass, "unlock", "()V");
396
397   /* android.hardware.Camera.CameraInfo */
398   klass = android_hardware_camera_camerainfo.klass =
399       gst_amc_jni_get_class (env, &err, "android/hardware/Camera$CameraInfo");
400   if (!klass)
401     goto failed;
402
403   android_hardware_camera_camerainfo.constructor =
404       gst_amc_jni_get_method_id (env, &err, klass, "<init>", "()V");
405
406   android_hardware_camera_camerainfo.facing =
407       gst_amc_jni_get_field_id (env, &err, klass, "facing", "I");
408
409   android_hardware_camera_camerainfo.orientation =
410       gst_amc_jni_get_field_id (env, &err, klass, "orientation", "I");
411
412
413   fieldID =
414       gst_amc_jni_get_static_field_id (env, &err, klass, "CAMERA_FACING_BACK",
415       "I");
416   if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID,
417           &android_hardware_camera_camerainfo.CAMERA_FACING_BACK))
418     goto failed;
419   CameraInfo_CAMERA_FACING_BACK =
420       android_hardware_camera_camerainfo.CAMERA_FACING_BACK;
421
422   fieldID =
423       gst_amc_jni_get_static_field_id (env, &err, klass, "CAMERA_FACING_FRONT",
424       "I");
425   if (!gst_amc_jni_get_static_int_field (env, &err, klass, fieldID,
426           &android_hardware_camera_camerainfo.CAMERA_FACING_FRONT))
427     goto failed;
428   CameraInfo_CAMERA_FACING_FRONT =
429       android_hardware_camera_camerainfo.CAMERA_FACING_FRONT;
430
431   /* android.hardware.Camera.Size */
432   klass = android_hardware_camera_size.klass =
433       gst_amc_jni_get_class (env, &err, "android/hardware/Camera$Size");
434   if (!klass)
435     goto failed;
436
437   android_hardware_camera_size.width =
438       gst_amc_jni_get_field_id (env, &err, klass, "width", "I");
439   android_hardware_camera_size.height =
440       gst_amc_jni_get_field_id (env, &err, klass, "height", "I");
441
442   /* android.hardware.Camera.Parameters */
443   klass = android_hardware_camera_parameters.klass =
444       gst_amc_jni_get_class (env, &err, "android/hardware/Camera$Parameters");
445   if (!klass)
446     goto failed;
447
448   android_hardware_camera_parameters.flatten =
449       gst_amc_jni_get_method_id (env, &err, klass, "flatten",
450       "()Ljava/lang/String;");
451
452   android_hardware_camera_parameters.getAntibanding =
453       gst_amc_jni_get_method_id (env, &err, klass, "getAntibanding",
454       "()Ljava/lang/String;");
455
456   android_hardware_camera_parameters.getColorEffect =
457       gst_amc_jni_get_method_id (env, &err, klass, "getColorEffect",
458       "()Ljava/lang/String;");
459
460   android_hardware_camera_parameters.getExposureCompensation =
461       gst_amc_jni_get_method_id (env, &err, klass, "getExposureCompensation",
462       "()I");
463
464   android_hardware_camera_parameters.getExposureCompensationStep =
465       gst_amc_jni_get_method_id (env, &err, klass,
466       "getExposureCompensationStep", "()F");
467
468   android_hardware_camera_parameters.getFlashMode =
469       gst_amc_jni_get_method_id (env, &err, klass, "getFlashMode",
470       "()Ljava/lang/String;");
471
472   android_hardware_camera_parameters.getFocalLength =
473       gst_amc_jni_get_method_id (env, &err, klass, "getFocalLength", "()F");
474
475   android_hardware_camera_parameters.getFocusMode =
476       gst_amc_jni_get_method_id (env, &err, klass, "getFocusMode",
477       "()Ljava/lang/String;");
478
479   android_hardware_camera_parameters.getHorizontalViewAngle =
480       gst_amc_jni_get_method_id (env, &err, klass, "getHorizontalViewAngle",
481       "()F");
482
483   android_hardware_camera_parameters.getMaxExposureCompensation =
484       gst_amc_jni_get_method_id (env, &err, klass, "getMaxExposureCompensation",
485       "()I");
486
487   android_hardware_camera_parameters.getMaxZoom =
488       gst_amc_jni_get_method_id (env, &err, klass, "getMaxZoom", "()I");
489
490   android_hardware_camera_parameters.getMinExposureCompensation =
491       gst_amc_jni_get_method_id (env, &err, klass, "getMinExposureCompensation",
492       "()I");
493
494   android_hardware_camera_parameters.getPreviewFormat =
495       gst_amc_jni_get_method_id (env, &err, klass, "getPreviewFormat", "()I");
496
497   android_hardware_camera_parameters.getPreviewFpsRange =
498       gst_amc_jni_get_method_id (env, &err, klass, "getPreviewFpsRange",
499       "([I)V");
500
501   android_hardware_camera_parameters.getPreviewSize =
502       gst_amc_jni_get_method_id (env, &err, klass, "getPreviewSize",
503       "()Landroid/hardware/Camera$Size;");
504
505   android_hardware_camera_parameters.getSceneMode =
506       gst_amc_jni_get_method_id (env, &err, klass, "getSceneMode",
507       "()Ljava/lang/String;");
508
509   android_hardware_camera_parameters.getSupportedAntibanding =
510       gst_amc_jni_get_method_id (env, &err, klass, "getSupportedAntibanding",
511       "()Ljava/util/List;");
512
513   android_hardware_camera_parameters.getSupportedColorEffects =
514       gst_amc_jni_get_method_id (env, &err, klass, "getSupportedColorEffects",
515       "()Ljava/util/List;");
516
517   android_hardware_camera_parameters.getSupportedFlashModes =
518       gst_amc_jni_get_method_id (env, &err, klass, "getSupportedFlashModes",
519       "()Ljava/util/List;");
520
521   android_hardware_camera_parameters.getSupportedFocusModes =
522       gst_amc_jni_get_method_id (env, &err, klass, "getSupportedFocusModes",
523       "()Ljava/util/List;");
524
525   android_hardware_camera_parameters.getSupportedPreviewFormats =
526       gst_amc_jni_get_method_id (env, &err, klass, "getSupportedPreviewFormats",
527       "()Ljava/util/List;");
528
529   android_hardware_camera_parameters.getSupportedPreviewFpsRange =
530       gst_amc_jni_get_method_id (env, &err, klass,
531       "getSupportedPreviewFpsRange", "()Ljava/util/List;");
532
533   android_hardware_camera_parameters.getSupportedPreviewSizes =
534       gst_amc_jni_get_method_id (env, &err, klass, "getSupportedPreviewSizes",
535       "()Ljava/util/List;");
536
537   android_hardware_camera_parameters.getSupportedSceneModes =
538       gst_amc_jni_get_method_id (env, &err, klass, "getSupportedSceneModes",
539       "()Ljava/util/List;");
540
541   android_hardware_camera_parameters.getSupportedWhiteBalance =
542       gst_amc_jni_get_method_id (env, &err, klass, "getSupportedWhiteBalance",
543       "()Ljava/util/List;");
544
545   android_hardware_camera_parameters.getVerticalViewAngle =
546       gst_amc_jni_get_method_id (env, &err, klass, "getVerticalViewAngle",
547       "()F");
548
549   android_hardware_camera_parameters.getVideoStabilization =
550       gst_amc_jni_get_method_id (env, &err, klass, "getVideoStabilization",
551       "()Z");
552
553   android_hardware_camera_parameters.getWhiteBalance =
554       gst_amc_jni_get_method_id (env, &err, klass, "getWhiteBalance",
555       "()Ljava/lang/String;");
556
557   android_hardware_camera_parameters.getZoom =
558       gst_amc_jni_get_method_id (env, &err, klass, "getZoom", "()I");
559
560   android_hardware_camera_parameters.getZoomRatios =
561       gst_amc_jni_get_method_id (env, &err, klass, "getZoomRatios",
562       "()Ljava/util/List;");
563
564   android_hardware_camera_parameters.isSmoothZoomSupported =
565       gst_amc_jni_get_method_id (env, &err, klass, "isSmoothZoomSupported",
566       "()Z");
567
568   android_hardware_camera_parameters.isVideoStabilizationSupported =
569       gst_amc_jni_get_method_id (env, &err, klass,
570       "isVideoStabilizationSupported", "()Z");
571
572   android_hardware_camera_parameters.isZoomSupported =
573       gst_amc_jni_get_method_id (env, &err, klass, "isZoomSupported", "()Z");
574
575   android_hardware_camera_parameters.setAntibanding =
576       gst_amc_jni_get_method_id (env, &err, klass, "setAntibanding",
577       "(Ljava/lang/String;)V");
578
579   android_hardware_camera_parameters.setColorEffect =
580       gst_amc_jni_get_method_id (env, &err, klass, "setColorEffect",
581       "(Ljava/lang/String;)V");
582
583   android_hardware_camera_parameters.setExposureCompensation =
584       gst_amc_jni_get_method_id (env, &err, klass, "setExposureCompensation",
585       "(I)V");
586
587   android_hardware_camera_parameters.setFlashMode =
588       gst_amc_jni_get_method_id (env, &err, klass, "setFlashMode",
589       "(Ljava/lang/String;)V");
590
591   android_hardware_camera_parameters.setFocusMode =
592       gst_amc_jni_get_method_id (env, &err, klass, "setFocusMode",
593       "(Ljava/lang/String;)V");
594
595   android_hardware_camera_parameters.setPreviewFormat =
596       gst_amc_jni_get_method_id (env, &err, klass, "setPreviewFormat", "(I)V");
597
598   android_hardware_camera_parameters.setPreviewFpsRange =
599       gst_amc_jni_get_method_id (env, &err, klass, "setPreviewFpsRange",
600       "(II)V");
601
602   android_hardware_camera_parameters.setPreviewSize =
603       gst_amc_jni_get_method_id (env, &err, klass, "setPreviewSize", "(II)V");
604
605   android_hardware_camera_parameters.setSceneMode =
606       gst_amc_jni_get_method_id (env, &err, klass, "setSceneMode",
607       "(Ljava/lang/String;)V");
608
609   android_hardware_camera_parameters.setWhiteBalance =
610       gst_amc_jni_get_method_id (env, &err, klass, "setWhiteBalance",
611       "(Ljava/lang/String;)V");
612
613   android_hardware_camera_parameters.setVideoStabilization =
614       gst_amc_jni_get_method_id (env, &err, klass, "setVideoStabilization",
615       "(Z)V");
616
617   android_hardware_camera_parameters.setZoom =
618       gst_amc_jni_get_method_id (env, &err, klass, "setZoom", "(I)V");
619
620   android_hardware_camera_parameters.unflatten =
621       gst_amc_jni_get_method_id (env, &err, klass, "unflatten",
622       "(Ljava/lang/String;)V");
623
624   fieldID =
625       gst_amc_jni_get_static_field_id (env, &err, klass, "WHITE_BALANCE_AUTO",
626       "Ljava/lang/String;");
627   if (!fieldID)
628     goto failed;
629   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
630           &android_hardware_camera_parameters.WHITE_BALANCE_AUTO))
631     goto failed;
632
633   Parameters_WHITE_BALANCE_AUTO =
634       (*env)->GetStringUTFChars (env,
635       android_hardware_camera_parameters.WHITE_BALANCE_AUTO, NULL);
636   {
637     jobject local = android_hardware_camera_parameters.WHITE_BALANCE_AUTO;
638
639     android_hardware_camera_parameters.WHITE_BALANCE_AUTO =
640         gst_amc_jni_object_make_global (env, local);
641   }
642
643   fieldID =
644       gst_amc_jni_get_static_field_id (env, &err, klass,
645       "WHITE_BALANCE_INCANDESCENT", "Ljava/lang/String;");
646   if (!fieldID)
647     goto failed;
648   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
649           &android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT))
650     goto failed;
651
652   Parameters_WHITE_BALANCE_INCANDESCENT =
653       (*env)->GetStringUTFChars (env,
654       android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT, NULL);
655   {
656     jobject local =
657         android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT;
658
659     android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT =
660         gst_amc_jni_object_make_global (env, local);
661   }
662
663   fieldID =
664       gst_amc_jni_get_static_field_id (env, &err, klass,
665       "WHITE_BALANCE_FLUORESCENT", "Ljava/lang/String;");
666   if (!fieldID)
667     goto failed;
668   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
669           &android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT))
670     goto failed;
671
672   Parameters_WHITE_BALANCE_FLUORESCENT =
673       (*env)->GetStringUTFChars (env,
674       android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT, NULL);
675   {
676     jobject local =
677         android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT;
678
679     android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT =
680         gst_amc_jni_object_make_global (env, local);
681   }
682
683   fieldID =
684       gst_amc_jni_get_static_field_id (env, &err, klass,
685       "WHITE_BALANCE_WARM_FLUORESCENT", "Ljava/lang/String;");
686   if (!fieldID)
687     goto failed;
688   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
689           &android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT))
690     goto failed;
691
692   Parameters_WHITE_BALANCE_WARM_FLUORESCENT =
693       (*env)->GetStringUTFChars (env,
694       android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT, NULL);
695   {
696     jobject local =
697         android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT;
698
699     android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT =
700         gst_amc_jni_object_make_global (env, local);
701   }
702
703   fieldID =
704       gst_amc_jni_get_static_field_id (env, &err, klass,
705       "WHITE_BALANCE_DAYLIGHT", "Ljava/lang/String;");
706   if (!fieldID)
707     goto failed;
708   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
709           &android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT))
710     goto failed;
711
712   Parameters_WHITE_BALANCE_DAYLIGHT =
713       (*env)->GetStringUTFChars (env,
714       android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT, NULL);
715   {
716     jobject local = android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT;
717
718     android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT =
719         gst_amc_jni_object_make_global (env, local);
720   }
721
722   fieldID =
723       gst_amc_jni_get_static_field_id (env, &err, klass,
724       "WHITE_BALANCE_CLOUDY_DAYLIGHT", "Ljava/lang/String;");
725   if (!fieldID)
726     goto failed;
727   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
728           &android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT))
729     goto failed;
730   Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT =
731       (*env)->GetStringUTFChars (env,
732       android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT, NULL);
733   {
734     jobject local =
735         android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT;
736
737     android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT =
738         gst_amc_jni_object_make_global (env, local);
739   }
740
741   fieldID =
742       gst_amc_jni_get_static_field_id (env, &err, klass,
743       "WHITE_BALANCE_TWILIGHT", "Ljava/lang/String;");
744   if (!fieldID)
745     goto failed;
746   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
747           &android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT))
748     goto failed;
749   Parameters_WHITE_BALANCE_TWILIGHT =
750       (*env)->GetStringUTFChars (env,
751       android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT, NULL);
752   {
753     jobject local = android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT;
754
755     android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT =
756         gst_amc_jni_object_make_global (env, local);
757   }
758
759   fieldID =
760       gst_amc_jni_get_static_field_id (env, &err, klass, "WHITE_BALANCE_SHADE",
761       "Ljava/lang/String;");
762   if (!fieldID)
763     goto failed;
764   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
765           &android_hardware_camera_parameters.WHITE_BALANCE_SHADE))
766     goto failed;
767
768   Parameters_WHITE_BALANCE_SHADE =
769       (*env)->GetStringUTFChars (env,
770       android_hardware_camera_parameters.WHITE_BALANCE_SHADE, NULL);
771   {
772     jobject local = android_hardware_camera_parameters.WHITE_BALANCE_SHADE;
773
774     android_hardware_camera_parameters.WHITE_BALANCE_SHADE =
775         gst_amc_jni_object_make_global (env, local);
776   }
777
778   fieldID =
779       gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_NONE",
780       "Ljava/lang/String;");
781   if (!fieldID)
782     goto failed;
783   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
784           &android_hardware_camera_parameters.EFFECT_NONE))
785     goto failed;
786
787   Parameters_EFFECT_NONE =
788       (*env)->GetStringUTFChars (env,
789       android_hardware_camera_parameters.EFFECT_NONE, NULL);
790   {
791     jobject local = android_hardware_camera_parameters.EFFECT_NONE;
792
793     android_hardware_camera_parameters.EFFECT_NONE =
794         gst_amc_jni_object_make_global (env, local);
795   }
796
797   fieldID =
798       gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_MONO",
799       "Ljava/lang/String;");
800   if (!fieldID)
801     goto failed;
802   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
803           &android_hardware_camera_parameters.EFFECT_MONO))
804     goto failed;
805
806   Parameters_EFFECT_MONO =
807       (*env)->GetStringUTFChars (env,
808       android_hardware_camera_parameters.EFFECT_MONO, NULL);
809   {
810     jobject local = android_hardware_camera_parameters.EFFECT_MONO;
811
812     android_hardware_camera_parameters.EFFECT_MONO =
813         gst_amc_jni_object_make_global (env, local);
814   }
815
816   fieldID =
817       gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_NEGATIVE",
818       "Ljava/lang/String;");
819   if (!fieldID)
820     goto failed;
821   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
822           &android_hardware_camera_parameters.EFFECT_NEGATIVE))
823     goto failed;
824
825   Parameters_EFFECT_NEGATIVE =
826       (*env)->GetStringUTFChars (env,
827       android_hardware_camera_parameters.EFFECT_NEGATIVE, NULL);
828   {
829     jobject local = android_hardware_camera_parameters.EFFECT_NEGATIVE;
830
831     android_hardware_camera_parameters.EFFECT_NEGATIVE =
832         gst_amc_jni_object_make_global (env, local);
833   }
834
835   fieldID =
836       gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_SOLARIZE",
837       "Ljava/lang/String;");
838   if (!fieldID)
839     goto failed;
840   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
841           &android_hardware_camera_parameters.EFFECT_SOLARIZE))
842     goto failed;
843
844   Parameters_EFFECT_SOLARIZE =
845       (*env)->GetStringUTFChars (env,
846       android_hardware_camera_parameters.EFFECT_SOLARIZE, NULL);
847   {
848     jobject local = android_hardware_camera_parameters.EFFECT_SOLARIZE;
849
850     android_hardware_camera_parameters.EFFECT_SOLARIZE =
851         gst_amc_jni_object_make_global (env, local);
852   }
853
854   fieldID =
855       gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_SEPIA",
856       "Ljava/lang/String;");
857   if (!fieldID)
858     goto failed;
859   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
860           &android_hardware_camera_parameters.EFFECT_SEPIA))
861     goto failed;
862
863   Parameters_EFFECT_SEPIA =
864       (*env)->GetStringUTFChars (env,
865       android_hardware_camera_parameters.EFFECT_SEPIA, NULL);
866   {
867     jobject local = android_hardware_camera_parameters.EFFECT_SEPIA;
868
869     android_hardware_camera_parameters.EFFECT_SEPIA =
870         gst_amc_jni_object_make_global (env, local);
871   }
872
873   fieldID =
874       gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_POSTERIZE",
875       "Ljava/lang/String;");
876   if (!fieldID)
877     goto failed;
878   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
879           &android_hardware_camera_parameters.EFFECT_POSTERIZE))
880     goto failed;
881
882   Parameters_EFFECT_POSTERIZE =
883       (*env)->GetStringUTFChars (env,
884       android_hardware_camera_parameters.EFFECT_POSTERIZE, NULL);
885   {
886     jobject local = android_hardware_camera_parameters.EFFECT_POSTERIZE;
887
888     android_hardware_camera_parameters.EFFECT_POSTERIZE =
889         gst_amc_jni_object_make_global (env, local);
890   }
891
892   fieldID =
893       gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_WHITEBOARD",
894       "Ljava/lang/String;");
895   if (!fieldID)
896     goto failed;
897   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
898           &android_hardware_camera_parameters.EFFECT_WHITEBOARD))
899     goto failed;
900
901   Parameters_EFFECT_WHITEBOARD =
902       (*env)->GetStringUTFChars (env,
903       android_hardware_camera_parameters.EFFECT_WHITEBOARD, NULL);
904   {
905     jobject local = android_hardware_camera_parameters.EFFECT_WHITEBOARD;
906
907     android_hardware_camera_parameters.EFFECT_WHITEBOARD =
908         gst_amc_jni_object_make_global (env, local);
909   }
910
911   fieldID =
912       gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_BLACKBOARD",
913       "Ljava/lang/String;");
914   if (!fieldID)
915     goto failed;
916   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
917           &android_hardware_camera_parameters.EFFECT_BLACKBOARD))
918     goto failed;
919
920   Parameters_EFFECT_BLACKBOARD =
921       (*env)->GetStringUTFChars (env,
922       android_hardware_camera_parameters.EFFECT_BLACKBOARD, NULL);
923   {
924     jobject local = android_hardware_camera_parameters.EFFECT_BLACKBOARD;
925
926     android_hardware_camera_parameters.EFFECT_BLACKBOARD =
927         gst_amc_jni_object_make_global (env, local);
928   }
929
930   fieldID =
931       gst_amc_jni_get_static_field_id (env, &err, klass, "EFFECT_AQUA",
932       "Ljava/lang/String;");
933   if (!fieldID)
934     goto failed;
935   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
936           &android_hardware_camera_parameters.EFFECT_AQUA))
937     goto failed;
938
939   Parameters_EFFECT_AQUA =
940       (*env)->GetStringUTFChars (env,
941       android_hardware_camera_parameters.EFFECT_AQUA, NULL);
942   {
943     jobject local = android_hardware_camera_parameters.EFFECT_AQUA;
944
945     android_hardware_camera_parameters.EFFECT_AQUA =
946         gst_amc_jni_object_make_global (env, local);
947   }
948
949   fieldID =
950       gst_amc_jni_get_static_field_id (env, &err, klass, "ANTIBANDING_AUTO",
951       "Ljava/lang/String;");
952   if (!fieldID)
953     goto failed;
954   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
955           &android_hardware_camera_parameters.ANTIBANDING_AUTO))
956     goto failed;
957
958   Parameters_ANTIBANDING_AUTO =
959       (*env)->GetStringUTFChars (env,
960       android_hardware_camera_parameters.ANTIBANDING_AUTO, NULL);
961   {
962     jobject local = android_hardware_camera_parameters.ANTIBANDING_AUTO;
963
964     android_hardware_camera_parameters.ANTIBANDING_AUTO =
965         gst_amc_jni_object_make_global (env, local);
966   }
967
968   fieldID =
969       gst_amc_jni_get_static_field_id (env, &err, klass, "ANTIBANDING_50HZ",
970       "Ljava/lang/String;");
971   if (!fieldID)
972     goto failed;
973   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
974           &android_hardware_camera_parameters.ANTIBANDING_50HZ))
975     goto failed;
976
977   Parameters_ANTIBANDING_50HZ =
978       (*env)->GetStringUTFChars (env,
979       android_hardware_camera_parameters.ANTIBANDING_50HZ, NULL);
980   {
981     jobject local = android_hardware_camera_parameters.ANTIBANDING_50HZ;
982
983     android_hardware_camera_parameters.ANTIBANDING_50HZ =
984         gst_amc_jni_object_make_global (env, local);
985   }
986
987   fieldID =
988       gst_amc_jni_get_static_field_id (env, &err, klass, "ANTIBANDING_60HZ",
989       "Ljava/lang/String;");
990   if (!fieldID)
991     goto failed;
992   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
993           &android_hardware_camera_parameters.ANTIBANDING_60HZ))
994     goto failed;
995
996   Parameters_ANTIBANDING_60HZ =
997       (*env)->GetStringUTFChars (env,
998       android_hardware_camera_parameters.ANTIBANDING_60HZ, NULL);
999   {
1000     jobject local = android_hardware_camera_parameters.ANTIBANDING_60HZ;
1001
1002     android_hardware_camera_parameters.ANTIBANDING_60HZ =
1003         gst_amc_jni_object_make_global (env, local);
1004   }
1005
1006   fieldID =
1007       gst_amc_jni_get_static_field_id (env, &err, klass, "ANTIBANDING_OFF",
1008       "Ljava/lang/String;");
1009   if (!fieldID)
1010     goto failed;
1011   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1012           &android_hardware_camera_parameters.ANTIBANDING_OFF))
1013     goto failed;
1014
1015   Parameters_ANTIBANDING_OFF =
1016       (*env)->GetStringUTFChars (env,
1017       android_hardware_camera_parameters.ANTIBANDING_OFF, NULL);
1018   {
1019     jobject local = android_hardware_camera_parameters.ANTIBANDING_OFF;
1020
1021     android_hardware_camera_parameters.ANTIBANDING_OFF =
1022         gst_amc_jni_object_make_global (env, local);
1023   }
1024
1025   fieldID =
1026       gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_OFF",
1027       "Ljava/lang/String;");
1028   if (!fieldID)
1029     goto failed;
1030   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1031           &android_hardware_camera_parameters.FLASH_MODE_OFF))
1032     goto failed;
1033
1034   Parameters_FLASH_MODE_OFF =
1035       (*env)->GetStringUTFChars (env,
1036       android_hardware_camera_parameters.FLASH_MODE_OFF, NULL);
1037   {
1038     jobject local = android_hardware_camera_parameters.FLASH_MODE_OFF;
1039
1040     android_hardware_camera_parameters.FLASH_MODE_OFF =
1041         gst_amc_jni_object_make_global (env, local);
1042   }
1043
1044   fieldID =
1045       gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_AUTO",
1046       "Ljava/lang/String;");
1047   if (!fieldID)
1048     goto failed;
1049   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1050           &android_hardware_camera_parameters.FLASH_MODE_AUTO))
1051     goto failed;
1052
1053   Parameters_FLASH_MODE_AUTO =
1054       (*env)->GetStringUTFChars (env,
1055       android_hardware_camera_parameters.FLASH_MODE_AUTO, NULL);
1056   {
1057     jobject local = android_hardware_camera_parameters.FLASH_MODE_AUTO;
1058
1059     android_hardware_camera_parameters.FLASH_MODE_AUTO =
1060         gst_amc_jni_object_make_global (env, local);
1061   }
1062
1063   fieldID =
1064       gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_ON",
1065       "Ljava/lang/String;");
1066   if (!fieldID)
1067     goto failed;
1068   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1069           &android_hardware_camera_parameters.FLASH_MODE_ON))
1070     goto failed;
1071
1072   Parameters_FLASH_MODE_ON =
1073       (*env)->GetStringUTFChars (env,
1074       android_hardware_camera_parameters.FLASH_MODE_ON, NULL);
1075   {
1076     jobject local = android_hardware_camera_parameters.FLASH_MODE_ON;
1077
1078     android_hardware_camera_parameters.FLASH_MODE_ON =
1079         gst_amc_jni_object_make_global (env, local);
1080   }
1081
1082   fieldID =
1083       gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_RED_EYE",
1084       "Ljava/lang/String;");
1085   if (!fieldID)
1086     goto failed;
1087   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1088           &android_hardware_camera_parameters.FLASH_MODE_RED_EYE))
1089     goto failed;
1090
1091   Parameters_FLASH_MODE_RED_EYE =
1092       (*env)->GetStringUTFChars (env,
1093       android_hardware_camera_parameters.FLASH_MODE_RED_EYE, NULL);
1094   {
1095     jobject local = android_hardware_camera_parameters.FLASH_MODE_RED_EYE;
1096
1097     android_hardware_camera_parameters.FLASH_MODE_RED_EYE =
1098         gst_amc_jni_object_make_global (env, local);
1099   }
1100
1101   fieldID =
1102       gst_amc_jni_get_static_field_id (env, &err, klass, "FLASH_MODE_TORCH",
1103       "Ljava/lang/String;");
1104   if (!fieldID)
1105     goto failed;
1106   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1107           &android_hardware_camera_parameters.FLASH_MODE_TORCH))
1108     goto failed;
1109
1110   Parameters_FLASH_MODE_TORCH =
1111       (*env)->GetStringUTFChars (env,
1112       android_hardware_camera_parameters.FLASH_MODE_TORCH, NULL);
1113   {
1114     jobject local = android_hardware_camera_parameters.FLASH_MODE_TORCH;
1115
1116     android_hardware_camera_parameters.FLASH_MODE_TORCH =
1117         gst_amc_jni_object_make_global (env, local);
1118   }
1119
1120   fieldID =
1121       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_AUTO",
1122       "Ljava/lang/String;");
1123   if (!fieldID)
1124     goto failed;
1125   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1126           &android_hardware_camera_parameters.SCENE_MODE_AUTO))
1127     goto failed;
1128
1129   Parameters_SCENE_MODE_AUTO =
1130       (*env)->GetStringUTFChars (env,
1131       android_hardware_camera_parameters.SCENE_MODE_AUTO, NULL);
1132   {
1133     jobject local = android_hardware_camera_parameters.SCENE_MODE_AUTO;
1134
1135     android_hardware_camera_parameters.SCENE_MODE_AUTO =
1136         gst_amc_jni_object_make_global (env, local);
1137   }
1138
1139   fieldID =
1140       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_ACTION",
1141       "Ljava/lang/String;");
1142   if (!fieldID)
1143     goto failed;
1144   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1145           &android_hardware_camera_parameters.SCENE_MODE_ACTION))
1146     goto failed;
1147
1148   Parameters_SCENE_MODE_ACTION =
1149       (*env)->GetStringUTFChars (env,
1150       android_hardware_camera_parameters.SCENE_MODE_ACTION, NULL);
1151   {
1152     jobject local = android_hardware_camera_parameters.SCENE_MODE_ACTION;
1153
1154     android_hardware_camera_parameters.SCENE_MODE_ACTION =
1155         gst_amc_jni_object_make_global (env, local);
1156   }
1157
1158   fieldID =
1159       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_PORTRAIT",
1160       "Ljava/lang/String;");
1161   if (!fieldID)
1162     goto failed;
1163   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1164           &android_hardware_camera_parameters.SCENE_MODE_PORTRAIT))
1165     goto failed;
1166
1167   Parameters_SCENE_MODE_PORTRAIT =
1168       (*env)->GetStringUTFChars (env,
1169       android_hardware_camera_parameters.SCENE_MODE_PORTRAIT, NULL);
1170   {
1171     jobject local = android_hardware_camera_parameters.SCENE_MODE_PORTRAIT;
1172
1173     android_hardware_camera_parameters.SCENE_MODE_PORTRAIT =
1174         gst_amc_jni_object_make_global (env, local);
1175   }
1176
1177   fieldID =
1178       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_LANDSCAPE",
1179       "Ljava/lang/String;");
1180   if (!fieldID)
1181     goto failed;
1182   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1183           &android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE))
1184     goto failed;
1185   Parameters_SCENE_MODE_LANDSCAPE =
1186       (*env)->GetStringUTFChars (env,
1187       android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE, NULL);
1188   {
1189     jobject local = android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE;
1190
1191     android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE =
1192         gst_amc_jni_object_make_global (env, local);
1193   }
1194
1195   fieldID =
1196       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_NIGHT",
1197       "Ljava/lang/String;");
1198   if (!fieldID)
1199     goto failed;
1200   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1201           &android_hardware_camera_parameters.SCENE_MODE_NIGHT))
1202     goto failed;
1203
1204   Parameters_SCENE_MODE_NIGHT =
1205       (*env)->GetStringUTFChars (env,
1206       android_hardware_camera_parameters.SCENE_MODE_NIGHT, NULL);
1207   {
1208     jobject local = android_hardware_camera_parameters.SCENE_MODE_NIGHT;
1209
1210     android_hardware_camera_parameters.SCENE_MODE_NIGHT =
1211         gst_amc_jni_object_make_global (env, local);
1212   }
1213
1214   fieldID =
1215       gst_amc_jni_get_static_field_id (env, &err, klass,
1216       "SCENE_MODE_NIGHT_PORTRAIT", "Ljava/lang/String;");
1217   if (!fieldID)
1218     goto failed;
1219   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1220           &android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT))
1221     goto failed;
1222   Parameters_SCENE_MODE_NIGHT_PORTRAIT =
1223       (*env)->GetStringUTFChars (env,
1224       android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT, NULL);
1225   {
1226     jobject local =
1227         android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT;
1228
1229     android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT =
1230         gst_amc_jni_object_make_global (env, local);
1231   }
1232   fieldID =
1233       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_THEATRE",
1234       "Ljava/lang/String;");
1235   if (!fieldID)
1236     goto failed;
1237   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1238           &android_hardware_camera_parameters.SCENE_MODE_THEATRE))
1239     goto failed;
1240
1241   Parameters_SCENE_MODE_THEATRE =
1242       (*env)->GetStringUTFChars (env,
1243       android_hardware_camera_parameters.SCENE_MODE_THEATRE, NULL);
1244   {
1245     jobject local = android_hardware_camera_parameters.SCENE_MODE_THEATRE;
1246
1247     android_hardware_camera_parameters.SCENE_MODE_THEATRE =
1248         gst_amc_jni_object_make_global (env, local);
1249   }
1250
1251   fieldID =
1252       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_BEACH",
1253       "Ljava/lang/String;");
1254   if (!fieldID)
1255     goto failed;
1256   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1257           &android_hardware_camera_parameters.SCENE_MODE_BEACH))
1258     goto failed;
1259
1260   Parameters_SCENE_MODE_BEACH =
1261       (*env)->GetStringUTFChars (env,
1262       android_hardware_camera_parameters.SCENE_MODE_BEACH, NULL);
1263   {
1264     jobject local = android_hardware_camera_parameters.SCENE_MODE_BEACH;
1265
1266     android_hardware_camera_parameters.SCENE_MODE_BEACH =
1267         gst_amc_jni_object_make_global (env, local);
1268   }
1269
1270   fieldID =
1271       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_SNOW",
1272       "Ljava/lang/String;");
1273   if (!fieldID)
1274     goto failed;
1275   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1276           &android_hardware_camera_parameters.SCENE_MODE_SNOW))
1277     goto failed;
1278
1279   Parameters_SCENE_MODE_SNOW =
1280       (*env)->GetStringUTFChars (env,
1281       android_hardware_camera_parameters.SCENE_MODE_SNOW, NULL);
1282   {
1283     jobject local = android_hardware_camera_parameters.SCENE_MODE_SNOW;
1284
1285     android_hardware_camera_parameters.SCENE_MODE_SNOW =
1286         gst_amc_jni_object_make_global (env, local);
1287   }
1288
1289   fieldID =
1290       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_SUNSET",
1291       "Ljava/lang/String;");
1292   if (!fieldID)
1293     goto failed;
1294   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1295           &android_hardware_camera_parameters.SCENE_MODE_SUNSET))
1296     goto failed;
1297
1298
1299   Parameters_SCENE_MODE_SUNSET =
1300       (*env)->GetStringUTFChars (env,
1301       android_hardware_camera_parameters.SCENE_MODE_SUNSET, NULL);
1302   {
1303     jobject local = android_hardware_camera_parameters.SCENE_MODE_SUNSET;
1304
1305     android_hardware_camera_parameters.SCENE_MODE_SUNSET =
1306         gst_amc_jni_object_make_global (env, local);
1307   }
1308
1309   fieldID =
1310       gst_amc_jni_get_static_field_id (env, &err, klass,
1311       "SCENE_MODE_STEADYPHOTO", "Ljava/lang/String;");
1312   if (!fieldID)
1313     goto failed;
1314   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1315           &android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO))
1316     goto failed;
1317
1318
1319   Parameters_SCENE_MODE_STEADYPHOTO =
1320       (*env)->GetStringUTFChars (env,
1321       android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO, NULL);
1322   {
1323     jobject local = android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO;
1324
1325     android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO =
1326         gst_amc_jni_object_make_global (env, local);
1327   }
1328
1329   fieldID =
1330       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_FIREWORKS",
1331       "Ljava/lang/String;");
1332   if (!fieldID)
1333     goto failed;
1334   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1335           &android_hardware_camera_parameters.SCENE_MODE_FIREWORKS))
1336     goto failed;
1337
1338   Parameters_SCENE_MODE_FIREWORKS =
1339       (*env)->GetStringUTFChars (env,
1340       android_hardware_camera_parameters.SCENE_MODE_FIREWORKS, NULL);
1341   {
1342     jobject local = android_hardware_camera_parameters.SCENE_MODE_FIREWORKS;
1343
1344     android_hardware_camera_parameters.SCENE_MODE_FIREWORKS =
1345         gst_amc_jni_object_make_global (env, local);
1346   }
1347
1348   fieldID =
1349       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_SPORTS",
1350       "Ljava/lang/String;");
1351   if (!fieldID)
1352     goto failed;
1353   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1354           &android_hardware_camera_parameters.SCENE_MODE_SPORTS))
1355     goto failed;
1356
1357
1358   Parameters_SCENE_MODE_SPORTS =
1359       (*env)->GetStringUTFChars (env,
1360       android_hardware_camera_parameters.SCENE_MODE_SPORTS, NULL);
1361   {
1362     jobject local = android_hardware_camera_parameters.SCENE_MODE_SPORTS;
1363
1364     android_hardware_camera_parameters.SCENE_MODE_SPORTS =
1365         gst_amc_jni_object_make_global (env, local);
1366   }
1367
1368   fieldID =
1369       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_PARTY",
1370       "Ljava/lang/String;");
1371   if (!fieldID)
1372     goto failed;
1373   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1374           &android_hardware_camera_parameters.SCENE_MODE_PARTY))
1375     goto failed;
1376
1377   Parameters_SCENE_MODE_PARTY =
1378       (*env)->GetStringUTFChars (env,
1379       android_hardware_camera_parameters.SCENE_MODE_PARTY, NULL);
1380   {
1381     jobject local = android_hardware_camera_parameters.SCENE_MODE_PARTY;
1382
1383     android_hardware_camera_parameters.SCENE_MODE_PARTY =
1384         gst_amc_jni_object_make_global (env, local);
1385   }
1386
1387   fieldID =
1388       gst_amc_jni_get_static_field_id (env, &err, klass,
1389       "SCENE_MODE_CANDLELIGHT", "Ljava/lang/String;");
1390   if (!fieldID)
1391     goto failed;
1392   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1393           &android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT))
1394     goto failed;
1395
1396   Parameters_SCENE_MODE_CANDLELIGHT =
1397       (*env)->GetStringUTFChars (env,
1398       android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT, NULL);
1399   {
1400     jobject local = android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT;
1401
1402     android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT =
1403         gst_amc_jni_object_make_global (env, local);
1404   }
1405
1406
1407   fieldID =
1408       gst_amc_jni_get_static_field_id (env, &err, klass, "SCENE_MODE_BARCODE",
1409       "Ljava/lang/String;");
1410   if (!fieldID)
1411     goto failed;
1412   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1413           &android_hardware_camera_parameters.SCENE_MODE_BARCODE))
1414     goto failed;
1415
1416   Parameters_SCENE_MODE_BARCODE =
1417       (*env)->GetStringUTFChars (env,
1418       android_hardware_camera_parameters.SCENE_MODE_BARCODE, NULL);
1419   {
1420     jobject local = android_hardware_camera_parameters.SCENE_MODE_BARCODE;
1421
1422     android_hardware_camera_parameters.SCENE_MODE_BARCODE =
1423         gst_amc_jni_object_make_global (env, local);
1424   }
1425
1426   fieldID =
1427       gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_AUTO",
1428       "Ljava/lang/String;");
1429   if (!fieldID)
1430     goto failed;
1431   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1432           &android_hardware_camera_parameters.FOCUS_MODE_AUTO))
1433     goto failed;
1434
1435   Parameters_FOCUS_MODE_AUTO =
1436       (*env)->GetStringUTFChars (env,
1437       android_hardware_camera_parameters.FOCUS_MODE_AUTO, NULL);
1438   {
1439     jobject local = android_hardware_camera_parameters.FOCUS_MODE_AUTO;
1440
1441     android_hardware_camera_parameters.FOCUS_MODE_AUTO =
1442         gst_amc_jni_object_make_global (env, local);
1443   }
1444
1445   fieldID =
1446       gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_INFINITY",
1447       "Ljava/lang/String;");
1448   if (!fieldID)
1449     goto failed;
1450   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1451           &android_hardware_camera_parameters.FOCUS_MODE_INFINITY))
1452     goto failed;
1453
1454   Parameters_FOCUS_MODE_INFINITY =
1455       (*env)->GetStringUTFChars (env,
1456       android_hardware_camera_parameters.FOCUS_MODE_INFINITY, NULL);
1457   {
1458     jobject local = android_hardware_camera_parameters.FOCUS_MODE_INFINITY;
1459
1460     android_hardware_camera_parameters.FOCUS_MODE_INFINITY =
1461         gst_amc_jni_object_make_global (env, local);
1462   }
1463
1464   fieldID =
1465       gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_MACRO",
1466       "Ljava/lang/String;");
1467   if (!fieldID)
1468     goto failed;
1469   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1470           &android_hardware_camera_parameters.FOCUS_MODE_MACRO))
1471     goto failed;
1472
1473   Parameters_FOCUS_MODE_MACRO =
1474       (*env)->GetStringUTFChars (env,
1475       android_hardware_camera_parameters.FOCUS_MODE_MACRO, NULL);
1476   {
1477     jobject local = android_hardware_camera_parameters.FOCUS_MODE_MACRO;
1478
1479     android_hardware_camera_parameters.FOCUS_MODE_MACRO =
1480         gst_amc_jni_object_make_global (env, local);
1481   }
1482
1483   fieldID =
1484       gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_FIXED",
1485       "Ljava/lang/String;");
1486   if (!fieldID)
1487     goto failed;
1488   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1489           &android_hardware_camera_parameters.FOCUS_MODE_FIXED))
1490     goto failed;
1491
1492   Parameters_FOCUS_MODE_FIXED =
1493       (*env)->GetStringUTFChars (env,
1494       android_hardware_camera_parameters.FOCUS_MODE_FIXED, NULL);
1495   {
1496     jobject local = android_hardware_camera_parameters.FOCUS_MODE_FIXED;
1497
1498     android_hardware_camera_parameters.FOCUS_MODE_FIXED =
1499         gst_amc_jni_object_make_global (env, local);
1500   }
1501
1502   fieldID =
1503       gst_amc_jni_get_static_field_id (env, &err, klass, "FOCUS_MODE_EDOF",
1504       "Ljava/lang/String;");
1505   if (!fieldID)
1506     goto failed;
1507   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1508           &android_hardware_camera_parameters.FOCUS_MODE_EDOF))
1509     goto failed;
1510
1511   Parameters_FOCUS_MODE_EDOF =
1512       (*env)->GetStringUTFChars (env,
1513       android_hardware_camera_parameters.FOCUS_MODE_EDOF, NULL);
1514   {
1515     jobject local = android_hardware_camera_parameters.FOCUS_MODE_EDOF;
1516
1517     android_hardware_camera_parameters.FOCUS_MODE_EDOF =
1518         gst_amc_jni_object_make_global (env, local);
1519   }
1520
1521   fieldID =
1522       gst_amc_jni_get_static_field_id (env, &err, klass,
1523       "FOCUS_MODE_CONTINUOUS_VIDEO", "Ljava/lang/String;");
1524   if (!fieldID)
1525     goto failed;
1526   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1527           &android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
1528     goto failed;
1529
1530   Parameters_FOCUS_MODE_CONTINUOUS_VIDEO =
1531       (*env)->GetStringUTFChars (env,
1532       android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO, NULL);
1533   {
1534     jobject local =
1535         android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO;
1536
1537     android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO =
1538         gst_amc_jni_object_make_global (env, local);
1539   }
1540
1541   fieldID =
1542       gst_amc_jni_get_static_field_id (env, &err, klass,
1543       "FOCUS_MODE_CONTINUOUS_PICTURE", "Ljava/lang/String;");
1544   if (!fieldID)
1545     goto failed;
1546   if (!gst_amc_jni_get_static_object_field (env, &err, klass, fieldID,
1547           &android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE))
1548     goto failed;
1549
1550
1551   Parameters_FOCUS_MODE_CONTINUOUS_PICTURE =
1552       (*env)->GetStringUTFChars (env,
1553       android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE, NULL);
1554   {
1555     jobject local =
1556         android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
1557
1558     android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE =
1559         gst_amc_jni_object_make_global (env, local);
1560   }
1561
1562   /* java.lang.String */
1563   klass = java_lang_string.klass =
1564       gst_amc_jni_get_class (env, &err, "java/lang/String");
1565   java_lang_string.equals =
1566       gst_amc_jni_get_method_id (env, &err, klass, "equals",
1567       "(Ljava/lang/Object;)Z");
1568
1569   /* java.util.List */
1570   klass = java_util_list.klass =
1571       gst_amc_jni_get_class (env, &err, "java/util/List");
1572   java_util_list.iterator =
1573       gst_amc_jni_get_method_id (env, &err, klass, "iterator",
1574       "()Ljava/util/Iterator;");
1575
1576   /* java.util.Iterator */
1577   klass = java_util_iterator.klass =
1578       gst_amc_jni_get_class (env, &err, "java/util/Iterator");
1579   java_util_iterator.hasNext =
1580       gst_amc_jni_get_method_id (env, &err, klass, "hasNext", "()Z");
1581   java_util_iterator.next =
1582       gst_amc_jni_get_method_id (env, &err, klass, "next",
1583       "()Ljava/lang/Object;");
1584
1585   /* java.lang.Integer */
1586   klass = java_lang_integer.klass =
1587       gst_amc_jni_get_class (env, &err, "java/lang/Integer");
1588   java_lang_integer.intValue =
1589       gst_amc_jni_get_method_id (env, &err, klass, "intValue", "()I");
1590
1591   if (!org_freedesktop_gstreamer_androidmedia_gstahccallback.klass) {
1592     org_freedesktop_gstreamer_androidmedia_gstahccallback.klass =
1593         gst_amc_jni_get_application_class (env,
1594         "org/freedesktop/gstreamer/androidmedia/GstAhcCallback", &err);
1595   }
1596   if (!org_freedesktop_gstreamer_androidmedia_gstahccallback.klass)
1597     goto failed;
1598
1599   org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor =
1600       gst_amc_jni_get_method_id (env, &err,
1601       org_freedesktop_gstreamer_androidmedia_gstahccallback.klass, "<init>",
1602       "(JJ)V");
1603
1604   if ((*env)->RegisterNatives (env,
1605           org_freedesktop_gstreamer_androidmedia_gstahccallback.klass,
1606           native_methods, G_N_ELEMENTS (native_methods))) {
1607     GST_ERROR ("Failed to register native methods for GstAhcCallback");
1608     return FALSE;
1609   }
1610
1611   return TRUE;
1612
1613 failed:
1614   if (err) {
1615     GST_ERROR ("Failed to initialize android.hardware.Camera classes: %s",
1616         err->message);
1617     g_clear_error (&err);
1618   }
1619
1620   return FALSE;
1621
1622 }
1623
1624
1625 gboolean
1626 gst_android_hardware_camera_init (void)
1627 {
1628   GST_DEBUG_CATEGORY_INIT (ahc_debug, "ahc", 0,
1629       "Android Gstreamer Hardware Camera");
1630   if (!_init_classes ()) {
1631     gst_android_hardware_camera_deinit ();
1632     return FALSE;
1633   }
1634
1635   return TRUE;
1636 }
1637
1638 void
1639 gst_android_hardware_camera_deinit (void)
1640 {
1641   JNIEnv *env = gst_amc_jni_get_env ();
1642
1643   if (android_hardware_camera.klass)
1644     gst_amc_jni_object_unref (env, android_hardware_camera.klass);
1645   android_hardware_camera.klass = NULL;
1646
1647   if (android_hardware_camera_camerainfo.klass)
1648     gst_amc_jni_object_unref (env, android_hardware_camera_camerainfo.klass);
1649   android_hardware_camera_camerainfo.klass = NULL;
1650
1651   if (android_hardware_camera_size.klass)
1652     gst_amc_jni_object_unref (env, android_hardware_camera_size.klass);
1653   android_hardware_camera_size.klass = NULL;
1654
1655   if (android_hardware_camera_parameters.klass)
1656     gst_amc_jni_object_unref (env, android_hardware_camera_parameters.klass);
1657   android_hardware_camera_parameters.klass = NULL;
1658   if (Parameters_WHITE_BALANCE_AUTO)
1659     (*env)->ReleaseStringUTFChars (env,
1660         android_hardware_camera_parameters.WHITE_BALANCE_AUTO,
1661         Parameters_WHITE_BALANCE_AUTO);
1662   Parameters_WHITE_BALANCE_AUTO = NULL;
1663   if (android_hardware_camera_parameters.WHITE_BALANCE_AUTO)
1664     gst_amc_jni_object_unref (env,
1665         android_hardware_camera_parameters.WHITE_BALANCE_AUTO);
1666   android_hardware_camera_parameters.WHITE_BALANCE_AUTO = NULL;
1667   if (Parameters_WHITE_BALANCE_INCANDESCENT)
1668     (*env)->ReleaseStringUTFChars (env,
1669         android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT,
1670         Parameters_WHITE_BALANCE_INCANDESCENT);
1671   Parameters_WHITE_BALANCE_INCANDESCENT = NULL;
1672   if (android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT)
1673     gst_amc_jni_object_unref (env,
1674         android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT);
1675   android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT = NULL;
1676   if (Parameters_WHITE_BALANCE_FLUORESCENT)
1677     (*env)->ReleaseStringUTFChars (env,
1678         android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT,
1679         Parameters_WHITE_BALANCE_FLUORESCENT);
1680   Parameters_WHITE_BALANCE_FLUORESCENT = NULL;
1681   if (android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT)
1682     gst_amc_jni_object_unref (env,
1683         android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT);
1684   android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT = NULL;
1685   if (Parameters_WHITE_BALANCE_WARM_FLUORESCENT)
1686     (*env)->ReleaseStringUTFChars (env,
1687         android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT,
1688         Parameters_WHITE_BALANCE_WARM_FLUORESCENT);
1689   Parameters_WHITE_BALANCE_WARM_FLUORESCENT = NULL;
1690   if (android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT)
1691     gst_amc_jni_object_unref (env,
1692         android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT);
1693   android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT = NULL;
1694   if (Parameters_WHITE_BALANCE_DAYLIGHT)
1695     (*env)->ReleaseStringUTFChars (env,
1696         android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT,
1697         Parameters_WHITE_BALANCE_DAYLIGHT);
1698   Parameters_WHITE_BALANCE_DAYLIGHT = NULL;
1699   if (android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT)
1700     gst_amc_jni_object_unref (env,
1701         android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT);
1702   android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT = NULL;
1703   if (Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT)
1704     (*env)->ReleaseStringUTFChars (env,
1705         android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT,
1706         Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT);
1707   Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT = NULL;
1708   if (android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT)
1709     gst_amc_jni_object_unref (env,
1710         android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT);
1711   android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT = NULL;
1712   if (Parameters_WHITE_BALANCE_TWILIGHT)
1713     (*env)->ReleaseStringUTFChars (env,
1714         android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT,
1715         Parameters_WHITE_BALANCE_TWILIGHT);
1716   Parameters_WHITE_BALANCE_TWILIGHT = NULL;
1717   if (android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT)
1718     gst_amc_jni_object_unref (env,
1719         android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT);
1720   android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT = NULL;
1721   if (Parameters_WHITE_BALANCE_SHADE)
1722     (*env)->ReleaseStringUTFChars (env,
1723         android_hardware_camera_parameters.WHITE_BALANCE_SHADE,
1724         Parameters_WHITE_BALANCE_SHADE);
1725   Parameters_WHITE_BALANCE_SHADE = NULL;
1726   if (android_hardware_camera_parameters.WHITE_BALANCE_SHADE)
1727     gst_amc_jni_object_unref (env,
1728         android_hardware_camera_parameters.WHITE_BALANCE_SHADE);
1729   android_hardware_camera_parameters.WHITE_BALANCE_SHADE = NULL;
1730   if (Parameters_EFFECT_NONE)
1731     (*env)->ReleaseStringUTFChars (env,
1732         android_hardware_camera_parameters.EFFECT_NONE, Parameters_EFFECT_NONE);
1733   Parameters_EFFECT_NONE = NULL;
1734   if (android_hardware_camera_parameters.EFFECT_NONE)
1735     gst_amc_jni_object_unref (env,
1736         android_hardware_camera_parameters.EFFECT_NONE);
1737   android_hardware_camera_parameters.EFFECT_NONE = NULL;
1738   if (Parameters_EFFECT_MONO)
1739     (*env)->ReleaseStringUTFChars (env,
1740         android_hardware_camera_parameters.EFFECT_MONO, Parameters_EFFECT_MONO);
1741   Parameters_EFFECT_MONO = NULL;
1742   if (android_hardware_camera_parameters.EFFECT_MONO)
1743     gst_amc_jni_object_unref (env,
1744         android_hardware_camera_parameters.EFFECT_MONO);
1745   android_hardware_camera_parameters.EFFECT_MONO = NULL;
1746   if (Parameters_EFFECT_NEGATIVE)
1747     (*env)->ReleaseStringUTFChars (env,
1748         android_hardware_camera_parameters.EFFECT_NEGATIVE,
1749         Parameters_EFFECT_NEGATIVE);
1750   Parameters_EFFECT_NEGATIVE = NULL;
1751   if (android_hardware_camera_parameters.EFFECT_NEGATIVE)
1752     gst_amc_jni_object_unref (env,
1753         android_hardware_camera_parameters.EFFECT_NEGATIVE);
1754   android_hardware_camera_parameters.EFFECT_NEGATIVE = NULL;
1755   if (Parameters_EFFECT_SOLARIZE)
1756     (*env)->ReleaseStringUTFChars (env,
1757         android_hardware_camera_parameters.EFFECT_SOLARIZE,
1758         Parameters_EFFECT_SOLARIZE);
1759   Parameters_EFFECT_SOLARIZE = NULL;
1760   if (android_hardware_camera_parameters.EFFECT_SOLARIZE)
1761     gst_amc_jni_object_unref (env,
1762         android_hardware_camera_parameters.EFFECT_SOLARIZE);
1763   android_hardware_camera_parameters.EFFECT_SOLARIZE = NULL;
1764   if (Parameters_EFFECT_SEPIA)
1765     (*env)->ReleaseStringUTFChars (env,
1766         android_hardware_camera_parameters.EFFECT_SEPIA,
1767         Parameters_EFFECT_SEPIA);
1768   Parameters_EFFECT_SEPIA = NULL;
1769   if (android_hardware_camera_parameters.EFFECT_SEPIA)
1770     gst_amc_jni_object_unref (env,
1771         android_hardware_camera_parameters.EFFECT_SEPIA);
1772   android_hardware_camera_parameters.EFFECT_SEPIA = NULL;
1773   if (Parameters_EFFECT_POSTERIZE)
1774     (*env)->ReleaseStringUTFChars (env,
1775         android_hardware_camera_parameters.EFFECT_POSTERIZE,
1776         Parameters_EFFECT_POSTERIZE);
1777   Parameters_EFFECT_POSTERIZE = NULL;
1778   if (android_hardware_camera_parameters.EFFECT_POSTERIZE)
1779     gst_amc_jni_object_unref (env,
1780         android_hardware_camera_parameters.EFFECT_POSTERIZE);
1781   android_hardware_camera_parameters.EFFECT_POSTERIZE = NULL;
1782   if (Parameters_EFFECT_WHITEBOARD)
1783     (*env)->ReleaseStringUTFChars (env,
1784         android_hardware_camera_parameters.EFFECT_WHITEBOARD,
1785         Parameters_EFFECT_WHITEBOARD);
1786   Parameters_EFFECT_WHITEBOARD = NULL;
1787   if (android_hardware_camera_parameters.EFFECT_WHITEBOARD)
1788     gst_amc_jni_object_unref (env,
1789         android_hardware_camera_parameters.EFFECT_WHITEBOARD);
1790   android_hardware_camera_parameters.EFFECT_WHITEBOARD = NULL;
1791   if (Parameters_EFFECT_BLACKBOARD)
1792     (*env)->ReleaseStringUTFChars (env,
1793         android_hardware_camera_parameters.EFFECT_BLACKBOARD,
1794         Parameters_EFFECT_BLACKBOARD);
1795   Parameters_EFFECT_BLACKBOARD = NULL;
1796   if (android_hardware_camera_parameters.EFFECT_BLACKBOARD)
1797     gst_amc_jni_object_unref (env,
1798         android_hardware_camera_parameters.EFFECT_BLACKBOARD);
1799   android_hardware_camera_parameters.EFFECT_BLACKBOARD = NULL;
1800   if (Parameters_EFFECT_AQUA)
1801     (*env)->ReleaseStringUTFChars (env,
1802         android_hardware_camera_parameters.EFFECT_AQUA, Parameters_EFFECT_AQUA);
1803   Parameters_EFFECT_AQUA = NULL;
1804   if (android_hardware_camera_parameters.EFFECT_AQUA)
1805     gst_amc_jni_object_unref (env,
1806         android_hardware_camera_parameters.EFFECT_AQUA);
1807   android_hardware_camera_parameters.EFFECT_AQUA = NULL;
1808   if (Parameters_ANTIBANDING_AUTO)
1809     (*env)->ReleaseStringUTFChars (env,
1810         android_hardware_camera_parameters.ANTIBANDING_AUTO,
1811         Parameters_ANTIBANDING_AUTO);
1812   Parameters_ANTIBANDING_AUTO = NULL;
1813   if (android_hardware_camera_parameters.ANTIBANDING_AUTO)
1814     gst_amc_jni_object_unref (env,
1815         android_hardware_camera_parameters.ANTIBANDING_AUTO);
1816   android_hardware_camera_parameters.ANTIBANDING_AUTO = NULL;
1817   if (Parameters_ANTIBANDING_50HZ)
1818     (*env)->ReleaseStringUTFChars (env,
1819         android_hardware_camera_parameters.ANTIBANDING_50HZ,
1820         Parameters_ANTIBANDING_50HZ);
1821   Parameters_ANTIBANDING_50HZ = NULL;
1822   if (android_hardware_camera_parameters.ANTIBANDING_50HZ)
1823     gst_amc_jni_object_unref (env,
1824         android_hardware_camera_parameters.ANTIBANDING_50HZ);
1825   android_hardware_camera_parameters.ANTIBANDING_50HZ = NULL;
1826   if (Parameters_ANTIBANDING_60HZ)
1827     (*env)->ReleaseStringUTFChars (env,
1828         android_hardware_camera_parameters.ANTIBANDING_60HZ,
1829         Parameters_ANTIBANDING_60HZ);
1830   Parameters_ANTIBANDING_60HZ = NULL;
1831   if (android_hardware_camera_parameters.ANTIBANDING_60HZ)
1832     gst_amc_jni_object_unref (env,
1833         android_hardware_camera_parameters.ANTIBANDING_60HZ);
1834   android_hardware_camera_parameters.ANTIBANDING_60HZ = NULL;
1835   if (Parameters_ANTIBANDING_OFF)
1836     (*env)->ReleaseStringUTFChars (env,
1837         android_hardware_camera_parameters.ANTIBANDING_OFF,
1838         Parameters_ANTIBANDING_OFF);
1839   Parameters_ANTIBANDING_OFF = NULL;
1840   if (android_hardware_camera_parameters.ANTIBANDING_OFF)
1841     gst_amc_jni_object_unref (env,
1842         android_hardware_camera_parameters.ANTIBANDING_OFF);
1843   android_hardware_camera_parameters.ANTIBANDING_OFF = NULL;
1844   if (Parameters_FLASH_MODE_OFF)
1845     (*env)->ReleaseStringUTFChars (env,
1846         android_hardware_camera_parameters.FLASH_MODE_OFF,
1847         Parameters_FLASH_MODE_OFF);
1848   Parameters_FLASH_MODE_OFF = NULL;
1849   if (android_hardware_camera_parameters.FLASH_MODE_OFF)
1850     gst_amc_jni_object_unref (env,
1851         android_hardware_camera_parameters.FLASH_MODE_OFF);
1852   android_hardware_camera_parameters.FLASH_MODE_OFF = NULL;
1853   if (Parameters_FLASH_MODE_AUTO)
1854     (*env)->ReleaseStringUTFChars (env,
1855         android_hardware_camera_parameters.FLASH_MODE_AUTO,
1856         Parameters_FLASH_MODE_AUTO);
1857   Parameters_FLASH_MODE_AUTO = NULL;
1858   if (android_hardware_camera_parameters.FLASH_MODE_AUTO)
1859     gst_amc_jni_object_unref (env,
1860         android_hardware_camera_parameters.FLASH_MODE_AUTO);
1861   android_hardware_camera_parameters.FLASH_MODE_AUTO = NULL;
1862   if (Parameters_FLASH_MODE_ON)
1863     (*env)->ReleaseStringUTFChars (env,
1864         android_hardware_camera_parameters.FLASH_MODE_ON,
1865         Parameters_FLASH_MODE_ON);
1866   Parameters_FLASH_MODE_ON = NULL;
1867   if (android_hardware_camera_parameters.FLASH_MODE_ON)
1868     gst_amc_jni_object_unref (env,
1869         android_hardware_camera_parameters.FLASH_MODE_ON);
1870   android_hardware_camera_parameters.FLASH_MODE_ON = NULL;
1871   if (Parameters_FLASH_MODE_RED_EYE)
1872     (*env)->ReleaseStringUTFChars (env,
1873         android_hardware_camera_parameters.FLASH_MODE_RED_EYE,
1874         Parameters_FLASH_MODE_RED_EYE);
1875   Parameters_FLASH_MODE_RED_EYE = NULL;
1876   if (android_hardware_camera_parameters.FLASH_MODE_RED_EYE)
1877     gst_amc_jni_object_unref (env,
1878         android_hardware_camera_parameters.FLASH_MODE_RED_EYE);
1879   android_hardware_camera_parameters.FLASH_MODE_RED_EYE = NULL;
1880   if (Parameters_FLASH_MODE_TORCH)
1881     (*env)->ReleaseStringUTFChars (env,
1882         android_hardware_camera_parameters.FLASH_MODE_TORCH,
1883         Parameters_FLASH_MODE_TORCH);
1884   Parameters_FLASH_MODE_TORCH = NULL;
1885   if (android_hardware_camera_parameters.FLASH_MODE_TORCH)
1886     gst_amc_jni_object_unref (env,
1887         android_hardware_camera_parameters.FLASH_MODE_TORCH);
1888   android_hardware_camera_parameters.FLASH_MODE_TORCH = NULL;
1889   if (Parameters_SCENE_MODE_AUTO)
1890     (*env)->ReleaseStringUTFChars (env,
1891         android_hardware_camera_parameters.SCENE_MODE_AUTO,
1892         Parameters_SCENE_MODE_AUTO);
1893   Parameters_SCENE_MODE_AUTO = NULL;
1894   if (android_hardware_camera_parameters.SCENE_MODE_AUTO)
1895     gst_amc_jni_object_unref (env,
1896         android_hardware_camera_parameters.SCENE_MODE_AUTO);
1897   android_hardware_camera_parameters.SCENE_MODE_AUTO = NULL;
1898   if (Parameters_SCENE_MODE_ACTION)
1899     (*env)->ReleaseStringUTFChars (env,
1900         android_hardware_camera_parameters.SCENE_MODE_ACTION,
1901         Parameters_SCENE_MODE_ACTION);
1902   Parameters_SCENE_MODE_ACTION = NULL;
1903   if (android_hardware_camera_parameters.SCENE_MODE_ACTION)
1904     gst_amc_jni_object_unref (env,
1905         android_hardware_camera_parameters.SCENE_MODE_ACTION);
1906   android_hardware_camera_parameters.SCENE_MODE_ACTION = NULL;
1907   if (Parameters_SCENE_MODE_PORTRAIT)
1908     (*env)->ReleaseStringUTFChars (env,
1909         android_hardware_camera_parameters.SCENE_MODE_PORTRAIT,
1910         Parameters_SCENE_MODE_PORTRAIT);
1911   Parameters_SCENE_MODE_PORTRAIT = NULL;
1912   if (android_hardware_camera_parameters.SCENE_MODE_PORTRAIT)
1913     gst_amc_jni_object_unref (env,
1914         android_hardware_camera_parameters.SCENE_MODE_PORTRAIT);
1915   android_hardware_camera_parameters.SCENE_MODE_PORTRAIT = NULL;
1916   if (Parameters_SCENE_MODE_LANDSCAPE)
1917     (*env)->ReleaseStringUTFChars (env,
1918         android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE,
1919         Parameters_SCENE_MODE_LANDSCAPE);
1920   Parameters_SCENE_MODE_LANDSCAPE = NULL;
1921   if (android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE)
1922     gst_amc_jni_object_unref (env,
1923         android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE);
1924   android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE = NULL;
1925   if (Parameters_SCENE_MODE_NIGHT)
1926     (*env)->ReleaseStringUTFChars (env,
1927         android_hardware_camera_parameters.SCENE_MODE_NIGHT,
1928         Parameters_SCENE_MODE_NIGHT);
1929   Parameters_SCENE_MODE_NIGHT = NULL;
1930   if (android_hardware_camera_parameters.SCENE_MODE_NIGHT)
1931     gst_amc_jni_object_unref (env,
1932         android_hardware_camera_parameters.SCENE_MODE_NIGHT);
1933   android_hardware_camera_parameters.SCENE_MODE_NIGHT = NULL;
1934   if (Parameters_SCENE_MODE_NIGHT_PORTRAIT)
1935     (*env)->ReleaseStringUTFChars (env,
1936         android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT,
1937         Parameters_SCENE_MODE_NIGHT_PORTRAIT);
1938   Parameters_SCENE_MODE_NIGHT_PORTRAIT = NULL;
1939   if (android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT)
1940     gst_amc_jni_object_unref (env,
1941         android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT);
1942   android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT = NULL;
1943   if (Parameters_SCENE_MODE_THEATRE)
1944     (*env)->ReleaseStringUTFChars (env,
1945         android_hardware_camera_parameters.SCENE_MODE_THEATRE,
1946         Parameters_SCENE_MODE_THEATRE);
1947   Parameters_SCENE_MODE_THEATRE = NULL;
1948   if (android_hardware_camera_parameters.SCENE_MODE_THEATRE)
1949     gst_amc_jni_object_unref (env,
1950         android_hardware_camera_parameters.SCENE_MODE_THEATRE);
1951   android_hardware_camera_parameters.SCENE_MODE_THEATRE = NULL;
1952   if (Parameters_SCENE_MODE_BEACH)
1953     (*env)->ReleaseStringUTFChars (env,
1954         android_hardware_camera_parameters.SCENE_MODE_BEACH,
1955         Parameters_SCENE_MODE_BEACH);
1956   Parameters_SCENE_MODE_BEACH = NULL;
1957   if (android_hardware_camera_parameters.SCENE_MODE_BEACH)
1958     gst_amc_jni_object_unref (env,
1959         android_hardware_camera_parameters.SCENE_MODE_BEACH);
1960   android_hardware_camera_parameters.SCENE_MODE_BEACH = NULL;
1961   if (Parameters_SCENE_MODE_SNOW)
1962     (*env)->ReleaseStringUTFChars (env,
1963         android_hardware_camera_parameters.SCENE_MODE_SNOW,
1964         Parameters_SCENE_MODE_SNOW);
1965   Parameters_SCENE_MODE_SNOW = NULL;
1966   if (android_hardware_camera_parameters.SCENE_MODE_SNOW)
1967     gst_amc_jni_object_unref (env,
1968         android_hardware_camera_parameters.SCENE_MODE_SNOW);
1969   android_hardware_camera_parameters.SCENE_MODE_SNOW = NULL;
1970   if (Parameters_SCENE_MODE_SUNSET)
1971     (*env)->ReleaseStringUTFChars (env,
1972         android_hardware_camera_parameters.SCENE_MODE_SUNSET,
1973         Parameters_SCENE_MODE_SUNSET);
1974   Parameters_SCENE_MODE_SUNSET = NULL;
1975   if (android_hardware_camera_parameters.SCENE_MODE_SUNSET)
1976     gst_amc_jni_object_unref (env,
1977         android_hardware_camera_parameters.SCENE_MODE_SUNSET);
1978   android_hardware_camera_parameters.SCENE_MODE_SUNSET = NULL;
1979   if (Parameters_SCENE_MODE_STEADYPHOTO)
1980     (*env)->ReleaseStringUTFChars (env,
1981         android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO,
1982         Parameters_SCENE_MODE_STEADYPHOTO);
1983   Parameters_SCENE_MODE_STEADYPHOTO = NULL;
1984   if (android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO)
1985     gst_amc_jni_object_unref (env,
1986         android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO);
1987   android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO = NULL;
1988   if (Parameters_SCENE_MODE_FIREWORKS)
1989     (*env)->ReleaseStringUTFChars (env,
1990         android_hardware_camera_parameters.SCENE_MODE_FIREWORKS,
1991         Parameters_SCENE_MODE_FIREWORKS);
1992   Parameters_SCENE_MODE_FIREWORKS = NULL;
1993   if (android_hardware_camera_parameters.SCENE_MODE_FIREWORKS)
1994     gst_amc_jni_object_unref (env,
1995         android_hardware_camera_parameters.SCENE_MODE_FIREWORKS);
1996   android_hardware_camera_parameters.SCENE_MODE_FIREWORKS = NULL;
1997   if (Parameters_SCENE_MODE_SPORTS)
1998     (*env)->ReleaseStringUTFChars (env,
1999         android_hardware_camera_parameters.SCENE_MODE_SPORTS,
2000         Parameters_SCENE_MODE_SPORTS);
2001   Parameters_SCENE_MODE_SPORTS = NULL;
2002   if (android_hardware_camera_parameters.SCENE_MODE_SPORTS)
2003     gst_amc_jni_object_unref (env,
2004         android_hardware_camera_parameters.SCENE_MODE_SPORTS);
2005   android_hardware_camera_parameters.SCENE_MODE_SPORTS = NULL;
2006   if (Parameters_SCENE_MODE_PARTY)
2007     (*env)->ReleaseStringUTFChars (env,
2008         android_hardware_camera_parameters.SCENE_MODE_PARTY,
2009         Parameters_SCENE_MODE_PARTY);
2010   Parameters_SCENE_MODE_PARTY = NULL;
2011   if (android_hardware_camera_parameters.SCENE_MODE_PARTY)
2012     gst_amc_jni_object_unref (env,
2013         android_hardware_camera_parameters.SCENE_MODE_PARTY);
2014   android_hardware_camera_parameters.SCENE_MODE_PARTY = NULL;
2015   if (Parameters_SCENE_MODE_CANDLELIGHT)
2016     (*env)->ReleaseStringUTFChars (env,
2017         android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT,
2018         Parameters_SCENE_MODE_CANDLELIGHT);
2019   Parameters_SCENE_MODE_CANDLELIGHT = NULL;
2020   if (android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT)
2021     gst_amc_jni_object_unref (env,
2022         android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT);
2023   android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT = NULL;
2024   if (Parameters_SCENE_MODE_BARCODE)
2025     (*env)->ReleaseStringUTFChars (env,
2026         android_hardware_camera_parameters.SCENE_MODE_BARCODE,
2027         Parameters_SCENE_MODE_BARCODE);
2028   Parameters_SCENE_MODE_BARCODE = NULL;
2029   if (android_hardware_camera_parameters.SCENE_MODE_BARCODE)
2030     gst_amc_jni_object_unref (env,
2031         android_hardware_camera_parameters.SCENE_MODE_BARCODE);
2032   android_hardware_camera_parameters.SCENE_MODE_BARCODE = NULL;
2033   if (Parameters_FOCUS_MODE_AUTO)
2034     (*env)->ReleaseStringUTFChars (env,
2035         android_hardware_camera_parameters.FOCUS_MODE_AUTO,
2036         Parameters_FOCUS_MODE_AUTO);
2037   Parameters_FOCUS_MODE_AUTO = NULL;
2038   if (android_hardware_camera_parameters.FOCUS_MODE_AUTO)
2039     gst_amc_jni_object_unref (env,
2040         android_hardware_camera_parameters.FOCUS_MODE_AUTO);
2041   android_hardware_camera_parameters.FOCUS_MODE_AUTO = NULL;
2042   if (Parameters_FOCUS_MODE_INFINITY)
2043     (*env)->ReleaseStringUTFChars (env,
2044         android_hardware_camera_parameters.FOCUS_MODE_INFINITY,
2045         Parameters_FOCUS_MODE_INFINITY);
2046   Parameters_FOCUS_MODE_INFINITY = NULL;
2047   if (android_hardware_camera_parameters.FOCUS_MODE_INFINITY)
2048     gst_amc_jni_object_unref (env,
2049         android_hardware_camera_parameters.FOCUS_MODE_INFINITY);
2050   android_hardware_camera_parameters.FOCUS_MODE_INFINITY = NULL;
2051   if (Parameters_FOCUS_MODE_MACRO)
2052     (*env)->ReleaseStringUTFChars (env,
2053         android_hardware_camera_parameters.FOCUS_MODE_MACRO,
2054         Parameters_FOCUS_MODE_MACRO);
2055   Parameters_FOCUS_MODE_MACRO = NULL;
2056   if (android_hardware_camera_parameters.FOCUS_MODE_MACRO)
2057     gst_amc_jni_object_unref (env,
2058         android_hardware_camera_parameters.FOCUS_MODE_MACRO);
2059   android_hardware_camera_parameters.FOCUS_MODE_MACRO = NULL;
2060   if (Parameters_FOCUS_MODE_FIXED)
2061     (*env)->ReleaseStringUTFChars (env,
2062         android_hardware_camera_parameters.FOCUS_MODE_FIXED,
2063         Parameters_FOCUS_MODE_FIXED);
2064   Parameters_FOCUS_MODE_FIXED = NULL;
2065   if (android_hardware_camera_parameters.FOCUS_MODE_FIXED)
2066     gst_amc_jni_object_unref (env,
2067         android_hardware_camera_parameters.FOCUS_MODE_FIXED);
2068   android_hardware_camera_parameters.FOCUS_MODE_FIXED = NULL;
2069   if (Parameters_FOCUS_MODE_EDOF)
2070     (*env)->ReleaseStringUTFChars (env,
2071         android_hardware_camera_parameters.FOCUS_MODE_EDOF,
2072         Parameters_FOCUS_MODE_EDOF);
2073   Parameters_FOCUS_MODE_EDOF = NULL;
2074   if (android_hardware_camera_parameters.FOCUS_MODE_EDOF)
2075     gst_amc_jni_object_unref (env,
2076         android_hardware_camera_parameters.FOCUS_MODE_EDOF);
2077   android_hardware_camera_parameters.FOCUS_MODE_EDOF = NULL;
2078   if (Parameters_FOCUS_MODE_CONTINUOUS_VIDEO)
2079     (*env)->ReleaseStringUTFChars (env,
2080         android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO,
2081         Parameters_FOCUS_MODE_CONTINUOUS_VIDEO);
2082   Parameters_FOCUS_MODE_CONTINUOUS_VIDEO = NULL;
2083   if (android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO)
2084     gst_amc_jni_object_unref (env,
2085         android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
2086   android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO = NULL;
2087   if (Parameters_FOCUS_MODE_CONTINUOUS_PICTURE)
2088     (*env)->ReleaseStringUTFChars (env,
2089         android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE,
2090         Parameters_FOCUS_MODE_CONTINUOUS_PICTURE);
2091   Parameters_FOCUS_MODE_CONTINUOUS_PICTURE = NULL;
2092   if (android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE)
2093     gst_amc_jni_object_unref (env,
2094         android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
2095   android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE = NULL;
2096
2097   if (java_lang_string.klass)
2098     gst_amc_jni_object_unref (env, java_lang_string.klass);
2099   java_lang_string.klass = NULL;
2100
2101   if (java_util_list.klass)
2102     gst_amc_jni_object_unref (env, java_util_list.klass);
2103   java_util_list.klass = NULL;
2104
2105   if (java_util_iterator.klass)
2106     gst_amc_jni_object_unref (env, java_util_iterator.klass);
2107   java_util_iterator.klass = NULL;
2108
2109   if (java_lang_integer.klass)
2110     gst_amc_jni_object_unref (env, java_lang_integer.klass);
2111   java_lang_integer.klass = NULL;
2112
2113   if (org_freedesktop_gstreamer_androidmedia_gstahccallback.klass) {
2114     (*env)->UnregisterNatives (env,
2115         org_freedesktop_gstreamer_androidmedia_gstahccallback.klass);
2116     gst_amc_jni_object_unref (env,
2117         org_freedesktop_gstreamer_androidmedia_gstahccallback.klass);
2118   }
2119   org_freedesktop_gstreamer_androidmedia_gstahccallback.klass = NULL;
2120 }
2121
2122 /* android.hardware.Camera */
2123 void
2124 gst_ah_camera_add_callback_buffer (GstAHCamera * self, jbyteArray buffer)
2125 {
2126   JNIEnv *env = gst_amc_jni_get_env ();
2127   GError *err = NULL;
2128
2129   GST_DEBUG ("add callback_buffer %p", buffer);
2130
2131   gst_amc_jni_call_void_method (env, &err, self->object,
2132       android_hardware_camera.addCallbackBuffer, buffer);
2133   if (err) {
2134     GST_ERROR ("Failed to call android.hardware.Camera.addCallbackBuffer: %s",
2135         err->message);
2136     g_clear_error (&err);
2137   }
2138 }
2139
2140 gboolean
2141 gst_ah_camera_auto_focus (GstAHCamera * self,
2142     GstAHCAutoFocusCallback cb, gpointer user_data)
2143 {
2144   JNIEnv *env = gst_amc_jni_get_env ();
2145   GError *err = NULL;
2146   jobject object = NULL;
2147   gboolean ret = FALSE;
2148
2149   if (cb) {
2150     object = gst_amc_jni_new_object (env,
2151         &err,
2152         FALSE,
2153         org_freedesktop_gstreamer_androidmedia_gstahccallback.klass,
2154         org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor,
2155         *((jlong *) & cb), *((jlong *) & user_data));
2156     if (err) {
2157       GST_ERROR
2158           ("Failed to create org.freedesktop.gstreamer.androidmedia.GstAhcCallback object");
2159       g_clear_error (&err);
2160       goto done;
2161     }
2162   }
2163
2164   gst_amc_jni_call_void_method (env, &err, self->object,
2165       android_hardware_camera.autoFocus, object);
2166   if (err) {
2167     GST_ERROR ("Failed to call android.hardware.Camera.autoFocus: %s",
2168         err->message);
2169     goto done;
2170   }
2171
2172   ret = TRUE;
2173 done:
2174   if (err)
2175     g_clear_error (&err);
2176   if (object)
2177     gst_amc_jni_object_local_unref (env, object);
2178
2179   return ret;
2180 }
2181
2182 gboolean
2183 gst_ah_camera_cancel_auto_focus (GstAHCamera * self)
2184 {
2185   JNIEnv *env = gst_amc_jni_get_env ();
2186   GError *err = NULL;
2187
2188   gst_amc_jni_call_void_method (env, &err, self->object,
2189       android_hardware_camera.cancelAutoFocus);
2190   if (err) {
2191     GST_ERROR ("Failed to call android.hardware.Camera.cancelAutoFocus: %s",
2192         err->message);
2193     g_clear_error (&err);
2194     return FALSE;
2195   }
2196
2197   return TRUE;
2198 }
2199
2200 gboolean
2201 gst_ah_camera_get_camera_info (gint camera_id, GstAHCCameraInfo * camera_info)
2202 {
2203   JNIEnv *env = gst_amc_jni_get_env ();
2204   GError *err = NULL;
2205   jobject jcamera_info = NULL;
2206   gboolean ret = FALSE;
2207
2208   jcamera_info = gst_amc_jni_new_object (env,
2209       &err,
2210       FALSE,
2211       android_hardware_camera_camerainfo.klass,
2212       android_hardware_camera_camerainfo.constructor);
2213   if (err) {
2214     GST_ERROR ("Failed to create android.hardware.camera.CameraInfo object");
2215     g_clear_error (&err);
2216     goto done;
2217   }
2218
2219   gst_amc_jni_call_static_void_method (env, &err, android_hardware_camera.klass,
2220       android_hardware_camera.getCameraInfo, camera_id, jcamera_info);
2221   if (err) {
2222     GST_ERROR ("Failed to call android.hardware.Camera.getCameraInfo: %s",
2223         err->message);
2224     goto done;
2225   }
2226
2227   camera_info->facing = (*env)->GetIntField (env, jcamera_info,
2228       android_hardware_camera_camerainfo.facing);
2229   if ((*env)->ExceptionCheck (env)) {
2230     GST_ERROR ("Failed to get CameraInfo.facing field");
2231     (*env)->ExceptionClear (env);
2232     goto done;
2233   }
2234
2235   camera_info->orientation = (*env)->GetIntField (env, jcamera_info,
2236       android_hardware_camera_camerainfo.orientation);
2237   if ((*env)->ExceptionCheck (env)) {
2238     GST_ERROR ("Failed to get CameraInfo.orientation field");
2239     (*env)->ExceptionClear (env);
2240     goto done;
2241   }
2242
2243   ret = TRUE;
2244 done:
2245   if (err)
2246     g_clear_error (&err);
2247   if (jcamera_info)
2248     gst_amc_jni_object_local_unref (env, jcamera_info);
2249
2250   return ret;
2251 }
2252
2253 gint
2254 gst_ah_camera_get_number_of_cameras (void)
2255 {
2256   JNIEnv *env = gst_amc_jni_get_env ();
2257   GError *err = NULL;
2258   gint num_cameras;
2259
2260   gst_amc_jni_call_static_int_method (env, &err, android_hardware_camera.klass,
2261       android_hardware_camera.getNumberOfCameras, &num_cameras);
2262   if (err) {
2263     GST_ERROR ("Failed to call android.hardware.Camera.getNumberOfCameras: %s",
2264         err->message);
2265     g_clear_error (&err);
2266     return -1;
2267   }
2268
2269   return num_cameras;
2270 }
2271
2272 GstAHCParameters *
2273 gst_ah_camera_get_parameters (GstAHCamera * self)
2274 {
2275   JNIEnv *env = gst_amc_jni_get_env ();
2276   GError *err = NULL;
2277   jobject object = NULL;
2278   GstAHCParameters *params = NULL;
2279
2280   gst_amc_jni_call_object_method (env, &err, self->object,
2281       android_hardware_camera.getParameters, &object);
2282   if (err) {
2283     GST_ERROR ("Failed to call android.hardware.Camera.getParameters: %s",
2284         err->message);
2285     g_clear_error (&err);
2286     return NULL;
2287   }
2288   if (!object) {
2289     GST_WARNING ("android.hardware.Camera.getParameter is NULL");
2290     return NULL;
2291   }
2292
2293   params = g_slice_new0 (GstAHCParameters);
2294   params->object = gst_amc_jni_object_ref (env, object);
2295   gst_amc_jni_object_local_unref (env, object);
2296   if (!params->object) {
2297     GST_ERROR ("Failed to create global reference");
2298     (*env)->ExceptionClear (env);
2299     g_slice_free (GstAHCParameters, params);
2300     return NULL;
2301   }
2302
2303   GST_DEBUG ("return parameters %p", params->object);
2304
2305   return params;
2306 }
2307
2308 gboolean
2309 gst_ah_camera_lock (GstAHCamera * self)
2310 {
2311   JNIEnv *env = gst_amc_jni_get_env ();
2312   GError *err = NULL;
2313
2314   gst_amc_jni_call_void_method (env, &err, self->object,
2315       android_hardware_camera.lock);
2316   if (err) {
2317     GST_ERROR ("Failed to call android.hardware.Camera.lock: %s", err->message);
2318     g_clear_error (&err);
2319     return FALSE;
2320   }
2321
2322   return TRUE;
2323 }
2324
2325 GstAHCamera *
2326 gst_ah_camera_open (gint camera_id)
2327 {
2328   JNIEnv *env = gst_amc_jni_get_env ();
2329   GError *err = NULL;
2330   jobject object = NULL;
2331   GstAHCamera *camera = NULL;
2332
2333   gst_amc_jni_call_static_object_method (env, &err,
2334       android_hardware_camera.klass, android_hardware_camera.open, &object,
2335       camera_id);
2336   if (err) {
2337     GST_ERROR ("Failed to call android.hardware.Camera.open: %s", err->message);
2338     g_clear_error (&err);
2339     goto done;
2340   }
2341
2342   if (object) {
2343     camera = g_slice_new0 (GstAHCamera);
2344     camera->object = gst_amc_jni_object_ref (env, object);
2345     gst_amc_jni_object_local_unref (env, object);
2346     if (!camera->object) {
2347       GST_ERROR ("Failed to create global reference");
2348       (*env)->ExceptionClear (env);
2349       g_slice_free (GstAHCamera, camera);
2350       camera = NULL;
2351     }
2352   }
2353
2354 done:
2355   return camera;
2356 }
2357
2358 gboolean
2359 gst_ah_camera_reconnect (GstAHCamera * self)
2360 {
2361   JNIEnv *env = gst_amc_jni_get_env ();
2362   GError *err = NULL;
2363
2364   gst_amc_jni_call_void_method (env, &err, self->object,
2365       android_hardware_camera.reconnect);
2366   if (err) {
2367     GST_ERROR ("Failed to call android.hardware.Camera.reconnect: %s",
2368         err->message);
2369     g_clear_error (&err);
2370     return FALSE;
2371   }
2372
2373   return TRUE;
2374 }
2375
2376 void
2377 gst_ah_camera_release (GstAHCamera * self)
2378 {
2379   JNIEnv *env = gst_amc_jni_get_env ();
2380   GError *err = NULL;
2381
2382   gst_amc_jni_call_void_method (env, &err, self->object,
2383       android_hardware_camera.release);
2384   if (err) {
2385     GST_ERROR ("Failed to call android.hardware.Camera.release: %s",
2386         err->message);
2387     g_clear_error (&err);
2388   }
2389 }
2390
2391 void
2392 gst_ah_camera_free (GstAHCamera * self)
2393 {
2394   JNIEnv *env = gst_amc_jni_get_env ();
2395
2396   gst_amc_jni_object_unref (env, self->object);
2397   g_slice_free (GstAHCamera, self);
2398 }
2399
2400
2401 gboolean
2402 gst_ah_camera_set_parameters (GstAHCamera * self, GstAHCParameters * params)
2403 {
2404   JNIEnv *env = gst_amc_jni_get_env ();
2405   GError *err = NULL;
2406
2407   gst_amc_jni_call_void_method (env, &err, self->object,
2408       android_hardware_camera.setParameters, params->object);
2409   if (err) {
2410     GST_ERROR ("Failed to call android.hardware.Camera.setParameters: %s",
2411         err->message);
2412     g_clear_error (&err);
2413     return FALSE;
2414   }
2415
2416   return TRUE;
2417 }
2418
2419 gboolean
2420 gst_ah_camera_set_error_callback (GstAHCamera * self, GstAHCErrorCallback cb,
2421     gpointer user_data)
2422 {
2423   JNIEnv *env = gst_amc_jni_get_env ();
2424   GError *err = NULL;
2425   jobject object = NULL;
2426   gboolean ret = FALSE;
2427
2428   if (cb) {
2429     object = gst_amc_jni_new_object (env,
2430         &err,
2431         FALSE,
2432         org_freedesktop_gstreamer_androidmedia_gstahccallback.klass,
2433         org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor,
2434         *((jlong *) & cb), *((jlong *) & user_data));
2435     if (err) {
2436       GST_ERROR
2437           ("Failed to create org.freedesktop.gstreamer.androidmedia.GstAhcCallback object");
2438       g_clear_error (&err);
2439       goto done;
2440     }
2441   }
2442
2443   gst_amc_jni_call_void_method (env, &err, self->object,
2444       android_hardware_camera.setErrorCallback, object);
2445   if (err) {
2446     GST_ERROR ("Failed to call android.hardware.Camera.setErrorCallback: %s",
2447         err->message);
2448     goto done;
2449   }
2450
2451   ret = TRUE;
2452 done:
2453   if (err)
2454     g_clear_error (&err);
2455   if (object)
2456     gst_amc_jni_object_local_unref (env, object);
2457
2458   return ret;
2459 }
2460
2461 gboolean
2462 gst_ah_camera_set_preview_callback_with_buffer (GstAHCamera * self,
2463     GstAHCPreviewCallback cb, gpointer user_data)
2464 {
2465   JNIEnv *env = gst_amc_jni_get_env ();
2466   GError *err = NULL;
2467   jobject object = NULL;
2468   gboolean ret = FALSE;
2469
2470   if (cb) {
2471     object = gst_amc_jni_new_object (env,
2472         &err,
2473         FALSE,
2474         org_freedesktop_gstreamer_androidmedia_gstahccallback.klass,
2475         org_freedesktop_gstreamer_androidmedia_gstahccallback.constructor,
2476         *((jlong *) & cb), *((jlong *) & user_data));
2477     if (err) {
2478       GST_ERROR
2479           ("Failed to create org.freedesktop.gstreamer.androidmedia.GstAhcCallback object");
2480       g_clear_error (&err);
2481       goto done;
2482     }
2483   }
2484
2485   gst_amc_jni_call_void_method (env, &err, self->object,
2486       android_hardware_camera.setPreviewCallbackWithBuffer, object);
2487   if (err) {
2488     GST_ERROR
2489         ("Failed to call android.hardware.Camera.setPreviewCallbackWithBuffer: %s",
2490         err->message);
2491     goto done;
2492   }
2493
2494   ret = TRUE;
2495 done:
2496   if (err)
2497     g_clear_error (&err);
2498   if (object)
2499     gst_amc_jni_object_local_unref (env, object);
2500
2501   return ret;
2502 }
2503
2504 void
2505 gst_ah_camera_set_preview_texture (GstAHCamera * self,
2506     GstAmcSurfaceTexture * surfaceTexture)
2507 {
2508   JNIEnv *env = gst_amc_jni_get_env ();
2509   GError *err = NULL;
2510
2511   gst_amc_jni_call_void_method (env, &err, self->object,
2512       android_hardware_camera.setPreviewTexture, surfaceTexture->jobject);
2513   if (err) {
2514     GST_ERROR ("Failed to call android.hardware.Camera.setPreviewTexture: %s",
2515         err->message);
2516     g_clear_error (&err);
2517   }
2518 }
2519
2520 gboolean
2521 gst_ah_camera_start_preview (GstAHCamera * self)
2522 {
2523   JNIEnv *env = gst_amc_jni_get_env ();
2524   GError *err = NULL;
2525
2526   gst_amc_jni_call_void_method (env, &err, self->object,
2527       android_hardware_camera.startPreview);
2528   if (err) {
2529     GST_ERROR ("Failed to call android.hardware.Camera.startPreview: %s",
2530         err->message);
2531     g_clear_error (&err);
2532     return FALSE;
2533   }
2534
2535   return TRUE;
2536 }
2537
2538 gboolean
2539 gst_ah_camera_start_smooth_zoom (GstAHCamera * self, gint value)
2540 {
2541   JNIEnv *env = gst_amc_jni_get_env ();
2542   GError *err = NULL;
2543
2544   gst_amc_jni_call_void_method (env, &err, self->object,
2545       android_hardware_camera.startSmoothZoom, value);
2546   if (err) {
2547     GST_ERROR ("Failed to call android.hardware.Camera.startSmoothZoom: %s",
2548         err->message);
2549     g_clear_error (&err);
2550     return FALSE;
2551   }
2552
2553   return TRUE;
2554 }
2555
2556 gboolean
2557 gst_ah_camera_stop_preview (GstAHCamera * self)
2558 {
2559   JNIEnv *env = gst_amc_jni_get_env ();
2560   GError *err = NULL;
2561
2562   gst_amc_jni_call_void_method (env, &err, self->object,
2563       android_hardware_camera.stopPreview);
2564   if (err) {
2565     GST_ERROR ("Failed to call android.hardware.Camera.stopPreview: %s",
2566         err->message);
2567     g_clear_error (&err);
2568     return FALSE;
2569   }
2570
2571   return TRUE;
2572 }
2573
2574 gboolean
2575 gst_ah_camera_stop_smooth_zoom (GstAHCamera * self)
2576 {
2577   JNIEnv *env = gst_amc_jni_get_env ();
2578   GError *err = NULL;
2579
2580   gst_amc_jni_call_void_method (env, &err, self->object,
2581       android_hardware_camera.stopSmoothZoom);
2582   if (err) {
2583     GST_ERROR ("Failed to call android.hardware.Camera.stopSmoothZoom: %s",
2584         err->message);
2585     g_clear_error (&err);
2586     return FALSE;
2587   }
2588
2589   return TRUE;
2590 }
2591
2592 gboolean
2593 gst_ah_camera_unlock (GstAHCamera * self)
2594 {
2595   JNIEnv *env = gst_amc_jni_get_env ();
2596   GError *err = NULL;
2597
2598   gst_amc_jni_call_void_method (env, &err, self->object,
2599       android_hardware_camera.unlock);
2600   if (err) {
2601     GST_ERROR ("Failed to call android.hardware.Camera.unlock: %s",
2602         err->message);
2603     g_clear_error (&err);
2604     return FALSE;
2605   }
2606
2607   return TRUE;
2608 }
2609
2610 /* android.hardware.Camera.Size */
2611 GstAHCSize *
2612 gst_ahc_size_new (gint width, gint height)
2613 {
2614   GstAHCSize *self = g_slice_new (GstAHCSize);
2615
2616   self->width = width;
2617   self->height = height;
2618
2619   return self;
2620 }
2621
2622 void
2623 gst_ahc_size_free (GstAHCSize * self)
2624 {
2625   g_slice_free (GstAHCSize, self);
2626 }
2627
2628 /* java.lang.String */
2629 static jboolean
2630 java_lang_string_equals (JNIEnv * env, jstring str, jstring obj)
2631 {
2632   return (*env)->CallBooleanMethod (env, str, java_lang_string.equals, obj);
2633 }
2634
2635 /* java.util.List */
2636 static jobject
2637 java_util_list_iterator (JNIEnv * env, jobject obj)
2638 {
2639   return (*env)->CallObjectMethod (env, obj, java_util_list.iterator);
2640 }
2641
2642 /* java.util.Iterator */
2643 static jobject
2644 java_util_iterator_next (JNIEnv * env, jobject obj)
2645 {
2646   return (*env)->CallObjectMethod (env, obj, java_util_iterator.next);
2647 }
2648
2649 static jboolean
2650 java_util_iterator_has_next (JNIEnv * env, jobject obj)
2651 {
2652   return (*env)->CallBooleanMethod (env, obj, java_util_iterator.hasNext);
2653 }
2654
2655 /* java.lang.Integer */
2656 static jint
2657 java_lang_integer_int_value (JNIEnv * env, jobject obj)
2658 {
2659   return (*env)->CallIntMethod (env, obj, java_lang_integer.intValue);
2660 }
2661
2662
2663 /* android.hardware.Camera.Parameters */
2664 static const gchar *
2665 _white_balance_to_gchar (JNIEnv * env, jstring white_balance)
2666 {
2667   if (!white_balance)
2668     return NULL;
2669
2670   if (java_lang_string_equals (env, white_balance,
2671           android_hardware_camera_parameters.WHITE_BALANCE_AUTO))
2672     return Parameters_WHITE_BALANCE_AUTO;
2673   else if (java_lang_string_equals (env, white_balance,
2674           android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT))
2675     return Parameters_WHITE_BALANCE_INCANDESCENT;
2676   else if (java_lang_string_equals (env, white_balance,
2677           android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT))
2678     return Parameters_WHITE_BALANCE_FLUORESCENT;
2679   else if (java_lang_string_equals (env, white_balance,
2680           android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT))
2681     return Parameters_WHITE_BALANCE_WARM_FLUORESCENT;
2682   else if (java_lang_string_equals (env, white_balance,
2683           android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT))
2684     return Parameters_WHITE_BALANCE_DAYLIGHT;
2685   else if (java_lang_string_equals (env, white_balance,
2686           android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT))
2687     return Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT;
2688   else if (java_lang_string_equals (env, white_balance,
2689           android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT))
2690     return Parameters_WHITE_BALANCE_TWILIGHT;
2691   else if (java_lang_string_equals (env, white_balance,
2692           android_hardware_camera_parameters.WHITE_BALANCE_SHADE))
2693     return Parameters_WHITE_BALANCE_SHADE;
2694
2695   return NULL;
2696 }
2697
2698 static jstring
2699 _white_balance_to_jstring (const gchar * white_balance)
2700 {
2701   if (!white_balance)
2702     return NULL;
2703
2704   if (!g_strcmp0 (white_balance, Parameters_WHITE_BALANCE_AUTO))
2705     return android_hardware_camera_parameters.WHITE_BALANCE_AUTO;
2706   else if (!g_strcmp0 (white_balance, Parameters_WHITE_BALANCE_INCANDESCENT))
2707     return android_hardware_camera_parameters.WHITE_BALANCE_INCANDESCENT;
2708   else if (!g_strcmp0 (white_balance, Parameters_WHITE_BALANCE_FLUORESCENT))
2709     return android_hardware_camera_parameters.WHITE_BALANCE_FLUORESCENT;
2710   else if (!g_strcmp0 (white_balance,
2711           Parameters_WHITE_BALANCE_WARM_FLUORESCENT))
2712     return android_hardware_camera_parameters.WHITE_BALANCE_WARM_FLUORESCENT;
2713   else if (!g_strcmp0 (white_balance, Parameters_WHITE_BALANCE_DAYLIGHT))
2714     return android_hardware_camera_parameters.WHITE_BALANCE_DAYLIGHT;
2715   else if (!g_strcmp0 (white_balance, Parameters_WHITE_BALANCE_CLOUDY_DAYLIGHT))
2716     return android_hardware_camera_parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT;
2717   else if (!g_strcmp0 (white_balance, Parameters_WHITE_BALANCE_TWILIGHT))
2718     return android_hardware_camera_parameters.WHITE_BALANCE_TWILIGHT;
2719   else if (!g_strcmp0 (white_balance, Parameters_WHITE_BALANCE_SHADE))
2720     return android_hardware_camera_parameters.WHITE_BALANCE_SHADE;
2721
2722   return NULL;
2723 }
2724
2725 static const gchar *
2726 _color_effect_to_gchar (JNIEnv * env, jstring color_effect)
2727 {
2728   if (!color_effect)
2729     return NULL;
2730
2731   if (java_lang_string_equals (env, color_effect,
2732           android_hardware_camera_parameters.EFFECT_NONE))
2733     return Parameters_EFFECT_NONE;
2734   else if (java_lang_string_equals (env, color_effect,
2735           android_hardware_camera_parameters.EFFECT_MONO))
2736     return Parameters_EFFECT_MONO;
2737   else if (java_lang_string_equals (env, color_effect,
2738           android_hardware_camera_parameters.EFFECT_NEGATIVE))
2739     return Parameters_EFFECT_NEGATIVE;
2740   else if (java_lang_string_equals (env, color_effect,
2741           android_hardware_camera_parameters.EFFECT_SOLARIZE))
2742     return Parameters_EFFECT_SOLARIZE;
2743   else if (java_lang_string_equals (env, color_effect,
2744           android_hardware_camera_parameters.EFFECT_SEPIA))
2745     return Parameters_EFFECT_SEPIA;
2746   else if (java_lang_string_equals (env, color_effect,
2747           android_hardware_camera_parameters.EFFECT_POSTERIZE))
2748     return Parameters_EFFECT_POSTERIZE;
2749   else if (java_lang_string_equals (env, color_effect,
2750           android_hardware_camera_parameters.EFFECT_WHITEBOARD))
2751     return Parameters_EFFECT_WHITEBOARD;
2752   else if (java_lang_string_equals (env, color_effect,
2753           android_hardware_camera_parameters.EFFECT_BLACKBOARD))
2754     return Parameters_EFFECT_BLACKBOARD;
2755   else if (java_lang_string_equals (env, color_effect,
2756           android_hardware_camera_parameters.EFFECT_AQUA))
2757     return Parameters_EFFECT_AQUA;
2758
2759   return NULL;
2760 }
2761
2762 static jstring
2763 _color_effect_to_jstring (const gchar * color_effect)
2764 {
2765   if (!color_effect)
2766     return NULL;
2767
2768   if (!g_strcmp0 (color_effect, Parameters_EFFECT_NONE))
2769     return android_hardware_camera_parameters.EFFECT_NONE;
2770   else if (!g_strcmp0 (color_effect, Parameters_EFFECT_MONO))
2771     return android_hardware_camera_parameters.EFFECT_MONO;
2772   else if (!g_strcmp0 (color_effect, Parameters_EFFECT_NEGATIVE))
2773     return android_hardware_camera_parameters.EFFECT_NEGATIVE;
2774   else if (!g_strcmp0 (color_effect, Parameters_EFFECT_SOLARIZE))
2775     return android_hardware_camera_parameters.EFFECT_SOLARIZE;
2776   else if (!g_strcmp0 (color_effect, Parameters_EFFECT_SEPIA))
2777     return android_hardware_camera_parameters.EFFECT_SEPIA;
2778   else if (!g_strcmp0 (color_effect, Parameters_EFFECT_POSTERIZE))
2779     return android_hardware_camera_parameters.EFFECT_POSTERIZE;
2780   else if (!g_strcmp0 (color_effect, Parameters_EFFECT_WHITEBOARD))
2781     return android_hardware_camera_parameters.EFFECT_WHITEBOARD;
2782   else if (!g_strcmp0 (color_effect, Parameters_EFFECT_BLACKBOARD))
2783     return android_hardware_camera_parameters.EFFECT_BLACKBOARD;
2784   else if (!g_strcmp0 (color_effect, Parameters_EFFECT_AQUA))
2785     return android_hardware_camera_parameters.EFFECT_AQUA;
2786
2787   return NULL;
2788 }
2789
2790 static const gchar *
2791 _antibanding_to_gchar (JNIEnv * env, jstring antibanding)
2792 {
2793   if (!antibanding)
2794     return NULL;
2795
2796   if (java_lang_string_equals (env, antibanding,
2797           android_hardware_camera_parameters.ANTIBANDING_AUTO))
2798     return Parameters_ANTIBANDING_AUTO;
2799   else if (java_lang_string_equals (env, antibanding,
2800           android_hardware_camera_parameters.ANTIBANDING_50HZ))
2801     return Parameters_ANTIBANDING_50HZ;
2802   else if (java_lang_string_equals (env, antibanding,
2803           android_hardware_camera_parameters.ANTIBANDING_60HZ))
2804     return Parameters_ANTIBANDING_60HZ;
2805   else if (java_lang_string_equals (env, antibanding,
2806           android_hardware_camera_parameters.ANTIBANDING_OFF))
2807     return Parameters_ANTIBANDING_OFF;
2808
2809   return NULL;
2810 }
2811
2812 static jstring
2813 _antibanding_to_jstring (const gchar * antibanding)
2814 {
2815   if (!antibanding)
2816     return NULL;
2817
2818   if (!g_strcmp0 (antibanding, Parameters_ANTIBANDING_AUTO))
2819     return android_hardware_camera_parameters.ANTIBANDING_AUTO;
2820   else if (!g_strcmp0 (antibanding, Parameters_ANTIBANDING_50HZ))
2821     return android_hardware_camera_parameters.ANTIBANDING_50HZ;
2822   else if (!g_strcmp0 (antibanding, Parameters_ANTIBANDING_60HZ))
2823     return android_hardware_camera_parameters.ANTIBANDING_60HZ;
2824   else if (!g_strcmp0 (antibanding, Parameters_ANTIBANDING_OFF))
2825     return android_hardware_camera_parameters.ANTIBANDING_OFF;
2826
2827   return NULL;
2828 }
2829
2830 static const gchar *
2831 _flash_mode_to_gchar (JNIEnv * env, jstring flash_mode)
2832 {
2833   if (!flash_mode)
2834     return NULL;
2835
2836   if (java_lang_string_equals (env, flash_mode,
2837           android_hardware_camera_parameters.FLASH_MODE_OFF))
2838     return Parameters_FLASH_MODE_OFF;
2839   else if (java_lang_string_equals (env, flash_mode,
2840           android_hardware_camera_parameters.FLASH_MODE_AUTO))
2841     return Parameters_FLASH_MODE_AUTO;
2842   else if (java_lang_string_equals (env, flash_mode,
2843           android_hardware_camera_parameters.FLASH_MODE_ON))
2844     return Parameters_FLASH_MODE_ON;
2845   else if (java_lang_string_equals (env, flash_mode,
2846           android_hardware_camera_parameters.FLASH_MODE_RED_EYE))
2847     return Parameters_FLASH_MODE_RED_EYE;
2848   else if (java_lang_string_equals (env, flash_mode,
2849           android_hardware_camera_parameters.FLASH_MODE_TORCH))
2850     return Parameters_FLASH_MODE_TORCH;
2851
2852   return NULL;
2853 }
2854
2855 static jstring
2856 _flash_mode_to_jstring (const gchar * flash_mode)
2857 {
2858   if (!flash_mode)
2859     return NULL;
2860
2861   if (!g_strcmp0 (flash_mode, Parameters_FLASH_MODE_OFF))
2862     return android_hardware_camera_parameters.FLASH_MODE_OFF;
2863   else if (!g_strcmp0 (flash_mode, Parameters_FLASH_MODE_AUTO))
2864     return android_hardware_camera_parameters.FLASH_MODE_AUTO;
2865   else if (!g_strcmp0 (flash_mode, Parameters_FLASH_MODE_ON))
2866     return android_hardware_camera_parameters.FLASH_MODE_ON;
2867   else if (!g_strcmp0 (flash_mode, Parameters_FLASH_MODE_RED_EYE))
2868     return android_hardware_camera_parameters.FLASH_MODE_RED_EYE;
2869   else if (!g_strcmp0 (flash_mode, Parameters_FLASH_MODE_TORCH))
2870     return android_hardware_camera_parameters.FLASH_MODE_TORCH;
2871
2872   return NULL;
2873 }
2874
2875 static const gchar *
2876 _scene_mode_to_gchar (JNIEnv * env, jstring scene_mode)
2877 {
2878   if (!scene_mode)
2879     return NULL;
2880
2881   if (java_lang_string_equals (env, scene_mode,
2882           android_hardware_camera_parameters.SCENE_MODE_AUTO))
2883     return Parameters_SCENE_MODE_AUTO;
2884   else if (java_lang_string_equals (env, scene_mode,
2885           android_hardware_camera_parameters.SCENE_MODE_ACTION))
2886     return Parameters_SCENE_MODE_ACTION;
2887   else if (java_lang_string_equals (env, scene_mode,
2888           android_hardware_camera_parameters.SCENE_MODE_PORTRAIT))
2889     return Parameters_SCENE_MODE_PORTRAIT;
2890   else if (java_lang_string_equals (env, scene_mode,
2891           android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE))
2892     return Parameters_SCENE_MODE_LANDSCAPE;
2893   else if (java_lang_string_equals (env, scene_mode,
2894           android_hardware_camera_parameters.SCENE_MODE_NIGHT))
2895     return Parameters_SCENE_MODE_NIGHT;
2896   else if (java_lang_string_equals (env, scene_mode,
2897           android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT))
2898     return Parameters_SCENE_MODE_NIGHT_PORTRAIT;
2899   else if (java_lang_string_equals (env, scene_mode,
2900           android_hardware_camera_parameters.SCENE_MODE_THEATRE))
2901     return Parameters_SCENE_MODE_THEATRE;
2902   else if (java_lang_string_equals (env, scene_mode,
2903           android_hardware_camera_parameters.SCENE_MODE_BEACH))
2904     return Parameters_SCENE_MODE_BEACH;
2905   else if (java_lang_string_equals (env, scene_mode,
2906           android_hardware_camera_parameters.SCENE_MODE_SNOW))
2907     return Parameters_SCENE_MODE_SNOW;
2908   else if (java_lang_string_equals (env, scene_mode,
2909           android_hardware_camera_parameters.SCENE_MODE_SUNSET))
2910     return Parameters_SCENE_MODE_SUNSET;
2911   else if (java_lang_string_equals (env, scene_mode,
2912           android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO))
2913     return Parameters_SCENE_MODE_STEADYPHOTO;
2914   else if (java_lang_string_equals (env, scene_mode,
2915           android_hardware_camera_parameters.SCENE_MODE_FIREWORKS))
2916     return Parameters_SCENE_MODE_FIREWORKS;
2917   else if (java_lang_string_equals (env, scene_mode,
2918           android_hardware_camera_parameters.SCENE_MODE_SPORTS))
2919     return Parameters_SCENE_MODE_SPORTS;
2920   else if (java_lang_string_equals (env, scene_mode,
2921           android_hardware_camera_parameters.SCENE_MODE_PARTY))
2922     return Parameters_SCENE_MODE_PARTY;
2923   else if (java_lang_string_equals (env, scene_mode,
2924           android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT))
2925     return Parameters_SCENE_MODE_CANDLELIGHT;
2926   else if (java_lang_string_equals (env, scene_mode,
2927           android_hardware_camera_parameters.SCENE_MODE_BARCODE))
2928     return Parameters_SCENE_MODE_BARCODE;
2929
2930   return NULL;
2931 }
2932
2933 static const jstring
2934 _scene_mode_to_jstring (const gchar * scene_mode)
2935 {
2936   if (!scene_mode)
2937     return NULL;
2938
2939   if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_AUTO))
2940     return android_hardware_camera_parameters.SCENE_MODE_AUTO;
2941   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_ACTION))
2942     return android_hardware_camera_parameters.SCENE_MODE_ACTION;
2943   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_PORTRAIT))
2944     return android_hardware_camera_parameters.SCENE_MODE_PORTRAIT;
2945   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_LANDSCAPE))
2946     return android_hardware_camera_parameters.SCENE_MODE_LANDSCAPE;
2947   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_NIGHT))
2948     return android_hardware_camera_parameters.SCENE_MODE_NIGHT;
2949   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_NIGHT_PORTRAIT))
2950     return android_hardware_camera_parameters.SCENE_MODE_NIGHT_PORTRAIT;
2951   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_THEATRE))
2952     return android_hardware_camera_parameters.SCENE_MODE_THEATRE;
2953   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_BEACH))
2954     return android_hardware_camera_parameters.SCENE_MODE_BEACH;
2955   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_SNOW))
2956     return android_hardware_camera_parameters.SCENE_MODE_SNOW;
2957   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_SUNSET))
2958     return android_hardware_camera_parameters.SCENE_MODE_SUNSET;
2959   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_STEADYPHOTO))
2960     return android_hardware_camera_parameters.SCENE_MODE_STEADYPHOTO;
2961   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_FIREWORKS))
2962     return android_hardware_camera_parameters.SCENE_MODE_FIREWORKS;
2963   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_SPORTS))
2964     return android_hardware_camera_parameters.SCENE_MODE_SPORTS;
2965   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_PARTY))
2966     return android_hardware_camera_parameters.SCENE_MODE_PARTY;
2967   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_CANDLELIGHT))
2968     return android_hardware_camera_parameters.SCENE_MODE_CANDLELIGHT;
2969   else if (!g_strcmp0 (scene_mode, Parameters_SCENE_MODE_BARCODE))
2970     return android_hardware_camera_parameters.SCENE_MODE_BARCODE;
2971
2972   return NULL;
2973 }
2974
2975 static const gchar *
2976 _focus_mode_to_gchar (JNIEnv * env, jstring focus_mode)
2977 {
2978   if (!focus_mode)
2979     return NULL;
2980
2981   if (java_lang_string_equals (env, focus_mode,
2982           android_hardware_camera_parameters.FOCUS_MODE_AUTO))
2983     return Parameters_FOCUS_MODE_AUTO;
2984   else if (java_lang_string_equals (env, focus_mode,
2985           android_hardware_camera_parameters.FOCUS_MODE_INFINITY))
2986     return Parameters_FOCUS_MODE_INFINITY;
2987   else if (java_lang_string_equals (env, focus_mode,
2988           android_hardware_camera_parameters.FOCUS_MODE_MACRO))
2989     return Parameters_FOCUS_MODE_MACRO;
2990   else if (java_lang_string_equals (env, focus_mode,
2991           android_hardware_camera_parameters.FOCUS_MODE_FIXED))
2992     return Parameters_FOCUS_MODE_FIXED;
2993   else if (java_lang_string_equals (env, focus_mode,
2994           android_hardware_camera_parameters.FOCUS_MODE_EDOF))
2995     return Parameters_FOCUS_MODE_EDOF;
2996   else if (java_lang_string_equals (env, focus_mode,
2997           android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO))
2998     return Parameters_FOCUS_MODE_CONTINUOUS_VIDEO;
2999   else if (java_lang_string_equals (env, focus_mode,
3000           android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE))
3001     return Parameters_FOCUS_MODE_CONTINUOUS_PICTURE;
3002
3003   return NULL;
3004 }
3005
3006 static jstring
3007 _focus_mode_to_jstring (const gchar * focus_mode)
3008 {
3009   if (!focus_mode)
3010     return NULL;
3011
3012   if (!g_strcmp0 (focus_mode, Parameters_FOCUS_MODE_AUTO))
3013     return android_hardware_camera_parameters.FOCUS_MODE_AUTO;
3014   else if (!g_strcmp0 (focus_mode, Parameters_FOCUS_MODE_INFINITY))
3015     return android_hardware_camera_parameters.FOCUS_MODE_INFINITY;
3016   else if (!g_strcmp0 (focus_mode, Parameters_FOCUS_MODE_MACRO))
3017     return android_hardware_camera_parameters.FOCUS_MODE_MACRO;
3018   else if (!g_strcmp0 (focus_mode, Parameters_FOCUS_MODE_FIXED))
3019     return android_hardware_camera_parameters.FOCUS_MODE_FIXED;
3020   else if (!g_strcmp0 (focus_mode, Parameters_FOCUS_MODE_EDOF))
3021     return android_hardware_camera_parameters.FOCUS_MODE_EDOF;
3022   else if (!g_strcmp0 (focus_mode, Parameters_FOCUS_MODE_CONTINUOUS_VIDEO))
3023     return android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_VIDEO;
3024   else if (!g_strcmp0 (focus_mode, Parameters_FOCUS_MODE_CONTINUOUS_PICTURE))
3025     return android_hardware_camera_parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
3026
3027   return NULL;
3028 }
3029
3030 gchar *
3031 gst_ahc_parameters_flatten (GstAHCParameters * self)
3032 {
3033   JNIEnv *env = gst_amc_jni_get_env ();
3034   GError *err = NULL;
3035   jstring v_str = NULL;
3036   const gchar *v = NULL;
3037   gchar *ret = NULL;
3038
3039   gst_amc_jni_call_object_method (env, &err, self->object,
3040       android_hardware_camera_parameters.flatten, &v_str);
3041   if (err) {
3042     GST_ERROR ("Failed to call android.hardware.Camera.Parameters.flatten: %s",
3043         err->message);
3044     goto done;
3045   }
3046
3047   v = (*env)->GetStringUTFChars (env, v_str, NULL);
3048   if (!v) {
3049     GST_ERROR ("Failed to convert string to UTF8");
3050     (*env)->ExceptionClear (env);
3051     goto done;
3052   }
3053
3054   ret = g_strdup (v);
3055 done:
3056   if (err)
3057     g_clear_error (&err);
3058   if (v)
3059     (*env)->ReleaseStringUTFChars (env, v_str, v);
3060   if (v_str)
3061     gst_amc_jni_object_local_unref (env, v_str);
3062
3063   return ret;
3064 }
3065
3066 const gchar *
3067 gst_ahc_parameters_get_antibanding (GstAHCParameters * self)
3068 {
3069   JNIEnv *env = gst_amc_jni_get_env ();
3070   GError *err = NULL;
3071   const gchar *ret = NULL;
3072   jstring antibanding;
3073
3074   gst_amc_jni_call_object_method (env, &err, self->object,
3075       android_hardware_camera_parameters.getAntibanding, &antibanding);
3076   if (err) {
3077     GST_ERROR
3078         ("Failed to call android.hardware.Camera.Parameters.getAntibanding: %s",
3079         err->message);
3080     g_clear_error (&err);
3081     return NULL;
3082   }
3083
3084   ret = _antibanding_to_gchar (env, antibanding);
3085
3086   if (antibanding)
3087     gst_amc_jni_object_local_unref (env, antibanding);
3088
3089   return ret;
3090 }
3091
3092 const gchar *
3093 gst_ahc_parameters_get_color_effect (GstAHCParameters * self)
3094 {
3095   JNIEnv *env = gst_amc_jni_get_env ();
3096   GError *err = NULL;
3097   const gchar *ret = NULL;
3098   jstring color_effect;
3099
3100   gst_amc_jni_call_object_method (env, &err, self->object,
3101       android_hardware_camera_parameters.getColorEffect, &color_effect);
3102   if (err) {
3103     GST_ERROR
3104         ("Failed to call android.hardware.Camera.Parameters.getColorEffect: %s",
3105         err->message);
3106     g_clear_error (&err);
3107     return NULL;
3108   }
3109
3110   ret = _color_effect_to_gchar (env, color_effect);
3111
3112   if (color_effect)
3113     gst_amc_jni_object_local_unref (env, color_effect);
3114
3115   return ret;
3116 }
3117
3118 gint
3119 gst_ahc_parameters_get_exposure_compensation (GstAHCParameters * self)
3120 {
3121   JNIEnv *env = gst_amc_jni_get_env ();
3122   GError *err = NULL;
3123   gint ev;
3124
3125   gst_amc_jni_call_int_method (env, &err, self->object,
3126       android_hardware_camera_parameters.getExposureCompensation, &ev);
3127   if (err) {
3128     GST_ERROR
3129         ("Failed to call android.hardware.Camera.Parameters.getExposureCompensation: %s",
3130         err->message);
3131     g_clear_error (&err);
3132     return -1;
3133   }
3134
3135   return ev;
3136 }
3137
3138 gfloat
3139 gst_ahc_parameters_get_exposure_compensation_step (GstAHCParameters * self)
3140 {
3141   JNIEnv *env = gst_amc_jni_get_env ();
3142   GError *err = NULL;
3143   gfloat step;
3144
3145   gst_amc_jni_call_float_method (env, &err, self->object,
3146       android_hardware_camera_parameters.getExposureCompensationStep, &step);
3147   if (err) {
3148     GST_ERROR
3149         ("Failed to call android.hardware.Camera.Parameters.getExposureCompensationStep: %s",
3150         err->message);
3151     g_clear_error (&err);
3152     return 0.0;
3153   }
3154
3155   return step;
3156 }
3157
3158 const gchar *
3159 gst_ahc_parameters_get_flash_mode (GstAHCParameters * self)
3160 {
3161   JNIEnv *env = gst_amc_jni_get_env ();
3162   GError *err = NULL;
3163   const gchar *ret = NULL;
3164   jstring flash_mode;
3165
3166   gst_amc_jni_call_object_method (env, &err, self->object,
3167       android_hardware_camera_parameters.getFlashMode, &flash_mode);
3168   if (err) {
3169     GST_ERROR
3170         ("Failed to call android.hardware.Camera.Parameters.getFlashMode: %s",
3171         err->message);
3172     g_clear_error (&err);
3173     return NULL;
3174   }
3175
3176   ret = _flash_mode_to_gchar (env, flash_mode);
3177
3178   if (flash_mode)
3179     gst_amc_jni_object_local_unref (env, flash_mode);
3180
3181   return ret;
3182 }
3183
3184 gfloat
3185 gst_ahc_parameters_get_focal_length (GstAHCParameters * self)
3186 {
3187   JNIEnv *env = gst_amc_jni_get_env ();
3188   GError *err = NULL;
3189   gfloat length;
3190
3191   gst_amc_jni_call_float_method (env, &err, self->object,
3192       android_hardware_camera_parameters.getFocalLength, &length);
3193   if (err) {
3194     GST_ERROR
3195         ("Failed to call android.hardware.Camera.Parameters.getFocalLength: %s",
3196         err->message);
3197     g_clear_error (&err);
3198     return 0.0;
3199   }
3200
3201   return length;
3202 }
3203
3204 const gchar *
3205 gst_ahc_parameters_get_focus_mode (GstAHCParameters * self)
3206 {
3207   JNIEnv *env = gst_amc_jni_get_env ();
3208   GError *err = NULL;
3209   const gchar *ret = NULL;
3210   jstring focus_mode;
3211
3212   gst_amc_jni_call_object_method (env, &err, self->object,
3213       android_hardware_camera_parameters.getFocusMode, &focus_mode);
3214   if (err) {
3215     GST_ERROR
3216         ("Failed to call android.hardware.Camera.Parameters.getFocusMode: %s",
3217         err->message);
3218     g_clear_error (&err);
3219     return NULL;
3220   }
3221
3222   ret = _focus_mode_to_gchar (env, focus_mode);
3223
3224   if (focus_mode)
3225     gst_amc_jni_object_local_unref (env, focus_mode);
3226
3227   return ret;
3228 }
3229
3230 gfloat
3231 gst_ahc_parameters_get_horizontal_view_angle (GstAHCParameters * self)
3232 {
3233   JNIEnv *env = gst_amc_jni_get_env ();
3234   GError *err = NULL;
3235   gfloat angle;
3236
3237   gst_amc_jni_call_float_method (env, &err, self->object,
3238       android_hardware_camera_parameters.getHorizontalViewAngle, &angle);
3239   if (err) {
3240     GST_ERROR
3241         ("Failed to call android.hardware.Camera.Parameters.getHorizontalViewAngle: %s",
3242         err->message);
3243     g_clear_error (&err);
3244     return 0.0;
3245   }
3246
3247   return angle;
3248 }
3249
3250 gint
3251 gst_ahc_parameters_get_max_exposure_compensation (GstAHCParameters * self)
3252 {
3253   JNIEnv *env = gst_amc_jni_get_env ();
3254   GError *err = NULL;
3255   gint max;
3256
3257   gst_amc_jni_call_int_method (env, &err, self->object,
3258       android_hardware_camera_parameters.getMaxExposureCompensation, &max);
3259   if (err) {
3260     GST_ERROR
3261         ("Failed to call android.hardware.Camera.Parameters.getMaxExposureCompensation: %s",
3262         err->message);
3263     g_clear_error (&err);
3264     return 0;
3265   }
3266
3267   return max;
3268 }
3269
3270 gint
3271 gst_ahc_parameters_get_max_zoom (GstAHCParameters * self)
3272 {
3273   JNIEnv *env = gst_amc_jni_get_env ();
3274   GError *err = NULL;
3275   gint max;
3276
3277   gst_amc_jni_call_int_method (env, &err, self->object,
3278       android_hardware_camera_parameters.getMaxZoom, &max);
3279   if (err) {
3280     GST_ERROR
3281         ("Failed to call android.hardware.Camera.Parameters.getMaxZoom: %s",
3282         err->message);
3283     g_clear_error (&err);
3284     return -1;
3285   }
3286
3287   return max;
3288 }
3289
3290 gint
3291 gst_ahc_parameters_get_min_exposure_compensation (GstAHCParameters * self)
3292 {
3293   JNIEnv *env = gst_amc_jni_get_env ();
3294   GError *err = NULL;
3295   gint min;
3296
3297   gst_amc_jni_call_int_method (env, &err, self->object,
3298       android_hardware_camera_parameters.getMinExposureCompensation, &min);
3299   if (err) {
3300     GST_ERROR
3301         ("Failed to call android.hardware.Camera.Parameters.getMinExposureCompensation: %s",
3302         err->message);
3303     g_clear_error (&err);
3304     return 0;
3305   }
3306
3307   return min;
3308 }
3309
3310 gint
3311 gst_ahc_parameters_get_preview_format (GstAHCParameters * self)
3312 {
3313   JNIEnv *env = gst_amc_jni_get_env ();
3314   GError *err = NULL;
3315   gint format;
3316
3317   gst_amc_jni_call_int_method (env, &err, self->object,
3318       android_hardware_camera_parameters.getPreviewFormat, &format);
3319   if (err) {
3320     GST_ERROR
3321         ("Failed to call android.hardware.Camera.Parameters.getPreviewFormat: %s",
3322         err->message);
3323     g_clear_error (&err);
3324     return 0;
3325   }
3326
3327   return format;
3328 }
3329
3330 gboolean
3331 gst_ahc_parameters_get_preview_fps_range (GstAHCParameters * self,
3332     gint * min, gint * max)
3333 {
3334   JNIEnv *env = gst_amc_jni_get_env ();
3335   GError *err = NULL;
3336   gboolean ret = FALSE;
3337   jintArray range = NULL;
3338   jint *fps = NULL;
3339
3340   range = (*env)->NewIntArray (env, 2);
3341   if (!fps) {
3342     (*env)->ExceptionClear (env);
3343     GST_ERROR ("Failed to create array");
3344     goto done;
3345   }
3346
3347   gst_amc_jni_call_void_method (env, &err, self->object,
3348       android_hardware_camera_parameters.getPreviewFpsRange, range);
3349   if (err) {
3350     GST_ERROR
3351         ("Failed to call android.hardware.Camera.Parameters.getPreviewFpsRange: %s",
3352         err->message);
3353     goto done;
3354   }
3355
3356   fps = (*env)->GetIntArrayElements (env, range, NULL);
3357   if ((*env)->ExceptionCheck (env) || !fps) {
3358     (*env)->ExceptionClear (env);
3359     GST_ERROR ("Failed to get array elements");
3360     goto done;
3361   }
3362   if (min)
3363     *min = fps[0];
3364   if (max)
3365     *max = fps[1];
3366
3367   ret = TRUE;
3368 done:
3369   if (err)
3370     g_clear_error (&err);
3371   if (fps)
3372     (*env)->ReleaseIntArrayElements (env, range, fps, JNI_ABORT);
3373   if (range)
3374     gst_amc_jni_object_local_unref (env, range);
3375
3376   return ret;
3377 }
3378
3379 GstAHCSize *
3380 gst_ahc_parameters_get_preview_size (GstAHCParameters * self)
3381 {
3382   JNIEnv *env = gst_amc_jni_get_env ();
3383   GError *err = NULL;
3384   jobject jsize = NULL;
3385   GstAHCSize *size = NULL;
3386
3387   gst_amc_jni_call_object_method (env, &err, self->object,
3388       android_hardware_camera_parameters.getPreviewSize, &jsize);
3389   if (err) {
3390     GST_ERROR
3391         ("Failed to call android.hardware.Camera.Parameters.getPreviewSize: %s",
3392         err->message);
3393     goto done;
3394   }
3395
3396   size = g_slice_new (GstAHCSize);
3397   size->width = (*env)->GetIntField (env, jsize,
3398       android_hardware_camera_size.width);
3399   if ((*env)->ExceptionCheck (env)) {
3400     GST_ERROR ("Failed to get Camera.Size.width field");
3401     (*env)->ExceptionClear (env);
3402     g_slice_free (GstAHCSize, size);
3403     size = NULL;
3404     goto done;
3405   }
3406
3407   size->height = (*env)->GetIntField (env, jsize,
3408       android_hardware_camera_size.height);
3409   if ((*env)->ExceptionCheck (env)) {
3410     GST_ERROR ("Failed to get Camera.Size.height field");
3411     (*env)->ExceptionClear (env);
3412     g_slice_free (GstAHCSize, size);
3413     size = NULL;
3414     goto done;
3415   }
3416
3417 done:
3418   if (err)
3419     g_clear_error (&err);
3420   if (jsize)
3421     gst_amc_jni_object_local_unref (env, jsize);
3422
3423   return size;
3424 }
3425
3426 const gchar *
3427 gst_ahc_parameters_get_scene_mode (GstAHCParameters * self)
3428 {
3429   JNIEnv *env = gst_amc_jni_get_env ();
3430   GError *err = NULL;
3431   const gchar *ret = NULL;
3432   jstring scene_mode;
3433
3434   gst_amc_jni_call_object_method (env, &err, self->object,
3435       android_hardware_camera_parameters.getSceneMode, &scene_mode);
3436   if (err) {
3437     GST_ERROR
3438         ("Failed to call android.hardware.Camera.Parameters.getSceneMode: %s",
3439         err->message);
3440     g_clear_error (&err);
3441     return NULL;
3442   }
3443
3444   ret = _scene_mode_to_gchar (env, scene_mode);
3445
3446   if (scene_mode)
3447     gst_amc_jni_object_local_unref (env, scene_mode);
3448
3449   return ret;
3450 }
3451
3452 GList *
3453 gst_ahc_parameters_get_supported_antibanding (GstAHCParameters * self)
3454 {
3455   JNIEnv *env = gst_amc_jni_get_env ();
3456   GError *err = NULL;
3457   jobject list = NULL;
3458   GList *ret = NULL;
3459
3460   gst_amc_jni_call_object_method (env, &err, self->object,
3461       android_hardware_camera_parameters.getSupportedAntibanding, &list);
3462   if (err) {
3463     GST_ERROR
3464         ("Failed to call android.hardware.Camera.Parameters.getSupportedAntibanding: %s",
3465         err->message);
3466     g_clear_error (&err);
3467     return NULL;
3468   }
3469
3470   if (list) {
3471     jobject iterator = NULL;
3472
3473     iterator = java_util_list_iterator (env, list);
3474     if (iterator) {
3475       while (java_util_iterator_has_next (env, iterator)) {
3476         jobject str = java_util_iterator_next (env, iterator);
3477
3478         if (str) {
3479           const gchar *value = _antibanding_to_gchar (env, str);
3480
3481           ret = g_list_append (ret, (gchar *) value);
3482           gst_amc_jni_object_local_unref (env, str);
3483         }
3484       }
3485       gst_amc_jni_object_local_unref (env, iterator);
3486     }
3487     gst_amc_jni_object_local_unref (env, list);
3488   }
3489
3490   return ret;
3491 }
3492
3493 void
3494 gst_ahc_parameters_supported_antibanding_free (GList * list)
3495 {
3496   g_list_free (list);
3497 }
3498
3499 GList *
3500 gst_ahc_parameters_get_supported_color_effects (GstAHCParameters * self)
3501 {
3502   JNIEnv *env = gst_amc_jni_get_env ();
3503   GError *err = NULL;
3504   jobject list = NULL;
3505   GList *ret = NULL;
3506
3507   gst_amc_jni_call_object_method (env, &err, self->object,
3508       android_hardware_camera_parameters.getSupportedColorEffects, &list);
3509   if (err) {
3510     GST_ERROR
3511         ("Failed to call android.hardware.Camera.Parameters.getSupportedColorEffects: %s",
3512         err->message);
3513     g_clear_error (&err);
3514     return NULL;
3515   }
3516
3517   if (list) {
3518     jobject iterator = NULL;
3519
3520     iterator = java_util_list_iterator (env, list);
3521     if (iterator) {
3522       while (java_util_iterator_has_next (env, iterator)) {
3523         jobject str = java_util_iterator_next (env, iterator);
3524
3525         if (str) {
3526           const gchar *value = _color_effect_to_gchar (env, str);
3527
3528           ret = g_list_append (ret, (gchar *) value);
3529           gst_amc_jni_object_local_unref (env, str);
3530         }
3531       }
3532       gst_amc_jni_object_local_unref (env, iterator);
3533     }
3534     gst_amc_jni_object_local_unref (env, list);
3535   }
3536
3537   return ret;
3538 }
3539
3540 void
3541 gst_ahc_parameters_supported_color_effects_free (GList * list)
3542 {
3543   g_list_free (list);
3544 }
3545
3546 GList *
3547 gst_ahc_parameters_get_supported_flash_modes (GstAHCParameters * self)
3548 {
3549   JNIEnv *env = gst_amc_jni_get_env ();
3550   GError *err = NULL;
3551   jobject list = NULL;
3552   GList *ret = NULL;
3553
3554   gst_amc_jni_call_object_method (env, &err, self->object,
3555       android_hardware_camera_parameters.getSupportedFlashModes, &list);
3556   if (err) {
3557     GST_ERROR
3558         ("Failed to call android.hardware.Camera.Parameters.getSupportedFlashModes: %s",
3559         err->message);
3560     g_clear_error (&err);
3561     return NULL;
3562   }
3563
3564   if (list) {
3565     jobject iterator = NULL;
3566
3567     iterator = java_util_list_iterator (env, list);
3568     if (iterator) {
3569       while (java_util_iterator_has_next (env, iterator)) {
3570         jobject str = java_util_iterator_next (env, iterator);
3571
3572         if (str) {
3573           const gchar *value = _flash_mode_to_gchar (env, str);
3574
3575           ret = g_list_append (ret, (gchar *) value);
3576           gst_amc_jni_object_local_unref (env, str);
3577         }
3578       }
3579       gst_amc_jni_object_local_unref (env, iterator);
3580     }
3581     gst_amc_jni_object_local_unref (env, list);
3582   }
3583
3584   return ret;
3585 }
3586
3587 void
3588 gst_ahc_parameters_supported_flash_modes_free (GList * list)
3589 {
3590   g_list_free (list);
3591 }
3592
3593 GList *
3594 gst_ahc_parameters_get_supported_focus_modes (GstAHCParameters * self)
3595 {
3596   JNIEnv *env = gst_amc_jni_get_env ();
3597   GError *err = NULL;
3598   jobject list = NULL;
3599   GList *ret = NULL;
3600
3601   gst_amc_jni_call_object_method (env, &err, self->object,
3602       android_hardware_camera_parameters.getSupportedFocusModes, &list);
3603   if (err) {
3604     GST_ERROR
3605         ("Failed to call android.hardware.Camera.Parameters.getSupportedFocusModes: %s",
3606         err->message);
3607     g_clear_error (&err);
3608     return NULL;
3609   }
3610
3611   if (list) {
3612     jobject iterator = NULL;
3613
3614     iterator = java_util_list_iterator (env, list);
3615     if (iterator) {
3616       while (java_util_iterator_has_next (env, iterator)) {
3617         jobject str = java_util_iterator_next (env, iterator);
3618
3619         if (str) {
3620           const gchar *value = _focus_mode_to_gchar (env, str);
3621
3622           ret = g_list_append (ret, (gchar *) value);
3623           gst_amc_jni_object_local_unref (env, str);
3624         }
3625       }
3626       gst_amc_jni_object_local_unref (env, iterator);
3627     }
3628     gst_amc_jni_object_local_unref (env, list);
3629   }
3630
3631   return ret;
3632 }
3633
3634 void
3635 gst_ahc_parameters_supported_focus_modes_free (GList * list)
3636 {
3637   g_list_free (list);
3638 }
3639
3640 GList *
3641 gst_ahc_parameters_get_supported_preview_formats (GstAHCParameters * self)
3642 {
3643   JNIEnv *env = gst_amc_jni_get_env ();
3644   GError *err = NULL;
3645   jobject list = NULL;
3646   GList *ret = NULL;
3647
3648   gst_amc_jni_call_object_method (env, &err, self->object,
3649       android_hardware_camera_parameters.getSupportedPreviewFormats, &list);
3650   if (err) {
3651     GST_ERROR
3652         ("Failed to call android.hardware.Camera.Parameters.getSupportedPreviewFormats: %s",
3653         err->message);
3654     g_clear_error (&err);
3655     return NULL;
3656   }
3657
3658   if (list) {
3659     jobject iterator = NULL;
3660
3661     iterator = java_util_list_iterator (env, list);
3662     if (iterator) {
3663       while (java_util_iterator_has_next (env, iterator)) {
3664         jobject integer = java_util_iterator_next (env, iterator);
3665
3666         if (integer) {
3667           jint value = java_lang_integer_int_value (env, integer);
3668
3669           ret = g_list_append (ret, GINT_TO_POINTER (value));
3670           gst_amc_jni_object_local_unref (env, integer);
3671         }
3672       }
3673       gst_amc_jni_object_local_unref (env, iterator);
3674     }
3675     gst_amc_jni_object_local_unref (env, list);
3676   }
3677
3678   return ret;
3679 }
3680
3681 void
3682 gst_ahc_parameters_supported_preview_formats_free (GList * list)
3683 {
3684   g_list_free (list);
3685 }
3686
3687 GList *
3688 gst_ahc_parameters_get_supported_preview_fps_range (GstAHCParameters * self)
3689 {
3690   JNIEnv *env = gst_amc_jni_get_env ();
3691   GError *err = NULL;
3692   jobject list = NULL;
3693   GList *ret = NULL;
3694
3695   gst_amc_jni_call_object_method (env, &err, self->object,
3696       android_hardware_camera_parameters.getSupportedPreviewFpsRange, &list);
3697   if (err) {
3698     GST_ERROR
3699         ("Failed to call android.hardware.Camera.Parameters.getSupportedPreviewFpsRange: %s",
3700         err->message);
3701     g_clear_error (&err);
3702     return NULL;
3703   }
3704
3705   if (list) {
3706     jobject iterator = NULL;
3707
3708     iterator = java_util_list_iterator (env, list);
3709     if (iterator) {
3710       while (java_util_iterator_has_next (env, iterator)) {
3711         jintArray range = java_util_iterator_next (env, iterator);
3712
3713         if (range) {
3714           jint *fps = g_new (jint, 2);
3715
3716           (*env)->GetIntArrayRegion (env, range, 0, 2, fps);
3717           ret = g_list_append (ret, fps);
3718           gst_amc_jni_object_local_unref (env, range);
3719         }
3720       }
3721       gst_amc_jni_object_local_unref (env, iterator);
3722     }
3723     gst_amc_jni_object_local_unref (env, list);
3724   }
3725
3726   return ret;
3727 }
3728
3729 void
3730 gst_ahc_parameters_supported_preview_fps_range_free (GList * list)
3731 {
3732   g_list_foreach (list, (GFunc) g_free, NULL);
3733   g_list_free (list);
3734 }
3735
3736 GList *
3737 gst_ahc_parameters_get_supported_preview_sizes (GstAHCParameters * self)
3738 {
3739   JNIEnv *env = gst_amc_jni_get_env ();
3740   GError *err = NULL;
3741   jobject list = NULL;
3742   GList *ret = NULL;
3743
3744   gst_amc_jni_call_object_method (env, &err, self->object,
3745       android_hardware_camera_parameters.getSupportedPreviewSizes, &list);
3746   if (err) {
3747     GST_ERROR
3748         ("Failed to call android.hardware.Camera.Parameters.getSupportedPreviewSizes: %s",
3749         err->message);
3750     g_clear_error (&err);
3751     return NULL;
3752   }
3753
3754   if (list) {
3755     jobject iterator = NULL;
3756
3757     iterator = java_util_list_iterator (env, list);
3758     if (iterator) {
3759       while (java_util_iterator_has_next (env, iterator)) {
3760         jobject jsize = java_util_iterator_next (env, iterator);
3761
3762         if (jsize) {
3763           jint width, height;
3764
3765           width = (*env)->GetIntField (env, jsize,
3766               android_hardware_camera_size.width);
3767           height = (*env)->GetIntField (env, jsize,
3768               android_hardware_camera_size.height);
3769
3770           ret = g_list_append (ret, gst_ahc_size_new (width, height));
3771           gst_amc_jni_object_local_unref (env, jsize);
3772         }
3773       }
3774       gst_amc_jni_object_local_unref (env, iterator);
3775     }
3776     gst_amc_jni_object_local_unref (env, list);
3777   }
3778
3779   return ret;
3780 }
3781
3782 void
3783 gst_ahc_parameters_supported_preview_sizes_free (GList * list)
3784 {
3785   g_list_foreach (list, (GFunc) gst_ahc_size_free, NULL);
3786   g_list_free (list);
3787 }
3788
3789 GList *
3790 gst_ahc_parameters_get_supported_scene_modes (GstAHCParameters * self)
3791 {
3792   JNIEnv *env = gst_amc_jni_get_env ();
3793   GError *err = NULL;
3794   jobject list = NULL;
3795   GList *ret = NULL;
3796
3797   gst_amc_jni_call_object_method (env, &err, self->object,
3798       android_hardware_camera_parameters.getSupportedSceneModes, &list);
3799   if (err) {
3800     GST_ERROR
3801         ("Failed to call android.hardware.Camera.Parameters.getSupportedSceneModes: %s",
3802         err->message);
3803     g_clear_error (&err);
3804     return NULL;
3805   }
3806
3807   if (list) {
3808     jobject iterator = NULL;
3809
3810     iterator = java_util_list_iterator (env, list);
3811     if (iterator) {
3812       while (java_util_iterator_has_next (env, iterator)) {
3813         jobject str = java_util_iterator_next (env, iterator);
3814
3815         if (str) {
3816           const gchar *value = _scene_mode_to_gchar (env, str);
3817
3818           ret = g_list_append (ret, (gchar *) value);
3819           gst_amc_jni_object_local_unref (env, str);
3820         }
3821       }
3822       gst_amc_jni_object_local_unref (env, iterator);
3823     }
3824     gst_amc_jni_object_local_unref (env, list);
3825   }
3826
3827   return ret;
3828 }
3829
3830 void
3831 gst_ahc_parameters_supported_scene_modes_free (GList * list)
3832 {
3833   g_list_free (list);
3834 }
3835
3836 GList *
3837 gst_ahc_parameters_get_supported_white_balance (GstAHCParameters * self)
3838 {
3839   JNIEnv *env = gst_amc_jni_get_env ();
3840   GError *err = NULL;
3841   jobject list = NULL;
3842   GList *ret = NULL;
3843
3844   gst_amc_jni_call_object_method (env, &err, self->object,
3845       android_hardware_camera_parameters.getSupportedWhiteBalance, &list);
3846   if (err) {
3847     GST_ERROR
3848         ("Failed to call android.hardware.Camera.Parameters.getSupportedWhiteBalance: %s",
3849         err->message);
3850     g_clear_error (&err);
3851     return NULL;
3852   }
3853
3854   if (list) {
3855     jobject iterator = NULL;
3856
3857     iterator = java_util_list_iterator (env, list);
3858     if (iterator) {
3859       while (java_util_iterator_has_next (env, iterator)) {
3860         jobject str = java_util_iterator_next (env, iterator);
3861
3862         if (str) {
3863           const gchar *value = _white_balance_to_gchar (env, str);
3864
3865           ret = g_list_append (ret, (gchar *) value);
3866           gst_amc_jni_object_local_unref (env, str);
3867         }
3868       }
3869       gst_amc_jni_object_local_unref (env, iterator);
3870     }
3871     gst_amc_jni_object_local_unref (env, list);
3872   }
3873
3874   return ret;
3875 }
3876
3877 void
3878 gst_ahc_parameters_supported_white_balance_free (GList * list)
3879 {
3880   g_list_free (list);
3881 }
3882
3883 gfloat
3884 gst_ahc_parameters_get_vertical_view_angle (GstAHCParameters * self)
3885 {
3886   JNIEnv *env = gst_amc_jni_get_env ();
3887   GError *err = NULL;
3888   gfloat angle;
3889
3890   gst_amc_jni_call_float_method (env, &err, self->object,
3891       android_hardware_camera_parameters.getVerticalViewAngle, &angle);
3892   if (err) {
3893     GST_ERROR
3894         ("Failed to call android.hardware.Camera.Parameters.getVerticalViewAngle: %s",
3895         err->message);
3896     g_clear_error (&err);
3897     return 0.0;
3898   }
3899
3900   return angle;
3901 }
3902
3903 gboolean
3904 gst_ahc_parameters_get_video_stabilization (GstAHCParameters * self)
3905 {
3906   JNIEnv *env = gst_amc_jni_get_env ();
3907   GError *err = NULL;
3908   gboolean ret;
3909
3910   gst_amc_jni_call_boolean_method (env, &err, self->object,
3911       android_hardware_camera_parameters.getVideoStabilization, &ret);
3912   if (err) {
3913     GST_ERROR
3914         ("Failed to call android.hardware.Camera.Parameters.getVideoStabilization: %s",
3915         err->message);
3916     g_clear_error (&err);
3917     return FALSE;
3918   }
3919
3920   return ret;
3921 }
3922
3923 const gchar *
3924 gst_ahc_parameters_get_white_balance (GstAHCParameters * self)
3925 {
3926   JNIEnv *env = gst_amc_jni_get_env ();
3927   GError *err = NULL;
3928   const gchar *ret = NULL;
3929   jstring white_balance;
3930
3931   gst_amc_jni_call_object_method (env, &err, self->object,
3932       android_hardware_camera_parameters.getWhiteBalance, &white_balance);
3933   if (err) {
3934     GST_ERROR
3935         ("Failed to call android.hardware.Camera.Parameters.getWhiteBalance: %s",
3936         err->message);
3937     g_clear_error (&err);
3938     return NULL;
3939   }
3940
3941   ret = _white_balance_to_gchar (env, white_balance);
3942
3943   if (white_balance)
3944     gst_amc_jni_object_local_unref (env, white_balance);
3945
3946   return ret;
3947 }
3948
3949 gint
3950 gst_ahc_parameters_get_zoom (GstAHCParameters * self)
3951 {
3952   JNIEnv *env = gst_amc_jni_get_env ();
3953   GError *err = NULL;
3954   gint zoom;
3955
3956   gst_amc_jni_call_int_method (env, &err, self->object,
3957       android_hardware_camera_parameters.getZoom, &zoom);
3958   if (err) {
3959     GST_ERROR ("Failed to call android.hardware.Camera.Parameters.getZoom: %s",
3960         err->message);
3961     g_clear_error (&err);
3962     return -1;
3963   }
3964
3965   return zoom;
3966 }
3967
3968 GList *
3969 gst_ahc_parameters_get_zoom_ratios (GstAHCParameters * self)
3970 {
3971   JNIEnv *env = gst_amc_jni_get_env ();
3972   GError *err = NULL;
3973   jobject list = NULL;
3974   GList *ret = NULL;
3975
3976   gst_amc_jni_call_object_method (env, &err, self->object,
3977       android_hardware_camera_parameters.getZoomRatios, &list);
3978   if (err) {
3979     GST_ERROR
3980         ("Failed to call android.hardware.Camera.Parameters.getZoomRatios: %s",
3981         err->message);
3982     g_clear_error (&err);
3983     return NULL;
3984   }
3985
3986   if (list) {
3987     jobject iterator = NULL;
3988
3989     iterator = java_util_list_iterator (env, list);
3990     if (iterator) {
3991       while (java_util_iterator_has_next (env, iterator)) {
3992         jobject integer = java_util_iterator_next (env, iterator);
3993
3994         if (integer) {
3995           jint value = java_lang_integer_int_value (env, integer);
3996
3997           ret = g_list_append (ret, GINT_TO_POINTER (value));
3998           gst_amc_jni_object_local_unref (env, integer);
3999         }
4000       }
4001       gst_amc_jni_object_local_unref (env, iterator);
4002     }
4003     gst_amc_jni_object_local_unref (env, list);
4004   }
4005
4006   return ret;
4007 }
4008
4009 void
4010 gst_ahc_parameters_zoom_ratios_free (GList * list)
4011 {
4012   g_list_free (list);
4013 }
4014
4015 gboolean
4016 gst_ahc_parameters_is_smooth_zoom_supported (GstAHCParameters * self)
4017 {
4018   JNIEnv *env = gst_amc_jni_get_env ();
4019   GError *err = NULL;
4020   gboolean supported;
4021
4022   gst_amc_jni_call_boolean_method (env, &err, self->object,
4023       android_hardware_camera_parameters.isSmoothZoomSupported, &supported);
4024   if (err) {
4025     GST_ERROR
4026         ("Failed to call android.hardware.Camera.Parameters.isSmoothZoomSupported: %s",
4027         err->message);
4028     g_clear_error (&err);
4029     return FALSE;
4030   }
4031
4032   return supported;
4033 }
4034
4035 gboolean
4036 gst_ahc_parameters_is_video_stabilization_supported (GstAHCParameters * self)
4037 {
4038   JNIEnv *env = gst_amc_jni_get_env ();
4039   GError *err = NULL;
4040   gboolean supported;
4041
4042   gst_amc_jni_call_boolean_method (env, &err, self->object,
4043       android_hardware_camera_parameters.isVideoStabilizationSupported,
4044       &supported);
4045   if (err) {
4046     GST_ERROR
4047         ("Failed to call android.hardware.Camera.Parameters.isVideoStabilizationSupported: %s",
4048         err->message);
4049     g_clear_error (&err);
4050     return FALSE;
4051   }
4052
4053   return supported;
4054 }
4055
4056 gboolean
4057 gst_ahc_parameters_is_zoom_supported (GstAHCParameters * self)
4058 {
4059   JNIEnv *env = gst_amc_jni_get_env ();
4060   GError *err = NULL;
4061   gboolean supported;
4062
4063   gst_amc_jni_call_boolean_method (env, &err, self->object,
4064       android_hardware_camera_parameters.isZoomSupported, &supported);
4065   if (err) {
4066     GST_ERROR
4067         ("Failed to call android.hardware.Camera.Parameters.isZoomSupported: %s",
4068         err->message);
4069     g_clear_error (&err);
4070     return FALSE;
4071   }
4072
4073   return supported;
4074 }
4075
4076 gboolean
4077 gst_ahc_parameters_set_antibanding (GstAHCParameters * self,
4078     const gchar * value)
4079 {
4080   JNIEnv *env = gst_amc_jni_get_env ();
4081   GError *err = NULL;
4082   jstring antibanding;
4083
4084   antibanding = _antibanding_to_jstring (value);
4085   if (!antibanding)
4086     return FALSE;
4087
4088   gst_amc_jni_call_void_method (env, &err, self->object,
4089       android_hardware_camera_parameters.setAntibanding, antibanding);
4090   if (err) {
4091     GST_ERROR
4092         ("Failed to call android.hardware.Camera.Parameters.setAntibanding: %s",
4093         err->message);
4094     g_clear_error (&err);
4095     return FALSE;
4096   }
4097
4098   return TRUE;
4099 }
4100
4101 gboolean
4102 gst_ahc_parameters_set_color_effect (GstAHCParameters * self,
4103     const gchar * value)
4104 {
4105   JNIEnv *env = gst_amc_jni_get_env ();
4106   GError *err = NULL;
4107   jstring color_effect;
4108
4109   color_effect = _color_effect_to_jstring (value);
4110   if (!color_effect)
4111     return FALSE;
4112
4113   gst_amc_jni_call_void_method (env, &err, self->object,
4114       android_hardware_camera_parameters.setColorEffect, color_effect);
4115   if (err) {
4116     GST_ERROR
4117         ("Failed to call android.hardware.Camera.Parameters.setColorEffect: %s",
4118         err->message);
4119     g_clear_error (&err);
4120     return FALSE;
4121   }
4122
4123   return TRUE;
4124 }
4125
4126 gboolean
4127 gst_ahc_parameters_set_exposure_compensation (GstAHCParameters * self,
4128     gint value)
4129 {
4130   JNIEnv *env = gst_amc_jni_get_env ();
4131   GError *err = NULL;
4132
4133   gst_amc_jni_call_void_method (env, &err, self->object,
4134       android_hardware_camera_parameters.setExposureCompensation, value);
4135   if (err) {
4136     GST_ERROR
4137         ("Failed to call android.hardware.Camera.Parameters.setExposureCompensation: %s",
4138         err->message);
4139     g_clear_error (&err);
4140     return FALSE;
4141   }
4142
4143   return TRUE;
4144 }
4145
4146 gboolean
4147 gst_ahc_parameters_set_flash_mode (GstAHCParameters * self, const gchar * value)
4148 {
4149   JNIEnv *env = gst_amc_jni_get_env ();
4150   GError *err = NULL;
4151   jstring flash_mode;
4152
4153   flash_mode = _flash_mode_to_jstring (value);
4154   if (!flash_mode)
4155     return FALSE;
4156
4157   gst_amc_jni_call_void_method (env, &err, self->object,
4158       android_hardware_camera_parameters.setFlashMode, flash_mode);
4159   if (err) {
4160     GST_ERROR
4161         ("Failed to call android.hardware.Camera.Parameters.setFlashMode: %s",
4162         err->message);
4163     g_clear_error (&err);
4164     return FALSE;
4165   }
4166
4167   return TRUE;
4168 }
4169
4170 gboolean
4171 gst_ahc_parameters_set_focus_mode (GstAHCParameters * self, const gchar * value)
4172 {
4173   JNIEnv *env = gst_amc_jni_get_env ();
4174   GError *err = NULL;
4175   jstring focus_mode;
4176
4177   focus_mode = _focus_mode_to_jstring (value);
4178   if (!focus_mode)
4179     return FALSE;
4180
4181   gst_amc_jni_call_void_method (env, &err, self->object,
4182       android_hardware_camera_parameters.setFocusMode, focus_mode);
4183   if (err) {
4184     GST_ERROR
4185         ("Failed to call android.hardware.Camera.Parameters.setFocusMode: %s",
4186         err->message);
4187     g_clear_error (&err);
4188     return FALSE;
4189   }
4190
4191   return TRUE;
4192 }
4193
4194 gboolean
4195 gst_ahc_parameters_set_preview_format (GstAHCParameters * self, gint format)
4196 {
4197   JNIEnv *env = gst_amc_jni_get_env ();
4198   GError *err = NULL;
4199
4200   gst_amc_jni_call_void_method (env, &err, self->object,
4201       android_hardware_camera_parameters.setPreviewFormat, format);
4202   if (err) {
4203     GST_ERROR
4204         ("Failed to call android.hardware.Camera.Parameters.setPreviewFormat: %s",
4205         err->message);
4206     g_clear_error (&err);
4207     return FALSE;
4208   }
4209
4210   return TRUE;
4211 }
4212
4213 gboolean
4214 gst_ahc_parameters_set_preview_fps_range (GstAHCParameters * self,
4215     gint min, gint max)
4216 {
4217   JNIEnv *env = gst_amc_jni_get_env ();
4218   GError *err = NULL;
4219
4220   gst_amc_jni_call_void_method (env, &err, self->object,
4221       android_hardware_camera_parameters.setPreviewFpsRange, min, max);
4222   if (err) {
4223     GST_ERROR
4224         ("Failed to call android.hardware.Camera.Parameters.setPreviewFpsRange: %s",
4225         err->message);
4226     g_clear_error (&err);
4227     return FALSE;
4228   }
4229
4230   return TRUE;
4231 }
4232
4233 gboolean
4234 gst_ahc_parameters_set_preview_size (GstAHCParameters * self,
4235     gint width, gint height)
4236 {
4237   JNIEnv *env = gst_amc_jni_get_env ();
4238   GError *err = NULL;
4239
4240   gst_amc_jni_call_void_method (env, &err, self->object,
4241       android_hardware_camera_parameters.setPreviewSize, width, height);
4242   if (err) {
4243     GST_ERROR
4244         ("Failed to call android.hardware.Camera.Parameters.setPreviewSize: %s",
4245         err->message);
4246     g_clear_error (&err);
4247     return FALSE;
4248   }
4249
4250   return TRUE;
4251 }
4252
4253 gboolean
4254 gst_ahc_parameters_set_scene_mode (GstAHCParameters * self, const gchar * value)
4255 {
4256   JNIEnv *env = gst_amc_jni_get_env ();
4257   GError *err = NULL;
4258   jstring scene_mode;
4259
4260   scene_mode = _scene_mode_to_jstring (value);
4261   if (!scene_mode)
4262     return FALSE;
4263
4264   gst_amc_jni_call_void_method (env, &err, self->object,
4265       android_hardware_camera_parameters.setSceneMode, scene_mode);
4266   if (err) {
4267     GST_ERROR
4268         ("Failed to call android.hardware.Camera.Parameters.setSceneMode: %s",
4269         err->message);
4270     g_clear_error (&err);
4271     return FALSE;
4272   }
4273
4274   return TRUE;
4275 }
4276
4277
4278 gboolean
4279 gst_ahc_parameters_set_video_stabilization (GstAHCParameters * self,
4280     gboolean toggle)
4281 {
4282   JNIEnv *env = gst_amc_jni_get_env ();
4283   GError *err = NULL;
4284
4285   gst_amc_jni_call_void_method (env, &err, self->object,
4286       android_hardware_camera_parameters.setVideoStabilization, toggle);
4287   if (err) {
4288     GST_ERROR
4289         ("Failed to call android.hardware.Camera.Parameters.setVideoStabilization: %s",
4290         err->message);
4291     g_clear_error (&err);
4292     return FALSE;
4293   }
4294
4295   return TRUE;
4296 }
4297
4298 gboolean
4299 gst_ahc_parameters_set_white_balance (GstAHCParameters * self,
4300     const gchar * value)
4301 {
4302   JNIEnv *env = gst_amc_jni_get_env ();
4303   GError *err = NULL;
4304   jstring white_balance;
4305
4306   white_balance = _white_balance_to_jstring (value);
4307   if (!white_balance)
4308     return FALSE;
4309
4310   gst_amc_jni_call_void_method (env, &err, self->object,
4311       android_hardware_camera_parameters.setWhiteBalance, white_balance);
4312   if (err) {
4313     GST_ERROR
4314         ("Failed to call android.hardware.Camera.Parameters.setWhiteBalance: %s",
4315         err->message);
4316     g_clear_error (&err);
4317     return FALSE;
4318   }
4319
4320   return TRUE;
4321 }
4322
4323 gboolean
4324 gst_ahc_parameters_set_zoom (GstAHCParameters * self, gint value)
4325 {
4326   JNIEnv *env = gst_amc_jni_get_env ();
4327   GError *err = NULL;
4328
4329   gst_amc_jni_call_void_method (env, &err, self->object,
4330       android_hardware_camera_parameters.setZoom, value);
4331   if (err) {
4332     GST_ERROR ("Failed to call android.hardware.Camera.Parameters.setZoom: %s",
4333         err->message);
4334     g_clear_error (&err);
4335     return FALSE;
4336   }
4337
4338   return TRUE;
4339 }
4340
4341 gboolean
4342 gst_ahc_parameters_unflatten (GstAHCParameters * self, const gchar * flattened)
4343 {
4344   JNIEnv *env = gst_amc_jni_get_env ();
4345   GError *err = NULL;
4346   jstring v_str = NULL;
4347   gboolean ret = TRUE;
4348
4349   v_str = (*env)->NewStringUTF (env, flattened);
4350   if (v_str == NULL)
4351     return FALSE;
4352
4353   gst_amc_jni_call_void_method (env, &err, self->object,
4354       android_hardware_camera_parameters.unflatten, v_str);
4355   if (err) {
4356     GST_ERROR
4357         ("Failed to call android.hardware.Camera.Parameters.unflatten: %s",
4358         err->message);
4359     g_clear_error (&err);
4360     ret = FALSE;
4361   }
4362
4363   gst_amc_jni_object_local_unref (env, self->object);
4364
4365   return ret;
4366 }
4367
4368 void
4369 gst_ahc_parameters_free (GstAHCParameters * self)
4370 {
4371   JNIEnv *env = gst_amc_jni_get_env ();
4372
4373   g_return_if_fail (self != NULL);
4374   g_return_if_fail (self->object != NULL);
4375
4376   GST_DEBUG ("freeing parameters %p", self->object);
4377
4378   gst_amc_jni_object_unref (env, self->object);
4379   g_slice_free (GstAHCParameters, self);
4380 }