1 /* GStreamer V4L2 camera source
2 * Copyright (C) 2010 Nokia Corporation <multimedia@maemo.org>
3 * 2010 Intel Corporation
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.
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.
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.
22 * SECTION:element-mfldcamsrc
23 * @short_description: Medfield V4L2 camera source
24 * @see_also: #GstCameraSrc
33 * <title>Example launch line</title>
36 * gst-launch mfldv4l2camsrc ! xvimagesink
48 #include <linux/videodev2.h>
49 #include "gstv4l2camsrc.h"
50 #include "v4l2camsrc_calls.h"
51 #include "gstv4l2camvidorient.h"
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
59 GST_DEBUG_CATEGORY (gst_v4l2camsrc_debug);
60 #define GST_CAT_DEFAULT gst_v4l2camsrc_debug
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_ae_mode (GstCameraSrc * camsrc, int mode);
73 static gboolean gst_v4l2camsrc_get_ae_mode (GstCameraSrc * camsrc, int *mode);
75 static gboolean gst_v4l2camsrc_iface_supported (GstImplementsInterface * iface,
77 static gboolean gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size);
78 static gboolean gst_v4l2camsrc_makernote_init(GstCameraSrc * camsrc,
80 unsigned num_afwindows,
85 static gboolean gst_v4l2camsrc_makernote_deal(GstCameraSrc * camsrc,
87 unsigned num_afwindows,
90 static gboolean gst_v4l2camsrc_makernote_uninit(GstCameraSrc * camsrc,
104 PROP_AE_METERING_MODE,
107 PROP_AF_METERING_MODE,
113 PROP_BAYER_DOWNSCALING,
114 PROP_CAPTURE_CORRECTION_GDC,
115 PROP_CAPTURE_CORRECTION_CAC,
116 PROP_CAPTURE_CORRECTION_RER,
117 PROP_CAPTURE_CORRECTION_DIS,
118 PROP_CAPTURE_CORRECTION_DVS,
119 PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT,
120 PROP_CAPTURE_CORRECTION_SHADING_CORRECTION,
121 PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION,
122 PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION,
123 PROP_CAPTURE_CORRECTION_GAMMA,
124 PROP_CAPTURE_CORRECTION_CONTRAST,
125 PROP_CAPTURE_CORRECTION_BRIGHTNESS,
129 PROP_DISABLE_LOW_RES_CROP,
130 PROP_DRAW_CORNER_MARKERS,
131 } GstV4L2CamSrcProperties;
134 static GstStaticPadTemplate gst_v4l2camsrc_template =
135 GST_STATIC_PAD_TEMPLATE ("src",
138 GST_STATIC_CAPS ("video/x-raw-yuv, "
139 "format = (fourcc) NV12, "
140 "framerate = (fraction) [ 0, 200 ], "
141 "width = (int) [ 1, MAX ], "
142 "height = (int) [ 1, MAX ];"
144 "format = (fourcc) I420, "
145 "framerate = (fraction) [ 0, 200 ], "
146 "width = (int) [ 1, MAX ], "
147 "height = (int) [ 1, MAX ];"
148 "video/x-raw-bayer, "
149 "format = (fourcc) BA10, "
150 "framerate = (fraction) [ 0, 200 ], "
151 "width = (int) [ 1, MAX ], "
152 "height = (int) [ 1, MAX ];"
153 "video/x-vaapi-sharing, "
155 "width = (int) [ 1, MAX ], "
156 "height = (int) [ 1, MAX ], "
157 "framerate = (fraction) [ 0, MAX ]"));
159 #define DEFAULT_PROP_DEVICE_NAME NULL
160 #define DEFAULT_PROP_DEVICE "/dev/video0"
161 #define DEFAULT_PROP_DEVICE_FD -1
162 #define DEFAULT_PROP_AE_WINDOW "x_left=0,x_right=0,y_bottom=0,y_top=0"
163 #define DEFAULT_PROP_AF_WINDOW "x_left=0,x_right=0,y_bottom=0,y_top=0"
164 #define DEFAULT_DEBUG_FLAGS 0
165 #define C_FLAGS(v) ((guint) v)
168 static const char* surface_string =
169 "video/x-vaapi-sharing, "
171 "width = (int) [ 1, MAX ], "
172 "height = (int) [ 1, MAX ], "
173 "framerate = (fraction) [ 0, MAX ]";
177 gst_camera_input_sensor_get_type (void)
179 static GType gst_camera_input_sensor_type = 0;
180 static GEnumValue gst_camera_input_sensors[] = {
181 {GST_CAMERA_INPUT_SENSOR_PRIMARY, "Primary Sensor", "primary"},
182 {GST_CAMERA_INPUT_SENSOR_SECONDARY, "Sencondary Sensor", "second"},
186 if (G_UNLIKELY (!gst_camera_input_sensor_type)) {
187 gst_camera_input_sensor_type =
188 g_enum_register_static ("GstCameraInputSensor",
189 gst_camera_input_sensors);
191 return gst_camera_input_sensor_type;
195 gst_camera_ae_metering_mode_get_type(void)
197 static GType gst_camera_ae_metering_mode_type = 0;
198 static GEnumValue gst_camera_ae_metering_mode[] = {
199 {GST_CAMERA_AE_METERING_AUTO, "AE auto metering", "auto"},
200 {GST_CAMERA_AE_METERING_SPOT, "AE spot metering", "spot"},
201 {GST_CAMERA_AE_METERING_CENTER, "AE center metering", "center"},
202 {GST_CAMERA_AE_METERING_CUSTOMIZED, "AE customized metering", "customized"},
206 if (G_UNLIKELY (!gst_camera_ae_metering_mode_type)) {
207 gst_camera_ae_metering_mode_type=
208 g_enum_register_static ("GstCameraAEMeteringMode",
209 gst_camera_ae_metering_mode);
211 return gst_camera_ae_metering_mode_type;
215 gst_camera_ae_mode_get_type(void)
217 static GType gst_camera_ae_mode_type = 0;
218 static GEnumValue gst_camera_ae_mode[] = {
219 {GST_CAMERA_AE_MODE_AUTO, "AE auto", "auto"},
220 {GST_CAMERA_AE_MODE_MANUAL, "AE manual", "manual"},
221 {GST_CAMERA_AE_MODE_SHUTTER_PRIORITY, "AE shutter priority", "shutter"},
222 {GST_CAMERA_AE_MODE_APERTURE_PRIORITY, "AE aperture priority", "aperture"},
226 if (G_UNLIKELY (!gst_camera_ae_mode_type)) {
227 gst_camera_ae_mode_type=
228 g_enum_register_static ("GstCameraAEMode",
231 return gst_camera_ae_mode_type;
235 gst_camera_af_metering_mode_get_type(void)
237 static GType gst_camera_af_metering_mode_type = 0;
238 static GEnumValue gst_camera_af_metering_mode[] = {
239 {GST_CAMERA_AF_METERING_AUTO, "AF auto metering", "auto"},
240 {GST_CAMERA_AF_METERING_SPOT, "AF spot metering", "spot"},
241 {GST_CAMERA_AF_METERING_CENTER, "AF center metering", "center"},
242 {GST_CAMERA_AF_METERING_CUSTOMIZED, "AF customized metering", "customized"},
246 if (G_UNLIKELY (!gst_camera_af_metering_mode_type)) {
247 gst_camera_af_metering_mode_type=
248 g_enum_register_static ("GstCameraAFMeteringMode",
249 gst_camera_af_metering_mode);
251 return gst_camera_af_metering_mode_type;
255 gst_camerasrc_debug_flags_get_type (void)
257 static GType gst_camerasrc_debug_flags = 0;
258 static const GFlagsValue values [] = {
259 {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_PERFORMANCE), "Debug flags for performance tuning",
261 {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_MAKER_NOTE), "Debug flags for maker note",
263 {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_AUTO_FOCUS), "Debug flags for auto focus",
268 if (G_UNLIKELY (!gst_camerasrc_debug_flags)) {
269 gst_camerasrc_debug_flags =
270 g_flags_register_static ("GstCameraSrcDebugFlags", values);
272 return gst_camerasrc_debug_flags;
277 GST_IMPLEMENT_V4L2CAMSRC_VIDORIENT_METHODS (GstMFLDV4l2CamSrc, gst_v4l2camsrc);
281 gst_v4l2camsrc_interface_init (GstImplementsInterfaceClass * klass)
284 * default virtual functions
286 klass->supported = gst_v4l2camsrc_iface_supported;
290 gst_v4l2camsrc_init_interfaces (GType type)
292 static const GInterfaceInfo v4l2camsrc_iface_info = {
293 (GInterfaceInitFunc) gst_v4l2camsrc_interface_init,
297 static const GInterfaceInfo v4l2camsrc_videoorientation_info = {
298 (GInterfaceInitFunc) gst_v4l2camsrc_video_orientation_interface_init,
303 g_type_add_interface_static (type,
304 GST_TYPE_IMPLEMENTS_INTERFACE, &v4l2camsrc_iface_info);
305 g_type_add_interface_static (type,
306 GST_TYPE_VIDEO_ORIENTATION, &v4l2camsrc_videoorientation_info);
310 GST_BOILERPLATE_FULL (GstMFLDV4l2CamSrc, gst_v4l2camsrc, GstCameraSrc,
311 GST_TYPE_CAMERA_SRC, gst_v4l2camsrc_init_interfaces);
316 gst_v4l2camsrc_iface_supported (GstImplementsInterface * iface,
319 GstCameraSrc *camsrc = GST_CAMERA_SRC (iface);
321 if (gst_v4l2camsrc_is_open (camsrc) &&
322 iface_type == GST_TYPE_VIDEO_ORIENTATION) {
326 else if (GST_IS_IMPLEMENTS_INTERFACE (camsrc)) {
327 GstImplementsInterfaceClass *parent_klass;
330 g_type_interface_peek (parent_class, GST_TYPE_IMPLEMENTS_INTERFACE);
331 return parent_klass->supported (iface, iface_type);
339 * gst_v4l2camsrc_is_open:
343 gst_v4l2camsrc_is_open (GstCameraSrc * camsrc)
345 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
347 return GST_V4L2CAMSRC_IS_OPEN (v4l2camsrc);
351 * gst_v4l2camsrc_is_active:
355 gst_v4l2camsrc_is_active (GstCameraSrc * camsrc)
357 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
359 return GST_V4L2CAMSRC_IS_ACTIVE (v4l2camsrc);
362 static gint caps_cache_cmp(struct cached_gst_caps *a, struct cached_gst_caps *b)
365 r = a->input - b->input;
368 r = a->mode - b->mode;
371 return (long)(a->pixelformat) - (long)(b->pixelformat);
375 * gst_v4l2camsrc_v4l2fourcc_to_structure:
378 static GstStructure *
379 gst_v4l2camsrc_v4l2fourcc_to_structure (guint32 fourcc)
381 GstStructure *structure = NULL;
384 case V4L2_PIX_FMT_MJPEG: /* Motion-JPEG */
385 case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */
386 structure = gst_structure_new ("image/jpeg", NULL);
388 case V4L2_PIX_FMT_RGB332:
389 case V4L2_PIX_FMT_RGB555:
390 case V4L2_PIX_FMT_RGB555X:
391 case V4L2_PIX_FMT_RGB565:
392 case V4L2_PIX_FMT_RGB565X:
393 case V4L2_PIX_FMT_RGB24:
394 case V4L2_PIX_FMT_BGR24:
395 case V4L2_PIX_FMT_RGB32:
396 case V4L2_PIX_FMT_BGR32:{
397 guint depth = 0, bpp = 0;
401 guint32 r_mask = 0, b_mask = 0, g_mask = 0;
404 case V4L2_PIX_FMT_RGB332:
406 endianness = G_BYTE_ORDER; /* 'like, whatever' */
411 case V4L2_PIX_FMT_RGB555:
412 case V4L2_PIX_FMT_RGB555X:
416 fourcc == V4L2_PIX_FMT_RGB555X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
421 case V4L2_PIX_FMT_RGB565:
422 case V4L2_PIX_FMT_RGB565X:
425 fourcc == V4L2_PIX_FMT_RGB565X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
430 case V4L2_PIX_FMT_RGB24:
432 endianness = G_BIG_ENDIAN;
437 case V4L2_PIX_FMT_BGR24:
439 endianness = G_BIG_ENDIAN;
444 case V4L2_PIX_FMT_RGB32:
446 endianness = G_BIG_ENDIAN;
451 case V4L2_PIX_FMT_BGR32:
453 endianness = G_BIG_ENDIAN;
459 g_assert_not_reached ();
462 structure = gst_structure_new ("video/x-raw-rgb",
463 "bpp", G_TYPE_INT, bpp,
464 "depth", G_TYPE_INT, depth,
465 "red_mask", G_TYPE_INT, r_mask,
466 "green_mask", G_TYPE_INT, g_mask,
467 "blue_mask", G_TYPE_INT, b_mask,
468 "endianness", G_TYPE_INT, endianness, NULL);
471 case V4L2_PIX_FMT_GREY: /* 8 Greyscale */
472 structure = gst_structure_new ("video/x-raw-gray",
473 "bpp", G_TYPE_INT, 8, NULL);
475 case V4L2_PIX_FMT_YYUV: /* 16 YUV 4:2:2 */
476 case V4L2_PIX_FMT_HI240: /* 8 8-bit color */
477 /* FIXME: get correct fourccs here */
479 case V4L2_PIX_FMT_NV12: /* 12 Y/CbCr 4:2:0 */
480 case V4L2_PIX_FMT_NV21: /* 12 Y/CrCb 4:2:0 */
481 case V4L2_PIX_FMT_NV61:
482 case V4L2_PIX_FMT_NV16:
483 case V4L2_PIX_FMT_YVU410:
484 case V4L2_PIX_FMT_YUV410:
485 case V4L2_PIX_FMT_YUV420: /* I420/IYUV */
486 case V4L2_PIX_FMT_YUYV:
487 case V4L2_PIX_FMT_YVU420:
488 case V4L2_PIX_FMT_UYVY:
489 case V4L2_PIX_FMT_Y41P:
490 case V4L2_PIX_FMT_YUV422P:
491 case V4L2_PIX_FMT_YUV444:
492 #ifdef V4L2_PIX_FMT_YVYU
493 case V4L2_PIX_FMT_YVYU:
495 case V4L2_PIX_FMT_YUV411P:{
499 case V4L2_PIX_FMT_NV12:
500 fcc = GST_MAKE_FOURCC ('N', 'V', '1', '2');
502 case V4L2_PIX_FMT_NV21:
503 fcc = GST_MAKE_FOURCC ('N', 'V', '2', '1');
505 case V4L2_PIX_FMT_NV16:
506 fcc = GST_MAKE_FOURCC ('N', 'V', '1', '6');
508 case V4L2_PIX_FMT_NV61:
509 fcc = GST_MAKE_FOURCC ('N', 'V', '6', '1');
511 case V4L2_PIX_FMT_YVU410:
512 fcc = GST_MAKE_FOURCC ('Y', 'V', 'U', '9');
514 case V4L2_PIX_FMT_YUV410:
515 fcc = GST_MAKE_FOURCC ('Y', 'U', 'V', '9');
517 case V4L2_PIX_FMT_YUV420:
518 fcc = GST_MAKE_FOURCC ('I', '4', '2', '0');
520 case V4L2_PIX_FMT_YUYV:
521 fcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2');
523 case V4L2_PIX_FMT_YVU420:
524 fcc = GST_MAKE_FOURCC ('Y', 'V', '1', '2');
526 case V4L2_PIX_FMT_UYVY:
527 fcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y');
529 case V4L2_PIX_FMT_Y41P:
530 fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'P');
532 case V4L2_PIX_FMT_YUV411P:
533 fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B');
535 case V4L2_PIX_FMT_YUV422P:
536 fcc = GST_MAKE_FOURCC ('Y', '4', '2', 'B');
538 case V4L2_PIX_FMT_YUV444:
539 fcc = GST_MAKE_FOURCC ('Y', '4', '4', '4');
541 #ifdef V4L2_PIX_FMT_YVYU
542 case V4L2_PIX_FMT_YVYU:
543 fcc = GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U');
547 g_assert_not_reached ();
550 structure = gst_structure_new ("video/x-raw-yuv",
551 "format", GST_TYPE_FOURCC, fcc, NULL);
554 case V4L2_PIX_FMT_SBGGR8:
555 case V4L2_PIX_FMT_SGBRG8:
556 case V4L2_PIX_FMT_SGRBG8:
557 case V4L2_PIX_FMT_SRGGB8:
558 case V4L2_PIX_FMT_SBGGR10:
559 case V4L2_PIX_FMT_SGBRG10:
560 case V4L2_PIX_FMT_SGRBG10:
561 case V4L2_PIX_FMT_SRGGB10:
562 #ifdef V4L2_PIX_FMT_SBGGR16
563 case V4L2_PIX_FMT_SBGGR16:{
567 case V4L2_PIX_FMT_SBGGR8:
568 fcc = GST_MAKE_FOURCC ('B', 'A', '8', '1');
570 case V4L2_PIX_FMT_SGBRG8:
571 fcc = GST_MAKE_FOURCC ('G', 'B', 'R', 'G');
573 case V4L2_PIX_FMT_SGRBG8:
574 fcc = GST_MAKE_FOURCC ('G', 'R', 'B', 'G');
576 case V4L2_PIX_FMT_SRGGB8:
577 fcc = GST_MAKE_FOURCC ('R', 'G', 'G', 'B');
579 case V4L2_PIX_FMT_SBGGR10:
580 fcc = GST_MAKE_FOURCC ('B', 'G', '1', '0');
582 case V4L2_PIX_FMT_SGBRG10:
583 fcc = GST_MAKE_FOURCC ('G', 'B', '1', '0');
585 case V4L2_PIX_FMT_SGRBG10:
586 fcc = GST_MAKE_FOURCC ('B', 'A', '1', '0');
588 case V4L2_PIX_FMT_SRGGB10:
589 fcc = GST_MAKE_FOURCC ('R', 'G', '1', '0');
591 case V4L2_PIX_FMT_SBGGR16:
592 fcc = GST_MAKE_FOURCC ('B', 'Y', 'R', '2');
595 g_assert_not_reached ();
598 structure = gst_structure_new ("video/x-raw-bayer",
599 "format", GST_TYPE_FOURCC, fcc, NULL);
603 GST_DEBUG ("Unknown fourcc 0x%08x %" GST_FOURCC_FORMAT,
604 fourcc, GST_FOURCC_ARGS (fourcc));
612 * gst_v4l2camsrc_get_caps:
616 gst_v4l2camsrc_get_caps (GstCameraSrc * camsrc)
618 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
619 GstStructure *template;
623 if (!gst_v4l2camsrc_is_open (camsrc)) {
624 /* FIXME: should it probe the device? */
628 if (!v4l2camsrc->formats)
629 gst_v4l2camsrc_fill_format_list (v4l2camsrc);
631 ret = gst_caps_new_empty ();
633 for (walk = v4l2camsrc->formats; walk; walk = walk->next) {
634 struct v4l2_fmtdesc *format;
637 /* FIXME: Introduce own format structure */
638 format = (struct v4l2_fmtdesc *) walk->data;
640 struct cached_gst_caps *val, key = {
641 .input = v4l2camsrc->input_sensor,
642 .mode = v4l2camsrc->capture_mode,
643 .pixelformat = format->pixelformat
646 it = g_slist_find_custom(v4l2camsrc->caps_cache, &key, (GCompareFunc)caps_cache_cmp);
648 val = (struct cached_gst_caps *) it->data;
649 gst_caps_append(ret, gst_caps_ref(val->caps));
650 GST_DEBUG_OBJECT(v4l2camsrc, "Using cached caps for (sensor=%d,mode=%d,format=%0.4s)",
651 val->input,val->mode,(char*)&val->pixelformat);
655 GST_DEBUG_OBJECT(v4l2camsrc, "Now probing for (sensor=%d,mode=%d,format=%0.4s)",
656 key.input,key.mode,(char*)&key.pixelformat);
657 template = gst_v4l2camsrc_v4l2fourcc_to_structure (format->pixelformat);
662 tmp = gst_v4l2camsrc_probe_caps_for_format (v4l2camsrc,
663 format->pixelformat, template);
665 val = malloc(sizeof *val);
666 memcpy(val, &key, sizeof *val);
667 val->caps = gst_caps_ref(tmp);
668 v4l2camsrc->caps_cache = g_slist_prepend(v4l2camsrc->caps_cache, val);
669 gst_caps_append (ret, tmp);
672 gst_structure_free (template);
674 GST_DEBUG_OBJECT (v4l2camsrc, "unknown format %u", format->pixelformat);
678 GstStructure * structure = gst_structure_from_string(surface_string, NULL);
679 gst_caps_append_structure (ret, structure);
681 v4l2camsrc->probed_caps = gst_caps_ref (ret);
683 GST_INFO_OBJECT (v4l2camsrc, "caps: %" GST_PTR_FORMAT, ret);
689 * gst_v4l2camsrc_get_num_buffers:
693 gst_v4l2camsrc_get_num_buffers (GstCameraSrc * camsrc)
695 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
697 return v4l2camsrc->num_buffers;
702 * gst_v4l2camsrc_base_init:
703 * @klass: #GstElementClass.
707 gst_v4l2camsrc_base_init (gpointer klass)
709 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
711 gst_element_class_set_details_simple (element_class,
712 "V4L2 camera source",
714 "Video4Linux2 camera source element",
715 "Maemo Multimedia <multimedia@maemo.org>");
717 gst_element_class_add_pad_template (element_class,
718 gst_static_pad_template_get (&gst_v4l2camsrc_template));
721 gboolean gst_v4l2camsrc_set_autofocus (GstCameraSrc * camsrc, gboolean on);
722 GstPhotoCaps gst_v4l2camsrc_get_capabilities (GstCameraSrc * camsrc);
723 gboolean gst_v4l2camsrc_set_capture_mode (GstCameraSrc * camsrc,
724 GstCameraSrcCaptureMode mode);
726 gst_v4l2camsrc_read_settings (GstCameraSrc * camsrc,
727 GstPhotoSettings * photoconf);
728 gboolean gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc,
729 GstPhotoSettings * photoconf, gboolean scene_override);
731 gst_v4l2camsrc_set_flash_mode (GstCameraSrc *camsrc, int value);
733 gst_v4l2camsrc_read_exif (GstCameraSrc *camsrc,
734 GstCameraControlExifInfo *exif_info);
736 gst_v4l2camsrc_set_strobe_state (GstCameraSrc *camsrc, gboolean state);
739 gst_v4l2camsrc_set_AeAafwindow (GstCameraSrc * camsrc, GstCameraSrc3a_window window);
742 * gst_v4l2camsrc_class_init:
743 * @klass: #GstMFLDV4l2CamSrcClass.
747 gst_v4l2camsrc_class_init (GstMFLDV4l2CamSrcClass * klass)
749 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
750 GstCameraSrcClass *camera_class = GST_CAMERA_SRC_CLASS (klass);
752 gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_property);
753 gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_property);
754 gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_dispose);
755 gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_finalize);
757 g_object_class_install_property (gobject_class, PROP_DEVICE,
758 g_param_spec_string ("device", "Device", "Device location",
759 DEFAULT_PROP_DEVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
761 g_object_class_install_property (gobject_class, PROP_DEVICE_NAME,
762 g_param_spec_string ("device-name", "Device name",
763 "Name of the device", DEFAULT_PROP_DEVICE_NAME,
764 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
766 g_object_class_install_property (gobject_class, PROP_DEVICE_FD,
767 g_param_spec_int ("device-fd", "File descriptor",
768 "File descriptor of the device", -1, G_MAXINT, DEFAULT_PROP_DEVICE_FD,
769 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
771 g_object_class_install_property (gobject_class, PROP_QUEUE_SIZE,
772 g_param_spec_uint ("queue-size", "Queue size",
773 "Number of buffers to be enqueud in the driver",
774 GST_V4L2CAMSRC_MIN_BUFFERS, GST_V4L2CAMSRC_MAX_BUFFERS,
775 GST_V4L2CAMSRC_DEFAULT_BUFFERS,
776 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
778 g_object_class_install_property (gobject_class, PROP_INPUT_SENSOR,
779 g_param_spec_enum ("camera-id", "Camera Id",
780 "Which sensor is the input of the ISP",
781 GST_TYPE_CAMERA_INPUT_SENSOR,
782 GST_CAMERA_INPUT_SENSOR_PRIMARY,
783 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
785 g_object_class_install_property (gobject_class, PROP_USE_MMAP,
786 g_param_spec_boolean ("use-mmap", "Use Mmap",
787 "Whether use mmap memory method", FALSE, G_PARAM_READWRITE));
789 g_object_class_install_property (gobject_class, PROP_USE_COPY,
790 g_param_spec_boolean ("use-copy", "Use Copy",
791 "Whether copy the buffer from driver, debug only", FALSE, G_PARAM_READWRITE));
793 /* AE, AF, and AWB settings */
794 g_object_class_install_property (gobject_class, PROP_3A,
795 g_param_spec_boolean ("use-3a", "Use 3A",
796 "3A processsing is On or Off", TRUE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
798 g_object_class_install_property (gobject_class, PROP_AE_METERING_MODE,
799 g_param_spec_enum ("ae-metering-mode", "AE Metering Mode",
800 "Select AE Metering Mode",
801 GST_TYPE_CAMERA_AE_METERING_MODE,
802 GST_CAMERA_AE_METERING_AUTO,
803 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
805 g_object_class_install_property (gobject_class, PROP_AE_MODE,
806 g_param_spec_enum ("ae-mode", "AE Mode",
808 GST_TYPE_CAMERA_AE_MODE,
809 GST_CAMERA_AE_MODE_AUTO,
810 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
812 g_object_class_install_property (gobject_class, PROP_AE_WINDOW,
813 g_param_spec_string("ae-window", "AE Window",
814 "Set AE Window Coordinates in format: x_left=value,x_right=value,"
815 "y_bottom=value,y_top=value",
816 DEFAULT_PROP_AE_WINDOW,
817 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ));
819 g_object_class_install_property (gobject_class, PROP_AF_METERING_MODE,
820 g_param_spec_enum ("af-metering-mode", "AF Metering Mode",
821 "Select AF Metering Mode",
822 GST_TYPE_CAMERA_AF_METERING_MODE,
823 GST_CAMERA_AF_METERING_AUTO,
824 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
826 g_object_class_install_property (gobject_class, PROP_AF_WINDOW,
827 g_param_spec_string("af-window", "AF Window",
828 "Set AF Window Coordinates in format: x_left=value,x_right=value,"
829 "y_bottom=value,y_top=value",
830 DEFAULT_PROP_AF_WINDOW,
831 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ));
833 g_object_class_install_property (gobject_class, PROP_STILL_AF,
834 g_param_spec_boolean ("still-af", "still image slow focus",
835 "Turn On or Off slow focus when doing the still image capture",
836 TRUE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
838 g_object_class_install_property (gobject_class, PROP_FOCUS_POSITION,
839 g_param_spec_int ("focus-posi", "Focus Position",
840 "Focus absolute position set to Sensor.", FOCUS_POSITION_MIN,
841 FOCUS_POSITION_MAX, 0,
842 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE));
844 g_object_class_install_property (gobject_class, PROP_BAYER_DOWNSCALING,
845 g_param_spec_boolean ("bayer-downscaling", "Bayer Downscaling crop",
846 "Turn On or Off Bayer Downscaling", TRUE, G_PARAM_READWRITE));
848 /* These are advanced ISP features for MFLD camera only */
849 g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_GDC,
850 g_param_spec_boolean ("GDC", "GDC",
851 "Capture Correction for Lens Geometry Distortion Correction",
852 FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
854 g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_CAC,
855 g_param_spec_boolean ("CAC", "CAC",
856 "Capture Correction for Chromatic Aberration Correction",
857 FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
859 g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_RER,
860 g_param_spec_boolean ("redeye-reduction", "Redeye reduction",
861 "Capture Correction for Redeye reduction",
862 FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
864 g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_DIS,
865 g_param_spec_boolean ("still-stable", "Still stabilization",
866 "Capture Correction for still image stabilization", FALSE,
867 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
869 g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_DVS,
870 g_param_spec_boolean ("video-stable", "Video stabilization",
871 "Capture Correction for video capture stabilization", FALSE,
872 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
874 g_object_class_install_property (gobject_class,
875 PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT,
876 g_param_spec_boolean ("edge-enhancement", "Edge Enhancement",
877 "Capture Correction for edge enhancement", TRUE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
879 g_object_class_install_property (gobject_class,
880 PROP_CAPTURE_CORRECTION_SHADING_CORRECTION,
881 g_param_spec_boolean ("shading-correction", "Shading Correction",
882 "Capture Correction for shading correction", TRUE,
883 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
885 g_object_class_install_property (gobject_class,
886 PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION,
887 g_param_spec_boolean ("black-level-compensation", "Black Level Compensation",
888 "Capture Correction for Black Level Compensation", FALSE,
889 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
891 g_object_class_install_property (gobject_class,
892 PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION,
893 g_param_spec_boolean ("bad-pixel-detection", "Bad Pixel Detection",
894 "Capture Correction for Bad Pixel Detection", TRUE,
895 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
897 g_object_class_install_property (gobject_class, PROP_CAPTURE_CORRECTION_GAMMA,
898 g_param_spec_float ("gamma", "Gamma",
899 "Gamma Values", 1.0, 2.4, 2.2,
900 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE));
902 g_object_class_install_property (gobject_class,
903 PROP_CAPTURE_CORRECTION_CONTRAST, g_param_spec_int ("contrast",
904 "Contrast", "Contrast Values", 0, 2048, 256,
905 G_PARAM_READWRITE |G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE));
907 g_object_class_install_property (gobject_class,
908 PROP_CAPTURE_CORRECTION_BRIGHTNESS, g_param_spec_int ("brightness",
909 "Brightness", "Brightness Values", -255, 255, 0,
910 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE));
912 g_object_class_install_property (gobject_class, PROP_DUMP_RAW,
913 g_param_spec_boolean ("dump-raw", "Dump RAW images simultanious",
914 "Whether dump the raw images as output when during the jpeg capture",
915 FALSE, G_PARAM_READWRITE));
917 g_object_class_install_property (gobject_class, PROP_DUMP_IMAGE,
918 g_param_spec_boolean ("dump-image", "Dump images simultanious in pipeline",
919 "Whether dump the images as output in pipeline, debug only,"
920 "output the image in current directory",
921 FALSE, G_PARAM_READWRITE));
923 g_object_class_install_property (gobject_class, PROP_DEBUG_FLAGS,
924 g_param_spec_flags ("debug-flags", "debug flags",
925 "debug flags for development and performance tuning usage",
926 GST_TYPE_CAMERASRC_DEBUG_FLAGS, DEFAULT_DEBUG_FLAGS,
927 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
929 g_object_class_install_property (gobject_class,
931 g_param_spec_boolean ("vflip", "Vertical Flip",
932 "Vertical flip", FALSE,
933 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
935 g_object_class_install_property (gobject_class,
937 g_param_spec_boolean ("hflip", "Horisontal Flip",
938 "Horisontal flip", FALSE,
939 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
941 g_object_class_install_property (gobject_class,
942 PROP_DISABLE_LOW_RES_CROP,
943 g_param_spec_boolean ("disable-low-res-crop", "disable low resolution crop",
944 "disable software crop on unsupported low resolution frame size", FALSE,
947 g_object_class_install_property (gobject_class,
948 PROP_DRAW_CORNER_MARKERS,
949 g_param_spec_boolean ("draw-corner-markers", "draw markers in frame corners",
950 "draw markers in frame corners", FALSE,
953 camera_class->is_open = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_is_open);
954 camera_class->open = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_open);
955 camera_class->close = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_close);
956 camera_class->get_attribute =
957 GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_attribute);
958 camera_class->set_attribute =
959 GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_attribute);
960 camera_class->set_capture = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_capture);
961 camera_class->start = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_capture_start);
962 camera_class->is_active = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_is_active);
963 camera_class->grab_frame = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_grab_frame);
964 camera_class->stop = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_capture_stop);
965 camera_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_caps);
966 camera_class->get_num_buffers =
967 GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_num_buffers);
968 camera_class->unlock = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_unlock);
969 camera_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_unlock_stop);
971 camera_class->set_capture_mode =
972 GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_capture_mode);
973 // camera_class->set_vfinder_mode = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_set_viewfinder_mode);
974 camera_class->set_autofocus =
975 GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_autofocus);
976 camera_class->read_settings =
977 GST_DEBUG_FUNCPTR (gst_v4l2camsrc_read_settings);
978 camera_class->write_settings =
979 GST_DEBUG_FUNCPTR (gst_v4l2camsrc_write_settings);
980 camera_class->get_capabilities =
981 GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_capabilities);
982 camera_class->set_zoom = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_zoom);
983 camera_class->set_AeAafwindow = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_AeAafwindow);
984 camera_class->set_ae_mode = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_ae_mode);
985 camera_class->get_ae_mode = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_ae_mode);
987 camera_class->get_makernote = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_makernote);
988 camera_class->makernote_init = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_makernote_init);
989 camera_class->makernote_deal = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_makernote_deal);
990 camera_class->makernote_uninit = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_makernote_uninit);
991 camera_class->set_flash_mode = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_set_flash_mode);
992 camera_class->read_exif = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_read_exif);
994 camera_class->set_strobe_state = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_set_strobe_state);
996 //camera_class->fill_image_tags = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_fill_image_tags);
997 //camera_class->get_preview_image = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_get_preview_image);
1001 * gst_v4l2camsrc_driver_wrapper_load:
1002 * Create the mfldadvci object. The function in libmfldadvci can
1003 * be called from this source element now
1006 gst_v4l2camsrc_mfldadvci_wrapper_load (GstMFLDV4l2CamSrc * v4l2camsrc)
1008 GstV4l2MFLDAdvCI *mfldadvci;
1010 mfldadvci = g_new0 (GstV4l2MFLDAdvCI, 1);
1011 wrapper_default_link_functions_init(mfldadvci);
1013 #ifdef USE_DYNAMIC_3A
1014 if (g_module_supported ()) {
1016 module_file = g_module_build_path (MFLD_ADVCI_PATH, "libmfldadvci.so.0");
1017 GST_DEBUG_OBJECT (v4l2camsrc, "Loading %s", module_file);
1019 v4l2camsrc->module = g_module_open (module_file, G_MODULE_BIND_LOCAL);
1021 /* Open again if libmfldadvci.so.0 doesn't exist */
1022 if (!v4l2camsrc->module) {
1023 module_file = g_module_build_path (MFLD_ADVCI_PATH, "libmfldadvci.so");
1024 v4l2camsrc->module = g_module_open (module_file, G_MODULE_BIND_LOCAL);
1025 GST_DEBUG_OBJECT (v4l2camsrc, "Loading %s", module_file);
1027 GST_DEBUG_OBJECT(v4l2camsrc, "Camera Source Interface version is %d\n", LIBMFLDADVCI_VERSION);
1028 if (v4l2camsrc->module) {
1029 lib_3a_link_functions_init(mfldadvci, v4l2camsrc->module);
1032 #endif /* USE_DYNAMIC_3A */
1038 * gst_v4l2camsrc_mfldadvci_wrapper_unload:
1039 * Unload the libmfldadvci and free its resource
1042 gst_v4l2camsrc_mfldadvci_wrapper_unload (GstMFLDV4l2CamSrc * v4l2camsrc)
1044 GstV4l2MFLDAdvCI *mfldadvci = v4l2camsrc->mfldadvci;
1046 GST_DEBUG ("mfldadvci unload");
1047 g_module_close (v4l2camsrc->module);
1048 v4l2camsrc->module = NULL;
1057 * gst_v4l2camsrc_init:
1058 * @v4l2camsrc: #GstMFLDV4l2CamSrc.
1059 * @klass: #GstMFLDV4l2CamSrcClass.
1063 gst_v4l2camsrc_init (GstMFLDV4l2CamSrc * v4l2camsrc,
1064 GstMFLDV4l2CamSrcClass * klass)
1066 v4l2camsrc->num_buffers = GST_V4L2CAMSRC_DEFAULT_BUFFERS;
1067 v4l2camsrc->tmp_num_buffers = v4l2camsrc->num_buffers;
1068 v4l2camsrc->videodev = g_strdup (DEFAULT_PROP_DEVICE);
1069 v4l2camsrc->video_fd = DEFAULT_PROP_DEVICE_FD;
1070 v4l2camsrc->poll = gst_poll_new (TRUE);
1071 v4l2camsrc->buffer = NULL;
1072 v4l2camsrc->crop_supported = FALSE;
1073 v4l2camsrc->max_zoom_factor = MAX_RESIZER_FACTOR;
1074 v4l2camsrc->zoom_factor = DEFAULT_RESIZER_FACTOR;
1075 v4l2camsrc->use_mmap = TRUE;
1076 v4l2camsrc->use_copy = FALSE;
1077 v4l2camsrc->capture_mode = GST_CAMERA_SRC_CAPTURE_MODE_VIEWFINDER;
1078 /* MFLD camera Advanced features status */
1079 v4l2camsrc->gdc_enabled = FALSE;
1080 v4l2camsrc->rer_enabled = FALSE;
1081 v4l2camsrc->cac_enabled = FALSE;
1082 v4l2camsrc->dvs_enabled = FALSE;
1083 v4l2camsrc->dis_enabled = FALSE;
1084 v4l2camsrc->ee_enabled = TRUE;
1085 v4l2camsrc->sc_enabled = TRUE;
1086 v4l2camsrc->cc_updated = FALSE;
1087 v4l2camsrc->gamma_updated = FALSE;
1088 v4l2camsrc->ae_awb_af_enabled = TRUE;
1089 v4l2camsrc->still_af = FALSE;
1090 v4l2camsrc->bayer_downscaling = FALSE;
1091 v4l2camsrc->tone.gamma = 2.2;
1092 v4l2camsrc->tone.brightness = 0;
1093 v4l2camsrc->tone.contrast = 256;
1095 v4l2camsrc->preflash_enabled = FALSE;
1096 v4l2camsrc->capflash_enabled = FALSE;
1097 v4l2camsrc->preflash_analoggain = 0;
1099 v4l2camsrc->dump_raw = FALSE;
1100 v4l2camsrc->dump_image = FALSE;
1101 v4l2camsrc->raw_output_size = 0;
1102 v4l2camsrc->debug_flags = DEFAULT_DEBUG_FLAGS;
1103 v4l2camsrc->disable_low_res_crop = FALSE;
1104 v4l2camsrc->draw_corner_markers = FALSE;
1106 v4l2camsrc->device_mutex = g_mutex_new ();
1108 v4l2camsrc->caps_cache = NULL;
1110 v4l2camsrc->mfldadvci = gst_v4l2camsrc_mfldadvci_wrapper_load (v4l2camsrc);
1112 v4l2camsrc->input_sensor = GST_CAMERA_INPUT_SENSOR_PRIMARY;
1113 v4l2camsrc->ae_metering_mode = GST_CAMERA_AE_METERING_AUTO;
1114 v4l2camsrc->ae_mode = GST_CAMERA_AE_MODE_AUTO;
1115 v4l2camsrc->af_metering_mode = GST_CAMERA_AF_METERING_AUTO;
1117 v4l2camsrc->ae_window.x_left = 0;
1118 v4l2camsrc->ae_window.x_right = 0;
1119 v4l2camsrc->ae_window.y_bottom = 0;
1120 v4l2camsrc->ae_window.y_top = 0;
1121 v4l2camsrc->ae_window.weight= 0x8000;
1122 v4l2camsrc->af_window.x_left = 0;
1123 v4l2camsrc->af_window.x_right = 0;
1124 v4l2camsrc->af_window.y_bottom = 0;
1125 v4l2camsrc->af_window.y_top = 0;
1126 v4l2camsrc->af_window.weight= 0x8000;
1128 libmfld_cam_init (v4l2camsrc->mfldadvci);
1130 GST_DEBUG ("initialized to commit %s", MFLD_V4L2CAMSRC_VERSION);
1133 static void caps_cache_destroy_value(struct cached_gst_caps *val)
1138 gst_caps_unref(val->caps);
1143 gst_v4l2camsrc_dispose (GObject * object)
1145 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (object);
1147 if (v4l2camsrc->caps_cache)
1148 g_slist_free_full(v4l2camsrc->caps_cache, (GDestroyNotify) caps_cache_destroy_value);
1149 v4l2camsrc->caps_cache = NULL;
1151 if (v4l2camsrc->formats) {
1152 gst_v4l2camsrc_clear_format_list (v4l2camsrc);
1155 if (v4l2camsrc->probed_caps) {
1156 gst_caps_unref (v4l2camsrc->probed_caps);
1157 v4l2camsrc->probed_caps = NULL;
1160 /* FIXME: driver cleanup function */
1161 if (v4l2camsrc->videodev) {
1162 g_free (v4l2camsrc->videodev);
1163 v4l2camsrc->videodev = NULL;
1166 if (v4l2camsrc->poll) {
1167 gst_poll_free (v4l2camsrc->poll);
1170 g_mutex_free (v4l2camsrc->device_mutex);
1172 G_OBJECT_CLASS (parent_class)->dispose (object);
1173 libmfld_cam_dispose ();
1174 gst_v4l2camsrc_mfldadvci_wrapper_unload(v4l2camsrc);
1179 * gst_v4l2camsrc_finalize:
1184 gst_v4l2camsrc_finalize (GObject * object)
1186 G_OBJECT_CLASS (parent_class)->finalize (object);
1194 gst_v4l2camsrc_set_property (GObject * object,
1195 guint prop_id, const GValue * value, GParamSpec * pspec)
1197 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (object);
1198 gboolean opened = GST_V4L2CAMSRC_IS_OPEN (v4l2camsrc);
1202 g_free (v4l2camsrc->videodev);
1203 v4l2camsrc->videodev = g_value_dup_string (value);
1205 case PROP_QUEUE_SIZE:
1206 v4l2camsrc->num_buffers = g_value_get_uint (value);
1207 v4l2camsrc->tmp_num_buffers = v4l2camsrc->num_buffers;
1209 case PROP_INPUT_SENSOR:
1210 v4l2camsrc->input_sensor = g_value_get_enum (value);
1213 v4l2camsrc->use_mmap = g_value_get_boolean (value);
1216 v4l2camsrc->use_copy = g_value_get_boolean (value);
1219 v4l2camsrc->ae_awb_af_enabled = g_value_get_boolean (value);
1221 case PROP_AE_WINDOW:
1223 GstStructure *ae_window_param = NULL;
1225 gboolean parsed = TRUE;
1227 ctmp = g_malloc0 (60);
1230 GST_DEBUG_OBJECT(v4l2camsrc, "alloc string mem failed.\n");
1233 strncpy (ctmp,"ae,",3);
1234 strncat (ctmp,g_value_get_string (value),55);
1235 ae_window_param = gst_structure_from_string (ctmp, NULL);
1236 if(ae_window_param == NULL)
1238 GST_DEBUG_OBJECT(v4l2camsrc,"wrong string format is entered. stop setting ae window.\n");
1243 parsed = gst_structure_get_int(ae_window_param, "x_left",
1244 &v4l2camsrc->ae_window.x_left);
1245 parsed |= gst_structure_get_int(ae_window_param, "x_right",
1246 &v4l2camsrc->ae_window.x_right);
1247 parsed |= gst_structure_get_int(ae_window_param, "y_top",
1248 &v4l2camsrc->ae_window.y_top);
1249 parsed |= gst_structure_get_int(ae_window_param, "y_bottom",
1250 &v4l2camsrc->ae_window.y_bottom);
1252 if (parsed == FALSE)
1254 GST_DEBUG_OBJECT(v4l2camsrc,"cannot parse ae window parameter. \n");
1255 gst_structure_free (ae_window_param);
1260 parsed = gst_structure_get_int(ae_window_param, "weight",
1261 &v4l2camsrc->ae_window.weight);
1263 if (parsed == FALSE)
1265 GST_DEBUG_OBJECT(v4l2camsrc,
1266 "set ae window weight to default value 0x8000.\n");
1267 v4l2camsrc->ae_window.weight = 0x8000;
1270 GST_DEBUG_OBJECT(v4l2camsrc,"ae-window-setting: x_left:%d, x_right:%d,"
1271 "y_bottom:%d, y_top:%d, weight:%d.\n",
1272 v4l2camsrc->ae_window.x_left,v4l2camsrc->ae_window.x_right,
1273 v4l2camsrc->ae_window.y_bottom, v4l2camsrc->ae_window.y_top,
1274 v4l2camsrc->ae_window.weight);
1277 if (v4l2camsrc->ae_metering_mode != GST_CAMERA_AE_METERING_SPOT)
1279 GST_DEBUG_OBJECT(v4l2camsrc,"wrong ae metering mode. set it to spot mode automaticly.\n");
1280 v4l2camsrc->ae_metering_mode = GST_CAMERA_AE_METERING_SPOT;
1281 v4l2camsrc->mfldadvci->AeSetMeteringMode
1282 ( (advci_ae_metering_mode) v4l2camsrc->ae_metering_mode);
1285 v4l2camsrc->mfldadvci->AeSetWindow ((advci_window *) (&(v4l2camsrc->ae_window)));
1287 gst_structure_free (ae_window_param);
1292 case PROP_AE_METERING_MODE:
1294 v4l2camsrc->ae_metering_mode = g_value_get_enum (value);
1295 v4l2camsrc->mfldadvci->AeSetMeteringMode((advci_ae_metering_mode)v4l2camsrc->ae_metering_mode);
1300 v4l2camsrc->ae_mode = g_value_get_enum (value);
1301 v4l2camsrc->mfldadvci->AeSetMode((advci_ae_mode)v4l2camsrc->ae_mode);
1304 case PROP_AF_METERING_MODE:
1306 v4l2camsrc->af_metering_mode = g_value_get_enum (value);
1307 v4l2camsrc->mfldadvci->AfSetMeteringMode((advci_af_metering_mode)v4l2camsrc->af_metering_mode);
1310 case PROP_AF_WINDOW:
1312 GstStructure *af_window_param = NULL;
1314 gboolean parsed = TRUE;
1316 ctmp = g_malloc0 (60);
1319 GST_DEBUG_OBJECT(v4l2camsrc, "alloc string mem failed.\n");
1322 strncpy (ctmp,"af,",3);
1323 strncat (ctmp,g_value_get_string (value),55);
1324 af_window_param = gst_structure_from_string (ctmp, NULL);
1325 if(af_window_param == NULL)
1327 GST_DEBUG_OBJECT(v4l2camsrc,"wrong string format is entered. stop setting af window.\n");
1332 parsed = gst_structure_get_int(af_window_param, "x_left",
1333 &v4l2camsrc->af_window.x_left);
1334 parsed |= gst_structure_get_int(af_window_param, "x_right",
1335 &v4l2camsrc->af_window.x_right);
1336 parsed |= gst_structure_get_int(af_window_param, "y_top",
1337 &v4l2camsrc->af_window.y_top);
1338 parsed |= gst_structure_get_int(af_window_param, "y_bottom",
1339 &v4l2camsrc->af_window.y_bottom);
1341 if (parsed == FALSE)
1343 GST_DEBUG_OBJECT(v4l2camsrc,"cannot parse af window parameter. \n");
1344 gst_structure_free (af_window_param);
1349 parsed = gst_structure_get_int(af_window_param, "weight",
1350 &v4l2camsrc->af_window.weight);
1352 if (parsed == FALSE)
1354 GST_DEBUG_OBJECT(v4l2camsrc,
1355 "set af window weight to default value 0x8000.\n");
1356 v4l2camsrc->af_window.weight = 0x8000;
1359 GST_DEBUG_OBJECT(v4l2camsrc,"af-window-setting: x_left:%d, x_right:%d,"
1360 "y_bottom:%d, y_top:%d, weight:%d.\n",
1361 v4l2camsrc->af_window.x_left,v4l2camsrc->af_window.x_right,
1362 v4l2camsrc->af_window.y_bottom, v4l2camsrc->af_window.y_top,
1363 v4l2camsrc->af_window.y_top);
1366 v4l2camsrc->mfldadvci->AfSetWindows (1, (advci_window *) (&(v4l2camsrc->af_window)));
1368 gst_structure_free (af_window_param);
1374 v4l2camsrc->still_af = g_value_get_boolean (value);
1375 cam_set_autofocus (v4l2camsrc->still_af);
1377 case PROP_FOCUS_POSITION:
1378 v4l2camsrc->focus_posi = g_value_get_int(value);
1380 cam_driver_set_focus_posi (v4l2camsrc->video_fd, v4l2camsrc->focus_posi);
1382 v4l2camsrc->focus_updated = TRUE;
1385 v4l2camsrc->vflip = g_value_get_boolean(value);
1386 if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc)))
1387 gst_v4l2camsrc_set_attribute (GST_CAMERA_SRC (v4l2camsrc),V4L2_CID_VFLIP,v4l2camsrc->vflip);
1390 v4l2camsrc->hflip = g_value_get_boolean(value);
1391 if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc)))
1392 gst_v4l2camsrc_set_attribute (GST_CAMERA_SRC (v4l2camsrc),V4L2_CID_HFLIP,v4l2camsrc->hflip);
1394 case PROP_BAYER_DOWNSCALING:
1395 v4l2camsrc->bayer_downscaling = g_value_get_boolean (value);
1397 case PROP_CAPTURE_CORRECTION_GDC:
1398 v4l2camsrc->gdc_enabled = g_value_get_boolean (value);
1400 cam_set_capture_correction (v4l2camsrc->video_fd,
1401 CAM_CAPTURE_CORRECTION_GDC, v4l2camsrc->gdc_enabled);
1403 v4l2camsrc->cc_updated = TRUE;
1405 case PROP_CAPTURE_CORRECTION_CAC:
1406 v4l2camsrc->cac_enabled = g_value_get_boolean (value);
1408 cam_set_capture_correction (v4l2camsrc->video_fd,
1409 CAM_CAPTURE_CORRECTION_CAC, v4l2camsrc->cac_enabled);
1411 v4l2camsrc->cc_updated = TRUE;
1413 case PROP_CAPTURE_CORRECTION_RER:
1414 v4l2camsrc->rer_enabled = g_value_get_boolean (value);
1415 cam_set_capture_correction (v4l2camsrc->video_fd,
1416 CAM_CAPTURE_CORRECTION_RER, v4l2camsrc->rer_enabled);
1418 case PROP_CAPTURE_CORRECTION_DIS:
1419 v4l2camsrc->dis_enabled = g_value_get_boolean (value);
1420 cam_set_capture_correction (v4l2camsrc->video_fd,
1421 CAM_CAPTURE_CORRECTION_DIS, v4l2camsrc->dis_enabled);
1423 case PROP_CAPTURE_CORRECTION_DVS:
1424 v4l2camsrc->dvs_enabled = g_value_get_boolean (value);
1426 cam_set_capture_correction (v4l2camsrc->video_fd,
1427 CAM_CAPTURE_CORRECTION_DVS, v4l2camsrc->dvs_enabled);
1429 v4l2camsrc->cc_updated = TRUE;
1431 case PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT:
1432 v4l2camsrc->ee_enabled = g_value_get_boolean (value);
1434 cam_set_capture_correction (v4l2camsrc->video_fd,
1435 CAM_CAPTURE_CORRECTION_EE, v4l2camsrc->ee_enabled);
1437 v4l2camsrc->cc_updated = TRUE;
1439 case PROP_CAPTURE_CORRECTION_SHADING_CORRECTION:
1440 v4l2camsrc->sc_enabled = g_value_get_boolean (value);
1442 cam_set_capture_correction (v4l2camsrc->video_fd,
1443 CAM_CAPTURE_CORRECTION_SC, v4l2camsrc->sc_enabled);
1445 v4l2camsrc->cc_updated = TRUE;
1447 case PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION:
1448 v4l2camsrc->blc_enabled = g_value_get_boolean (value);
1450 cam_set_capture_correction (v4l2camsrc->video_fd,
1451 CAM_CAPTURE_CORRECTION_BLC, v4l2camsrc->blc_enabled);
1453 v4l2camsrc->cc_updated = TRUE;
1455 case PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION:
1456 v4l2camsrc->bpd_enabled = g_value_get_boolean (value);
1458 cam_set_capture_correction (v4l2camsrc->video_fd,
1459 CAM_CAPTURE_CORRECTION_BPD, v4l2camsrc->bpd_enabled);
1461 v4l2camsrc->cc_updated = TRUE;
1463 case PROP_CAPTURE_CORRECTION_GAMMA:
1464 v4l2camsrc->tone.gamma = g_value_get_float (value);
1466 cam_set_tone_control (v4l2camsrc->video_fd, CAM_GAMMA_VALUE,
1469 v4l2camsrc->gamma_updated = TRUE;
1471 case PROP_CAPTURE_CORRECTION_CONTRAST:
1472 v4l2camsrc->tone.contrast = g_value_get_int (value);
1474 cam_set_tone_control (v4l2camsrc->video_fd, CAM_CONTRAST_VALUE,
1477 v4l2camsrc->gamma_updated = TRUE;
1479 case PROP_CAPTURE_CORRECTION_BRIGHTNESS:
1480 v4l2camsrc->tone.brightness = g_value_get_int (value);
1482 cam_set_tone_control (v4l2camsrc->video_fd, CAM_BRIGHTNESS_VALUE,
1485 v4l2camsrc->gamma_updated = TRUE;
1488 v4l2camsrc->dump_raw = g_value_get_boolean (value);
1490 case PROP_DUMP_IMAGE:
1491 v4l2camsrc->dump_image = g_value_get_boolean (value);
1493 case PROP_DEBUG_FLAGS:
1494 v4l2camsrc->debug_flags = g_value_get_flags (value);
1496 case PROP_DISABLE_LOW_RES_CROP:
1497 v4l2camsrc->disable_low_res_crop = g_value_get_boolean (value);
1499 case PROP_DRAW_CORNER_MARKERS:
1500 v4l2camsrc->draw_corner_markers = g_value_get_boolean (value);
1503 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1513 gst_v4l2camsrc_get_property (GObject * object,
1514 guint prop_id, GValue * value, GParamSpec * pspec)
1516 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (object);
1520 g_value_set_string (value, v4l2camsrc->videodev);
1522 case PROP_DEVICE_NAME:
1524 const guchar *new = NULL;
1526 if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc))) {
1527 new = v4l2camsrc->vcap.card;
1528 } else if (gst_v4l2camsrc_open (GST_CAMERA_SRC (v4l2camsrc))) {
1529 new = v4l2camsrc->vcap.card;
1530 gst_v4l2camsrc_close (GST_CAMERA_SRC (v4l2camsrc));
1531 gst_camerasrc_clear_color_channels (GST_CAMERA_SRC (v4l2camsrc));
1533 g_value_set_string (value, (gchar *) new);
1536 case PROP_DEVICE_FD:
1538 if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc)))
1539 g_value_set_int (value, v4l2camsrc->video_fd);
1541 g_value_set_int (value, DEFAULT_PROP_DEVICE_FD);
1544 case PROP_QUEUE_SIZE:
1545 g_value_set_uint (value, v4l2camsrc->num_buffers);
1547 case PROP_INPUT_SENSOR:
1548 g_value_set_enum (value, v4l2camsrc->input_sensor);
1551 g_value_set_boolean (value, v4l2camsrc->use_mmap);
1554 g_value_set_boolean (value, v4l2camsrc->use_copy);
1557 g_value_set_boolean (value, v4l2camsrc->ae_awb_af_enabled);
1559 case PROP_AE_METERING_MODE:
1560 g_value_set_enum (value, v4l2camsrc->ae_metering_mode);
1563 g_value_set_enum (value, v4l2camsrc->ae_mode);
1565 case PROP_AE_WINDOW:
1567 GstStructure *tmp = NULL;
1568 tmp = gst_structure_empty_new("ae-window");
1571 GST_DEBUG ("wrong default ae window setting.\n");
1574 gst_structure_set (tmp,"x_left", G_TYPE_INT,
1575 v4l2camsrc->ae_window.x_left,NULL);
1576 gst_structure_set (tmp,"x_right", G_TYPE_INT,
1577 v4l2camsrc->ae_window.x_right,NULL);
1578 gst_structure_set (tmp,"y_bottom", G_TYPE_INT,
1579 v4l2camsrc->ae_window.y_bottom,NULL);
1580 gst_structure_set (tmp,"y_top", G_TYPE_INT,
1581 v4l2camsrc->ae_window.y_top,NULL);
1582 g_value_set_string(value, gst_structure_to_string(tmp));
1583 gst_structure_free(tmp);
1586 case PROP_AF_METERING_MODE:
1587 g_value_set_enum (value, v4l2camsrc->af_metering_mode);
1589 case PROP_AF_WINDOW:
1591 GstStructure *tmp = NULL;
1592 tmp = gst_structure_empty_new("af-window");
1595 GST_DEBUG ("wrong default af window setting.\n");
1598 gst_structure_set (tmp,"x_left", G_TYPE_INT,
1599 v4l2camsrc->af_window.x_left,NULL);
1600 gst_structure_set (tmp,"x_right", G_TYPE_INT,
1601 v4l2camsrc->af_window.x_right,NULL);
1602 gst_structure_set (tmp,"y_bottom", G_TYPE_INT,
1603 v4l2camsrc->af_window.y_bottom,NULL);
1604 gst_structure_set (tmp,"y_top", G_TYPE_INT,
1605 v4l2camsrc->af_window.y_top,NULL);
1606 g_value_set_string(value, gst_structure_to_string(tmp));
1607 gst_structure_free(tmp);
1611 g_value_set_boolean (value, v4l2camsrc->still_af);
1613 case PROP_FOCUS_POSITION:
1614 g_value_set_int (value, v4l2camsrc->focus_posi);
1617 g_value_set_boolean (value, v4l2camsrc->vflip);
1620 g_value_set_boolean (value, v4l2camsrc->hflip);
1622 case PROP_BAYER_DOWNSCALING:
1623 g_value_set_boolean (value, v4l2camsrc->bayer_downscaling);
1625 case PROP_CAPTURE_CORRECTION_GDC:
1626 g_value_set_boolean (value, v4l2camsrc->gdc_enabled);
1628 case PROP_CAPTURE_CORRECTION_CAC:
1629 g_value_set_boolean (value, v4l2camsrc->cac_enabled);
1631 case PROP_CAPTURE_CORRECTION_RER:
1632 g_value_set_boolean (value, v4l2camsrc->rer_enabled);
1634 case PROP_CAPTURE_CORRECTION_DIS:
1635 g_value_set_boolean (value, v4l2camsrc->dis_enabled);
1637 case PROP_CAPTURE_CORRECTION_DVS:
1638 g_value_set_boolean (value, v4l2camsrc->dvs_enabled);
1640 case PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT:
1641 g_value_set_boolean (value, v4l2camsrc->ee_enabled);
1643 case PROP_CAPTURE_CORRECTION_SHADING_CORRECTION:
1644 g_value_set_boolean (value, v4l2camsrc->sc_enabled);
1646 case PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION:
1647 g_value_set_boolean (value, v4l2camsrc->blc_enabled);
1649 case PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION:
1650 g_value_set_boolean (value, v4l2camsrc->bpd_enabled);
1652 case PROP_CAPTURE_CORRECTION_GAMMA:
1653 g_value_set_float (value, v4l2camsrc->tone.gamma);
1655 case PROP_CAPTURE_CORRECTION_CONTRAST:
1656 g_value_set_int (value, v4l2camsrc->tone.contrast);
1658 case PROP_CAPTURE_CORRECTION_BRIGHTNESS:
1659 g_value_set_int (value, v4l2camsrc->tone.brightness);
1662 g_value_set_boolean (value, v4l2camsrc->dump_raw);
1664 case PROP_DUMP_IMAGE:
1665 g_value_set_boolean (value, v4l2camsrc->dump_image);
1667 case PROP_DEBUG_FLAGS:
1668 g_value_set_flags (value, v4l2camsrc->debug_flags);
1670 case PROP_DISABLE_LOW_RES_CROP:
1671 g_value_set_boolean (value, v4l2camsrc->disable_low_res_crop);
1673 case PROP_DRAW_CORNER_MARKERS:
1674 g_value_set_boolean (value, v4l2camsrc->draw_corner_markers);
1677 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1685 gst_v4l2camsrc_unlock (GstCameraSrc * src)
1687 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (src);
1689 GST_LOG_OBJECT (v4l2camsrc, "Flushing");
1690 gst_poll_set_flushing (v4l2camsrc->poll, TRUE);
1696 gst_v4l2camsrc_unlock_stop (GstCameraSrc * src)
1698 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (src);
1700 GST_LOG_OBJECT (v4l2camsrc, "No longer flushing");
1701 gst_poll_set_flushing (v4l2camsrc->poll, FALSE);
1707 * gst_v4l2camsrc_set_zoom:
1708 * @camsrc: @GstCameraSrc object.
1709 * @zoom: zoom factor to be set.
1711 * Set the zoom factor for outputted video.
1713 * Returns: TRUE on success.
1716 gst_v4l2camsrc_set_zoom (GstCameraSrc * camsrc, gfloat zoom)
1718 GstMFLDV4l2CamSrc *v4l2camsrc;
1719 gboolean ret = TRUE;
1721 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1723 GST_DEBUG_OBJECT (v4l2camsrc, "ZOOM: %f", zoom);
1725 v4l2camsrc->zoom_factor = zoom;
1726 if (v4l2camsrc->is_active) {
1727 g_mutex_lock (v4l2camsrc->device_mutex);
1728 ret = gst_v4l2camsrc_libmfldcam_set_zoom (v4l2camsrc, zoom);
1729 g_mutex_unlock (v4l2camsrc->device_mutex);
1731 v4l2camsrc->zoom_updated = TRUE;
1736 gst_v4l2camsrc_set_ae_mode(GstCameraSrc * camsrc, int mode)
1738 GstMFLDV4l2CamSrc *v4l2camsrc;
1739 gboolean ret = TRUE;
1741 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1743 if (v4l2camsrc->is_active) {
1744 g_mutex_lock (v4l2camsrc->device_mutex);
1745 v4l2camsrc->ae_metering_mode = *(GstCameraAEMeteringMode *)&mode;
1746 v4l2camsrc->mfldadvci->AeSetMeteringMode((advci_ae_metering_mode)v4l2camsrc->ae_metering_mode);
1747 g_mutex_unlock (v4l2camsrc->device_mutex);
1753 gst_v4l2camsrc_get_ae_mode(GstCameraSrc * camsrc, int *mode)
1755 GstMFLDV4l2CamSrc *v4l2camsrc;
1756 gboolean ret = TRUE;
1758 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1760 if (v4l2camsrc->is_active) {
1761 g_mutex_lock (v4l2camsrc->device_mutex);
1762 *mode = v4l2camsrc->ae_metering_mode;
1763 g_mutex_unlock (v4l2camsrc->device_mutex);
1770 gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size)
1772 GstMFLDV4l2CamSrc *v4l2camsrc;
1773 gboolean ret = TRUE;
1775 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1776 GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1778 if (v4l2camsrc->is_active) {
1779 g_mutex_lock (v4l2camsrc->device_mutex);
1780 ret = gst_v4l2camsrc_libmfldcam_get_makernote(v4l2camsrc, buf, size);
1781 g_mutex_unlock (v4l2camsrc->device_mutex);
1787 static gboolean gst_v4l2camsrc_makernote_init(GstCameraSrc * camsrc,
1788 unsigned * buf_size,
1789 unsigned num_afwindows,
1795 GstMFLDV4l2CamSrc *v4l2camsrc;
1797 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1798 GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1800 num_afwindows = num_grid = 1;
1801 num_faces = num_eyes = 0;
1806 static gboolean gst_v4l2camsrc_makernote_deal(GstCameraSrc * camsrc,
1807 GstBuffer *pmakerbuf,
1808 unsigned num_afwindows,
1812 GstMFLDV4l2CamSrc *v4l2camsrc;
1814 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1815 GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1821 static gboolean gst_v4l2camsrc_makernote_uninit(GstCameraSrc * camsrc,
1824 GstMFLDV4l2CamSrc *v4l2camsrc;
1826 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1827 GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1835 * @plugin: GstPlugin
1837 * Returns: TRUE on success.
1840 plugin_init (GstPlugin * plugin)
1842 GST_DEBUG_CATEGORY_INIT (gst_v4l2camsrc_debug, "camerasrc", 0,
1843 "Medfield V4L2 camera source");
1845 return gst_element_register (plugin, "camerasrc",
1846 GST_RANK_NONE, GST_TYPE_V4L2CAMSRC);
1849 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
1852 "V4L2 camera image capturing element",
1853 plugin_init, VERSION, "LGPL", "Intel", "www.intel.com")