diff options
Diffstat (limited to 'sys/v4l2/gstv4l2src.c')
-rw-r--r-- | sys/v4l2/gstv4l2src.c | 311 |
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; |