diff --git a/sys/niimaqdx/gstniimaqdx.c b/sys/niimaqdx/gstniimaqdx.c index dc40cd7..1115ec4 100644 --- a/sys/niimaqdx/gstniimaqdx.c +++ b/sys/niimaqdx/gstniimaqdx.c @@ -59,11 +59,13 @@ enum { PROP_0, PROP_DEVICE, - PROP_RING_BUFFER_COUNT + PROP_RING_BUFFER_COUNT, + PROP_ATTRIBUTES }; #define DEFAULT_PROP_DEVICE "cam0" #define DEFAULT_PROP_RING_BUFFER_COUNT 3 +#define DEFAULT_PROP_ATTRIBUTES "" static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, @@ -555,6 +557,10 @@ gst_niimaqdxsrc_class_init (GstNiImaqDxSrcClass * klass) "The number of buffers in the internal IMAQdx ringbuffer", 1, G_MAXINT, DEFAULT_PROP_RING_BUFFER_COUNT, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_ATTRIBUTES, g_param_spec_string ("attributes", + "Attributes", "Initial attributes to set", DEFAULT_PROP_ATTRIBUTES, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); /* install GstBaseSrc vmethod implementations */ gstbasesrc_class->get_caps = gst_niimaqdxsrc_get_caps; @@ -591,6 +597,7 @@ gst_niimaqdxsrc_init (GstNiImaqDxSrc * niimaqdxsrc, /* initialize properties */ niimaqdxsrc->ringbuffer_count = DEFAULT_PROP_RING_BUFFER_COUNT; niimaqdxsrc->device_name = g_strdup (DEFAULT_PROP_DEVICE); + niimaqdxsrc->attributes = g_strdup (DEFAULT_PROP_ATTRIBUTES); /* initialize pointers, then call reset to initialize the rest */ niimaqdxsrc->times = NULL; @@ -640,6 +647,11 @@ gst_niimaqdxsrc_set_property (GObject * object, guint prop_id, case PROP_RING_BUFFER_COUNT: niimaqdxsrc->ringbuffer_count = g_value_get_int (value); break; + case PROP_ATTRIBUTES: + if (niimaqdxsrc->attributes) + g_free (niimaqdxsrc->attributes); + niimaqdxsrc->attributes = g_strdup (g_value_get_string (value)); + break; default: break; } @@ -658,6 +670,9 @@ gst_niimaqdxsrc_get_property (GObject * object, guint prop_id, GValue * value, case PROP_RING_BUFFER_COUNT: g_value_set_int (value, niimaqdxsrc->ringbuffer_count); break; + case PROP_ATTRIBUTES: + g_value_set_string (value, niimaqdxsrc->attributes); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1034,6 +1049,38 @@ error: return NULL; } +void +gst_niimaqdxsrc_set_dx_attributes (GstNiImaqDxSrc * niimaqdxsrc) +{ + gchar **pairs; + int i; + IMAQdxError rval; + + pairs = g_strsplit (niimaqdxsrc->attributes, ";", 0); + + for (i = 0;; i++) { + gchar **pair; + + if (!pairs[i]) + break; + + pair = g_strsplit (pairs[i], "=", 2); + + g_assert (pair[0]); + g_assert (pair[1]); + GST_DEBUG_OBJECT (niimaqdxsrc, "Setting attribute, '%s'='%s'", pair[0], + pair[1]); + + IMAQdxSetAttribute (niimaqdxsrc->session, pair[0], IMAQdxValueTypeString, + (const char *) pair[1]); + if (rval != IMAQdxErrorSuccess) { + gst_niimaqdxsrc_report_imaq_error (rval); + } + g_strfreev (pair); + } + g_strfreev (pairs); +} + /** * gst_niimaqdxsrc_start: * src: #GstBaseSrc instance @@ -1095,6 +1142,8 @@ gst_niimaqdxsrc_start (GstBaseSrc * src) goto error; } + gst_niimaqdxsrc_set_dx_attributes (niimaqdxsrc); + return TRUE; error: diff --git a/sys/niimaqdx/gstniimaqdx.h b/sys/niimaqdx/gstniimaqdx.h index 612db65..4d87b3c 100644 --- a/sys/niimaqdx/gstniimaqdx.h +++ b/sys/niimaqdx/gstniimaqdx.h @@ -61,6 +61,7 @@ struct _GstNiImaqDxSrc { /* properties */ gchar *device_name; gint ringbuffer_count; + gchar *attributes; /* image info */ int width;