2 * GStreamer Camera Control Interface
4 * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd.
6 * Contact: Jeongmo Yang <jm80.yang@samsung.com>
8 * This library is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU Lesser General Public License as published by the
10 * Free Software Foundation; either version 2.1 of the License, or (at your option)
13 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
14 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 * License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this library; if not, write to the Free Software Foundation, Inc., 51
20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 /*============================================================================================
25 EDIT HISTORY FOR MODULE
27 This section contains comments describing changes made to the module.
28 Notice that changes are listed in reverse chronological order.
30 when who what, where, why
31 --------- ------------------------ ----------------------------------------------
32 12/09/08 jm80.yang@samsung.com Created
34 ============================================================================================*/
41 #include "cameracontrol.h"
42 #include "interfaces-marshal.h"
45 * SECTION:gstcameracontrol
46 * @short_description: Interface for camera control
50 CONTROL_VALUE_CHANGED,
54 static void gst_camera_control_class_init(GstCameraControlClass *klass);
56 static guint gst_camera_control_signals[CONTROL_LAST_SIGNAL] = { 0 };
58 GType gst_camera_control_get_type(void)
60 static GType gst_camera_control_type = 0;
62 if (!gst_camera_control_type) {
63 static const GTypeInfo gst_camera_control_info =
65 sizeof(GstCameraControlClass),
66 (GBaseInitFunc)gst_camera_control_class_init,
76 gst_camera_control_type = g_type_register_static(G_TYPE_INTERFACE,
78 &gst_camera_control_info,
80 g_type_interface_add_prerequisite(gst_camera_control_type, GST_TYPE_IMPLEMENTS_INTERFACE);
83 return gst_camera_control_type;
86 static void gst_camera_control_class_init(GstCameraControlClass *klass)
88 static gboolean initialized = FALSE;
91 gst_camera_control_signals[CONTROL_VALUE_CHANGED] =
92 g_signal_new("control-value-changed",
93 GST_TYPE_CAMERA_CONTROL, G_SIGNAL_RUN_LAST,
94 G_STRUCT_OFFSET(GstCameraControlClass, value_changed),
96 gst_interfaces_marshal_VOID__OBJECT_INT,
97 G_TYPE_NONE, 2, GST_TYPE_CAMERA_CONTROL_CHANNEL, G_TYPE_INT);
103 klass->camera_control_type = 0;
105 /* defauld virtual functions */
106 klass->list_channels = NULL;
107 klass->set_exposure = NULL;
108 klass->get_exposure = NULL;
109 klass->set_capture_mode = NULL;
110 klass->get_capture_mode = NULL;
111 klass->set_strobe = NULL;
112 klass->get_strobe = NULL;
113 klass->set_detect = NULL;
114 klass->get_detect = NULL;
115 klass->set_value = NULL;
116 klass->get_value = NULL;
117 klass->set_zoom = NULL;
118 klass->get_zoom = NULL;
119 klass->set_focus = NULL;
120 klass->get_focus = NULL;
121 klass->start_auto_focus = NULL;
122 klass->stop_auto_focus = NULL;
123 klass->set_focus_level = NULL;
124 klass->get_focus_level = NULL;
125 klass->set_auto_focus_area = NULL;
126 klass->get_auto_focus_area = NULL;
127 klass->set_wdr = NULL;
128 klass->get_wdr = NULL;
129 klass->set_ahs = NULL;
130 klass->get_ahs = NULL;
131 klass->set_part_color = NULL;
132 klass->get_part_color = NULL;
133 klass->get_exif_info = NULL;
134 klass->set_capture_command = NULL;
135 klass->set_record_command = NULL;
136 klass->start_face_zoom = NULL;
137 klass->stop_face_zoom = NULL;
138 klass->set_ae_lock = NULL;
139 klass->get_ae_lock = NULL;
140 klass->set_awb_lock = NULL;
141 klass->get_awb_lock = NULL;
144 const GList* gst_camera_control_list_channels(GstCameraControl *control)
146 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
148 if (klass->list_channels) {
149 return klass->list_channels(control);
156 gboolean gst_camera_control_set_value(GstCameraControl *control, GstCameraControlChannel *control_channel)
158 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
160 if (klass->set_value) {
161 return klass->set_value(control, control_channel);
167 gboolean gst_camera_control_get_value(GstCameraControl *control, GstCameraControlChannel *control_channel)
169 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
171 if (klass->get_value) {
172 return klass->get_value(control, control_channel);
180 gboolean gst_camera_control_set_exposure(GstCameraControl *control, gint type, gint value1, gint value2)
182 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
184 if (klass->set_exposure) {
185 return klass->set_exposure(control, type, value1, value2);
191 gboolean gst_camera_control_get_exposure(GstCameraControl *control, gint type, gint *value1, gint *value2)
193 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
195 if (klass->get_exposure) {
196 return klass->get_exposure(control, type, value1, value2);
202 gboolean gst_camera_control_set_capture_mode(GstCameraControl *control, gint type, gint value)
204 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
206 if (klass->set_capture_mode) {
207 return klass->set_capture_mode(control, type, value);
213 gboolean gst_camera_control_get_capture_mode(GstCameraControl *control, gint type, gint *value)
215 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
217 if (klass->get_capture_mode) {
218 return klass->get_capture_mode(control, type, value);
224 gboolean gst_camera_control_set_strobe(GstCameraControl *control, gint type, gint value)
226 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
228 if (klass->set_strobe) {
229 return klass->set_strobe(control, type, value);
235 gboolean gst_camera_control_get_strobe(GstCameraControl *control, gint type, gint *value)
237 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
239 if (klass->get_strobe) {
240 return klass->get_strobe(control, type, value);
246 gboolean gst_camera_control_set_detect(GstCameraControl *control, gint type, gint value)
248 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
250 if (klass->set_detect) {
251 return klass->set_detect(control, type, value);
257 gboolean gst_camera_control_get_detect(GstCameraControl *control, gint type, gint *value)
259 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
261 if (klass->get_detect) {
262 return klass->get_detect(control, type, value);
268 gboolean gst_camera_control_set_zoom(GstCameraControl *control, gint type, gint value)
270 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
272 if (klass->set_zoom) {
273 return klass->set_zoom(control, type, value);
279 gboolean gst_camera_control_get_zoom(GstCameraControl *control, gint type, gint *value)
281 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
283 if (klass->get_zoom) {
284 return klass->get_zoom(control, type, value);
290 gboolean gst_camera_control_set_focus(GstCameraControl *control, gint mode, gint range)
292 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
294 if (klass->set_focus) {
295 return klass->set_focus(control, mode, range);
301 gboolean gst_camera_control_get_focus(GstCameraControl *control, gint *mode, gint *range)
303 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
305 if (klass->get_focus) {
306 return klass->get_focus(control, mode, range);
312 gboolean gst_camera_control_start_auto_focus(GstCameraControl *control)
314 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
316 if (klass->start_auto_focus) {
317 return klass->start_auto_focus(control);
323 gboolean gst_camera_control_stop_auto_focus(GstCameraControl *control)
325 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
327 if (klass->stop_auto_focus) {
328 return klass->stop_auto_focus(control);
334 gboolean gst_camera_control_set_focus_level(GstCameraControl *control, gint manual_level)
336 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
338 if (klass->set_focus_level) {
339 return klass->set_focus_level(control, manual_level);
345 gboolean gst_camera_control_get_focus_level(GstCameraControl *control, gint *manual_level)
347 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
349 if (klass->get_focus_level) {
350 return klass->get_focus_level(control, manual_level);
356 gboolean gst_camera_control_set_auto_focus_area(GstCameraControl *control, GstCameraControlRectType rect)
358 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
360 if (klass->set_auto_focus_area) {
361 return klass->set_auto_focus_area(control, rect);
367 gboolean gst_camera_control_get_auto_focus_area(GstCameraControl *control, GstCameraControlRectType *rect)
369 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
371 if (klass->get_auto_focus_area) {
372 return klass->get_auto_focus_area(control, rect);
378 gboolean gst_camera_control_set_wdr(GstCameraControl *control, gint value)
380 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
382 if (klass->set_wdr) {
383 return klass->set_wdr(control, value);
389 gboolean gst_camera_control_get_wdr(GstCameraControl *control, gint *value)
391 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
393 if (klass->get_wdr) {
394 return klass->get_wdr(control, value);
400 gboolean gst_camera_control_set_ahs(GstCameraControl *control, gint value)
402 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
404 if (klass->set_ahs) {
405 return klass->set_ahs(control, value);
411 gboolean gst_camera_control_get_ahs(GstCameraControl *control, gint *value)
413 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
415 if (klass->get_ahs) {
416 return klass->get_ahs(control, value);
422 gboolean gst_camera_control_set_part_color(GstCameraControl *control, gint type, gint value)
424 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
426 if (klass->set_part_color) {
427 return klass->set_part_color(control, type, value);
433 gboolean gst_camera_control_get_part_color(GstCameraControl *control, gint type, gint *value)
435 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
437 if (klass->get_part_color) {
438 return klass->get_part_color(control, type, value);
445 gst_camera_control_get_exif_info(GstCameraControl *control, GstCameraControlExifInfo *info)
447 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
449 if (klass->get_exif_info) {
450 return klass->get_exif_info(control, info);
457 gboolean gst_camera_control_get_basic_dev_info(GstCameraControl *control, gint dev_id, GstCameraControlCapsInfoType *info)
459 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
461 if (klass->get_basic_dev_info) {
462 return klass->get_basic_dev_info(control, dev_id, info);
468 gboolean gst_camera_control_get_misc_dev_info(GstCameraControl *control, gint dev_id, GstCameraControlCtrlListInfoType *info)
470 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS( control );
472 if( klass->get_misc_dev_info )
474 return klass->get_misc_dev_info( control, dev_id, info );
480 gboolean gst_camera_control_get_extra_dev_info(GstCameraControl *control, gint dev_id, GstCameraControlExtraInfoType *info)
482 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
484 if (klass->get_extra_dev_info) {
485 return klass->get_extra_dev_info(control, dev_id, info);
491 void gst_camera_control_set_capture_command(GstCameraControl *control, GstCameraControlCaptureCommand cmd)
493 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
495 if (klass->set_capture_command) {
496 klass->set_capture_command(control, cmd);
501 void gst_camera_control_set_record_command(GstCameraControl *control, GstCameraControlRecordCommand cmd)
503 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
505 if (klass->set_record_command) {
506 klass->set_record_command(control, cmd);
512 gboolean gst_camera_control_start_face_zoom(GstCameraControl *control, gint x, gint y, gint zoom_level)
514 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
516 if (klass->start_face_zoom) {
517 return klass->start_face_zoom(control, x, y, zoom_level);
523 gboolean gst_camera_control_stop_face_zoom(GstCameraControl *control)
525 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
527 if (klass->stop_face_zoom) {
528 return klass->stop_face_zoom(control);
534 gboolean gst_camera_control_set_ae_lock(GstCameraControl *control, gboolean lock)
536 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
538 if (klass->set_ae_lock) {
539 return klass->set_ae_lock(control, lock);
545 gboolean gst_camera_control_get_ae_lock(GstCameraControl *control, gboolean *lock)
547 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
549 if (klass->get_ae_lock) {
550 return klass->get_ae_lock(control, lock);
556 gboolean gst_camera_control_set_awb_lock(GstCameraControl *control, gboolean lock)
558 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
560 if (klass->set_awb_lock) {
561 return klass->set_awb_lock(control, lock);
567 gboolean gst_camera_control_get_awb_lock(GstCameraControl *control, gboolean *lock)
569 GstCameraControlClass *klass = GST_CAMERA_CONTROL_GET_CLASS(control);
571 if (klass->get_awb_lock) {
572 return klass->get_awb_lock(control, lock);
578 void gst_camera_control_value_changed(GstCameraControl *control, GstCameraControlChannel *control_channel, gint value)
580 g_signal_emit(G_OBJECT(control), gst_camera_control_signals[CONTROL_VALUE_CHANGED], 0, control_channel, value);
581 g_signal_emit_by_name(G_OBJECT(control_channel), "control-value-changed", value);