pylonsrc: added gst parameter inter-packet-delay for tuning when using multiple cameras and limited bandwidth situations

This commit is contained in:
Eskild Helmersen 2020-05-15 18:35:53 +02:00 committed by joshdoe
parent 1f121e3e01
commit 5b809cc950
2 changed files with 45 additions and 4 deletions

View File

@ -173,6 +173,7 @@ typedef enum _GST_PYLONSRC_PROP
PROP_FRAMEDROPLIMIT, PROP_FRAMEDROPLIMIT,
PROP_GRABTIMEOUT, PROP_GRABTIMEOUT,
PROP_PACKETSIZE, PROP_PACKETSIZE,
PROP_INTERPACKETDELAY,
PROP_CONFIGFILE, PROP_CONFIGFILE,
PROP_IGNOREDEFAULTS, PROP_IGNOREDEFAULTS,
@ -355,7 +356,7 @@ ascii_strdown (gchar * *str, gssize len)
#define DEFAULT_PROP_FRAMEDROPLIMIT 10 #define DEFAULT_PROP_FRAMEDROPLIMIT 10
#define DEFAULT_PROP_GRABTIMEOUT 1000 #define DEFAULT_PROP_GRABTIMEOUT 1000
#define DEFAULT_PROP_PACKETSIZE 1500 #define DEFAULT_PROP_PACKETSIZE 1500
#define DEFAULT_PROP_INTERPACKETDELAY 0
/* pad templates */ /* pad templates */
static GstStaticPadTemplate gst_pylonsrc_src_template = static GstStaticPadTemplate gst_pylonsrc_src_template =
GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_PAD_TEMPLATE ("src",
@ -745,6 +746,12 @@ gst_pylonsrc_class_init (GstPylonSrcClass * klass)
"The packetsize parameter specifies the maximum size of a data packet transmitted via Ethernet. The value is in bytes.", "The packetsize parameter specifies the maximum size of a data packet transmitted via Ethernet. The value is in bytes.",
0, 16000, DEFAULT_PROP_PACKETSIZE, 0, 16000, DEFAULT_PROP_PACKETSIZE,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
g_object_class_install_property (gobject_class, PROP_INTERPACKETDELAY,
g_param_spec_int ("inter-packet-delay",
"Inter-Packet Delay between packet transmissions",
"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)));
} }
static gboolean static gboolean
@ -836,6 +843,7 @@ gst_pylonsrc_init (GstPylonSrc * src)
src->frameDropLimit = DEFAULT_PROP_FRAMEDROPLIMIT; src->frameDropLimit = DEFAULT_PROP_FRAMEDROPLIMIT;
src->grabtimeout = DEFAULT_PROP_GRABTIMEOUT; src->grabtimeout = DEFAULT_PROP_GRABTIMEOUT;
src->packetSize = DEFAULT_PROP_PACKETSIZE; src->packetSize = DEFAULT_PROP_PACKETSIZE;
src->interPacketDelay = DEFAULT_PROP_INTERPACKETDELAY;
for (int i = 0; i < PROP_NUM_PROPERTIES; i++) { for (int i = 0; i < PROP_NUM_PROPERTIES; i++) {
src->propFlags[i] = GST_PYLONSRC_PROPST_DEFAULT; src->propFlags[i] = GST_PYLONSRC_PROPST_DEFAULT;
@ -1163,6 +1171,9 @@ gst_pylonsrc_set_property (GObject * object, guint property_id,
case PROP_PACKETSIZE: case PROP_PACKETSIZE:
src->packetSize = g_value_get_int (value); src->packetSize = g_value_get_int (value);
break; break;
case PROP_INTERPACKETDELAY:
src->interPacketDelay = g_value_get_int (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
return; return;
@ -1383,6 +1394,9 @@ gst_pylonsrc_get_property (GObject * object, guint property_id,
case PROP_PACKETSIZE: case PROP_PACKETSIZE:
g_value_set_int (value, src->packetSize); g_value_set_int (value, src->packetSize);
break; break;
case PROP_INTERPACKETDELAY:
g_value_set_int (value, src->interPacketDelay);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break; break;
@ -2888,6 +2902,30 @@ error:
return FALSE; return FALSE;
} }
static gboolean
gst_pylonsrc_set_interPacketDelay (GstPylonSrc * src)
{
GENAPIC_RESULT res;
if (is_prop_implicit (src, PROP_INTERPACKETDELAY)) {
if (is_prop_set (src, PROP_INTERPACKETDELAY)) {
if (feature_supported (src, "GevSCPD")) {
GST_DEBUG_OBJECT (src, "Setting inter packet delay to %d",
src->interPacketDelay);
res =
PylonDeviceSetIntegerFeature (src->deviceHandle, "GevSCPD",
src->interPacketDelay);
PYLONC_CHECK_ERROR (src, res);
}
}
reset_prop (src, PROP_INTERPACKETDELAY);
}
return TRUE;
error:
return FALSE;
}
static gboolean static gboolean
gst_pylonsrc_configure_start_acquisition (GstPylonSrc * src) gst_pylonsrc_configure_start_acquisition (GstPylonSrc * src)
{ {
@ -3716,6 +3754,7 @@ read_all_features (GstPylonSrc * src)
gst_pylonsrc_read_pixel_format (src); gst_pylonsrc_read_pixel_format (src);
gst_pylonsrc_read_test_image (src); gst_pylonsrc_read_test_image (src);
//gst_pylonsrc_read_packetsize(src); //gst_pylonsrc_read_packetsize(src);
//gst_pylonsrc_read_interPacketDelay(src)
gst_pylonsrc_read_readout (src); gst_pylonsrc_read_readout (src);
gst_pylonsrc_read_bandwidth (src); gst_pylonsrc_read_bandwidth (src);
gst_pylonsrc_read_framerate (src); gst_pylonsrc_read_framerate (src);
@ -3773,6 +3812,7 @@ gst_pylonsrc_set_properties (GstPylonSrc * src)
gst_pylonsrc_set_pixel_format (src) && gst_pylonsrc_set_pixel_format (src) &&
gst_pylonsrc_set_test_image (src) && gst_pylonsrc_set_test_image (src) &&
gst_pylonsrc_set_packetsize (src) && gst_pylonsrc_set_packetsize (src) &&
gst_pylonsrc_set_interPacketDelay (src) &&
gst_pylonsrc_set_readout (src) && gst_pylonsrc_set_readout (src) &&
gst_pylonsrc_set_bandwidth (src) && gst_pylonsrc_set_bandwidth (src) &&
gst_pylonsrc_set_framerate (src) && gst_pylonsrc_set_framerate (src) &&
@ -4056,8 +4096,8 @@ pylonc_print_camera_info (GstPylonSrc * src, PYLON_DEVICE_HANDLE deviceHandle,
serial[1] = '\0'; serial[1] = '\0';
} }
} }
if (PylonDeviceFeatureIsReadable (deviceHandle, "DeviceUserID")) { if (PylonDeviceFeatureIsReadable (deviceHandle, "DeviceUserID")) {
siz = sizeof (id); siz = sizeof (id);
res = PylonDeviceFeatureToString (deviceHandle, "DeviceUserID", id, &siz); res = PylonDeviceFeatureToString (deviceHandle, "DeviceUserID", id, &siz);
PYLONC_CHECK_ERROR (src, res); PYLONC_CHECK_ERROR (src, res);

View File

@ -39,7 +39,7 @@ enum
GST_PYLONSRC_NUM_CAPTURE_BUFFERS = 10, GST_PYLONSRC_NUM_CAPTURE_BUFFERS = 10,
GST_PYLONSRC_NUM_AUTO_FEATURES = 3, GST_PYLONSRC_NUM_AUTO_FEATURES = 3,
GST_PYLONSRC_NUM_LIMITED_FEATURES = 2, GST_PYLONSRC_NUM_LIMITED_FEATURES = 2,
GST_PYLONSRC_NUM_PROPS = 70 GST_PYLONSRC_NUM_PROPS = 71
}; };
typedef enum _GST_PYLONSRC_PROPERTY_STATE typedef enum _GST_PYLONSRC_PROPERTY_STATE
@ -100,7 +100,8 @@ struct _GstPylonSrc
GstPylonSrcLimitedFeature limitedFeature[GST_PYLONSRC_NUM_LIMITED_FEATURES]; GstPylonSrcLimitedFeature limitedFeature[GST_PYLONSRC_NUM_LIMITED_FEATURES];
gint maxBandwidth, testImage, frameDropLimit, grabtimeout, packetSize; gint maxBandwidth, testImage, frameDropLimit, grabtimeout, packetSize,
interPacketDelay;
gint size[2]; gint size[2];
gint binning[2]; gint binning[2];
gint maxSize[2]; gint maxSize[2];