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_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);
76 static gboolean gst_v4l2camsrc_iface_supported (GstImplementsInterface * iface,
78 static gboolean gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size);
79 static gboolean gst_v4l2camsrc_makernote_init(GstCameraSrc * camsrc,
81 unsigned num_afwindows,
86 static gboolean gst_v4l2camsrc_makernote_deal(GstCameraSrc * camsrc,
88 unsigned num_afwindows,
91 static gboolean gst_v4l2camsrc_makernote_uninit(GstCameraSrc * camsrc,
105 PROP_AE_METERING_MODE,
108 PROP_AF_METERING_MODE,
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,
131 } GstV4L2CamSrcProperties;
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)
145 gst_camera_input_sensor_get_type (void)
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"},
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);
159 return gst_camera_input_sensor_type;
163 gst_camera_ae_metering_mode_get_type(void)
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"},
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);
179 return gst_camera_ae_metering_mode_type;
183 gst_camera_af_metering_mode_get_type(void)
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"},
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);
199 return gst_camera_af_metering_mode_type;
203 gst_camerasrc_debug_flags_get_type (void)
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",
209 {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_MAKER_NOTE), "Debug flags for maker note",
211 {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_AUTO_FOCUS), "Debug flags for auto focus",
216 if (G_UNLIKELY (!gst_camerasrc_debug_flags)) {
217 gst_camerasrc_debug_flags =
218 g_flags_register_static ("GstCameraSrcDebugFlags", values);
220 return gst_camerasrc_debug_flags;
225 GST_IMPLEMENT_V4L2CAMSRC_VIDORIENT_METHODS (GstMFLDV4l2CamSrc, gst_v4l2camsrc);
229 gst_v4l2camsrc_interface_init (GstImplementsInterfaceClass * klass)
232 * default virtual functions
234 klass->supported = gst_v4l2camsrc_iface_supported;
238 gst_v4l2camsrc_init_interfaces (GType type)
240 static const GInterfaceInfo v4l2camsrc_iface_info = {
241 (GInterfaceInitFunc) gst_v4l2camsrc_interface_init,
245 static const GInterfaceInfo v4l2camsrc_videoorientation_info = {
246 (GInterfaceInitFunc) gst_v4l2camsrc_video_orientation_interface_init,
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);
258 GST_BOILERPLATE_FULL (GstMFLDV4l2CamSrc, gst_v4l2camsrc, GstCameraSrc,
259 GST_TYPE_CAMERA_SRC, gst_v4l2camsrc_init_interfaces);
264 gst_v4l2camsrc_iface_supported (GstImplementsInterface * iface,
267 GstCameraSrc *camsrc = GST_CAMERA_SRC (iface);
269 if (gst_v4l2camsrc_is_open (camsrc) &&
270 iface_type == GST_TYPE_VIDEO_ORIENTATION) {
274 else if (GST_IS_IMPLEMENTS_INTERFACE (camsrc)) {
275 GstImplementsInterfaceClass *parent_klass;
278 g_type_interface_peek (parent_class, GST_TYPE_IMPLEMENTS_INTERFACE);
279 return parent_klass->supported (iface, iface_type);
287 * gst_v4l2camsrc_is_open:
291 gst_v4l2camsrc_is_open (GstCameraSrc * camsrc)
293 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
295 return GST_V4L2CAMSRC_IS_OPEN (v4l2camsrc);
299 * gst_v4l2camsrc_is_active:
303 gst_v4l2camsrc_is_active (GstCameraSrc * camsrc)
305 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
307 return GST_V4L2CAMSRC_IS_ACTIVE (v4l2camsrc);
311 * gst_v4l2camsrc_v4l2fourcc_to_structure:
314 static GstStructure *
315 gst_v4l2camsrc_v4l2fourcc_to_structure (guint32 fourcc)
317 GstStructure *structure = NULL;
320 case V4L2_PIX_FMT_MJPEG: /* Motion-JPEG */
321 case V4L2_PIX_FMT_JPEG: /* JFIF JPEG */
322 structure = gst_structure_new ("image/jpeg", NULL);
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;
337 guint32 r_mask = 0, b_mask = 0, g_mask = 0;
340 case V4L2_PIX_FMT_RGB332:
342 endianness = G_BYTE_ORDER; /* 'like, whatever' */
347 case V4L2_PIX_FMT_RGB555:
348 case V4L2_PIX_FMT_RGB555X:
352 fourcc == V4L2_PIX_FMT_RGB555X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
357 case V4L2_PIX_FMT_RGB565:
358 case V4L2_PIX_FMT_RGB565X:
361 fourcc == V4L2_PIX_FMT_RGB565X ? G_BIG_ENDIAN : G_LITTLE_ENDIAN;
366 case V4L2_PIX_FMT_RGB24:
368 endianness = G_BIG_ENDIAN;
373 case V4L2_PIX_FMT_BGR24:
375 endianness = G_BIG_ENDIAN;
380 case V4L2_PIX_FMT_RGB32:
382 endianness = G_BIG_ENDIAN;
387 case V4L2_PIX_FMT_BGR32:
389 endianness = G_BIG_ENDIAN;
395 g_assert_not_reached ();
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);
407 case V4L2_PIX_FMT_GREY: /* 8 Greyscale */
408 structure = gst_structure_new ("video/x-raw-gray",
409 "bpp", G_TYPE_INT, 8, NULL);
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 */
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:
431 case V4L2_PIX_FMT_YUV411P:{
435 case V4L2_PIX_FMT_NV12:
436 fcc = GST_MAKE_FOURCC ('N', 'V', '1', '2');
438 case V4L2_PIX_FMT_NV21:
439 fcc = GST_MAKE_FOURCC ('N', 'V', '2', '1');
441 case V4L2_PIX_FMT_NV16:
442 fcc = GST_MAKE_FOURCC ('N', 'V', '1', '6');
444 case V4L2_PIX_FMT_NV61:
445 fcc = GST_MAKE_FOURCC ('N', 'V', '6', '1');
447 case V4L2_PIX_FMT_YVU410:
448 fcc = GST_MAKE_FOURCC ('Y', 'V', 'U', '9');
450 case V4L2_PIX_FMT_YUV410:
451 fcc = GST_MAKE_FOURCC ('Y', 'U', 'V', '9');
453 case V4L2_PIX_FMT_YUV420:
454 fcc = GST_MAKE_FOURCC ('I', '4', '2', '0');
456 case V4L2_PIX_FMT_YUYV:
457 fcc = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2');
459 case V4L2_PIX_FMT_YVU420:
460 fcc = GST_MAKE_FOURCC ('Y', 'V', '1', '2');
462 case V4L2_PIX_FMT_UYVY:
463 fcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y');
465 case V4L2_PIX_FMT_Y41P:
466 fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'P');
468 case V4L2_PIX_FMT_YUV411P:
469 fcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B');
471 case V4L2_PIX_FMT_YUV422P:
472 fcc = GST_MAKE_FOURCC ('Y', '4', '2', 'B');
474 case V4L2_PIX_FMT_YUV444:
475 fcc = GST_MAKE_FOURCC ('Y', '4', '4', '4');
477 #ifdef V4L2_PIX_FMT_YVYU
478 case V4L2_PIX_FMT_YVYU:
479 fcc = GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U');
483 g_assert_not_reached ();
486 structure = gst_structure_new ("video/x-raw-yuv",
487 "format", GST_TYPE_FOURCC, fcc, NULL);
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:{
503 case V4L2_PIX_FMT_SBGGR8:
504 fcc = GST_MAKE_FOURCC ('B', 'A', '8', '1');
506 case V4L2_PIX_FMT_SGBRG8:
507 fcc = GST_MAKE_FOURCC ('G', 'B', 'R', 'G');
509 case V4L2_PIX_FMT_SGRBG8:
510 fcc = GST_MAKE_FOURCC ('G', 'R', 'B', 'G');
512 case V4L2_PIX_FMT_SRGGB8:
513 fcc = GST_MAKE_FOURCC ('R', 'G', 'G', 'B');
515 case V4L2_PIX_FMT_SBGGR10:
516 fcc = GST_MAKE_FOURCC ('B', 'G', '1', '0');
518 case V4L2_PIX_FMT_SGBRG10:
519 fcc = GST_MAKE_FOURCC ('G', 'B', '1', '0');
521 case V4L2_PIX_FMT_SGRBG10:
522 fcc = GST_MAKE_FOURCC ('B', 'A', '1', '0');
524 case V4L2_PIX_FMT_SRGGB10:
525 fcc = GST_MAKE_FOURCC ('R', 'G', '1', '0');
527 case V4L2_PIX_FMT_SBGGR16:
528 fcc = GST_MAKE_FOURCC ('B', 'Y', 'R', '2');
531 g_assert_not_reached ();
534 structure = gst_structure_new ("video/x-raw-bayer",
535 "format", GST_TYPE_FOURCC, fcc, NULL);
539 GST_DEBUG ("Unknown fourcc 0x%08x %" GST_FOURCC_FORMAT,
540 fourcc, GST_FOURCC_ARGS (fourcc));
548 * gst_v4l2camsrc_get_caps:
552 gst_v4l2camsrc_get_caps (GstCameraSrc * camsrc)
554 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
555 GstStructure *template;
559 if (!gst_v4l2camsrc_is_open (camsrc)) {
560 /* FIXME: should it probe the device? */
564 if (!v4l2camsrc->formats)
565 gst_v4l2camsrc_fill_format_list (v4l2camsrc);
567 ret = gst_caps_new_empty ();
569 for (walk = v4l2camsrc->formats; walk; walk = walk->next) {
570 struct v4l2_fmtdesc *format;
572 /* FIXME: Introduce own format structure */
573 format = (struct v4l2_fmtdesc *) walk->data;
575 template = gst_v4l2camsrc_v4l2fourcc_to_structure (format->pixelformat);
580 tmp = gst_v4l2camsrc_probe_caps_for_format (v4l2camsrc,
581 format->pixelformat, template);
583 gst_caps_append (ret, tmp);
585 gst_structure_free (template);
587 GST_DEBUG_OBJECT (v4l2camsrc, "unknown format %u", format->pixelformat);
591 v4l2camsrc->probed_caps = gst_caps_ref (ret);
593 GST_INFO_OBJECT(v4l2camsrc, "use GST_DEBUG >= 5 for probed caps");
594 GST_LOG_OBJECT (v4l2camsrc, "probed caps: %" GST_PTR_FORMAT, ret);
600 * gst_v4l2camsrc_get_num_buffers:
604 gst_v4l2camsrc_get_num_buffers (GstCameraSrc * camsrc)
606 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc);
608 return v4l2camsrc->num_buffers;
612 * common format / caps utilities:
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},
627 {V4L2_PIX_FMT_NV12, TRUE},
628 {V4L2_PIX_FMT_NV21, TRUE},
630 {V4L2_PIX_FMT_NV16, TRUE},
631 {V4L2_PIX_FMT_NV61, TRUE},
633 {V4L2_PIX_FMT_YUYV, TRUE},
634 {V4L2_PIX_FMT_UYVY, TRUE},
636 {V4L2_PIX_FMT_SBGGR16, TRUE},
638 {V4L2_PIX_FMT_SBGGR8, TRUE},
639 {V4L2_PIX_FMT_SGBRG8, TRUE},
640 {V4L2_PIX_FMT_SGRBG8, TRUE},
641 {V4L2_PIX_FMT_SRGGB8, TRUE},
643 {V4L2_PIX_FMT_SBGGR10, TRUE},
644 {V4L2_PIX_FMT_SGBRG10, TRUE},
645 {V4L2_PIX_FMT_SGRBG10, TRUE},
646 {V4L2_PIX_FMT_SRGGB10, TRUE},
648 {V4L2_PIX_FMT_RGB24, TRUE},
649 {V4L2_PIX_FMT_RGB32, TRUE},
650 {V4L2_PIX_FMT_RGB565, TRUE},
653 #define GST_V4L2_FORMAT_COUNT (G_N_ELEMENTS (gst_v4l2_formats))
654 #define GST_V4L2_MAX_SIZE (1<<15) /* 2^15 == 32768 */
657 gst_v4l2camsrc_get_all_caps (void)
659 static GstCaps *caps = NULL;
662 GstStructure *structure;
666 caps = gst_caps_new_empty ();
667 for (i = 0; i < GST_V4L2_FORMAT_COUNT; i++) {
669 gst_v4l2camsrc_v4l2fourcc_to_structure (gst_v4l2_formats[i].format);
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);
677 gst_caps_append_structure (caps, structure);
682 return gst_caps_ref (caps);
687 * gst_v4l2camsrc_base_init:
688 * @klass: #GstElementClass.
692 gst_v4l2camsrc_base_init (gpointer klass)
694 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
696 gst_element_class_set_details_simple (element_class,
697 "V4L2 camera source",
699 "Video4Linux2 camera source element",
700 "Maemo Multimedia <multimedia@maemo.org>");
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 ()));
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);
713 gst_v4l2camsrc_read_settings (GstCameraSrc * camsrc,
714 GstPhotoSettings * photoconf);
715 gboolean gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc,
716 GstPhotoSettings * photoconf, gboolean scene_override);
718 gst_v4l2camsrc_set_flash_mode (GstCameraSrc *camsrc, int value);
719 gst_v4l2camsrc_read_exif (GstCameraSrc *camsrc,
720 GstCameraControlExifInfo *exif_info);
724 * gst_v4l2camsrc_class_init:
725 * @klass: #GstMFLDV4l2CamSrcClass.
729 gst_v4l2camsrc_class_init (GstMFLDV4l2CamSrcClass * klass)
731 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
732 GstCameraSrcClass *camera_class = GST_CAMERA_SRC_CLASS (klass);
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);
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));
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));
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));
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));
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));
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));
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));
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));
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));
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 ));
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));
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));
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 ));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
914 g_object_class_install_property (gobject_class,
916 g_param_spec_boolean ("vflip", "Vertical Flip",
917 "Vertical flip", FALSE,
918 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
920 g_object_class_install_property (gobject_class,
922 g_param_spec_boolean ("hflip", "Horisontal Flip",
923 "Horisontal flip", FALSE,
924 G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
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);
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);
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);
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);
974 * gst_v4l2camsrc_driver_wrapper_load:
975 * Create the mfldadvci object. The function in libmfldadvci can
976 * be called from this source element now
979 gst_v4l2camsrc_mfldadvci_wrapper_load (GstMFLDV4l2CamSrc * v4l2camsrc)
981 GstV4l2MFLDAdvCI *mfldadvci;
983 mfldadvci = g_new0 (GstV4l2MFLDAdvCI, 1);
984 wrapper_default_link_functions_init(mfldadvci);
986 if (g_module_supported ()) {
988 module_file = g_module_build_path (MFLD_ADVCI_PATH, "libmfldadvci.so.0");
989 GST_DEBUG_OBJECT (v4l2camsrc, "Loading %s", module_file);
991 v4l2camsrc->module = g_module_open (module_file, G_MODULE_BIND_LOCAL);
993 /* Open again if libmfldadvci.so.0 doesn't exist */
994 if (!v4l2camsrc->module) {
995 module_file = g_module_build_path (MFLD_ADVCI_PATH, "libmfldadvci.so");
996 v4l2camsrc->module = g_module_open (module_file, G_MODULE_BIND_LOCAL);
997 GST_DEBUG_OBJECT (v4l2camsrc, "Loading %s", module_file);
999 GST_DEBUG_OBJECT(v4l2camsrc, "Camera Source Interface version is %d\n", LIBMFLDADVCI_VERSION);
1000 if (v4l2camsrc->module) {
1001 #ifdef USE_STATIC_3A
1002 lib_3a_link_functions_init(mfldadvci);
1003 #endif /* USE_STATIC_3A */
1004 /* for dynamic func initilisation
1005 * ret = g_module_symbol (v4l2camsrc->module, "libmfldadvci_init",
1006 * (gpointer) & init_function);
1008 * advci_version = init_function (mfldadvci);
1017 * gst_v4l2camsrc_mfldadvci_wrapper_unload:
1018 * Unload the libmfldadvci and free its resource
1021 gst_v4l2camsrc_mfldadvci_wrapper_unload (GstMFLDV4l2CamSrc * v4l2camsrc)
1023 GstV4l2MFLDAdvCI *mfldadvci = v4l2camsrc->mfldadvci;
1024 g_module_close (v4l2camsrc->module);
1025 v4l2camsrc->module = NULL;
1034 * gst_v4l2camsrc_init:
1035 * @v4l2camsrc: #GstMFLDV4l2CamSrc.
1036 * @klass: #GstMFLDV4l2CamSrcClass.
1040 gst_v4l2camsrc_init (GstMFLDV4l2CamSrc * v4l2camsrc,
1041 GstMFLDV4l2CamSrcClass * klass)
1043 v4l2camsrc->num_buffers = GST_V4L2CAMSRC_DEFAULT_BUFFERS;
1044 v4l2camsrc->tmp_num_buffers = v4l2camsrc->num_buffers;
1045 v4l2camsrc->videodev = g_strdup (DEFAULT_PROP_DEVICE);
1046 v4l2camsrc->video_fd = DEFAULT_PROP_DEVICE_FD;
1047 v4l2camsrc->poll = gst_poll_new (TRUE);
1048 v4l2camsrc->buffer = NULL;
1049 v4l2camsrc->crop_supported = FALSE;
1050 v4l2camsrc->max_zoom_factor = MAX_RESIZER_FACTOR;
1051 v4l2camsrc->zoom_factor = DEFAULT_RESIZER_FACTOR;
1052 v4l2camsrc->use_mmap = TRUE;
1053 v4l2camsrc->use_copy = FALSE;
1054 v4l2camsrc->capture_mode = GST_CAMERA_SRC_CAPTURE_MODE_VIEWFINDER;
1055 /* MFLD camera Advanced features status */
1056 v4l2camsrc->gdc_enabled = FALSE;
1057 v4l2camsrc->rer_enabled = FALSE;
1058 v4l2camsrc->cac_enabled = FALSE;
1059 v4l2camsrc->dvs_enabled = FALSE;
1060 v4l2camsrc->dis_enabled = FALSE;
1061 v4l2camsrc->ee_enabled = TRUE;
1062 v4l2camsrc->sc_enabled = TRUE;
1063 v4l2camsrc->cc_updated = FALSE;
1064 v4l2camsrc->gamma_updated = FALSE;
1065 v4l2camsrc->ae_enabled = TRUE;
1066 v4l2camsrc->af_enabled = TRUE;
1067 v4l2camsrc->awb_enabled = TRUE;
1068 v4l2camsrc->still_af = FALSE;
1069 v4l2camsrc->bayer_downscaling = FALSE;
1070 v4l2camsrc->tone.gamma = 2.2;
1071 v4l2camsrc->tone.brightness = 0;
1072 v4l2camsrc->tone.contrast = 256;
1074 v4l2camsrc->preflash_enabled = FALSE;
1075 v4l2camsrc->capflash_enabled = FALSE;
1076 v4l2camsrc->preflash_analoggain = 0;
1078 v4l2camsrc->dump_raw = FALSE;
1079 v4l2camsrc->dump_image = FALSE;
1080 v4l2camsrc->raw_output_size = 0;
1081 v4l2camsrc->debug_flags = DEFAULT_DEBUG_FLAGS;
1083 v4l2camsrc->device_mutex = g_mutex_new ();
1085 v4l2camsrc->mfldadvci = gst_v4l2camsrc_mfldadvci_wrapper_load (v4l2camsrc);
1087 v4l2camsrc->input_sensor = GST_CAMERA_INPUT_SENSOR_PRIMARY;
1088 v4l2camsrc->ae_metering_mode = GST_CAMERA_AE_METERING_AUTO;
1089 v4l2camsrc->af_metering_mode = GST_CAMERA_AF_METERING_AUTO;
1091 v4l2camsrc->ae_window.x_left = 0;
1092 v4l2camsrc->ae_window.x_right = 0;
1093 v4l2camsrc->ae_window.y_bottom = 0;
1094 v4l2camsrc->ae_window.y_top = 0;
1095 v4l2camsrc->ae_window.weight= 0x8000;
1096 v4l2camsrc->af_window.x_left = 0;
1097 v4l2camsrc->af_window.x_right = 0;
1098 v4l2camsrc->af_window.y_bottom = 0;
1099 v4l2camsrc->af_window.y_top = 0;
1100 v4l2camsrc->af_window.weight= 0x8000;
1102 libmfld_cam_init (v4l2camsrc->mfldadvci);
1104 GST_DEBUG ("initialized to commit %s", MFLD_V4L2CAMSRC_VERSION);
1109 gst_v4l2camsrc_dispose (GObject * object)
1111 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (object);
1113 if (v4l2camsrc->formats) {
1114 gst_v4l2camsrc_clear_format_list (v4l2camsrc);
1117 if (v4l2camsrc->probed_caps) {
1118 gst_caps_unref (v4l2camsrc->probed_caps);
1119 v4l2camsrc->probed_caps = NULL;
1122 /* FIXME: driver cleanup function */
1123 if (v4l2camsrc->videodev) {
1124 g_free (v4l2camsrc->videodev);
1125 v4l2camsrc->videodev = NULL;
1128 if (v4l2camsrc->poll) {
1129 gst_poll_free (v4l2camsrc->poll);
1132 g_mutex_free (v4l2camsrc->device_mutex);
1134 G_OBJECT_CLASS (parent_class)->dispose (object);
1135 libmfld_cam_dispose ();
1140 * gst_v4l2camsrc_finalize:
1145 gst_v4l2camsrc_finalize (GObject * object)
1147 G_OBJECT_CLASS (parent_class)->finalize (object);
1155 gst_v4l2camsrc_set_property (GObject * object,
1156 guint prop_id, const GValue * value, GParamSpec * pspec)
1158 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (object);
1159 gboolean opened = GST_V4L2CAMSRC_IS_OPEN (v4l2camsrc);
1163 g_free (v4l2camsrc->videodev);
1164 v4l2camsrc->videodev = g_value_dup_string (value);
1166 case PROP_QUEUE_SIZE:
1167 v4l2camsrc->num_buffers = g_value_get_uint (value);
1168 v4l2camsrc->tmp_num_buffers = v4l2camsrc->num_buffers;
1170 case PROP_INPUT_SENSOR:
1171 v4l2camsrc->input_sensor = g_value_get_enum (value);
1174 v4l2camsrc->use_mmap = g_value_get_boolean (value);
1177 v4l2camsrc->use_copy = g_value_get_boolean (value);
1180 v4l2camsrc->ae_enabled = g_value_get_boolean (value);
1182 case PROP_AE_WINDOW:
1184 GstStructure *ae_window_param = NULL;
1186 gboolean parsed = TRUE;
1189 ctmp = g_malloc0 (60);
1192 GST_DEBUG_OBJECT(v4l2camsrc, "alloc string mem failed.\n");
1195 strncpy (ctmp,"ae,",3);
1196 strncat (ctmp,g_value_get_string (value),55);
1197 ae_window_param = gst_structure_from_string (ctmp, NULL);
1198 if(ae_window_param == NULL)
1200 GST_DEBUG_OBJECT(v4l2camsrc,"wrong string format is entered. stop setting ae window.\n");
1205 parsed = gst_structure_get_int(ae_window_param, "x_left",
1206 &v4l2camsrc->ae_window.x_left);
1207 parsed |= gst_structure_get_int(ae_window_param, "x_right",
1208 &v4l2camsrc->ae_window.x_right);
1209 parsed |= gst_structure_get_int(ae_window_param, "y_top",
1210 &v4l2camsrc->ae_window.y_top);
1211 parsed |= gst_structure_get_int(ae_window_param, "y_bottom",
1212 &v4l2camsrc->ae_window.y_bottom);
1214 if (parsed == FALSE)
1216 GST_DEBUG_OBJECT(v4l2camsrc,"cannot parse ae window parameter. \n");
1217 gst_structure_free (ae_window_param);
1222 parsed = gst_structure_get_int(ae_window_param, "weight",
1223 &v4l2camsrc->ae_window.weight);
1225 if (parsed == FALSE)
1227 GST_DEBUG_OBJECT(v4l2camsrc,
1228 "set ae window weight to default value 0x8000.\n");
1229 v4l2camsrc->ae_window.weight = 0x8000;
1232 GST_DEBUG_OBJECT(v4l2camsrc,"ae-window-setting: x_left:%d, x_right:%d,"
1233 "y_bottom:%d, y_top:%d, weight:%d.\n",
1234 v4l2camsrc->ae_window.x_left,v4l2camsrc->ae_window.x_right,
1235 v4l2camsrc->ae_window.y_bottom, v4l2camsrc->ae_window.y_top,
1236 v4l2camsrc->ae_window.weight);
1239 if (v4l2camsrc->ae_metering_mode != GST_CAMERA_AE_METERING_SPOT)
1241 GST_DEBUG_OBJECT(v4l2camsrc,"wrong ae metering mode. set it to spot mode automaticly.\n");
1242 v4l2camsrc->ae_metering_mode = GST_CAMERA_AE_METERING_SPOT;
1243 v4l2camsrc->mfldadvci->AeSetMeteringMode
1244 ( (ia_3a_ae_metering_mode) v4l2camsrc->ae_metering_mode);
1247 v4l2camsrc->mfldadvci->AeSetWindow ((ia_3a_window *) (&(v4l2camsrc->ae_window)));
1249 gst_structure_free (ae_window_param);
1254 case PROP_AE_METERING_MODE:
1256 v4l2camsrc->ae_metering_mode = g_value_get_enum (value);
1257 v4l2camsrc->mfldadvci->AeSetMeteringMode((ia_3a_ae_metering_mode)v4l2camsrc->ae_metering_mode);
1260 case PROP_AF_METERING_MODE:
1262 v4l2camsrc->af_metering_mode = g_value_get_enum (value);
1263 v4l2camsrc->mfldadvci->AfSetMeteringMode((ia_3a_af_metering_mode)v4l2camsrc->af_metering_mode);
1266 case PROP_AF_WINDOW:
1268 GstStructure *af_window_param = NULL;
1270 gboolean parsed = TRUE;
1273 ctmp = g_malloc0 (60);
1276 GST_DEBUG_OBJECT(v4l2camsrc, "alloc string mem failed.\n");
1279 strncpy (ctmp,"af,",3);
1280 strncat (ctmp,g_value_get_string (value),55);
1281 af_window_param = gst_structure_from_string (ctmp, NULL);
1282 if(af_window_param == NULL)
1284 GST_DEBUG_OBJECT(v4l2camsrc,"wrong string format is entered. stop setting af window.\n");
1289 parsed = gst_structure_get_int(af_window_param, "x_left",
1290 &v4l2camsrc->af_window.x_left);
1291 parsed |= gst_structure_get_int(af_window_param, "x_right",
1292 &v4l2camsrc->af_window.x_right);
1293 parsed |= gst_structure_get_int(af_window_param, "y_top",
1294 &v4l2camsrc->af_window.y_top);
1295 parsed |= gst_structure_get_int(af_window_param, "y_bottom",
1296 &v4l2camsrc->af_window.y_bottom);
1298 if (parsed == FALSE)
1300 GST_DEBUG_OBJECT(v4l2camsrc,"cannot parse af window parameter. \n");
1301 gst_structure_free (af_window_param);
1306 parsed = gst_structure_get_int(af_window_param, "weight",
1307 &v4l2camsrc->af_window.weight);
1309 if (parsed == FALSE)
1311 GST_DEBUG_OBJECT(v4l2camsrc,
1312 "set af window weight to default value 0x8000.\n");
1313 v4l2camsrc->af_window.weight = 0x8000;
1316 GST_DEBUG_OBJECT(v4l2camsrc,"af-window-setting: x_left:%d, x_right:%d,"
1317 "y_bottom:%d, y_top:%d, weight:%d.\n",
1318 v4l2camsrc->af_window.x_left,v4l2camsrc->af_window.x_right,
1319 v4l2camsrc->af_window.y_bottom, v4l2camsrc->af_window.y_top,
1320 v4l2camsrc->af_window.y_top);
1323 v4l2camsrc->mfldadvci->AfSetWindow ((ia_3a_window *) (&(v4l2camsrc->af_window)));
1325 gst_structure_free (af_window_param);
1331 v4l2camsrc->af_enabled = g_value_get_boolean (value);
1335 v4l2camsrc->awb_enabled = g_value_get_boolean (value);
1338 v4l2camsrc->still_af = g_value_get_boolean (value);
1339 cam_set_autofocus (v4l2camsrc->still_af);
1341 case PROP_FOCUS_POSITION:
1342 v4l2camsrc->focus_posi = g_value_get_int(value);
1344 cam_driver_set_focus_posi (v4l2camsrc->video_fd, v4l2camsrc->focus_posi);
1346 v4l2camsrc->focus_updated = TRUE;
1349 v4l2camsrc->vflip = g_value_get_boolean(value);
1350 if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc)))
1351 gst_v4l2camsrc_set_attribute (GST_CAMERA_SRC (v4l2camsrc),V4L2_CID_VFLIP,v4l2camsrc->vflip);
1354 v4l2camsrc->hflip = g_value_get_boolean(value);
1355 if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc)))
1356 gst_v4l2camsrc_set_attribute (GST_CAMERA_SRC (v4l2camsrc),V4L2_CID_HFLIP,v4l2camsrc->hflip);
1358 case PROP_BAYER_DOWNSCALING:
1359 v4l2camsrc->bayer_downscaling = g_value_get_boolean (value);
1361 case PROP_CAPTURE_CORRECTION_GDC:
1362 v4l2camsrc->gdc_enabled = g_value_get_boolean (value);
1364 cam_set_capture_correction (v4l2camsrc->video_fd,
1365 CAM_CAPTURE_CORRECTION_GDC, v4l2camsrc->gdc_enabled);
1367 v4l2camsrc->cc_updated = TRUE;
1369 case PROP_CAPTURE_CORRECTION_CAC:
1370 v4l2camsrc->cac_enabled = g_value_get_boolean (value);
1372 cam_set_capture_correction (v4l2camsrc->video_fd,
1373 CAM_CAPTURE_CORRECTION_CAC, v4l2camsrc->cac_enabled);
1375 v4l2camsrc->cc_updated = TRUE;
1377 case PROP_CAPTURE_CORRECTION_RER:
1378 v4l2camsrc->rer_enabled = g_value_get_boolean (value);
1379 cam_set_capture_correction (v4l2camsrc->video_fd,
1380 CAM_CAPTURE_CORRECTION_RER, v4l2camsrc->rer_enabled);
1382 case PROP_CAPTURE_CORRECTION_DIS:
1383 v4l2camsrc->dis_enabled = g_value_get_boolean (value);
1384 cam_set_capture_correction (v4l2camsrc->video_fd,
1385 CAM_CAPTURE_CORRECTION_DIS, v4l2camsrc->dis_enabled);
1387 case PROP_CAPTURE_CORRECTION_DVS:
1388 v4l2camsrc->dvs_enabled = g_value_get_boolean (value);
1390 cam_set_capture_correction (v4l2camsrc->video_fd,
1391 CAM_CAPTURE_CORRECTION_DVS, v4l2camsrc->dvs_enabled);
1393 v4l2camsrc->cc_updated = TRUE;
1395 case PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT:
1396 v4l2camsrc->ee_enabled = g_value_get_boolean (value);
1398 cam_set_capture_correction (v4l2camsrc->video_fd,
1399 CAM_CAPTURE_CORRECTION_EE, v4l2camsrc->ee_enabled);
1401 v4l2camsrc->cc_updated = TRUE;
1403 case PROP_CAPTURE_CORRECTION_SHADING_CORRECTION:
1404 v4l2camsrc->sc_enabled = g_value_get_boolean (value);
1406 cam_set_capture_correction (v4l2camsrc->video_fd,
1407 CAM_CAPTURE_CORRECTION_SC, v4l2camsrc->sc_enabled);
1409 v4l2camsrc->cc_updated = TRUE;
1411 case PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION:
1412 v4l2camsrc->blc_enabled = g_value_get_boolean (value);
1414 cam_set_capture_correction (v4l2camsrc->video_fd,
1415 CAM_CAPTURE_CORRECTION_BLC, v4l2camsrc->blc_enabled);
1417 v4l2camsrc->cc_updated = TRUE;
1419 case PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION:
1420 v4l2camsrc->bpd_enabled = g_value_get_boolean (value);
1422 cam_set_capture_correction (v4l2camsrc->video_fd,
1423 CAM_CAPTURE_CORRECTION_BPD, v4l2camsrc->bpd_enabled);
1425 v4l2camsrc->cc_updated = TRUE;
1427 case PROP_CAPTURE_CORRECTION_GAMMA:
1428 v4l2camsrc->tone.gamma = g_value_get_float (value);
1430 cam_set_tone_control (v4l2camsrc->video_fd, CAM_GAMMA_VALUE,
1433 v4l2camsrc->gamma_updated = TRUE;
1435 case PROP_CAPTURE_CORRECTION_CONTRAST:
1436 v4l2camsrc->tone.contrast = g_value_get_int (value);
1438 cam_set_tone_control (v4l2camsrc->video_fd, CAM_CONTRAST_VALUE,
1441 v4l2camsrc->gamma_updated = TRUE;
1443 case PROP_CAPTURE_CORRECTION_BRIGHTNESS:
1444 v4l2camsrc->tone.brightness = g_value_get_int (value);
1446 cam_set_tone_control (v4l2camsrc->video_fd, CAM_BRIGHTNESS_VALUE,
1449 v4l2camsrc->gamma_updated = TRUE;
1452 v4l2camsrc->dump_raw = g_value_get_boolean (value);
1454 case PROP_DUMP_IMAGE:
1455 v4l2camsrc->dump_image = g_value_get_boolean (value);
1457 case PROP_DEBUG_FLAGS:
1458 v4l2camsrc->debug_flags = g_value_get_flags (value);
1461 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1471 gst_v4l2camsrc_get_property (GObject * object,
1472 guint prop_id, GValue * value, GParamSpec * pspec)
1474 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (object);
1478 g_value_set_string (value, v4l2camsrc->videodev);
1480 case PROP_DEVICE_NAME:
1482 const guchar *new = NULL;
1484 if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc))) {
1485 new = v4l2camsrc->vcap.card;
1486 } else if (gst_v4l2camsrc_open (GST_CAMERA_SRC (v4l2camsrc))) {
1487 new = v4l2camsrc->vcap.card;
1488 gst_v4l2camsrc_close (GST_CAMERA_SRC (v4l2camsrc));
1489 gst_camerasrc_clear_color_channels (GST_CAMERA_SRC (v4l2camsrc));
1491 g_value_set_string (value, (gchar *) new);
1494 case PROP_DEVICE_FD:
1496 if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc)))
1497 g_value_set_int (value, v4l2camsrc->video_fd);
1499 g_value_set_int (value, DEFAULT_PROP_DEVICE_FD);
1502 case PROP_QUEUE_SIZE:
1503 g_value_set_uint (value, v4l2camsrc->num_buffers);
1505 case PROP_INPUT_SENSOR:
1506 g_value_set_enum (value, v4l2camsrc->input_sensor);
1509 g_value_set_boolean (value, v4l2camsrc->use_mmap);
1512 g_value_set_boolean (value, v4l2camsrc->use_copy);
1515 g_value_set_boolean (value, v4l2camsrc->ae_enabled);
1517 case PROP_AE_METERING_MODE:
1518 g_value_set_enum (value, v4l2camsrc->ae_metering_mode);
1520 case PROP_AE_WINDOW:
1522 GstStructure *tmp = NULL;
1523 tmp = gst_structure_empty_new("ae-window");
1526 GST_DEBUG ("wrong default ae window setting.\n");
1529 gst_structure_set (tmp,"x_left", G_TYPE_INT,
1530 v4l2camsrc->ae_window.x_left,NULL);
1531 gst_structure_set (tmp,"x_right", G_TYPE_INT,
1532 v4l2camsrc->ae_window.x_right,NULL);
1533 gst_structure_set (tmp,"y_bottom", G_TYPE_INT,
1534 v4l2camsrc->ae_window.y_bottom,NULL);
1535 gst_structure_set (tmp,"y_top", G_TYPE_INT,
1536 v4l2camsrc->ae_window.y_top,NULL);
1537 g_value_set_string(value, gst_structure_to_string(tmp));
1538 gst_structure_free(tmp);
1543 g_value_set_boolean (value, v4l2camsrc->af_enabled);
1545 case PROP_AF_METERING_MODE:
1546 g_value_set_enum (value, v4l2camsrc->af_metering_mode);
1548 case PROP_AF_WINDOW:
1550 GstStructure *tmp = NULL;
1551 tmp = gst_structure_empty_new("af-window");
1554 GST_DEBUG ("wrong default af window setting.\n");
1557 gst_structure_set (tmp,"x_left", G_TYPE_INT,
1558 v4l2camsrc->af_window.x_left,NULL);
1559 gst_structure_set (tmp,"x_right", G_TYPE_INT,
1560 v4l2camsrc->af_window.x_right,NULL);
1561 gst_structure_set (tmp,"y_bottom", G_TYPE_INT,
1562 v4l2camsrc->af_window.y_bottom,NULL);
1563 gst_structure_set (tmp,"y_top", G_TYPE_INT,
1564 v4l2camsrc->af_window.y_top,NULL);
1565 g_value_set_string(value, gst_structure_to_string(tmp));
1566 gst_structure_free(tmp);
1571 g_value_set_boolean (value, v4l2camsrc->awb_enabled);
1574 g_value_set_boolean (value, v4l2camsrc->still_af);
1576 case PROP_FOCUS_POSITION:
1577 g_value_set_int (value, v4l2camsrc->focus_posi);
1580 g_value_set_boolean (value, v4l2camsrc->vflip);
1583 g_value_set_boolean (value, v4l2camsrc->hflip);
1585 case PROP_BAYER_DOWNSCALING:
1586 g_value_set_boolean (value, v4l2camsrc->bayer_downscaling);
1588 case PROP_CAPTURE_CORRECTION_GDC:
1589 g_value_set_boolean (value, v4l2camsrc->gdc_enabled);
1591 case PROP_CAPTURE_CORRECTION_CAC:
1592 g_value_set_boolean (value, v4l2camsrc->cac_enabled);
1594 case PROP_CAPTURE_CORRECTION_RER:
1595 g_value_set_boolean (value, v4l2camsrc->rer_enabled);
1597 case PROP_CAPTURE_CORRECTION_DIS:
1598 g_value_set_boolean (value, v4l2camsrc->dis_enabled);
1600 case PROP_CAPTURE_CORRECTION_DVS:
1601 g_value_set_boolean (value, v4l2camsrc->dvs_enabled);
1603 case PROP_CAPTURE_CORRECTION_EDGE_ENHANCEMENT:
1604 g_value_set_boolean (value, v4l2camsrc->ee_enabled);
1606 case PROP_CAPTURE_CORRECTION_SHADING_CORRECTION:
1607 g_value_set_boolean (value, v4l2camsrc->sc_enabled);
1609 case PROP_CAPTURE_CORRECTION_BLACK_LEVEL_COMPENSATION:
1610 g_value_set_boolean (value, v4l2camsrc->blc_enabled);
1612 case PROP_CAPTURE_CORRECTION_BAD_PIXEL_DETECTION:
1613 g_value_set_boolean (value, v4l2camsrc->bpd_enabled);
1615 case PROP_CAPTURE_CORRECTION_GAMMA:
1616 g_value_set_float (value, v4l2camsrc->tone.gamma);
1618 case PROP_CAPTURE_CORRECTION_CONTRAST:
1619 g_value_set_int (value, v4l2camsrc->tone.contrast);
1621 case PROP_CAPTURE_CORRECTION_BRIGHTNESS:
1622 g_value_set_int (value, v4l2camsrc->tone.brightness);
1625 g_value_set_boolean (value, v4l2camsrc->dump_raw);
1627 case PROP_DUMP_IMAGE:
1628 g_value_set_boolean (value, v4l2camsrc->dump_image);
1630 case PROP_DEBUG_FLAGS:
1631 g_value_set_flags (value, v4l2camsrc->debug_flags);
1634 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1642 gst_v4l2camsrc_unlock (GstCameraSrc * src)
1644 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (src);
1646 GST_LOG_OBJECT (v4l2camsrc, "Flushing");
1647 gst_poll_set_flushing (v4l2camsrc->poll, TRUE);
1653 gst_v4l2camsrc_unlock_stop (GstCameraSrc * src)
1655 GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (src);
1657 GST_LOG_OBJECT (v4l2camsrc, "No longer flushing");
1658 gst_poll_set_flushing (v4l2camsrc->poll, FALSE);
1664 * gst_v4l2camsrc_set_zoom:
1665 * @camsrc: @GstCameraSrc object.
1666 * @zoom: zoom factor to be set.
1668 * Set the zoom factor for outputted video.
1670 * Returns: TRUE on success.
1673 gst_v4l2camsrc_set_zoom (GstCameraSrc * camsrc, gfloat zoom)
1675 GstMFLDV4l2CamSrc *v4l2camsrc;
1676 gboolean ret = TRUE;
1678 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1680 GST_DEBUG_OBJECT (v4l2camsrc, "ZOOM: %f", zoom);
1682 v4l2camsrc->zoom_factor = zoom;
1683 if (v4l2camsrc->is_active) {
1684 g_mutex_lock (v4l2camsrc->device_mutex);
1685 ret = gst_v4l2camsrc_libmfldcam_set_zoom (v4l2camsrc, zoom);
1686 g_mutex_unlock (v4l2camsrc->device_mutex);
1688 v4l2camsrc->zoom_updated = TRUE;
1693 gst_v4l2camsrc_set_AeAafwindow (GstCameraSrc * camsrc, GstCameraSrc3a_window window)
1695 GstMFLDV4l2CamSrc *v4l2camsrc;
1696 gboolean ret = TRUE;
1698 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1700 GST_DEBUG_OBJECT(v4l2camsrc,"ae-af-window-setting: x_left:%d, x_right:%d,"
1701 "y_bottom:%d, y_top:%d, weight:%d.\n",
1702 window.x_left,window.x_right,
1703 window.y_bottom, window.y_top,
1706 v4l2camsrc->af_window = v4l2camsrc->ae_window = *(GstCameraWindow*)&window;
1708 if (v4l2camsrc->is_active) {
1709 g_mutex_lock (v4l2camsrc->device_mutex);
1710 v4l2camsrc->mfldadvci->AfSetWindow ((ia_3a_window *) (&(v4l2camsrc->af_window)));
1711 g_mutex_unlock (v4l2camsrc->device_mutex);
1717 gst_v4l2camsrc_set_ae_mode(GstCameraSrc * camsrc, int mode)
1719 GstMFLDV4l2CamSrc *v4l2camsrc;
1720 gboolean ret = TRUE;
1722 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1724 if (v4l2camsrc->is_active) {
1725 g_mutex_lock (v4l2camsrc->device_mutex);
1726 v4l2camsrc->ae_metering_mode = *(GstCameraAEMeteringMode *)&mode;
1727 v4l2camsrc->mfldadvci->AeSetMeteringMode((ia_3a_ae_metering_mode)v4l2camsrc->ae_metering_mode);
1728 g_mutex_unlock (v4l2camsrc->device_mutex);
1734 gst_v4l2camsrc_get_ae_mode(GstCameraSrc * camsrc, int *mode)
1736 GstMFLDV4l2CamSrc *v4l2camsrc;
1737 gboolean ret = TRUE;
1739 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1741 if (v4l2camsrc->is_active) {
1742 g_mutex_lock (v4l2camsrc->device_mutex);
1743 *mode = v4l2camsrc->ae_metering_mode;
1744 g_mutex_unlock (v4l2camsrc->device_mutex);
1751 gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size)
1753 GstMFLDV4l2CamSrc *v4l2camsrc;
1754 gboolean ret = TRUE;
1756 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1757 GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1759 if (v4l2camsrc->is_active) {
1760 g_mutex_lock (v4l2camsrc->device_mutex);
1761 ret = gst_v4l2camsrc_libmfldcam_get_makernote(v4l2camsrc, buf, size);
1762 g_mutex_unlock (v4l2camsrc->device_mutex);
1768 static gboolean gst_v4l2camsrc_makernote_init(GstCameraSrc * camsrc,
1769 unsigned * buf_size,
1770 unsigned num_afwindows,
1776 GstMFLDV4l2CamSrc *v4l2camsrc;
1778 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1779 GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1781 num_afwindows = num_grid = 1;
1782 num_faces = num_eyes = 0;
1787 static gboolean gst_v4l2camsrc_makernote_deal(GstCameraSrc * camsrc,
1788 GstBuffer *pmakerbuf,
1789 unsigned num_afwindows,
1793 GstMFLDV4l2CamSrc *v4l2camsrc;
1795 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1796 GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1802 static gboolean gst_v4l2camsrc_makernote_uninit(GstCameraSrc * camsrc,
1805 GstMFLDV4l2CamSrc *v4l2camsrc;
1807 v4l2camsrc = GST_V4L2CAMSRC (camsrc);
1808 GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
1816 * @plugin: GstPlugin
1818 * Returns: TRUE on success.
1821 plugin_init (GstPlugin * plugin)
1823 GST_DEBUG_CATEGORY_INIT (gst_v4l2camsrc_debug, "camerasrc", 0,
1824 "Medfield V4L2 camera source");
1826 return gst_element_register (plugin, "camerasrc",
1827 GST_RANK_NONE, GST_TYPE_V4L2CAMSRC);
1830 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
1833 "V4L2 camera image capturing element",
1834 plugin_init, VERSION, "LGPL", "Intel", "www.intel.com")