summaryrefslogtreecommitdiff
path: root/sys/v4l2/gstv4l2src.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/v4l2/gstv4l2src.c')
-rw-r--r--sys/v4l2/gstv4l2src.c311
1 files changed, 310 insertions, 1 deletions
diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c
index 463bef3a6..5b7fade38 100644
--- a/sys/v4l2/gstv4l2src.c
+++ b/sys/v4l2/gstv4l2src.c
@@ -79,7 +79,23 @@ enum
PROP_0,
V4L2_STD_OBJECT_PROPS,
PROP_QUEUE_SIZE,
- PROP_ALWAYS_COPY
+ PROP_ALWAYS_COPY,
+
+ /* additionnal properties for Stericsson sensors */
+ PROP_EFFECT,
+ PROP_HFLIP,
+ PROP_VFLIP,
+ PROP_BRIGHTNESS,
+ PROP_CONTRAST,
+ PROP_SATURATION,
+ PROP_ZOOM,
+ PROP_WB_MODE,
+ PROP_SCENE,
+ PROP_SENSITIVITY,
+ PROP_MET_EXP,
+ PROP_FOCUS_CTRL,
+ PROP_FOCUS_STATE,
+ PROP_FLICKER_MOD,
};
GST_IMPLEMENT_V4L2_PROBE_METHODS (GstV4l2SrcClass, gst_v4l2src);
@@ -221,6 +237,32 @@ gst_v4l2src_base_init (gpointer g_class)
gst_v4l2_object_get_all_caps ()));
}
+GType gst_v4l2src_effect_type = 0;
+const GEnumValue gst_icbvideo_v4l_effects[] = GST_ICB_EFFECT_LIST;
+#define DEFAULT_EFFECT 0 /* NO_FX */
+GType gst_v4l2src_wb_mode = 0;
+const GEnumValue gst_icbvideo_v4l_wb_mode[] = GST_ICB_WB_MODE_LIST;
+#define DEFAULT_WB_MODE 0 /* AUTO */
+GType gst_v4l2src_scene = 0;
+const GEnumValue gst_icbvideo_v4l_scene[] = GST_ICB_SCENE_LIST;
+#define DEFAULT_SCENE V4L2_CTRL_SCENE_AUTO
+GType gst_v4l2src_sensitivity = 0;
+const GEnumValue gst_icbvideo_v4l_sensitivity[] = GST_ICB_SENSITIVITY_LIST;
+#define DEFAULT_SENSITIVITY V4L2_CTRL_ISO_AUTO
+GType gst_v4l2src_metering_exposure = 0;
+const GEnumValue gst_icbvideo_v4l_metering_exposure[] = GST_ICB_MET_EXP_LIST;
+#define DEFAULT_MET_EXP V4L2_CTRL_MET_EXP_MATRIX
+GType gst_v4l2src_focus_ctrl = 0;
+const GEnumValue gst_icbvideo_v4l_focus_ctrl[] = GST_ICB_FOCUS_CTRL_LIST;
+#define DEFAULT_FOCUS_CTRL GST_ICB_FOCUS_CTRL_OFF
+GType gst_v4l2src_focus_state = 0;
+const GEnumValue gst_icbvideo_v4l_focus_state[] = GST_ICB_FOCUS_STATE_LIST;
+#define DEFAULT_FOCUS_STATE GST_ICB_FOCUS_STATE_NOT_FOCUSED
+GType gst_v4l2src_flicker_mod = 0;
+const GEnumValue gst_icbvideo_v4l_flicker_mod[] = GST_ICB_FLICKER_MOD_LIST;
+#define DEFAULT_FLICKER_MOD V4L2_CID_POWER_LINE_FREQUENCY_DISABLED
+
+
static void
gst_v4l2src_class_init (GstV4l2SrcClass * klass)
{
@@ -264,6 +306,126 @@ gst_v4l2src_class_init (GstV4l2SrcClass * klass)
basesrc_class->negotiate = GST_DEBUG_FUNCPTR (gst_v4l2src_negotiate);
pushsrc_class->create = GST_DEBUG_FUNCPTR (gst_v4l2src_create);
+
+ /* additionnal properties for Stericsson sensors */
+ if (!gst_v4l2src_effect_type) {
+ gst_v4l2src_effect_type =
+ g_enum_register_static ("GstV4l2SrcEffects", gst_icbvideo_v4l_effects);
+ }
+
+ if (!gst_v4l2src_wb_mode) {
+
+ gst_v4l2src_wb_mode =
+ g_enum_register_static ("GstV4l2SrcWhiteBalanceMode",
+ gst_icbvideo_v4l_wb_mode);
+ }
+
+ if (!gst_v4l2src_scene) {
+
+ gst_v4l2src_scene =
+ g_enum_register_static ("GstV4l2SrcScene", gst_icbvideo_v4l_scene);
+ }
+
+ if (!gst_v4l2src_sensitivity) {
+
+ gst_v4l2src_sensitivity =
+ g_enum_register_static ("GstV4l2SrcSensitivity",
+ gst_icbvideo_v4l_sensitivity);
+ }
+
+ if (!gst_v4l2src_metering_exposure) {
+
+ gst_v4l2src_metering_exposure =
+ g_enum_register_static ("GstV4l2SrcMeteringExposure",
+ gst_icbvideo_v4l_metering_exposure);
+ }
+
+ if (!gst_v4l2src_focus_ctrl) {
+
+ gst_v4l2src_focus_ctrl =
+ g_enum_register_static ("GstV4l2SrcFocusCtrl",
+ gst_icbvideo_v4l_focus_ctrl);
+ }
+
+ if (!gst_v4l2src_focus_state) {
+
+ gst_v4l2src_focus_state =
+ g_enum_register_static ("GstV4l2SrcFocusState",
+ gst_icbvideo_v4l_focus_state);
+ }
+
+
+ if (!gst_v4l2src_flicker_mod) {
+
+ gst_v4l2src_flicker_mod =
+ g_enum_register_static ("GstV4l2SrcFlickerMod",
+ gst_icbvideo_v4l_flicker_mod);
+ }
+
+ g_object_class_install_property (gobject_class, PROP_EFFECT,
+ g_param_spec_enum ("effect", "Effect", "Effect of the source",
+ gst_v4l2src_effect_type, DEFAULT_EFFECT, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_WB_MODE,
+ g_param_spec_enum ("wb", "White_balance_mode",
+ "White balancemode of the source", gst_v4l2src_wb_mode,
+ DEFAULT_WB_MODE, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_HFLIP,
+ g_param_spec_boolean ("hflip", "Horizontal Flip",
+ "Horizontal Flip : camera configuration", 0, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_VFLIP,
+ g_param_spec_boolean ("vflip", "Vertical Flip",
+ "Vertical Flip : camera configuration", 0, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_BRIGHTNESS,
+ g_param_spec_int ("brightness", "Brightness",
+ "Brightness : camera configuration", GST_ICB_BRIGHTNESS_MIN,
+ GST_ICB_BRIGHTNESS_MAX, GST_ICB_BRIGHTNESS_DEFAULT,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_CONTRAST,
+ g_param_spec_int ("contrast", "Contrast",
+ "Contrast : camera configuration", GST_ICB_CONTRAST_MIN,
+ GST_ICB_CONTRAST_MAX, GST_ICB_CONTRAST_DEFAULT, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_SATURATION,
+ g_param_spec_int ("saturation", "Saturation",
+ "Saturation : camera configuration", GST_ICB_SATURATION_MIN,
+ GST_ICB_SATURATION_MAX, GST_ICB_SATURATION_DEFAULT,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_ZOOM,
+ g_param_spec_double ("zoom", "Zoom",
+ "Zoom : camera configuration", 1.0, 4.0, 1.0, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_SCENE,
+ g_param_spec_enum ("scene", "Scene", "Scene of the source",
+ gst_v4l2src_scene, DEFAULT_SCENE, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_SENSITIVITY,
+ g_param_spec_enum ("sensitivity", "Sensitivity",
+ "Sensitivity of the source", gst_v4l2src_sensitivity,
+ DEFAULT_SENSITIVITY, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_MET_EXP,
+ g_param_spec_enum ("metering_exposure", "Metering exposure",
+ "metering exposure mode", gst_v4l2src_metering_exposure,
+ DEFAULT_MET_EXP, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_FOCUS_CTRL,
+ g_param_spec_enum ("focus control", "Focus control", "Lens focus control",
+ gst_v4l2src_focus_ctrl, DEFAULT_FOCUS_CTRL, G_PARAM_WRITABLE));
+
+ g_object_class_install_property (gobject_class, PROP_FOCUS_STATE,
+ g_param_spec_enum ("focus state", "Focus state", "Lens focus state",
+ gst_v4l2src_focus_state, DEFAULT_FOCUS_STATE, G_PARAM_READABLE));
+
+ g_object_class_install_property (gobject_class, PROP_FLICKER_MOD,
+ g_param_spec_enum ("flicker mode", "Flicker mode", "Flicker mode",
+ gst_v4l2src_flicker_mod, DEFAULT_FLICKER_MOD, G_PARAM_READWRITE));
+
}
static void
@@ -286,6 +448,18 @@ gst_v4l2src_init (GstV4l2Src * v4l2src, GstV4l2SrcClass * klass)
v4l2src->fps_d = 0;
v4l2src->fps_n = 0;
+ v4l2src->hflip = FALSE;
+ v4l2src->hflip = FALSE;
+ v4l2src->brightness = GST_ICB_BRIGHTNESS_DEFAULT;
+ v4l2src->contrast = GST_ICB_CONTRAST_DEFAULT;
+ v4l2src->saturation = GST_ICB_SATURATION_DEFAULT;
+ v4l2src->zoom = 1.0;
+ v4l2src->effect = DEFAULT_EFFECT;
+ v4l2src->wb_mode = DEFAULT_WB_MODE;
+ v4l2src->scene = DEFAULT_SCENE;
+ v4l2src->sensitivity = DEFAULT_SENSITIVITY;
+ v4l2src->metering_exposure = DEFAULT_MET_EXP;
+
}
@@ -308,6 +482,20 @@ gst_v4l2src_finalize (GstV4l2Src * v4l2src)
gst_v4l2_object_destroy (v4l2src->v4l2object);
G_OBJECT_CLASS (parent_class)->finalize ((GObject *) (v4l2src));
+
+}
+
+
+/* looks for the nick name from value ; return NULL if not found */
+char *
+gst_v4l2src_get_enum_nick_from_value (GEnumValue * table, gint value)
+{
+ while (table->value_nick != NULL) {
+ if (table->value == value)
+ return (char *) table->value_nick;
+ table++;
+ }
+ return NULL;
}
@@ -326,6 +514,62 @@ gst_v4l2src_set_property (GObject * object,
case PROP_ALWAYS_COPY:
v4l2src->always_copy = g_value_get_boolean (value);
break;
+ case PROP_EFFECT:
+ v4l2src->effect = g_value_get_enum (value);
+ gst_v4l2src_capture_set_effect (v4l2src,
+ gst_v4l2src_get_enum_nick_from_value ((GEnumValue *)
+ gst_icbvideo_v4l_effects, v4l2src->effect));
+ break;
+ case PROP_WB_MODE:
+ v4l2src->wb_mode = g_value_get_enum (value);
+ gst_v4l2src_capture_set_white_balance_mode (v4l2src,
+ gst_v4l2src_get_enum_nick_from_value ((GEnumValue *)
+ gst_icbvideo_v4l_wb_mode, v4l2src->wb_mode));
+ break;
+ case PROP_HFLIP:
+ v4l2src->hflip = g_value_get_boolean (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_HFLIP);
+ break;
+ case PROP_VFLIP:
+ v4l2src->vflip = g_value_get_boolean (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_VFLIP);
+ break;
+ case PROP_BRIGHTNESS:
+ v4l2src->brightness = g_value_get_int (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_BRIGHTNESS);
+ break;
+ case PROP_CONTRAST:
+ v4l2src->contrast = g_value_get_int (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_CONTRAST);
+ break;
+ case PROP_SATURATION:
+ v4l2src->saturation = g_value_get_int (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_SATURATION);
+ break;
+ case PROP_ZOOM:
+ v4l2src->zoom = g_value_get_double (value);
+ gst_v4l2src_capture_set_zoom (v4l2src);
+ break;
+ case PROP_SCENE:
+ v4l2src->scene = g_value_get_enum (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_SCENE);
+ break;
+ case PROP_SENSITIVITY:
+ v4l2src->sensitivity = g_value_get_enum (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_SENSITIVITY);
+ break;
+ case PROP_MET_EXP:
+ v4l2src->metering_exposure = g_value_get_enum (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_MET_EXP);
+ break;
+ case PROP_FOCUS_CTRL:
+ v4l2src->focus_ctrl = g_value_get_enum (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_FOCUS_CTRL);
+ break;
+ case PROP_FLICKER_MOD:
+ v4l2src->flicker_mod = g_value_get_enum (value);
+ gst_v4l2src_capture_set_control (v4l2src, PROP_FLICKER_MOD);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -349,6 +593,55 @@ gst_v4l2src_get_property (GObject * object,
case PROP_ALWAYS_COPY:
g_value_set_boolean (value, v4l2src->always_copy);
break;
+ case PROP_EFFECT:
+ g_value_set_enum (value, v4l2src->effect);
+ break;
+ case PROP_WB_MODE:
+ g_value_set_enum (value, v4l2src->wb_mode);
+ break;
+ case PROP_HFLIP:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_HFLIP);
+ g_value_set_boolean (value, v4l2src->hflip);
+ break;
+ case PROP_VFLIP:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_VFLIP);
+ g_value_set_boolean (value, v4l2src->vflip);
+ break;
+ case PROP_BRIGHTNESS:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_BRIGHTNESS);
+ g_value_set_int (value, v4l2src->brightness);
+ break;
+ case PROP_CONTRAST:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_CONTRAST);
+ g_value_set_int (value, v4l2src->contrast);
+ break;
+ case PROP_SATURATION:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_SATURATION);
+ g_value_set_int (value, v4l2src->saturation);
+ break;
+ case PROP_ZOOM:
+ g_value_set_double (value, v4l2src->zoom);
+ break;
+ case PROP_SCENE:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_SCENE);
+ g_value_set_enum (value, v4l2src->scene);
+ break;
+ case PROP_SENSITIVITY:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_SENSITIVITY);
+ g_value_set_enum (value, v4l2src->sensitivity);
+ break;
+ case PROP_MET_EXP:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_MET_EXP);
+ g_value_set_enum (value, v4l2src->metering_exposure);
+ break;
+ case PROP_FOCUS_STATE:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_FOCUS_STATE);
+ g_value_set_enum (value, v4l2src->focus_state);
+ break;
+ case PROP_FLICKER_MOD:
+ gst_v4l2src_capture_get_control (v4l2src, PROP_FLICKER_MOD);
+ g_value_set_enum (value, v4l2src->flicker_mod);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -617,6 +910,22 @@ gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps)
if (!gst_v4l2src_capture_init (v4l2src, caps))
return FALSE;
+ if (!gst_v4l2src_capture_set_all_controls (v4l2src))
+ return FALSE;
+
+ if (!gst_v4l2src_capture_set_effect (v4l2src,
+ gst_v4l2src_get_enum_nick_from_value ((GEnumValue *)
+ gst_icbvideo_v4l_effects, v4l2src->effect)))
+ return FALSE;
+
+ if (!gst_v4l2src_capture_set_white_balance_mode (v4l2src,
+ gst_v4l2src_get_enum_nick_from_value ((GEnumValue *)
+ gst_icbvideo_v4l_wb_mode, v4l2src->wb_mode)))
+ return FALSE;
+
+ if (!gst_v4l2src_capture_set_zoom (v4l2src))
+ return FALSE;
+
if (!gst_v4l2src_capture_start (v4l2src))
return FALSE;