30d9e292165875fa1c05a7a34d62e6f1ad55782e
[adaptation/intel_mfld/gst-plugins-atomisp.git] / gst / mfldv4l2cam / gstv4l2camsrc.c
1 /* GStreamer V4L2 camera source
2  * Copyright (C) 2010 Nokia Corporation <multimedia@maemo.org>
3  *               2010 Intel Corporation
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 /**
22  * SECTION:element-mfldcamsrc
23  * @short_description: Medfield V4L2 camera source
24  * @see_also: #GstCameraSrc
25  *
26  * <refsect2>
27  * <para>
28  * Bla bla...
29  * </para>
30  * <para>
31  * Foo bar
32  * </para>
33  * <title>Example launch line</title>
34  * <para>
35  * <programlisting>
36  * gst-launch mfldv4l2camsrc ! xvimagesink
37  * </programlisting>
38  * </para>
39  * </refsect2>
40  */
41
42 #include <string.h>
43
44 #ifdef HAVE_CONFIG_H
45 #include "config.h"
46 #endif
47
48 #include <linux/videodev2.h>
49 #include "gstv4l2camsrc.h"
50 #include "v4l2camsrc_calls.h"
51 #include "gstv4l2camvidorient.h"
52 #include <mfld_cam.h>
53
54 #define MFLD_ADVCI_PATH "/usr/lib/"
55 #define MFLD_V4L2CAMSRC_VERSION "85de990a519ae021f0bf4ec89c0e352ec76f6965"
56 #define FOCUS_POSITION_MIN      0
57 #define FOCUS_POSITION_MAX      512
58
59 GST_DEBUG_CATEGORY (gst_v4l2camsrc_debug);
60 #define GST_CAT_DEFAULT gst_v4l2camsrc_debug
61
62 static gboolean gst_v4l2camsrc_is_open (GstCameraSrc * camsrc);
63 static void gst_v4l2camsrc_finalize (GObject * object);
64 static void gst_v4l2camsrc_dispose (GObject * object);
65 static void gst_v4l2camsrc_set_property (GObject * object,
66     guint prop_id, const GValue * value, GParamSpec * pspec);
67 static void gst_v4l2camsrc_get_property (GObject * object,
68     guint prop_id, GValue * value, GParamSpec * pspec);
69 static gboolean gst_v4l2camsrc_unlock (GstCameraSrc * src);
70 static gboolean gst_v4l2camsrc_unlock_stop (GstCameraSrc * src);
71 static gboolean gst_v4l2camsrc_set_zoom (GstCameraSrc * camsrc, gfloat zoom);
72 static gboolean gst_v4l2camsrc_set_AeAafwindow (GstCameraSrc * camsrc, GstCameraSrc3a_window window);
73 static gboolean gst_v4l2camsrc_set_ae_mode (GstCameraSrc * camsrc, int mode);
74 static gboolean gst_v4l2camsrc_get_ae_mode (GstCameraSrc * camsrc, int *mode);
75
76 static gboolean gst_v4l2camsrc_iface_supported (GstImplementsInterface * iface,
77     GType iface_type);
78 static gboolean gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size);
79 static gboolean gst_v4l2camsrc_makernote_init(GstCameraSrc * camsrc,
80                                                       unsigned * buf_size,
81                                                       unsigned num_afwindows,
82                                                       unsigned num_faces,
83                                                       unsigned num_eyes,
84                                                       unsigned num_grid,
85                                                       int *handle);
86 static gboolean gst_v4l2camsrc_makernote_deal(GstCameraSrc * camsrc,
87                                                       GstBuffer *pmakerbuf,
88                                                       unsigned num_afwindows,
89                                                       unsigned num_grid,
90                                                       int handle);
91 static gboolean gst_v4l2camsrc_makernote_uninit(GstCameraSrc * camsrc,
92                                                         int handle);
93
94 typedef enum
95 {
96   PROP_0,
97   PROP_DEVICE,
98   PROP_DEVICE_FD,
99   PROP_DEVICE_NAME,
100   PROP_QUEUE_SIZE,
101   PROP_INPUT_SENSOR,
102   PROP_USE_MMAP,
103   PROP_USE_COPY,
104   PROP_AE,
105   PROP_AE_METERING_MODE,
106   PROP_AE_WINDOW,
107   PROP_AF,
108   PROP_AF_METERING_MODE,
109   PROP_AF_WINDOW,
110   PROP_AWB,
111   PROP_STILL_AF,
112   PROP_FOCUS_POSITION,
113   PROP_VFLIP,
114   PROP_HFLIP,
115   PROP_BAYER_DOWNSCALING,
116   PROP_CAPTURE_CORRECTION_GDC,
117   PROP_CAPTURE_CORRECTION_CAC,
118   PROP_CAPTURE_CORRECTION_RER,
119   PROP_CAPTURE_CORRECTION_DIS,
120   PROP_CAPTURE_CORRECTION_DVS,
121   PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT,
122   PROP_CAPTURE_CORRECTION_SHADING_CORRECTION,
123   PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION,
124   PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION,
125   PROP_CAPTURE_CORRECTION_GAMMA,
126   PROP_CAPTURE_CORRECTION_CONTRAST,
127   PROP_CAPTURE_CORRECTION_BRIGHTNESS,
128   PROP_DUMP_RAW,
129   PROP_DUMP_IMAGE,
130   PROP_DEBUG_FLAGS,
131 } GstV4L2CamSrcProperties;
132
133
134
135
136 #define DEFAULT_PROP_DEVICE_NAME  NULL
137 #define DEFAULT_PROP_DEVICE       "/dev/video0"
138 #define DEFAULT_PROP_DEVICE_FD    -1
139 #define DEFAULT_PROP_AE_WINDOW  "x_left=0,x_right=0,y_bottom=0,y_top=0"
140 #define DEFAULT_PROP_AF_WINDOW  "x_left=0,x_right=0,y_bottom=0,y_top=0"
141 #define DEFAULT_DEBUG_FLAGS     0
142 #define C_FLAGS(v) ((guint) v)
143
144 GType
145 gst_camera_input_sensor_get_type (void)
146 {
147   static GType gst_camera_input_sensor_type = 0;
148   static GEnumValue gst_camera_input_sensors[] = {
149     {GST_CAMERA_INPUT_SENSOR_PRIMARY, "Primary Sensor", "primary"},
150     {GST_CAMERA_INPUT_SENSOR_SECONDARY, "Sencondary Sensor", "second"},
151     {0, NULL, NULL},
152   };
153
154   if (G_UNLIKELY (!gst_camera_input_sensor_type)) {
155     gst_camera_input_sensor_type =
156         g_enum_register_static ("GstCameraInputSensor",
157         gst_camera_input_sensors);
158   }
159   return gst_camera_input_sensor_type;
160 }
161
162 GType
163 gst_camera_ae_metering_mode_get_type(void)
164 {
165   static GType gst_camera_ae_metering_mode_type = 0;
166   static GEnumValue gst_camera_ae_metering_mode[] = {
167     {GST_CAMERA_AE_METERING_AUTO, "AE auto metering", "auto"},
168     {GST_CAMERA_AE_METERING_SPOT, "AE spot metering", "spot"},
169     {GST_CAMERA_AE_METERING_CENTER, "AE center metering", "center"},
170     {GST_CAMERA_AE_METERING_CUSTOMIZED, "AE customized metering", "customized"},
171     {0, NULL, NULL},
172   };
173
174   if (G_UNLIKELY (!gst_camera_ae_metering_mode_type)) {
175     gst_camera_ae_metering_mode_type=
176         g_enum_register_static ("GstCameraAEMeteringMode",
177         gst_camera_ae_metering_mode);
178   }
179   return  gst_camera_ae_metering_mode_type;
180 }
181
182 GType
183 gst_camera_af_metering_mode_get_type(void)
184 {
185   static GType gst_camera_af_metering_mode_type = 0;
186   static GEnumValue gst_camera_af_metering_mode[] = {
187     {GST_CAMERA_AF_METERING_AUTO, "AF auto metering", "auto"},
188     {GST_CAMERA_AF_METERING_SPOT, "AF spot metering", "spot"},
189     {GST_CAMERA_AF_METERING_CENTER, "AF center metering", "center"},
190     {GST_CAMERA_AF_METERING_CUSTOMIZED, "AF customized metering", "customized"},
191     {0, NULL, NULL},
192   };
193
194   if (G_UNLIKELY (!gst_camera_af_metering_mode_type)) {
195     gst_camera_af_metering_mode_type=
196         g_enum_register_static ("GstCameraAFMeteringMode",
197         gst_camera_af_metering_mode);
198   }
199   return  gst_camera_af_metering_mode_type;
200 }
201
202 GType
203 gst_camerasrc_debug_flags_get_type (void)
204 {
205   static GType gst_camerasrc_debug_flags = 0;
206   static const GFlagsValue values [] = {
207     {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_PERFORMANCE), "Debug flags for performance tuning",
208       "performance"},
209     {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_MAKER_NOTE), "Debug flags for maker note",
210       "maker-note"},
211     {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_AUTO_FOCUS), "Debug flags for auto focus",
212       "auto-focus"},
213     {0, NULL, NULL},
214   };
215
216   if (G_UNLIKELY (!gst_camerasrc_debug_flags)) {
217     gst_camerasrc_debug_flags =
218         g_flags_register_static ("GstCameraSrcDebugFlags", values);
219   }
220   return  gst_camerasrc_debug_flags;
221 }
222
223
224
225 GST_IMPLEMENT_V4L2CAMSRC_VIDORIENT_METHODS (GstMFLDV4l2CamSrc, gst_v4l2camsrc);
226
227
228 static void
229 gst_v4l2camsrc_interface_init (GstImplementsInterfaceClass * klass)
230 {
231   /*
232    * default virtual functions
233    */
234   klass->supported = gst_v4l2camsrc_iface_supported;
235 }
236
237 void
238 gst_v4l2camsrc_init_interfaces (GType type)
239 {
240   static const GInterfaceInfo v4l2camsrc_iface_info = {
241     (GInterfaceInitFunc) gst_v4l2camsrc_interface_init,
242     NULL,
243     NULL,
244   };
245   static const GInterfaceInfo v4l2camsrc_videoorientation_info = {
246     (GInterfaceInitFunc) gst_v4l2camsrc_video_orientation_interface_init,
247     NULL,
248     NULL,
249   };
250
251   g_type_add_interface_static (type,
252       GST_TYPE_IMPLEMENTS_INTERFACE, &v4l2camsrc_iface_info);
253   g_type_add_interface_static (type,
254       GST_TYPE_VIDEO_ORIENTATION, &v4l2camsrc_videoorientation_info);
255 }
256
257
258 GST_BOILERPLATE_FULL (GstMFLDV4l2CamSrc, gst_v4l2camsrc, GstCameraSrc,
259     GST_TYPE_CAMERA_SRC, gst_v4l2camsrc_init_interfaces);
260
261
262
263 static gboolean
264 gst_v4l2camsrc_iface_supported (GstImplementsInterface * iface,
265     GType iface_type)
266 {
267   GstCameraSrc *camsrc = GST_CAMERA_SRC (iface);
268
269   if (gst_v4l2camsrc_is_open (camsrc) &&
270       iface_type == GST_TYPE_VIDEO_ORIENTATION) {
271     return TRUE;
272   }
273
274   else if (GST_IS_IMPLEMENTS_INTERFACE (camsrc)) {
275     GstImplementsInterfaceClass *parent_klass;
276
277     parent_klass =
278         g_type_interface_peek (parent_class, GST_TYPE_IMPLEMENTS_INTERFACE);
279     return parent_klass->supported (iface, iface_type);
280   }
281
282   return FALSE;
283 }
284
285
286 /*
287  * gst_v4l2camsrc_is_open:
288  *
289  */
290 static gboolean
291 gst_v4l2camsrc_is_open (GstCameraSrc * camsrc)
292 {
293   GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
294
295   return GST_V4L2CAMSRC_IS_OPEN (v4l2camsrc);
296 }
297
298 /*
299  * gst_v4l2camsrc_is_active:
300  *
301  */
302 static gboolean
303 gst_v4l2camsrc_is_active (GstCameraSrc * camsrc)
304 {
305   GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
306
307   return GST_V4L2CAMSRC_IS_ACTIVE (v4l2camsrc);
308 }
309
310 /*
311  * gst_v4l2camsrc_v4l2fourcc_to_structure:
312  *
313  */
314 static GstStructure *
315 gst_v4l2camsrc_v4l2fourcc_to_structure (guint32 fourcc)
316 {
317   GstStructure *structure = NULL;
318
319   switch (fourcc) {
320     case V4L2_PIX_FMT_MJPEG:   /* Motion-JPEG */
321     case V4L2_PIX_FMT_JPEG:    /* JFIF JPEG */
322       structure = gst_structure_new ("image/jpeg", NULL);
323       break;
324     case V4L2_PIX_FMT_RGB332:
325     case V4L2_PIX_FMT_RGB555:
326     case V4L2_PIX_FMT_RGB555X:
327     case V4L2_PIX_FMT_RGB565:
328     case V4L2_PIX_FMT_RGB565X:
329     case V4L2_PIX_FMT_RGB24:
330     case V4L2_PIX_FMT_BGR24:
331     case V4L2_PIX_FMT_RGB32:
332     case V4L2_PIX_FMT_BGR32:{
333       guint depth = 0, bpp = 0;
334
335       gint endianness = 0;
336
337       guint32 r_mask = 0, b_mask = 0, g_mask = 0;
338
339       switch (fourcc) {
340         case V4L2_PIX_FMT_RGB332:
341           bpp = depth = 8;
342           endianness = G_BYTE_ORDER;    /* 'like, whatever' */
343           r_mask = 0xe0;
344           g_mask = 0x1c;
345           b_mask = 0x03;
346           break;
347         case V4L2_PIX_FMT_RGB555:
348         case V4L2_PIX_FMT_RGB555X:
349           bpp = 16;
350           depth = 15;
351           endianness =
352               fourcc == V4L2_PIX_FMT_RGB555X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
353           r_mask = 0x7c00;
354           g_mask = 0x03e0;
355           b_mask = 0x001f;
356           break;
357         case V4L2_PIX_FMT_RGB565:
358         case V4L2_PIX_FMT_RGB565X:
359           bpp = depth = 16;
360           endianness =
361               fourcc == V4L2_PIX_FMT_RGB565X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
362           r_mask = 0xf800;
363           g_mask = 0x07e0;
364           b_mask = 0x001f;
365           break;
366         case V4L2_PIX_FMT_RGB24:
367           bpp = depth = 24;
368           endianness = G_BIG_ENDIAN;
369           r_mask = 0xff0000;
370           g_mask = 0x00ff00;
371           b_mask = 0x0000ff;
372           break;
373         case V4L2_PIX_FMT_BGR24:
374           bpp = depth = 24;
375           endianness = G_BIG_ENDIAN;
376           r_mask = 0x0000ff;
377           g_mask = 0x00ff00;
378           b_mask = 0xff0000;
379           break;
380         case V4L2_PIX_FMT_RGB32:
381           bpp = depth = 32;
382           endianness = G_BIG_ENDIAN;
383           r_mask = 0xff000000;
384           g_mask = 0x00ff0000;
385           b_mask = 0x0000ff00;
386           break;
387         case V4L2_PIX_FMT_BGR32:
388           bpp = depth = 32;
389           endianness = G_BIG_ENDIAN;
390           r_mask = 0x000000ff;
391           g_mask = 0x0000ff00;
392           b_mask = 0x00ff0000;
393           break;
394         default:
395           g_assert_not_reached ();
396           break;
397       }
398       structure = gst_structure_new ("video/x-raw-rgb",
399           "bpp", G_TYPE_INT, bpp,
400           "depth", G_TYPE_INT, depth,
401           "red_mask", G_TYPE_INT, r_mask,
402           "green_mask", G_TYPE_INT, g_mask,
403           "blue_mask", G_TYPE_INT, b_mask,
404           "endianness", G_TYPE_INT, endianness, NULL);
405       break;
406     }
407     case V4L2_PIX_FMT_GREY:    /*  8  Greyscale     */
408       structure = gst_structure_new ("video/x-raw-gray",
409           "bpp", G_TYPE_INT, 8, NULL);
410       break;
411     case V4L2_PIX_FMT_YYUV:    /* 16  YUV 4:2:2     */
412     case V4L2_PIX_FMT_HI240:   /*  8  8-bit color   */
413       /* FIXME: get correct fourccs here */
414       break;
415     case V4L2_PIX_FMT_NV12:    /* 12  Y/CbCr 4:2:0  */
416     case V4L2_PIX_FMT_NV21:    /* 12  Y/CrCb 4:2:0  */
417     case V4L2_PIX_FMT_NV61:
418     case V4L2_PIX_FMT_NV16:
419     case V4L2_PIX_FMT_YVU410:
420     case V4L2_PIX_FMT_YUV410:
421     case V4L2_PIX_FMT_YUV420:  /* I420/IYUV */
422     case V4L2_PIX_FMT_YUYV:
423     case V4L2_PIX_FMT_YVU420:
424     case V4L2_PIX_FMT_UYVY:
425     case V4L2_PIX_FMT_Y41P:
426     case V4L2_PIX_FMT_YUV422P:
427     case V4L2_PIX_FMT_YUV444:
428 #ifdef V4L2_PIX_FMT_YVYU
429     case V4L2_PIX_FMT_YVYU:
430 #endif
431     case V4L2_PIX_FMT_YUV411P:{
432       guint32 fcc = 0;
433
434       switch (fourcc) {
435         case V4L2_PIX_FMT_NV12:
436           fcc = GST_MAKE_FOURCC ('N', 'V', '1', '2');
437           break;
438         case V4L2_PIX_FMT_NV21:
439           fcc = GST_MAKE_FOURCC ('N', 'V', '2', '1');
440           break;
441         case V4L2_PIX_FMT_NV16:
442           fcc = GST_MAKE_FOURCC ('N', 'V', '1', '6');
443           break;
444         case V4L2_PIX_FMT_NV61:
445           fcc = GST_MAKE_FOURCC ('N', 'V', '6', '1');
446           break;
447         case V4L2_PIX_FMT_YVU410:
448           fcc = GST_MAKE_FOURCC ('Y', 'V', 'U', '9');
449           break;
450         case V4L2_PIX_FMT_YUV410:
451           fcc = GST_MAKE_FOURCC ('Y', 'U', 'V', '9');
452           break;
453         case V4L2_PIX_FMT_YUV420:
454           fcc = GST_MAKE_FOURCC ('I', '4', '2', '0');
455           break;
456         case V4L2_PIX_FMT_YUYV:
457           fcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2');
458           break;
459         case V4L2_PIX_FMT_YVU420:
460           fcc = GST_MAKE_FOURCC ('Y', 'V', '1', '2');
461           break;
462         case V4L2_PIX_FMT_UYVY:
463           fcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y');
464           break;
465         case V4L2_PIX_FMT_Y41P:
466           fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'P');
467           break;
468         case V4L2_PIX_FMT_YUV411P:
469           fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B');
470           break;
471         case V4L2_PIX_FMT_YUV422P:
472           fcc = GST_MAKE_FOURCC ('Y', '4', '2', 'B');
473           break;
474         case V4L2_PIX_FMT_YUV444:
475           fcc = GST_MAKE_FOURCC ('Y', '4', '4', '4');
476           break;
477 #ifdef V4L2_PIX_FMT_YVYU
478         case V4L2_PIX_FMT_YVYU:
479           fcc = GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U');
480           break;
481 #endif
482         default:
483           g_assert_not_reached ();
484           break;
485       }
486       structure = gst_structure_new ("video/x-raw-yuv",
487           "format", GST_TYPE_FOURCC, fcc, NULL);
488       break;
489     }
490     case V4L2_PIX_FMT_SBGGR8:
491     case V4L2_PIX_FMT_SGBRG8:
492     case V4L2_PIX_FMT_SGRBG8:
493     case V4L2_PIX_FMT_SRGGB8:
494     case V4L2_PIX_FMT_SBGGR10:
495     case V4L2_PIX_FMT_SGBRG10:
496     case V4L2_PIX_FMT_SGRBG10:
497     case V4L2_PIX_FMT_SRGGB10:
498 #ifdef V4L2_PIX_FMT_SBGGR16
499     case V4L2_PIX_FMT_SBGGR16:{
500 #endif
501       guint32 fcc = 0;
502       switch (fourcc) {
503         case V4L2_PIX_FMT_SBGGR8:
504           fcc = GST_MAKE_FOURCC ('B', 'A', '8', '1');
505           break;
506         case V4L2_PIX_FMT_SGBRG8:
507           fcc = GST_MAKE_FOURCC ('G', 'B', 'R', 'G');
508           break;
509         case V4L2_PIX_FMT_SGRBG8:
510           fcc = GST_MAKE_FOURCC ('G', 'R', 'B', 'G');
511           break;
512         case V4L2_PIX_FMT_SRGGB8:
513           fcc = GST_MAKE_FOURCC ('R', 'G', 'G', 'B');
514           break;
515         case V4L2_PIX_FMT_SBGGR10:
516           fcc = GST_MAKE_FOURCC ('B', 'G', '1', '0');
517           break;
518         case V4L2_PIX_FMT_SGBRG10:
519           fcc = GST_MAKE_FOURCC ('G', 'B', '1', '0');
520           break;
521         case V4L2_PIX_FMT_SGRBG10:
522           fcc = GST_MAKE_FOURCC ('B', 'A', '1', '0');
523           break;
524         case V4L2_PIX_FMT_SRGGB10:
525           fcc = GST_MAKE_FOURCC ('R', 'G', '1', '0');
526           break;
527         case V4L2_PIX_FMT_SBGGR16:
528           fcc = GST_MAKE_FOURCC ('B', 'Y', 'R', '2');
529           break;
530         default:
531           g_assert_not_reached ();
532           break;
533       }
534       structure = gst_structure_new ("video/x-raw-bayer",
535           "format", GST_TYPE_FOURCC, fcc, NULL);
536       break;
537     }
538     default:
539       GST_DEBUG ("Unknown fourcc 0x%08x %" GST_FOURCC_FORMAT,
540           fourcc, GST_FOURCC_ARGS (fourcc));
541       break;
542   }
543
544   return structure;
545 }
546
547 /*
548  * gst_v4l2camsrc_get_caps:
549  *
550  */
551 static GstCaps *
552 gst_v4l2camsrc_get_caps (GstCameraSrc * camsrc)
553 {
554   GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
555   GstStructure *template;
556   GstCaps *ret;
557   GSList *walk;
558
559   if (!gst_v4l2camsrc_is_open (camsrc)) {
560     /* FIXME: should it probe the device? */
561     return NULL;
562   }
563
564   if (!v4l2camsrc->formats)
565     gst_v4l2camsrc_fill_format_list (v4l2camsrc);
566
567   ret = gst_caps_new_empty ();
568
569   for (walk = v4l2camsrc->formats; walk; walk = walk->next) {
570     struct v4l2_fmtdesc *format;
571
572     /* FIXME: Introduce own format structure */
573     format = (struct v4l2_fmtdesc *) walk->data;
574
575     template = gst_v4l2camsrc_v4l2fourcc_to_structure (format->pixelformat);
576
577     if (template) {
578       GstCaps *tmp;
579
580       tmp = gst_v4l2camsrc_probe_caps_for_format (v4l2camsrc,
581           format->pixelformat, template);
582       if (tmp)
583         gst_caps_append (ret, tmp);
584
585       gst_structure_free (template);
586     } else {
587       GST_DEBUG_OBJECT (v4l2camsrc, "unknown format %u", format->pixelformat);
588     }
589   }
590
591   v4l2camsrc->probed_caps = gst_caps_ref (ret);
592
593   GST_INFO_OBJECT(v4l2camsrc, "use GST_DEBUG >= 5 for probed caps");
594   GST_LOG_OBJECT (v4l2camsrc, "probed caps: %" GST_PTR_FORMAT, ret);
595
596   return ret;
597 }
598
599 /*
600  * gst_v4l2camsrc_get_num_buffers:
601  *
602  */
603 static guint
604 gst_v4l2camsrc_get_num_buffers (GstCameraSrc * camsrc)
605 {
606   GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
607
608   return v4l2camsrc->num_buffers;
609 }
610
611 /*
612  * common format / caps utilities:
613  */
614 typedef struct
615 {
616   guint32 format;
617   gboolean dimensions;
618 } GstV4L2FormatDesc;
619
620 static const GstV4L2FormatDesc gst_v4l2_formats[] = {
621   /* from Linux 2.6.15 videodev2.h */
622   {V4L2_PIX_FMT_YUV420, TRUE},
623   {V4L2_PIX_FMT_YVU420, TRUE},
624   {V4L2_PIX_FMT_YUV422P, TRUE},
625   {V4L2_PIX_FMT_YUV444, TRUE},
626
627   {V4L2_PIX_FMT_NV12, TRUE},
628   {V4L2_PIX_FMT_NV21, TRUE},
629
630   {V4L2_PIX_FMT_NV16, TRUE},
631   {V4L2_PIX_FMT_NV61, TRUE},
632
633   {V4L2_PIX_FMT_YUYV, TRUE},
634   {V4L2_PIX_FMT_UYVY, TRUE},
635
636   {V4L2_PIX_FMT_SBGGR16, TRUE},
637
638   {V4L2_PIX_FMT_SBGGR8, TRUE},
639   {V4L2_PIX_FMT_SGBRG8, TRUE},
640   {V4L2_PIX_FMT_SGRBG8, TRUE},
641   {V4L2_PIX_FMT_SRGGB8, TRUE},
642
643   {V4L2_PIX_FMT_SBGGR10, TRUE},
644   {V4L2_PIX_FMT_SGBRG10, TRUE},
645   {V4L2_PIX_FMT_SGRBG10, TRUE},
646   {V4L2_PIX_FMT_SRGGB10, TRUE},
647
648   {V4L2_PIX_FMT_RGB24, TRUE},
649   {V4L2_PIX_FMT_RGB32, TRUE},
650   {V4L2_PIX_FMT_RGB565, TRUE},
651 };
652
653 #define GST_V4L2_FORMAT_COUNT (G_N_ELEMENTS (gst_v4l2_formats))
654 #define GST_V4L2_MAX_SIZE (1<<15)       /* 2^15 == 32768 */
655
656 GstCaps *
657 gst_v4l2camsrc_get_all_caps (void)
658 {
659   static GstCaps *caps = NULL;
660
661   if (caps == NULL) {
662     GstStructure *structure;
663
664     guint i;
665
666     caps = gst_caps_new_empty ();
667     for (i = 0; i < GST_V4L2_FORMAT_COUNT; i++) {
668       structure =
669           gst_v4l2camsrc_v4l2fourcc_to_structure (gst_v4l2_formats[i].format);
670       if (structure) {
671         if (gst_v4l2_formats[i].dimensions) {
672           gst_structure_set (structure,
673               "width", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE,
674               "height", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE,
675               "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1, NULL);
676         }
677         gst_caps_append_structure (caps, structure);
678       }
679     }
680   }
681
682   return gst_caps_ref (caps);
683 }
684
685
686 /*
687  * gst_v4l2camsrc_base_init:
688  * @klass: #GstElementClass.
689  *
690  */
691 static void
692 gst_v4l2camsrc_base_init (gpointer klass)
693 {
694   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
695
696   gst_element_class_set_details_simple (element_class,
697       "V4L2 camera source",
698       "Video/Src",
699       "Video4Linux2 camera source element",
700       "Maemo Multimedia <multimedia@maemo.org>");
701
702   gst_element_class_add_pad_template (element_class,
703       gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
704           gst_v4l2camsrc_get_all_caps ()));
705 }
706
707 gboolean gst_v4l2camsrc_set_autofocus (GstCameraSrc * camsrc, gboolean on);
708 gboolean gst_v4l2camsrc_set_autoexposure (GstCameraSrc * camsrc, gboolean on);
709 GstPhotoCaps gst_v4l2camsrc_get_capabilities (GstCameraSrc * camsrc);
710 gboolean gst_v4l2camsrc_set_capture_mode (GstCameraSrc * camsrc,
711     GstCameraSrcCaptureMode mode);
712 gboolean
713 gst_v4l2camsrc_read_settings (GstCameraSrc * camsrc,
714     GstPhotoSettings * photoconf);
715 gboolean gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc,
716     GstPhotoSettings * photoconf, gboolean scene_override);
717 gboolean
718 gst_v4l2camsrc_set_flash_mode (GstCameraSrc *camsrc, int value);
719 gst_v4l2camsrc_read_exif (GstCameraSrc *camsrc, 
720     GstCameraControlExifInfo *exif_info);
721
722
723 /*
724  * gst_v4l2camsrc_class_init:
725  * @klass: #GstMFLDV4l2CamSrcClass.
726  *
727  */
728 static void
729 gst_v4l2camsrc_class_init (GstMFLDV4l2CamSrcClass * klass)
730 {
731   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
732   GstCameraSrcClass *camera_class = GST_CAMERA_SRC_CLASS (klass);
733
734   gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_property);
735   gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_property);
736   gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_dispose);
737   gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_finalize);
738
739   g_object_class_install_property (gobject_class, PROP_DEVICE,
740       g_param_spec_string ("device", "Device", "Device location",
741           DEFAULT_PROP_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
742
743   g_object_class_install_property (gobject_class, PROP_DEVICE_NAME,
744       g_param_spec_string ("device-name", "Device name",
745           "Name of the device", DEFAULT_PROP_DEVICE_NAME,
746           G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
747
748   g_object_class_install_property (gobject_class, PROP_DEVICE_FD,
749       g_param_spec_int ("device-fd", "File descriptor",
750           "File descriptor of the device", -1, G_MAXINT, DEFAULT_PROP_DEVICE_FD,
751           G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
752
753   g_object_class_install_property (gobject_class, PROP_QUEUE_SIZE,
754       g_param_spec_uint ("queue-size", "Queue size",
755           "Number of buffers to be enqueud in the driver",
756           GST_V4L2CAMSRC_MIN_BUFFERS, GST_V4L2CAMSRC_MAX_BUFFERS,
757           GST_V4L2CAMSRC_DEFAULT_BUFFERS,
758           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
759
760   g_object_class_install_property (gobject_class, PROP_INPUT_SENSOR,
761       g_param_spec_enum ("camera-id", "Camera Id",
762           "Which sensor is the input of the ISP",
763           GST_TYPE_CAMERA_INPUT_SENSOR,
764           GST_CAMERA_INPUT_SENSOR_PRIMARY,
765           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
766
767   g_object_class_install_property (gobject_class, PROP_USE_MMAP,
768       g_param_spec_boolean ("use-mmap", "Use Mmap",
769           "Whether use mmap memory method", FALSE, G_PARAM_READWRITE));
770
771   g_object_class_install_property (gobject_class, PROP_USE_COPY,
772       g_param_spec_boolean ("use-copy", "Use Copy",
773           "Whether copy the buffer from driver, debug only", FALSE, G_PARAM_READWRITE));
774
775   /* AE, AF, and AWB settings */
776   g_object_class_install_property (gobject_class, PROP_AE,
777       g_param_spec_boolean ("ae", "Auto Exposure",
778           "Auto Exposure is On or Off", TRUE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
779
780   g_object_class_install_property (gobject_class, PROP_AE_METERING_MODE,
781       g_param_spec_enum ("ae-metering-mode", "AE Metering Mode",
782           "Select AE Metering Mode",
783           GST_TYPE_CAMERA_AE_METERING_MODE,
784           GST_CAMERA_AE_METERING_AUTO,
785           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
786
787  g_object_class_install_property (gobject_class, PROP_AE_WINDOW,
788       g_param_spec_string("ae-window", "AE Window",
789           "Set AE Window Coordinates in format: x_left=value,x_right=value,"
790           "y_bottom=value,y_top=value",
791           DEFAULT_PROP_AE_WINDOW,
792           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ));
793
794
795   g_object_class_install_property (gobject_class, PROP_AF,
796       g_param_spec_boolean ("af", "Auto Focus",
797           "Auto Focus is On or Off", TRUE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
798
799   g_object_class_install_property (gobject_class, PROP_AF_METERING_MODE,
800       g_param_spec_enum ("af-metering-mode", "AF Metering Mode",
801           "Select AF Metering Mode",
802           GST_TYPE_CAMERA_AF_METERING_MODE,
803           GST_CAMERA_AF_METERING_AUTO,
804           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
805
806  g_object_class_install_property (gobject_class, PROP_AF_WINDOW,
807       g_param_spec_string("af-window", "AF Window",
808           "Set AF Window Coordinates in format: x_left=value,x_right=value,"
809           "y_bottom=value,y_top=value",
810           DEFAULT_PROP_AF_WINDOW,
811           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ));
812
813   g_object_class_install_property (gobject_class, PROP_AWB,
814       g_param_spec_boolean ("awb", "White Balance",
815           "White Balance is On or Off",
816           TRUE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
817
818   g_object_class_install_property (gobject_class, PROP_STILL_AF,
819       g_param_spec_boolean ("still-af", "still image slow focus",
820           "Turn On or Off slow focus when doing the still image capture",
821           TRUE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
822
823   g_object_class_install_property (gobject_class, PROP_FOCUS_POSITION,
824       g_param_spec_int ("focus-posi", "Focus Position",
825           "Focus absolute position set to Sensor.", FOCUS_POSITION_MIN,
826           FOCUS_POSITION_MAX, 0,
827           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE));
828
829   g_object_class_install_property (gobject_class, PROP_BAYER_DOWNSCALING,
830       g_param_spec_boolean ("bayer-downscaling", "Bayer Downscaling crop",
831           "Turn On or Off Bayer Downscaling", TRUE, G_PARAM_READWRITE));
832
833   /* These are advanced ISP features for MFLD camera only */
834   g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_GDC,
835       g_param_spec_boolean ("GDC", "GDC",
836           "Capture Correction for Lens Geometry Distortion Correction",
837           FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
838
839   g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_CAC,
840       g_param_spec_boolean ("CAC", "CAC",
841           "Capture Correction for Chromatic Aberration Correction",
842           FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
843
844   g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_RER,
845       g_param_spec_boolean ("redeye-reduction", "Redeye reduction",
846           "Capture Correction for Redeye reduction",
847           FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
848
849   g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_DIS,
850       g_param_spec_boolean ("still-stable", "Still stabilization",
851           "Capture Correction for still image stabilization", FALSE,
852           G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
853
854   g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_DVS,
855       g_param_spec_boolean ("video-stable", "Video stabilization",
856           "Capture Correction for video capture stabilization", FALSE,
857           G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
858
859   g_object_class_install_property (gobject_class,
860       PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT,
861       g_param_spec_boolean ("edge-enhancement", "Edge Enhancement",
862           "Capture Correction for edge enhancement", TRUE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
863
864   g_object_class_install_property (gobject_class,
865       PROP_CAPTURE_CORRECTION_SHADING_CORRECTION,
866       g_param_spec_boolean ("shading-correction", "Shading Correction",
867           "Capture Correction for shading correction", TRUE,
868           G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
869
870   g_object_class_install_property (gobject_class,
871       PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION,
872       g_param_spec_boolean ("black-level-compensation", "Black Level Compensation",
873           "Capture Correction for Black Level Compensation", FALSE,
874           G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
875
876   g_object_class_install_property (gobject_class,
877       PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION,
878       g_param_spec_boolean ("bad-pixel-detection", "Bad Pixel Detection",
879           "Capture Correction for Bad Pixel Detection", TRUE,
880           G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
881
882   g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_GAMMA,
883       g_param_spec_float ("gamma", "Gamma",
884           "Gamma Values", 1.0, 2.4, 2.2,
885           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE));
886
887   g_object_class_install_property (gobject_class,
888       PROP_CAPTURE_CORRECTION_CONTRAST, g_param_spec_int ("contrast",
889           "Contrast", "Contrast Values", 0, 2048, 256,
890           G_PARAM_READWRITE |G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE));
891
892   g_object_class_install_property (gobject_class,
893       PROP_CAPTURE_CORRECTION_BRIGHTNESS, g_param_spec_int ("brightness",
894           "Brightness", "Brightness Values", -255, 255, 0,
895           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE));
896
897   g_object_class_install_property (gobject_class, PROP_DUMP_RAW,
898       g_param_spec_boolean ("dump-raw", "Dump RAW images simultanious",
899           "Whether dump the raw images as output when during the jpeg capture",
900           FALSE, G_PARAM_READWRITE));
901
902   g_object_class_install_property (gobject_class, PROP_DUMP_IMAGE,
903       g_param_spec_boolean ("dump-image", "Dump images simultanious in pipeline",
904           "Whether dump the  images as output in pipeline, debug only,"
905           "output the image in current directory",
906           FALSE, G_PARAM_READWRITE));
907
908   g_object_class_install_property (gobject_class, PROP_DEBUG_FLAGS,
909       g_param_spec_flags ("debug-flags", "debug flags",
910           "debug flags for development and performance tuning usage",
911           GST_TYPE_CAMERASRC_DEBUG_FLAGS, DEFAULT_DEBUG_FLAGS,
912           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
913
914   g_object_class_install_property (gobject_class,
915       PROP_VFLIP,
916       g_param_spec_boolean ("vflip", "Vertical Flip",
917           "Vertical flip", FALSE,
918           G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
919
920   g_object_class_install_property (gobject_class,
921       PROP_HFLIP,
922       g_param_spec_boolean ("hflip", "Horisontal Flip",
923           "Horisontal flip", FALSE,
924           G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
925
926   camera_class->is_open = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_is_open);
927   camera_class->open = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_open);
928   camera_class->close = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_close);
929   camera_class->get_attribute =
930       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_attribute);
931   camera_class->set_attribute =
932       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_attribute);
933   camera_class->set_capture = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_capture);
934   camera_class->start = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_capture_start);
935   camera_class->is_active = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_is_active);
936   camera_class->grab_frame = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_grab_frame);
937   camera_class->stop = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_capture_stop);
938   camera_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_caps);
939   camera_class->get_num_buffers =
940       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_num_buffers);
941   camera_class->unlock = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_unlock);
942   camera_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_unlock_stop);
943
944   camera_class->set_capture_mode =
945       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_capture_mode);
946 //  camera_class->set_vfinder_mode = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_set_viewfinder_mode);
947   camera_class->set_autofocus =
948       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_autofocus);
949   camera_class->set_autoexposure =
950       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_autoexposure);
951   camera_class->read_settings =
952       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_read_settings);
953   camera_class->write_settings =
954       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_write_settings);
955   camera_class->get_capabilities =
956       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_capabilities);
957   camera_class->set_zoom = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_zoom);
958   camera_class->set_AeAafwindow = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_AeAafwindow);
959   camera_class->set_ae_mode = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_ae_mode);
960   camera_class->get_ae_mode = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_ae_mode);
961
962   camera_class->get_makernote = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_makernote);
963   camera_class->makernote_init = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_makernote_init);
964   camera_class->makernote_deal = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_makernote_deal);
965   camera_class->makernote_uninit = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_makernote_uninit);
966   camera_class->set_flash_mode = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_set_flash_mode);
967   camera_class->read_exif = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_read_exif);
968
969 //camera_class->fill_image_tags = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_fill_image_tags);
970 //camera_class->get_preview_image = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_get_preview_image);
971 }
972
973 /*
974  * gst_v4l2camsrc_driver_wrapper_load:
975  * Create the mfldadvci object. The function in libmfldadvci can
976  * be called from this source element now
977  */
978 GstV4l2MFLDAdvCI *
979 gst_v4l2camsrc_mfldadvci_wrapper_load (GstMFLDV4l2CamSrc * v4l2camsrc)
980 {
981   GstV4l2MFLDAdvCI *mfldadvci;
982
983   mfldadvci = g_new0 (GstV4l2MFLDAdvCI, 1);
984   lib_3a_link_functions_init(mfldadvci);
985   return mfldadvci;
986 }
987
988 /*
989  * gst_v4l2camsrc_mfldadvci_wrapper_unload:
990  * Unload the libmfldadvci and free its resource
991  */
992 void
993 gst_v4l2camsrc_mfldadvci_wrapper_unload (GstMFLDV4l2CamSrc * v4l2camsrc)
994 {
995   GstV4l2MFLDAdvCI *mfldadvci = v4l2camsrc->mfldadvci;
996   g_free (mfldadvci);
997 }
998
999
1000
1001 /*
1002  * gst_v4l2camsrc_init:
1003  * @v4l2camsrc: #GstMFLDV4l2CamSrc.
1004  * @klass: #GstMFLDV4l2CamSrcClass.
1005  *
1006  */
1007 static void
1008 gst_v4l2camsrc_init (GstMFLDV4l2CamSrc * v4l2camsrc,
1009     GstMFLDV4l2CamSrcClass * klass)
1010 {
1011   v4l2camsrc->num_buffers = GST_V4L2CAMSRC_DEFAULT_BUFFERS;
1012   v4l2camsrc->tmp_num_buffers = v4l2camsrc->num_buffers;
1013   v4l2camsrc->videodev = g_strdup (DEFAULT_PROP_DEVICE);
1014   v4l2camsrc->video_fd = DEFAULT_PROP_DEVICE_FD;
1015   v4l2camsrc->poll = gst_poll_new (TRUE);
1016   v4l2camsrc->buffer = NULL;
1017   v4l2camsrc->crop_supported = FALSE;
1018   v4l2camsrc->max_zoom_factor = MAX_RESIZER_FACTOR;
1019   v4l2camsrc->zoom_factor = DEFAULT_RESIZER_FACTOR;
1020   v4l2camsrc->use_mmap = TRUE;
1021   v4l2camsrc->use_copy = FALSE;
1022   v4l2camsrc->capture_mode = GST_CAMERA_SRC_CAPTURE_MODE_VIEWFINDER;
1023   /* MFLD camera Advanced features status */
1024   v4l2camsrc->gdc_enabled = FALSE;
1025   v4l2camsrc->rer_enabled = FALSE;
1026   v4l2camsrc->cac_enabled = FALSE;
1027   v4l2camsrc->dvs_enabled = FALSE;
1028   v4l2camsrc->dis_enabled = FALSE;
1029   v4l2camsrc->ee_enabled = TRUE;
1030   v4l2camsrc->sc_enabled = TRUE;
1031   v4l2camsrc->cc_updated = FALSE;
1032   v4l2camsrc->gamma_updated = FALSE;
1033   v4l2camsrc->ae_enabled = TRUE;
1034   v4l2camsrc->af_enabled = TRUE;
1035   v4l2camsrc->awb_enabled = TRUE;
1036   v4l2camsrc->still_af = FALSE;
1037   v4l2camsrc->bayer_downscaling = FALSE;
1038   v4l2camsrc->tone.gamma = 2.2;
1039   v4l2camsrc->tone.brightness = 0;
1040   v4l2camsrc->tone.contrast = 256;
1041
1042   v4l2camsrc->preflash_enabled = FALSE;
1043   v4l2camsrc->capflash_enabled = FALSE;
1044   v4l2camsrc->preflash_analoggain = 0;
1045
1046   v4l2camsrc->dump_raw = FALSE;
1047   v4l2camsrc->dump_image = FALSE;
1048   v4l2camsrc->raw_output_size = 0;
1049   v4l2camsrc->debug_flags = DEFAULT_DEBUG_FLAGS;
1050
1051   v4l2camsrc->device_mutex = g_mutex_new ();
1052
1053   v4l2camsrc->mfldadvci = gst_v4l2camsrc_mfldadvci_wrapper_load (v4l2camsrc);
1054
1055   v4l2camsrc->input_sensor = GST_CAMERA_INPUT_SENSOR_PRIMARY;
1056   v4l2camsrc->ae_metering_mode = GST_CAMERA_AE_METERING_AUTO;
1057   v4l2camsrc->af_metering_mode = GST_CAMERA_AF_METERING_AUTO;
1058
1059   v4l2camsrc->ae_window.x_left = 0;
1060   v4l2camsrc->ae_window.x_right = 0;
1061   v4l2camsrc->ae_window.y_bottom = 0;
1062   v4l2camsrc->ae_window.y_top = 0;
1063   v4l2camsrc->ae_window.weight= 0x8000;
1064   v4l2camsrc->af_window.x_left = 0;
1065   v4l2camsrc->af_window.x_right = 0;
1066   v4l2camsrc->af_window.y_bottom = 0;
1067   v4l2camsrc->af_window.y_top = 0;
1068   v4l2camsrc->af_window.weight= 0x8000;
1069
1070   libmfld_cam_init (v4l2camsrc->mfldadvci);
1071
1072   GST_DEBUG ("initialized to commit %s", MFLD_V4L2CAMSRC_VERSION);
1073 }
1074
1075
1076 static void
1077 gst_v4l2camsrc_dispose (GObject * object)
1078 {
1079   GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (object);
1080
1081   if (v4l2camsrc->formats) {
1082     gst_v4l2camsrc_clear_format_list (v4l2camsrc);
1083   }
1084
1085   if (v4l2camsrc->probed_caps) {
1086     gst_caps_unref (v4l2camsrc->probed_caps);
1087     v4l2camsrc->probed_caps = NULL;
1088   }
1089
1090   /* FIXME: driver cleanup function */
1091   if (v4l2camsrc->videodev) {
1092     g_free (v4l2camsrc->videodev);
1093     v4l2camsrc->videodev = NULL;
1094   }
1095
1096   if (v4l2camsrc->poll) {
1097     gst_poll_free (v4l2camsrc->poll);
1098   }
1099
1100   g_mutex_free (v4l2camsrc->device_mutex);
1101
1102   G_OBJECT_CLASS (parent_class)->dispose (object);
1103   libmfld_cam_dispose ();
1104 }
1105
1106
1107 /*
1108  * gst_v4l2camsrc_finalize:
1109  * @object:
1110  *
1111  */
1112 static void
1113 gst_v4l2camsrc_finalize (GObject * object)
1114 {
1115   G_OBJECT_CLASS (parent_class)->finalize (object);
1116 }
1117
1118
1119
1120 /*
1121  */
1122 static void
1123 gst_v4l2camsrc_set_property (GObject * object,
1124     guint prop_id, const GValue * value, GParamSpec * pspec)
1125 {
1126   GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (object);
1127   gboolean opened = GST_V4L2CAMSRC_IS_OPEN (v4l2camsrc);
1128
1129   switch (prop_id) {
1130     case PROP_DEVICE:
1131       g_free (v4l2camsrc->videodev);
1132       v4l2camsrc->videodev = g_value_dup_string (value);
1133       break;
1134     case PROP_QUEUE_SIZE:
1135       v4l2camsrc->num_buffers = g_value_get_uint (value);
1136       v4l2camsrc->tmp_num_buffers = v4l2camsrc->num_buffers;
1137       break;
1138     case PROP_INPUT_SENSOR:
1139       v4l2camsrc->input_sensor = g_value_get_enum (value);
1140       break;
1141     case PROP_USE_MMAP:
1142       v4l2camsrc->use_mmap = g_value_get_boolean (value);
1143       break;
1144     case PROP_USE_COPY:
1145       v4l2camsrc->use_copy = g_value_get_boolean (value);
1146       break;
1147     case PROP_AE:
1148       v4l2camsrc->ae_enabled = g_value_get_boolean (value);
1149       break;
1150     case PROP_AE_WINDOW:
1151     {
1152       GstStructure *ae_window_param = NULL;
1153       char * ctmp = NULL;
1154       gboolean parsed = TRUE;
1155       ci_adv_Err r;
1156
1157       ctmp = g_malloc0 (60);
1158       if (ctmp == NULL)
1159       {
1160              GST_DEBUG_OBJECT(v4l2camsrc, "alloc string mem failed.\n");
1161              break;
1162       }
1163       strncpy (ctmp,"ae,",3);
1164       strncat (ctmp,g_value_get_string (value),55);
1165       ae_window_param = gst_structure_from_string (ctmp, NULL);
1166       if(ae_window_param == NULL)
1167       {
1168               GST_DEBUG_OBJECT(v4l2camsrc,"wrong string format is entered. stop setting ae window.\n");
1169               g_free (ctmp);
1170               break;
1171       }
1172
1173       parsed = gst_structure_get_int(ae_window_param, "x_left",
1174                       &v4l2camsrc->ae_window.x_left);
1175       parsed |= gst_structure_get_int(ae_window_param, "x_right",
1176                       &v4l2camsrc->ae_window.x_right);
1177       parsed |= gst_structure_get_int(ae_window_param, "y_top",
1178                       &v4l2camsrc->ae_window.y_top);
1179       parsed |= gst_structure_get_int(ae_window_param, "y_bottom",
1180                       &v4l2camsrc->ae_window.y_bottom);
1181
1182       if (parsed == FALSE)
1183       {
1184                 GST_DEBUG_OBJECT(v4l2camsrc,"cannot parse ae window parameter. \n");
1185                 gst_structure_free (ae_window_param);
1186                 g_free (ctmp);
1187                 break;
1188       }
1189
1190       parsed = gst_structure_get_int(ae_window_param, "weight",
1191                       &v4l2camsrc->ae_window.weight);
1192
1193       if (parsed == FALSE)
1194       {
1195         GST_DEBUG_OBJECT(v4l2camsrc,
1196                              "set ae window weight to default value 0x8000.\n");
1197         v4l2camsrc->ae_window.weight = 0x8000;
1198       }
1199
1200       GST_DEBUG_OBJECT(v4l2camsrc,"ae-window-setting: x_left:%d, x_right:%d,"
1201                      "y_bottom:%d, y_top:%d, weight:%d.\n",
1202                       v4l2camsrc->ae_window.x_left,v4l2camsrc->ae_window.x_right,
1203                       v4l2camsrc->ae_window.y_bottom, v4l2camsrc->ae_window.y_top,
1204                      v4l2camsrc->ae_window.weight);
1205
1206
1207       if (v4l2camsrc->ae_metering_mode != GST_CAMERA_AE_METERING_SPOT)
1208       {
1209                 GST_DEBUG_OBJECT(v4l2camsrc,"wrong ae metering mode. set it to spot mode automaticly.\n");
1210                v4l2camsrc->ae_metering_mode = GST_CAMERA_AE_METERING_SPOT;
1211                 v4l2camsrc->mfldadvci->AeSetMeteringMode
1212                         ( (ia_3a_ae_metering_mode) v4l2camsrc->ae_metering_mode);
1213
1214       }
1215       v4l2camsrc->mfldadvci->AeSetWindow ((ia_3a_window *) (&(v4l2camsrc->ae_window)));
1216
1217       gst_structure_free (ae_window_param);
1218       g_free (ctmp);
1219       break;
1220     }
1221
1222     case PROP_AE_METERING_MODE:
1223     {
1224       v4l2camsrc->ae_metering_mode = g_value_get_enum (value);
1225       v4l2camsrc->mfldadvci->AeSetMeteringMode((ia_3a_ae_metering_mode)v4l2camsrc->ae_metering_mode);
1226       break;
1227     }
1228     case PROP_AF_METERING_MODE:
1229     {
1230       v4l2camsrc->af_metering_mode = g_value_get_enum (value);
1231       v4l2camsrc->mfldadvci->AfSetMeteringMode((ia_3a_af_metering_mode)v4l2camsrc->af_metering_mode);
1232       break;
1233     }
1234     case PROP_AF_WINDOW:
1235     {
1236       GstStructure *af_window_param = NULL;
1237       char * ctmp = NULL;
1238       gboolean parsed = TRUE;
1239       ci_adv_Err r;
1240
1241       ctmp = g_malloc0 (60);
1242       if (ctmp == NULL)
1243       {
1244              GST_DEBUG_OBJECT(v4l2camsrc, "alloc string mem failed.\n");
1245              break;
1246       }
1247       strncpy (ctmp,"af,",3);
1248       strncat (ctmp,g_value_get_string (value),55);
1249       af_window_param = gst_structure_from_string (ctmp, NULL);
1250       if(af_window_param == NULL)
1251       {
1252               GST_DEBUG_OBJECT(v4l2camsrc,"wrong string format is entered. stop setting af window.\n");
1253               g_free (ctmp);
1254               break;
1255       }
1256
1257       parsed = gst_structure_get_int(af_window_param, "x_left",
1258                       &v4l2camsrc->af_window.x_left);
1259       parsed |= gst_structure_get_int(af_window_param, "x_right",
1260                       &v4l2camsrc->af_window.x_right);
1261       parsed |= gst_structure_get_int(af_window_param, "y_top",
1262                       &v4l2camsrc->af_window.y_top);
1263       parsed |= gst_structure_get_int(af_window_param, "y_bottom",
1264                       &v4l2camsrc->af_window.y_bottom);
1265
1266       if (parsed == FALSE)
1267       {
1268                 GST_DEBUG_OBJECT(v4l2camsrc,"cannot parse af window parameter. \n");
1269                 gst_structure_free (af_window_param);
1270                 g_free (ctmp);
1271                 break;
1272       }
1273
1274       parsed = gst_structure_get_int(af_window_param, "weight",
1275                       &v4l2camsrc->af_window.weight);
1276
1277       if (parsed == FALSE)
1278       {
1279              GST_DEBUG_OBJECT(v4l2camsrc,
1280                              "set af window weight to default value 0x8000.\n");
1281              v4l2camsrc->af_window.weight = 0x8000;
1282       }
1283
1284       GST_DEBUG_OBJECT(v4l2camsrc,"af-window-setting: x_left:%d, x_right:%d,"
1285                      "y_bottom:%d, y_top:%d, weight:%d.\n",
1286                       v4l2camsrc->af_window.x_left,v4l2camsrc->af_window.x_right,
1287                       v4l2camsrc->af_window.y_bottom, v4l2camsrc->af_window.y_top,
1288                      v4l2camsrc->af_window.y_top);
1289
1290
1291       v4l2camsrc->mfldadvci->AfSetWindow ((ia_3a_window *) (&(v4l2camsrc->af_window)));
1292
1293       gst_structure_free (af_window_param);
1294       g_free (ctmp);
1295       break;
1296     }
1297
1298     case PROP_AF:
1299       v4l2camsrc->af_enabled = g_value_get_boolean (value);
1300       break;
1301
1302     case PROP_AWB:
1303       v4l2camsrc->awb_enabled = g_value_get_boolean (value);
1304       break;
1305     case PROP_STILL_AF:
1306       v4l2camsrc->still_af = g_value_get_boolean (value);
1307       cam_set_autofocus (v4l2camsrc->still_af);
1308       break;
1309     case PROP_FOCUS_POSITION:
1310       v4l2camsrc->focus_posi = g_value_get_int(value);
1311       if (opened)
1312         cam_driver_set_focus_posi (v4l2camsrc->video_fd, v4l2camsrc->focus_posi);
1313       else
1314         v4l2camsrc->focus_updated = TRUE;
1315       break;
1316     case PROP_VFLIP:
1317       v4l2camsrc->vflip = g_value_get_boolean(value);
1318       if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc)))
1319         gst_v4l2camsrc_set_attribute (GST_CAMERA_SRC (v4l2camsrc),V4L2_CID_VFLIP,v4l2camsrc->vflip);
1320       break;
1321     case  PROP_HFLIP:
1322       v4l2camsrc->hflip = g_value_get_boolean(value);
1323       if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc))) 
1324         gst_v4l2camsrc_set_attribute (GST_CAMERA_SRC (v4l2camsrc),V4L2_CID_HFLIP,v4l2camsrc->hflip);
1325       break;
1326     case PROP_BAYER_DOWNSCALING:
1327       v4l2camsrc->bayer_downscaling = g_value_get_boolean (value);
1328       break;
1329     case PROP_CAPTURE_CORRECTION_GDC:
1330       v4l2camsrc->gdc_enabled = g_value_get_boolean (value);
1331       if (opened)
1332         cam_set_capture_correction (v4l2camsrc->video_fd,
1333             CAM_CAPTURE_CORRECTION_GDC, v4l2camsrc->gdc_enabled);
1334       else
1335         v4l2camsrc->cc_updated = TRUE;
1336       break;
1337     case PROP_CAPTURE_CORRECTION_CAC:
1338       v4l2camsrc->cac_enabled = g_value_get_boolean (value);
1339       if (opened)
1340         cam_set_capture_correction (v4l2camsrc->video_fd,
1341             CAM_CAPTURE_CORRECTION_CAC, v4l2camsrc->cac_enabled);
1342       else
1343         v4l2camsrc->cc_updated = TRUE;
1344       break;
1345     case PROP_CAPTURE_CORRECTION_RER:
1346       v4l2camsrc->rer_enabled = g_value_get_boolean (value);
1347       cam_set_capture_correction (v4l2camsrc->video_fd,
1348           CAM_CAPTURE_CORRECTION_RER, v4l2camsrc->rer_enabled);
1349       break;
1350     case PROP_CAPTURE_CORRECTION_DIS:
1351       v4l2camsrc->dis_enabled = g_value_get_boolean (value);
1352       cam_set_capture_correction (v4l2camsrc->video_fd,
1353           CAM_CAPTURE_CORRECTION_DIS, v4l2camsrc->dis_enabled);
1354       break;
1355     case PROP_CAPTURE_CORRECTION_DVS:
1356       v4l2camsrc->dvs_enabled = g_value_get_boolean (value);
1357       if (opened)
1358         cam_set_capture_correction (v4l2camsrc->video_fd,
1359             CAM_CAPTURE_CORRECTION_DVS, v4l2camsrc->dvs_enabled);
1360       else
1361         v4l2camsrc->cc_updated = TRUE;
1362       break;
1363     case PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT:
1364       v4l2camsrc->ee_enabled = g_value_get_boolean (value);
1365       if (opened)
1366         cam_set_capture_correction (v4l2camsrc->video_fd,
1367             CAM_CAPTURE_CORRECTION_EE, v4l2camsrc->ee_enabled);
1368       else
1369         v4l2camsrc->cc_updated = TRUE;
1370       break;
1371     case PROP_CAPTURE_CORRECTION_SHADING_CORRECTION:
1372       v4l2camsrc->sc_enabled = g_value_get_boolean (value);
1373       if (opened)
1374         cam_set_capture_correction (v4l2camsrc->video_fd,
1375             CAM_CAPTURE_CORRECTION_SC, v4l2camsrc->sc_enabled);
1376       else
1377         v4l2camsrc->cc_updated = TRUE;
1378       break;
1379     case PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION:
1380       v4l2camsrc->blc_enabled = g_value_get_boolean (value);
1381       if (opened)
1382         cam_set_capture_correction (v4l2camsrc->video_fd,
1383             CAM_CAPTURE_CORRECTION_BLC, v4l2camsrc->blc_enabled);
1384       else
1385         v4l2camsrc->cc_updated = TRUE;
1386       break;
1387     case PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION:
1388       v4l2camsrc->bpd_enabled = g_value_get_boolean (value);
1389       if (opened)
1390         cam_set_capture_correction (v4l2camsrc->video_fd,
1391             CAM_CAPTURE_CORRECTION_BPD, v4l2camsrc->bpd_enabled);
1392       else
1393         v4l2camsrc->cc_updated = TRUE;
1394       break;
1395     case PROP_CAPTURE_CORRECTION_GAMMA:
1396       v4l2camsrc->tone.gamma = g_value_get_float (value);
1397       if (opened)
1398         cam_set_tone_control (v4l2camsrc->video_fd, CAM_GAMMA_VALUE,
1399             &v4l2camsrc->tone);
1400       else
1401         v4l2camsrc->gamma_updated = TRUE;
1402       break;
1403     case PROP_CAPTURE_CORRECTION_CONTRAST:
1404       v4l2camsrc->tone.contrast = g_value_get_int (value);
1405       if (opened)
1406         cam_set_tone_control (v4l2camsrc->video_fd, CAM_CONTRAST_VALUE,
1407             &v4l2camsrc->tone);
1408       else
1409         v4l2camsrc->gamma_updated = TRUE;
1410       break;
1411     case PROP_CAPTURE_CORRECTION_BRIGHTNESS:
1412       v4l2camsrc->tone.brightness = g_value_get_int (value);
1413       if (opened)
1414         cam_set_tone_control (v4l2camsrc->video_fd, CAM_BRIGHTNESS_VALUE,
1415             &v4l2camsrc->tone);
1416       else
1417         v4l2camsrc->gamma_updated = TRUE;
1418       break;
1419     case PROP_DUMP_RAW:
1420       v4l2camsrc->dump_raw = g_value_get_boolean (value);
1421       break;
1422     case PROP_DUMP_IMAGE:
1423       v4l2camsrc->dump_image = g_value_get_boolean (value);
1424       break;
1425     case PROP_DEBUG_FLAGS:
1426       v4l2camsrc->debug_flags = g_value_get_flags (value);
1427       break;
1428     default:
1429       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1430       break;
1431
1432
1433   }
1434 }
1435
1436 /*
1437  */
1438 static void
1439 gst_v4l2camsrc_get_property (GObject * object,
1440     guint prop_id, GValue * value, GParamSpec * pspec)
1441 {
1442   GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (object);
1443
1444   switch (prop_id) {
1445     case PROP_DEVICE:
1446       g_value_set_string (value, v4l2camsrc->videodev);
1447       break;
1448     case PROP_DEVICE_NAME:
1449     {
1450       const guchar *new = NULL;
1451
1452       if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc))) {
1453         new = v4l2camsrc->vcap.card;
1454       } else if (gst_v4l2camsrc_open (GST_CAMERA_SRC (v4l2camsrc))) {
1455         new = v4l2camsrc->vcap.card;
1456         gst_v4l2camsrc_close (GST_CAMERA_SRC (v4l2camsrc));
1457         gst_camerasrc_clear_color_channels (GST_CAMERA_SRC (v4l2camsrc));
1458       }
1459       g_value_set_string (value, (gchar *) new);
1460       break;
1461     }
1462     case PROP_DEVICE_FD:
1463     {
1464       if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc)))
1465         g_value_set_int (value, v4l2camsrc->video_fd);
1466       else
1467         g_value_set_int (value, DEFAULT_PROP_DEVICE_FD);
1468       break;
1469     }
1470     case PROP_QUEUE_SIZE:
1471       g_value_set_uint (value, v4l2camsrc->num_buffers);
1472       break;
1473     case PROP_INPUT_SENSOR:
1474       g_value_set_enum (value, v4l2camsrc->input_sensor);
1475       break;
1476     case PROP_USE_MMAP:
1477       g_value_set_boolean (value, v4l2camsrc->use_mmap);
1478       break;
1479     case PROP_USE_COPY:
1480       g_value_set_boolean (value, v4l2camsrc->use_copy);
1481       break;
1482     case PROP_AE:
1483       g_value_set_boolean (value, v4l2camsrc->ae_enabled);
1484       break;
1485     case PROP_AE_METERING_MODE:
1486       g_value_set_enum (value, v4l2camsrc->ae_metering_mode);
1487       break;
1488     case PROP_AE_WINDOW:
1489     {
1490       GstStructure *tmp = NULL;
1491       tmp = gst_structure_empty_new("ae-window");
1492       if(tmp == NULL)
1493       {
1494               GST_DEBUG ("wrong default ae window setting.\n");
1495               break;
1496       }
1497       gst_structure_set (tmp,"x_left", G_TYPE_INT,
1498                       v4l2camsrc->ae_window.x_left,NULL);
1499       gst_structure_set (tmp,"x_right", G_TYPE_INT,
1500                       v4l2camsrc->ae_window.x_right,NULL);
1501       gst_structure_set (tmp,"y_bottom", G_TYPE_INT,
1502                       v4l2camsrc->ae_window.y_bottom,NULL);
1503       gst_structure_set (tmp,"y_top", G_TYPE_INT,
1504                       v4l2camsrc->ae_window.y_top,NULL);
1505       g_value_set_string(value, gst_structure_to_string(tmp));
1506       gst_structure_free(tmp);
1507       break;
1508     }
1509
1510     case PROP_AF:
1511       g_value_set_boolean (value, v4l2camsrc->af_enabled);
1512       break;
1513     case PROP_AF_METERING_MODE:
1514       g_value_set_enum (value, v4l2camsrc->af_metering_mode);
1515       break;
1516     case PROP_AF_WINDOW:
1517     {
1518       GstStructure *tmp = NULL;
1519       tmp = gst_structure_empty_new("af-window");
1520       if(tmp == NULL)
1521       {
1522               GST_DEBUG ("wrong default af window setting.\n");
1523               break;
1524       }
1525       gst_structure_set (tmp,"x_left", G_TYPE_INT,
1526                       v4l2camsrc->af_window.x_left,NULL);
1527       gst_structure_set (tmp,"x_right", G_TYPE_INT,
1528                       v4l2camsrc->af_window.x_right,NULL);
1529       gst_structure_set (tmp,"y_bottom", G_TYPE_INT,
1530                       v4l2camsrc->af_window.y_bottom,NULL);
1531       gst_structure_set (tmp,"y_top", G_TYPE_INT,
1532                       v4l2camsrc->af_window.y_top,NULL);
1533       g_value_set_string(value, gst_structure_to_string(tmp));
1534       gst_structure_free(tmp);
1535       break;
1536     }
1537
1538     case PROP_AWB:
1539       g_value_set_boolean (value, v4l2camsrc->awb_enabled);
1540       break;
1541     case PROP_STILL_AF:
1542       g_value_set_boolean (value, v4l2camsrc->still_af);
1543       break;
1544     case PROP_FOCUS_POSITION:
1545       g_value_set_int (value, v4l2camsrc->focus_posi);
1546       break;
1547     case PROP_VFLIP:
1548       g_value_set_boolean (value, v4l2camsrc->vflip);
1549       break;
1550     case PROP_HFLIP:
1551       g_value_set_boolean (value,  v4l2camsrc->hflip);
1552       break;
1553     case PROP_BAYER_DOWNSCALING:
1554       g_value_set_boolean (value, v4l2camsrc->bayer_downscaling);
1555       break;
1556     case PROP_CAPTURE_CORRECTION_GDC:
1557       g_value_set_boolean (value, v4l2camsrc->gdc_enabled);
1558       break;
1559     case PROP_CAPTURE_CORRECTION_CAC:
1560       g_value_set_boolean (value, v4l2camsrc->cac_enabled);
1561       break;
1562     case PROP_CAPTURE_CORRECTION_RER:
1563       g_value_set_boolean (value, v4l2camsrc->rer_enabled);
1564       break;
1565     case PROP_CAPTURE_CORRECTION_DIS:
1566       g_value_set_boolean (value, v4l2camsrc->dis_enabled);
1567       break;
1568     case PROP_CAPTURE_CORRECTION_DVS:
1569       g_value_set_boolean (value, v4l2camsrc->dvs_enabled);
1570       break;
1571     case PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT:
1572       g_value_set_boolean (value, v4l2camsrc->ee_enabled);
1573       break;
1574     case PROP_CAPTURE_CORRECTION_SHADING_CORRECTION:
1575       g_value_set_boolean (value, v4l2camsrc->sc_enabled);
1576       break;
1577     case PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION:
1578       g_value_set_boolean (value, v4l2camsrc->blc_enabled);
1579       break;
1580     case PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION:
1581       g_value_set_boolean (value, v4l2camsrc->bpd_enabled);
1582       break;
1583     case PROP_CAPTURE_CORRECTION_GAMMA:
1584       g_value_set_float (value, v4l2camsrc->tone.gamma);
1585       break;
1586     case PROP_CAPTURE_CORRECTION_CONTRAST:
1587       g_value_set_int (value, v4l2camsrc->tone.contrast);
1588       break;
1589     case PROP_CAPTURE_CORRECTION_BRIGHTNESS:
1590       g_value_set_int (value, v4l2camsrc->tone.brightness);
1591       break;
1592     case PROP_DUMP_RAW:
1593       g_value_set_boolean (value, v4l2camsrc->dump_raw);
1594       break;
1595     case PROP_DUMP_IMAGE:
1596       g_value_set_boolean (value, v4l2camsrc->dump_image);
1597       break;
1598     case PROP_DEBUG_FLAGS:
1599       g_value_set_flags (value, v4l2camsrc->debug_flags);
1600       break;
1601     default:
1602       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1603       break;
1604   }
1605 }
1606
1607
1608
1609 static gboolean
1610 gst_v4l2camsrc_unlock (GstCameraSrc * src)
1611 {
1612   GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (src);
1613
1614   GST_LOG_OBJECT (v4l2camsrc, "Flushing");
1615   gst_poll_set_flushing (v4l2camsrc->poll, TRUE);
1616
1617   return TRUE;
1618 }
1619
1620 static gboolean
1621 gst_v4l2camsrc_unlock_stop (GstCameraSrc * src)
1622 {
1623   GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (src);
1624
1625   GST_LOG_OBJECT (v4l2camsrc, "No longer flushing");
1626   gst_poll_set_flushing (v4l2camsrc->poll, FALSE);
1627
1628   return TRUE;
1629 }
1630
1631 /*
1632  * gst_v4l2camsrc_set_zoom:
1633  * @camsrc: @GstCameraSrc object.
1634  * @zoom: zoom factor to be set.
1635  *
1636  * Set the zoom factor for outputted video.
1637  *
1638  * Returns: TRUE on success.
1639  */
1640 static gboolean
1641 gst_v4l2camsrc_set_zoom (GstCameraSrc * camsrc, gfloat zoom)
1642 {
1643   GstMFLDV4l2CamSrc *v4l2camsrc;
1644   gboolean ret = TRUE;
1645
1646   v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1647
1648   GST_DEBUG_OBJECT (v4l2camsrc, "ZOOM: %f", zoom);
1649
1650   v4l2camsrc->zoom_factor = zoom;
1651   if (v4l2camsrc->is_active) {
1652     g_mutex_lock (v4l2camsrc->device_mutex);
1653     ret = gst_v4l2camsrc_libmfldcam_set_zoom (v4l2camsrc, zoom);
1654     g_mutex_unlock (v4l2camsrc->device_mutex);
1655   } else
1656     v4l2camsrc->zoom_updated = TRUE;
1657
1658   return ret;
1659 }
1660 static gboolean
1661 gst_v4l2camsrc_set_AeAafwindow (GstCameraSrc * camsrc, GstCameraSrc3a_window window)
1662 {
1663   GstMFLDV4l2CamSrc *v4l2camsrc;
1664   gboolean ret = TRUE;
1665
1666   v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1667
1668   GST_DEBUG_OBJECT(v4l2camsrc,"ae-af-window-setting: x_left:%d, x_right:%d,"
1669          "y_bottom:%d, y_top:%d, weight:%d.\n",
1670          window.x_left,window.x_right,
1671          window.y_bottom, window.y_top,
1672          window.weight);
1673
1674   v4l2camsrc->af_window = v4l2camsrc->ae_window  = *(GstCameraWindow*)&window;
1675
1676   if (v4l2camsrc->is_active) {
1677     g_mutex_lock (v4l2camsrc->device_mutex);
1678     v4l2camsrc->mfldadvci->AfSetWindow ((ia_3a_window *) (&(v4l2camsrc->af_window)));
1679     g_mutex_unlock (v4l2camsrc->device_mutex);
1680   }
1681
1682   return ret;
1683 }
1684 static gboolean
1685 gst_v4l2camsrc_set_ae_mode(GstCameraSrc * camsrc, int mode)
1686 {
1687   GstMFLDV4l2CamSrc *v4l2camsrc;
1688   gboolean ret = TRUE;
1689
1690   v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1691
1692   if (v4l2camsrc->is_active) {
1693     g_mutex_lock (v4l2camsrc->device_mutex);
1694     v4l2camsrc->ae_metering_mode = *(GstCameraAEMeteringMode *)&mode;
1695     v4l2camsrc->mfldadvci->AeSetMeteringMode((ia_3a_ae_metering_mode)v4l2camsrc->ae_metering_mode);
1696     g_mutex_unlock (v4l2camsrc->device_mutex);
1697   }
1698
1699   return ret;
1700 }
1701 static gboolean
1702 gst_v4l2camsrc_get_ae_mode(GstCameraSrc * camsrc, int *mode)
1703 {
1704   GstMFLDV4l2CamSrc *v4l2camsrc;
1705   gboolean ret = TRUE;
1706
1707   v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1708
1709   if (v4l2camsrc->is_active) {
1710     g_mutex_lock (v4l2camsrc->device_mutex);
1711     *mode = v4l2camsrc->ae_metering_mode;
1712     g_mutex_unlock (v4l2camsrc->device_mutex);
1713   }
1714
1715   return ret;
1716 }
1717
1718 static gboolean
1719 gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size)
1720 {
1721   GstMFLDV4l2CamSrc *v4l2camsrc;
1722   gboolean ret = TRUE;
1723
1724   v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1725   GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1726
1727   if (v4l2camsrc->is_active) {
1728     g_mutex_lock (v4l2camsrc->device_mutex);
1729     ret = gst_v4l2camsrc_libmfldcam_get_makernote(v4l2camsrc, buf, size);
1730     g_mutex_unlock (v4l2camsrc->device_mutex);
1731   }
1732
1733   return ret;
1734 }
1735
1736 static gboolean gst_v4l2camsrc_makernote_init(GstCameraSrc * camsrc,
1737                                                       unsigned * buf_size,
1738                                                       unsigned num_afwindows,
1739                                                       unsigned num_faces,
1740                                                       unsigned num_eyes,
1741                                                       unsigned num_grid,
1742                                                       int *handle)
1743 {
1744   GstMFLDV4l2CamSrc *v4l2camsrc;
1745
1746   v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1747   GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1748
1749   num_afwindows = num_grid = 1;
1750   num_faces = num_eyes = 0;
1751   return FALSE;
1752
1753 }
1754
1755 static gboolean gst_v4l2camsrc_makernote_deal(GstCameraSrc * camsrc,
1756                                                       GstBuffer *pmakerbuf,
1757                                                       unsigned num_afwindows,
1758                                                       unsigned num_grid,
1759                                                       int handle)
1760 {
1761   GstMFLDV4l2CamSrc *v4l2camsrc;
1762
1763   v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1764   GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1765
1766   return FALSE;
1767
1768 }
1769
1770 static gboolean gst_v4l2camsrc_makernote_uninit(GstCameraSrc * camsrc,
1771                                                         int handle)
1772 {
1773   GstMFLDV4l2CamSrc *v4l2camsrc;
1774
1775   v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1776   GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1777
1778   return FALSE;
1779 }
1780
1781
1782 /*
1783  * plugin_init:
1784  * @plugin: GstPlugin
1785  *
1786  * Returns: TRUE on success.
1787  */
1788 static gboolean
1789 plugin_init (GstPlugin * plugin)
1790 {
1791   GST_DEBUG_CATEGORY_INIT (gst_v4l2camsrc_debug, "camerasrc", 0,
1792       "Medfield V4L2 camera source");
1793
1794   return gst_element_register (plugin, "camerasrc",
1795       GST_RANK_NONE, GST_TYPE_V4L2CAMSRC);
1796 }
1797
1798 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
1799     GST_VERSION_MINOR,
1800     "mfldv4l2cam",
1801     "V4L2 camera image capturing element",
1802     plugin_init, VERSION, "LGPL", "Intel", "www.intel.com")