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