pylonsrc: fixed string handling

This commit is contained in:
mrstecklo 2020-11-09 17:11:14 +03:00 committed by joshdoe
parent 8bd6934d78
commit b2f88a5bde
2 changed files with 71 additions and 39 deletions

View File

@ -140,6 +140,14 @@ enum
PROP_TRANSFORMATION22 PROP_TRANSFORMATION22
}; };
static inline void
ascii_strdown(gchar* * str, gssize len)
{
gchar* temp = g_ascii_strdown(*str, len);
g_free(*str);
*str = temp;
}
#define DEFAULT_PROP_PIXEL_FORMAT "auto" #define DEFAULT_PROP_PIXEL_FORMAT "auto"
/* pad templates */ /* pad templates */
@ -518,16 +526,16 @@ gst_pylonsrc_init (GstPylonSrc * src)
src->width = 0; src->width = 0;
src->maxBandwidth = 0; src->maxBandwidth = 0;
src->testImage = 0; src->testImage = 0;
src->sensorMode = "normal\0"; src->sensorMode = g_strdup ("normal");
src->lightsource = "5000k\0"; src->lightsource = g_strdup ("5000k");
src->autoexposure = "off\0"; src->autoexposure = g_strdup ("off");
src->autowhitebalance = "off\0"; src->autowhitebalance = g_strdup ("off");
src->autogain = "off\0"; src->autogain = g_strdup ("off");
src->reset = "off\0"; src->reset = g_strdup ("off");
src->pixel_format = g_strdup (DEFAULT_PROP_PIXEL_FORMAT); src->pixel_format = g_strdup (DEFAULT_PROP_PIXEL_FORMAT);
src->userid = "\0"; src->userid = g_strdup ("");
src->autoprofile = "default\0"; src->autoprofile = g_strdup ("default");
src->transformationselector = "default\0"; src->transformationselector = g_strdup ("default");
src->fps = 0.0; src->fps = 0.0;
src->exposure = 0.0; src->exposure = 0.0;
src->gain = 0.0; src->gain = 0.0;
@ -578,7 +586,7 @@ gst_pylonsrc_set_property (GObject * object, guint property_id,
{ {
GstPylonSrc *src = GST_PYLONSRC (object); GstPylonSrc *src = GST_PYLONSRC (object);
GST_DEBUG_OBJECT (src, "Setting a property."); GST_DEBUG_OBJECT (src, "Setting a property: %u", property_id);
switch (property_id) { switch (property_id) {
case PROP_CAMERA: case PROP_CAMERA:
@ -606,35 +614,44 @@ gst_pylonsrc_set_property (GObject * object, guint property_id,
src->testImage = g_value_get_int (value); src->testImage = g_value_get_int (value);
break; break;
case PROP_SENSORREADOUTMODE: case PROP_SENSORREADOUTMODE:
src->sensorMode = g_value_dup_string (value + '\0'); g_free(src->sensorMode);
src->sensorMode = g_value_dup_string (value);
break; break;
case PROP_LIGHTSOURCE: case PROP_LIGHTSOURCE:
src->lightsource = g_value_dup_string (value + '\0'); g_free(src->lightsource);
src->lightsource = g_value_dup_string (value);
break; break;
case PROP_AUTOEXPOSURE: case PROP_AUTOEXPOSURE:
src->autoexposure = g_value_dup_string (value + '\0'); g_free(src->autoexposure);
src->autoexposure = g_value_dup_string (value);
break; break;
case PROP_AUTOWHITEBALANCE: case PROP_AUTOWHITEBALANCE:
src->autowhitebalance = g_value_dup_string (value + '\0'); g_free(src->autowhitebalance);
src->autowhitebalance = g_value_dup_string (value);
break; break;
case PROP_PIXEL_FORMAT: case PROP_PIXEL_FORMAT:
g_free (src->pixel_format); g_free (src->pixel_format);
src->pixel_format = g_value_dup_string (value); src->pixel_format = g_value_dup_string (value);
break; break;
case PROP_AUTOGAIN: case PROP_AUTOGAIN:
src->autogain = g_value_dup_string (value + '\0'); g_free(src->autogain);
src->autogain = g_value_dup_string (value);
break; break;
case PROP_RESET: case PROP_RESET:
src->reset = g_value_dup_string (value + '\0'); g_free(src->reset);
src->reset = g_value_dup_string (value);
break; break;
case PROP_AUTOPROFILE: case PROP_AUTOPROFILE:
src->autoprofile = g_value_dup_string (value + '\0'); g_free(src->autoprofile);
src->autoprofile = g_value_dup_string (value);
break; break;
case PROP_TRANSFORMATIONSELECTOR: case PROP_TRANSFORMATIONSELECTOR:
src->transformationselector = g_value_dup_string (value + '\0'); g_free(src->transformationselector);
src->transformationselector = g_value_dup_string (value);
break; break;
case PROP_USERID: case PROP_USERID:
src->userid = g_value_dup_string (value + '\0'); g_free(src->userid);
src->userid = g_value_dup_string (value);
break; break;
case PROP_BALANCERED: case PROP_BALANCERED:
src->balancered = g_value_get_double (value); src->balancered = g_value_get_double (value);
@ -986,13 +1003,13 @@ gst_pylonsrc_get_caps (GstBaseSrc * bsrc, GstCaps * filter)
{ {
GstPylonSrc *src = GST_PYLONSRC (bsrc); GstPylonSrc *src = GST_PYLONSRC (bsrc);
GST_DEBUG_OBJECT (src, "Received a request for caps."); GST_DEBUG_OBJECT (src, "Received a request for caps. Filter:\n%" GST_PTR_FORMAT, filter);
if (!src->deviceConnected) { if (!src->deviceConnected) {
GST_DEBUG_OBJECT (src, "Could not send caps - no camera connected."); GST_DEBUG_OBJECT (src, "Could not send caps - no camera connected.");
return gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (bsrc)); return gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (bsrc));
} else { } else {
GstCaps* result = gst_caps_copy(src->caps); GstCaps* result = gst_caps_copy(src->caps);
GST_DEBUG_OBJECT (src, "Return caps:\n%" GST_PTR_FORMAT, result);
return result; return result;
} }
} }
@ -1217,7 +1234,7 @@ gst_pylonsrc_connect_device (GstPylonSrc * src)
pylonc_print_camera_info (src, src->deviceHandle, src->cameraId); pylonc_print_camera_info (src, src->deviceHandle, src->cameraId);
// Reset the camera if required. // Reset the camera if required.
src->reset = g_ascii_strdown (src->reset, -1); ascii_strdown (&src->reset, -1);
if (strcmp (src->reset, "before") == 0) { if (strcmp (src->reset, "before") == 0) {
if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "DeviceReset")) { if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "DeviceReset")) {
size_t numDevices; size_t numDevices;
@ -1374,7 +1391,7 @@ gst_pylonsrc_set_offset (GstPylonSrc * src)
src->centerx ? "True" : "False", src->centery ? "True" : "False"); src->centerx ? "True" : "False", src->centery ? "True" : "False");
if (!src->centerx && src->offsetx != 99999) { if (!src->centerx && src->offsetx != 99999) {
int64_t maxoffsetx = src->maxWidth - src->width; gint maxoffsetx = src->maxWidth - src->width;
if (maxoffsetx >= src->offsetx) { if (maxoffsetx >= src->offsetx) {
res = res =
@ -1394,7 +1411,7 @@ gst_pylonsrc_set_offset (GstPylonSrc * src)
} }
if (!src->centery && src->offsety != 99999) { if (!src->centery && src->offsety != 99999) {
int64_t maxoffsety = src->maxHeight - src->height; gint maxoffsety = src->maxHeight - src->height;
if (maxoffsety >= src->offsety) { if (maxoffsety >= src->offsety) {
res = res =
PylonDeviceSetIntegerFeature (src->deviceHandle, "OffsetY", PylonDeviceSetIntegerFeature (src->deviceHandle, "OffsetY",
@ -1498,6 +1515,7 @@ gst_pylonsrc_get_supported_caps (GstPylonSrc * src)
GST_DEBUG_OBJECT (src, "Supported caps are %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (src, "Supported caps are %" GST_PTR_FORMAT, caps);
g_string_free(format, TRUE);
return caps; return caps;
} }
@ -1546,6 +1564,7 @@ gst_pylonsrc_set_test_image (GstPylonSrc * src)
res = res =
PylonDeviceFeatureFromString (src->deviceHandle, "TestImageSelector", PylonDeviceFeatureFromString (src->deviceHandle, "TestImageSelector",
ImageId); ImageId);
g_free(ImageId);
PYLONC_CHECK_ERROR (src, res); PYLONC_CHECK_ERROR (src, res);
} else { } else {
res = res =
@ -1570,7 +1589,7 @@ gst_pylonsrc_set_readout (GstPylonSrc * src)
// Set sensor readout mode (default: Normal) // Set sensor readout mode (default: Normal)
if (FEATURE_SUPPORTED ("SensorReadoutMode")) { if (FEATURE_SUPPORTED ("SensorReadoutMode")) {
src->sensorMode = g_ascii_strdown (src->sensorMode, -1); ascii_strdown (&src->sensorMode, -1);
if (strcmp (src->sensorMode, "normal") == 0) { if (strcmp (src->sensorMode, "normal") == 0) {
GST_DEBUG_OBJECT (src, "Setting the sensor readout mode to normal."); GST_DEBUG_OBJECT (src, "Setting the sensor readout mode to normal.");
@ -1704,7 +1723,7 @@ gst_pylonsrc_set_lightsource (GstPylonSrc * src)
GENAPIC_RESULT res; GENAPIC_RESULT res;
// Set lightsource preset // Set lightsource preset
if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "LightSourcePreset")) { if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "LightSourcePreset")) {
src->lightsource = g_ascii_strdown (src->lightsource, -1); ascii_strdown (&src->lightsource, -1);
if (strcmp (src->lightsource, "off") == 0) { if (strcmp (src->lightsource, "off") == 0) {
GST_DEBUG_OBJECT (src, "Not using a lightsource preset."); GST_DEBUG_OBJECT (src, "Not using a lightsource preset.");
@ -1758,7 +1777,7 @@ gst_pylonsrc_set_auto_exp_gain_wb (GstPylonSrc * src)
GENAPIC_RESULT res; GENAPIC_RESULT res;
// Enable/disable automatic exposure // Enable/disable automatic exposure
src->autoexposure = g_ascii_strdown (src->autoexposure, -1); ascii_strdown (&src->autoexposure, -1);
if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "ExposureAuto")) { if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "ExposureAuto")) {
if (strcmp (src->autoexposure, "off") == 0) { if (strcmp (src->autoexposure, "off") == 0) {
GST_DEBUG_OBJECT (src, "Disabling automatic exposure."); GST_DEBUG_OBJECT (src, "Disabling automatic exposure.");
@ -1792,7 +1811,7 @@ gst_pylonsrc_set_auto_exp_gain_wb (GstPylonSrc * src)
} }
// Enable/disable automatic gain // Enable/disable automatic gain
src->autogain = g_ascii_strdown (src->autogain, -1); ascii_strdown (&src->autogain, -1);
if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "GainAuto")) { if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "GainAuto")) {
if (strcmp (src->autogain, "off") == 0) { if (strcmp (src->autogain, "off") == 0) {
GST_DEBUG_OBJECT (src, "Disabling automatic gain."); GST_DEBUG_OBJECT (src, "Disabling automatic gain.");
@ -1824,7 +1843,7 @@ gst_pylonsrc_set_auto_exp_gain_wb (GstPylonSrc * src)
} }
// Enable/disable automatic white balance // Enable/disable automatic white balance
src->autowhitebalance = g_ascii_strdown (src->autowhitebalance, -1); ascii_strdown (&src->autowhitebalance, -1);
if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "BalanceWhiteAuto")) { if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "BalanceWhiteAuto")) {
if (strcmp (src->autowhitebalance, "off") == 0) { if (strcmp (src->autowhitebalance, "off") == 0) {
GST_DEBUG_OBJECT (src, "Disabling automatic white balance."); GST_DEBUG_OBJECT (src, "Disabling automatic white balance.");
@ -1936,7 +1955,7 @@ gst_pylonsrc_set_auto_exp_gain_wb (GstPylonSrc * src)
"This camera doesn't support changing the brightness target."); "This camera doesn't support changing the brightness target.");
} }
} }
src->autoprofile = g_ascii_strdown (src->autoprofile, -1); ascii_strdown (&src->autoprofile, -1);
if (strcmp (src->autoprofile, "default") != 0) { if (strcmp (src->autoprofile, "default") != 0) {
GST_DEBUG_OBJECT (src, "Setting automatic profile to minimise %s.", GST_DEBUG_OBJECT (src, "Setting automatic profile to minimise %s.",
src->autoprofile); src->autoprofile);
@ -2213,8 +2232,7 @@ gst_pylonsrc_set_color (GstPylonSrc * src)
} }
// Configure colour transformation // Configure colour transformation
src->transformationselector = ascii_strdown (&src->transformationselector, -1);
g_ascii_strdown (src->transformationselector, -1);
if (PylonDeviceFeatureIsAvailable (src->deviceHandle, if (PylonDeviceFeatureIsAvailable (src->deviceHandle,
"ColorTransformationSelector")) { "ColorTransformationSelector")) {
if (strcmp (src->transformationselector, "default") != 0) { if (strcmp (src->transformationselector, "default") != 0) {
@ -2576,7 +2594,7 @@ gst_pylonsrc_configure_start_acquisition (GstPylonSrc * src)
PYLONC_CHECK_ERROR (src, res); PYLONC_CHECK_ERROR (src, res);
// Allocate the memory for the frame payloads // Allocate the memory for the frame payloads
for (i = 0; i < NUM_CAPTURE_BUFFERS; ++i) { for (i = 0; i < GST_PYLONSRC_NUM_CAPTURE_BUFFERS; ++i) {
src->buffers[i] = (unsigned char *) malloc (src->payloadSize); src->buffers[i] = (unsigned char *) malloc (src->payloadSize);
if (NULL == src->buffers[i]) { if (NULL == src->buffers[i]) {
GST_ERROR_OBJECT (src, "Memory allocation error."); GST_ERROR_OBJECT (src, "Memory allocation error.");
@ -2589,7 +2607,7 @@ gst_pylonsrc_configure_start_acquisition (GstPylonSrc * src)
// Define buffers // Define buffers
res = res =
PylonStreamGrabberSetMaxNumBuffer (src->streamGrabber, PylonStreamGrabberSetMaxNumBuffer (src->streamGrabber,
NUM_CAPTURE_BUFFERS); GST_PYLONSRC_NUM_CAPTURE_BUFFERS);
PYLONC_CHECK_ERROR (src, res); PYLONC_CHECK_ERROR (src, res);
res = res =
PylonStreamGrabberSetMaxBufferSize (src->streamGrabber, src->payloadSize); PylonStreamGrabberSetMaxBufferSize (src->streamGrabber, src->payloadSize);
@ -2599,14 +2617,14 @@ gst_pylonsrc_configure_start_acquisition (GstPylonSrc * src)
res = PylonStreamGrabberPrepareGrab (src->streamGrabber); res = PylonStreamGrabberPrepareGrab (src->streamGrabber);
PYLONC_CHECK_ERROR (src, res); PYLONC_CHECK_ERROR (src, res);
for (i = 0; i < NUM_CAPTURE_BUFFERS; ++i) { for (i = 0; i < GST_PYLONSRC_NUM_CAPTURE_BUFFERS; ++i) {
res = res =
PylonStreamGrabberRegisterBuffer (src->streamGrabber, src->buffers[i], PylonStreamGrabberRegisterBuffer (src->streamGrabber, src->buffers[i],
src->payloadSize, &src->bufferHandle[i]); src->payloadSize, &src->bufferHandle[i]);
PYLONC_CHECK_ERROR (src, res); PYLONC_CHECK_ERROR (src, res);
} }
for (i = 0; i < NUM_CAPTURE_BUFFERS; ++i) { for (i = 0; i < GST_PYLONSRC_NUM_CAPTURE_BUFFERS; ++i) {
res = res =
PylonStreamGrabberQueueBuffer (src->streamGrabber, src->bufferHandle[i], PylonStreamGrabberQueueBuffer (src->streamGrabber, src->bufferHandle[i],
(void *) i); (void *) i);
@ -2844,6 +2862,18 @@ gst_pylonsrc_finalize (GObject * object)
GstPylonSrc *src = GST_PYLONSRC (object); GstPylonSrc *src = GST_PYLONSRC (object);
GST_DEBUG_OBJECT (src, "finalize"); GST_DEBUG_OBJECT (src, "finalize");
g_free(src->pixel_format);
g_free(src->sensorMode);
g_free(src->lightsource);
g_free(src->autoexposure);
g_free(src->autowhitebalance);
g_free(src->autogain);
g_free(src->reset);
g_free(src->autoprofile);
g_free(src->transformationselector);
g_free(src->userid);
pylonc_terminate (); pylonc_terminate ();
G_OBJECT_CLASS (gst_pylonsrc_parent_class)->finalize (object); G_OBJECT_CLASS (gst_pylonsrc_parent_class)->finalize (object);

View File

@ -24,7 +24,9 @@
#include <gst/base/gstpushsrc.h> #include <gst/base/gstpushsrc.h>
#include "pylonc/PylonC.h" #include "pylonc/PylonC.h"
#define NUM_CAPTURE_BUFFERS 10 enum {
GST_PYLONSRC_NUM_CAPTURE_BUFFERS = 10
};
G_BEGIN_DECLS G_BEGIN_DECLS
@ -50,8 +52,8 @@ struct _GstPylonSrc
gboolean deviceConnected; gboolean deviceConnected;
gboolean acquisition_configured; gboolean acquisition_configured;
unsigned char *buffers[NUM_CAPTURE_BUFFERS]; unsigned char *buffers[GST_PYLONSRC_NUM_CAPTURE_BUFFERS];
PYLON_STREAMBUFFER_HANDLE bufferHandle[NUM_CAPTURE_BUFFERS]; PYLON_STREAMBUFFER_HANDLE bufferHandle[GST_PYLONSRC_NUM_CAPTURE_BUFFERS];
int32_t frameSize; // Size of a frame in bytes. int32_t frameSize; // Size of a frame in bytes.
int32_t payloadSize; // Size of a frame in bytes. int32_t payloadSize; // Size of a frame in bytes.