diff --git a/sys/pylon/gstpylonsrc.c b/sys/pylon/gstpylonsrc.c index b39e046..00b3762 100644 --- a/sys/pylon/gstpylonsrc.c +++ b/sys/pylon/gstpylonsrc.c @@ -174,6 +174,7 @@ typedef enum _GST_PYLONSRC_PROP PROP_GRABTIMEOUT, PROP_PACKETSIZE, PROP_INTERPACKETDELAY, + PROP_FRAMETRANSDELAY, PROP_CONFIGFILE, PROP_IGNOREDEFAULTS, @@ -357,6 +358,8 @@ ascii_strdown (gchar * *str, gssize len) #define DEFAULT_PROP_GRABTIMEOUT 1000 #define DEFAULT_PROP_PACKETSIZE 1500 #define DEFAULT_PROP_INTERPACKETDELAY 0 +#define DEFAULT_PROP_FRAMETRANSDELAY 0 + /* pad templates */ static GstStaticPadTemplate gst_pylonsrc_src_template = GST_STATIC_PAD_TEMPLATE ("src", @@ -752,6 +755,12 @@ gst_pylonsrc_class_init (GstPylonSrcClass * klass) "If your network hardware can't handle the incoming packet rate, it is useful to increase the delay between packet transmissions.", 0, 3435, DEFAULT_PROP_INTERPACKETDELAY, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_FRAMETRANSDELAY, + g_param_spec_int ("frame-trans-delay", + "Delay for begin transmitting frame.", + "Sets a delay in ticks between when camera begisn transmitting frame afther acquiring it. By default, one tick equals 8 ns. With PTP enabled, one tick equals 1 ns.", + 0, 50000000, DEFAULT_PROP_FRAMETRANSDELAY, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } static gboolean @@ -844,6 +853,7 @@ gst_pylonsrc_init (GstPylonSrc * src) src->grabtimeout = DEFAULT_PROP_GRABTIMEOUT; src->packetSize = DEFAULT_PROP_PACKETSIZE; src->interPacketDelay = DEFAULT_PROP_INTERPACKETDELAY; + src->frameTransDelay = DEFAULT_PROP_FRAMETRANSDELAY; for (int i = 0; i < PROP_NUM_PROPERTIES; i++) { src->propFlags[i] = GST_PYLONSRC_PROPST_DEFAULT; @@ -1174,6 +1184,9 @@ gst_pylonsrc_set_property (GObject * object, guint property_id, case PROP_INTERPACKETDELAY: src->interPacketDelay = g_value_get_int (value); break; + case PROP_FRAMETRANSDELAY: + src->frameTransDelay = g_value_get_int (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); return; @@ -1397,6 +1410,9 @@ gst_pylonsrc_get_property (GObject * object, guint property_id, case PROP_INTERPACKETDELAY: g_value_set_int (value, src->interPacketDelay); break; + case PROP_FRAMETRANSDELAY: + g_value_set_int (value, src->frameTransDelay); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -2926,6 +2942,30 @@ error: return FALSE; } +static gboolean +gst_pylonsrc_set_frameTransDelay (GstPylonSrc * src) +{ + GENAPIC_RESULT res; + + if (is_prop_implicit (src, PROP_FRAMETRANSDELAY)) { + if (is_prop_set (src, PROP_FRAMETRANSDELAY)) { + if (feature_supported (src, "GevSCFTD")) { + GST_DEBUG_OBJECT (src, "Setting frame transmission delay to %d", + src->frameTransDelay); + res = + PylonDeviceSetIntegerFeature (src->deviceHandle, "GevSCFTD", + src->frameTransDelay); + PYLONC_CHECK_ERROR (src, res); + } + } + reset_prop (src, PROP_FRAMETRANSDELAY); + } + return TRUE; + +error: + return FALSE; +} + static gboolean gst_pylonsrc_configure_start_acquisition (GstPylonSrc * src) { @@ -3754,7 +3794,8 @@ read_all_features (GstPylonSrc * src) gst_pylonsrc_read_pixel_format (src); gst_pylonsrc_read_test_image (src); //gst_pylonsrc_read_packetsize(src); - //gst_pylonsrc_read_interPacketDelay(src) + //gst_pylonsrc_read_interPacketDelay(src); + //gst_pylonsrc_read_frameTransDelay(src); gst_pylonsrc_read_readout (src); gst_pylonsrc_read_bandwidth (src); gst_pylonsrc_read_framerate (src); @@ -3813,6 +3854,7 @@ gst_pylonsrc_set_properties (GstPylonSrc * src) gst_pylonsrc_set_test_image (src) && gst_pylonsrc_set_packetsize (src) && gst_pylonsrc_set_interPacketDelay (src) && + gst_pylonsrc_set_frameTransDelay (src) && gst_pylonsrc_set_readout (src) && gst_pylonsrc_set_bandwidth (src) && gst_pylonsrc_set_framerate (src) && diff --git a/sys/pylon/gstpylonsrc.h b/sys/pylon/gstpylonsrc.h index 112a668..78ede75 100644 --- a/sys/pylon/gstpylonsrc.h +++ b/sys/pylon/gstpylonsrc.h @@ -39,7 +39,7 @@ enum GST_PYLONSRC_NUM_CAPTURE_BUFFERS = 10, GST_PYLONSRC_NUM_AUTO_FEATURES = 3, GST_PYLONSRC_NUM_LIMITED_FEATURES = 2, - GST_PYLONSRC_NUM_PROPS = 71 + GST_PYLONSRC_NUM_PROPS = 72 }; typedef enum _GST_PYLONSRC_PROPERTY_STATE @@ -101,7 +101,7 @@ struct _GstPylonSrc GstPylonSrcLimitedFeature limitedFeature[GST_PYLONSRC_NUM_LIMITED_FEATURES]; gint maxBandwidth, testImage, frameDropLimit, grabtimeout, packetSize, - interPacketDelay; + interPacketDelay, frameTransDelay; gint size[2]; gint binning[2]; gint maxSize[2];