pylonsrc: refactored grouped features
This commit is contained in:
parent
7faedddea2
commit
53351a0818
@ -171,6 +171,8 @@ typedef enum _GST_PYLONSRC_AXIS {
|
||||
AXIS_Y
|
||||
} GST_PYLONSRC_AXIS;
|
||||
|
||||
static const GST_PYLONSRC_AXIS otherAxis[2] = {AXIS_Y, AXIS_X};
|
||||
|
||||
typedef enum _GST_PYLONSRC_COLOUR {
|
||||
COLOUR_RED,
|
||||
COLOUR_GREEN,
|
||||
@ -180,7 +182,7 @@ typedef enum _GST_PYLONSRC_COLOUR {
|
||||
COLOUR_YELLOW
|
||||
} GST_PYLONSRC_COLOUR;
|
||||
|
||||
static const GST_PYLONSRC_AXIS otherAxis[2] = {AXIS_Y, AXIS_X};
|
||||
static const char* featColour[6] = {"Red", "Green", "Blue", "Cyan", "Magenta", "Yellow"};
|
||||
|
||||
static inline const char*
|
||||
boolalpha(_Bool arg)
|
||||
@ -561,19 +563,17 @@ gst_pylonsrc_init (GstPylonSrc * src)
|
||||
src->limitBandwidth = TRUE;
|
||||
src->setFPS = FALSE;
|
||||
src->demosaicing = FALSE;
|
||||
src->binning[AXIS_X] = 1;
|
||||
src->binning[AXIS_Y] = 1;
|
||||
src->center[AXIS_X] = FALSE;
|
||||
src->center[AXIS_Y] = FALSE;
|
||||
src->flip[AXIS_X] = FALSE;
|
||||
src->flip[AXIS_Y] = FALSE;
|
||||
src->offset[AXIS_X] = 99999;
|
||||
src->offset[AXIS_Y] = 99999;
|
||||
|
||||
for(int i = 0; i < 2; i++) {
|
||||
src->binning[i] = 1;
|
||||
src->center[i] = FALSE;
|
||||
src->flip[i] = FALSE;
|
||||
src->offset[i] = 99999;
|
||||
src->size[i] = 0;
|
||||
src->maxSize[i] = G_MAXINT;
|
||||
}
|
||||
|
||||
src->cameraId = 9999;
|
||||
src->size[AXIS_Y] = 0;
|
||||
src->size[AXIS_X] = 0;
|
||||
src->maxSize[AXIS_Y] = G_MAXINT;
|
||||
src->maxSize[AXIS_X] = G_MAXINT;
|
||||
src->maxBandwidth = 0;
|
||||
src->testImage = 0;
|
||||
src->sensorMode = g_strdup ("normal");
|
||||
@ -591,21 +591,16 @@ gst_pylonsrc_init (GstPylonSrc * src)
|
||||
src->gain = 0.0;
|
||||
src->blacklevel = 0.0;
|
||||
src->gamma = 1.0;
|
||||
src->balance[COLOUR_RED] = 999.0;
|
||||
src->balance[COLOUR_GREEN] = 999.0;
|
||||
src->balance[COLOUR_BLUE] = 999.0;
|
||||
src->hue[COLOUR_RED] = 999.0;
|
||||
src->saturation[COLOUR_RED] = 999.0;
|
||||
src->hue[COLOUR_YELLOW] = 999.0;
|
||||
src->saturation[COLOUR_YELLOW] = 999.0;
|
||||
src->hue[COLOUR_GREEN] = 999.0;
|
||||
src->saturation[COLOUR_GREEN] = 999.0;
|
||||
src->hue[COLOUR_CYAN] = 999.0;
|
||||
src->saturation[COLOUR_CYAN] = 999.0;
|
||||
src->hue[COLOUR_BLUE] = 999.0;
|
||||
src->saturation[COLOUR_BLUE] = 999.0;
|
||||
src->hue[COLOUR_MAGENTA] = 999.0;
|
||||
src->saturation[COLOUR_MAGENTA] = 999.0;
|
||||
|
||||
for(int i = 0; i < 3; i++) {
|
||||
src->balance[i] = 999.0;
|
||||
}
|
||||
|
||||
for(int i = 0; i < 6; i++) {
|
||||
src->hue[i] = 999.0;
|
||||
src->saturation[i] = 999.0;
|
||||
}
|
||||
|
||||
src->sharpnessenhancement = 999.0;
|
||||
src->noisereduction = 999.0;
|
||||
src->autoexposureupperlimit = 9999999.0;
|
||||
@ -613,15 +608,11 @@ gst_pylonsrc_init (GstPylonSrc * src)
|
||||
src->gainupperlimit = 999.0;
|
||||
src->gainlowerlimit = 999.0;
|
||||
src->brightnesstarget = 999.0;
|
||||
src->transformation[0][0] = 999.0;
|
||||
src->transformation[0][1] = 999.0;
|
||||
src->transformation[0][2] = 999.0;
|
||||
src->transformation[1][0] = 999.0;
|
||||
src->transformation[1][1] = 999.0;
|
||||
src->transformation[1][2] = 999.0;
|
||||
src->transformation[2][0] = 999.0;
|
||||
src->transformation[2][1] = 999.0;
|
||||
src->transformation[2][2] = 999.0;
|
||||
for(int j = 0; j < 3; j++) {
|
||||
for(int i = 0; i < 3; i++) {
|
||||
src->transformation[i][j] = 999.0;
|
||||
}
|
||||
}
|
||||
|
||||
// Mark this element as a live source (disable preroll)
|
||||
gst_base_src_set_live (GST_BASE_SRC (src), TRUE);
|
||||
@ -1323,28 +1314,26 @@ error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_pylonsrc_set_resolution (GstPylonSrc * src)
|
||||
static _Bool
|
||||
gst_pylonsrc_set_resolution_axis(GstPylonSrc * src, GST_PYLONSRC_AXIS axis)
|
||||
{
|
||||
GENAPIC_RESULT res;
|
||||
int64_t width = 0, height = 0;
|
||||
int64_t size = 0;
|
||||
|
||||
static const char* const featBinning[2] = {"BinningHorizontal", "BinningVertical"};
|
||||
static const char* const featSize[2] = {"Width", "Height"};
|
||||
static const char* const featMaxSize[2] = {"WidthMax", "HeightMax"};
|
||||
|
||||
// set binning of camera
|
||||
if (FEATURE_SUPPORTED ("BinningHorizontal") &&
|
||||
FEATURE_SUPPORTED ("BinningVertical")) {
|
||||
GST_DEBUG_OBJECT (src, "Setting horizontal binning to %d", src->binning[AXIS_X]);
|
||||
if (FEATURE_SUPPORTED (featBinning[axis])) {
|
||||
GST_DEBUG_OBJECT (src, "Setting %s to %d", featBinning[axis], src->binning[axis]);
|
||||
res =
|
||||
PylonDeviceSetIntegerFeature (src->deviceHandle, "BinningHorizontal",
|
||||
src->binning[AXIS_X]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
GST_DEBUG_OBJECT (src, "Setting vertical binning to %d", src->binning[AXIS_Y]);
|
||||
res =
|
||||
PylonDeviceSetIntegerFeature (src->deviceHandle, "BinningVertical",
|
||||
src->binning[AXIS_Y]);
|
||||
PylonDeviceSetIntegerFeature (src->deviceHandle, featBinning[axis],
|
||||
src->binning[axis]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
}
|
||||
// Get the camera's resolution
|
||||
if (!FEATURE_SUPPORTED ("Width") || !FEATURE_SUPPORTED ("Height")) {
|
||||
if (!FEATURE_SUPPORTED (featSize[axis])) {
|
||||
GST_ERROR_OBJECT (src,
|
||||
"The camera doesn't seem to be reporting it's resolution.");
|
||||
GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
|
||||
@ -1353,58 +1342,33 @@ gst_pylonsrc_set_resolution (GstPylonSrc * src)
|
||||
goto error;
|
||||
}
|
||||
// Default height/width
|
||||
res = PylonDeviceGetIntegerFeature (src->deviceHandle, "Width", &width);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res = PylonDeviceGetIntegerFeature (src->deviceHandle, "Height", &height);
|
||||
res = PylonDeviceGetIntegerFeature (src->deviceHandle, featSize[axis], &size);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
// Max Width and Height.
|
||||
if (FEATURE_SUPPORTED ("WidthMax") && FEATURE_SUPPORTED ("HeightMax")) {
|
||||
int64_t maxWidth, maxHeight;
|
||||
if (FEATURE_SUPPORTED (featMaxSize[axis])) {
|
||||
int64_t maxSize;
|
||||
res =
|
||||
PylonDeviceGetIntegerFeature (src->deviceHandle, "WidthMax", &maxWidth);
|
||||
src->maxSize[AXIS_X] = (gint) maxWidth;
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceGetIntegerFeature (src->deviceHandle, "HeightMax",
|
||||
&maxHeight);
|
||||
src->maxSize[AXIS_Y] = (gint) maxHeight;
|
||||
PylonDeviceGetIntegerFeature (src->deviceHandle, featMaxSize[axis], &maxSize);
|
||||
src->maxSize[axis] = (gint) maxSize;
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
}
|
||||
GST_DEBUG_OBJECT (src, "Max resolution is %dx%d.", src->maxSize[AXIS_X],
|
||||
src->maxSize[AXIS_Y]);
|
||||
|
||||
// If custom resolution is set, check if it's even possible and set it
|
||||
if (src->size[AXIS_Y] != 0 || src->size[AXIS_X] != 0) {
|
||||
if (src->size[AXIS_X] > src->maxSize[AXIS_X]) {
|
||||
GST_DEBUG_OBJECT (src, "Set width is above camera's capabilities.");
|
||||
if (src->size[axis] != 0) {
|
||||
if (src->size[axis] > src->maxSize[axis]) {
|
||||
GST_DEBUG_OBJECT (src, "Set %s is above camera's capabilities.", featSize[axis]);
|
||||
GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
|
||||
("Failed to initialise the camera"), ("Wrong width specified"));
|
||||
("Failed to initialise the camera"), ("Wrong %s specified", featSize[axis]));
|
||||
goto error;
|
||||
} else if (src->size[AXIS_X] == 0) {
|
||||
src->size[AXIS_X] = (gint) width;
|
||||
}
|
||||
|
||||
if (src->size[AXIS_Y] > src->maxSize[AXIS_Y]) {
|
||||
GST_DEBUG_OBJECT (src, "Set height is above camera's capabilities.");
|
||||
GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
|
||||
("Failed to initialise the camera"), ("Wrong height specified"));
|
||||
goto error;
|
||||
} else if (src->size[AXIS_Y] == 0) {
|
||||
src->size[AXIS_Y] = (gint) height;
|
||||
}
|
||||
} else {
|
||||
src->size[AXIS_Y] = (gint) height;
|
||||
src->size[AXIS_X] = (gint) width;
|
||||
src->size[axis] = (gint) size;
|
||||
}
|
||||
|
||||
// Set the final resolution
|
||||
res = PylonDeviceSetIntegerFeature (src->deviceHandle, "Width", src->size[AXIS_X]);
|
||||
res = PylonDeviceSetIntegerFeature (src->deviceHandle, featSize[axis], src->size[axis]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res = PylonDeviceSetIntegerFeature (src->deviceHandle, "Height", src->size[AXIS_Y]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
GST_DEBUG_OBJECT (src, "Setting resolution to %dx%d.", src->size[AXIS_X],
|
||||
src->size[AXIS_Y]);
|
||||
|
||||
return TRUE;
|
||||
|
||||
@ -1412,69 +1376,62 @@ error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static _Bool
|
||||
gst_pylonsrc_set_resolution (GstPylonSrc * src)
|
||||
{
|
||||
const _Bool result = gst_pylonsrc_set_resolution_axis(src, AXIS_X) &&
|
||||
gst_pylonsrc_set_resolution_axis(src, AXIS_Y);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Max resolution is %dx%d.", src->maxSize[AXIS_X],
|
||||
src->maxSize[AXIS_Y]);
|
||||
GST_DEBUG_OBJECT (src, "Setting resolution to %dx%d.", src->size[AXIS_X],
|
||||
src->size[AXIS_Y]);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_pylonsrc_set_offset (GstPylonSrc * src)
|
||||
gst_pylonsrc_set_offset_axis (GstPylonSrc * src, GST_PYLONSRC_AXIS axis)
|
||||
{
|
||||
GENAPIC_RESULT res;
|
||||
|
||||
static const char* featOffset[2] = {"OffsetX", "OffsetY"};
|
||||
static const char* featCenter[2] = {"CenterX", "CenterY"};
|
||||
|
||||
// Set the offset
|
||||
if (!FEATURE_SUPPORTED ("OffsetX") || !FEATURE_SUPPORTED ("OffsetY")) {
|
||||
if (!FEATURE_SUPPORTED (featOffset[axis])) {
|
||||
GST_WARNING_OBJECT (src,
|
||||
"The camera doesn't seem to allow setting offsets. Skipping...");
|
||||
} else {
|
||||
// Check if the user wants to center image first
|
||||
_Bool cameraSupportsCenterX = FEATURE_SUPPORTED ("CenterX");
|
||||
_Bool cameraSupportsCenterY = FEATURE_SUPPORTED ("CenterY");
|
||||
if (!cameraSupportsCenterX || !cameraSupportsCenterY) {
|
||||
_Bool cameraSupportsCenter = FEATURE_SUPPORTED (featCenter[axis]);
|
||||
if (!cameraSupportsCenter) {
|
||||
GST_WARNING_OBJECT (src,
|
||||
"The camera doesn't seem to allow offset centering. Skipping...");
|
||||
} else {
|
||||
res =
|
||||
PylonDeviceSetBooleanFeature (src->deviceHandle, "CenterX",
|
||||
src->center[AXIS_X]);
|
||||
PylonDeviceSetBooleanFeature (src->deviceHandle, featCenter[axis],
|
||||
src->center[axis]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetBooleanFeature (src->deviceHandle, "CenterY",
|
||||
src->center[AXIS_Y]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
GST_DEBUG_OBJECT (src, "Centering X: %s, Centering Y: %s.",
|
||||
src->center[AXIS_X] ? "True" : "False", src->center[AXIS_Y] ? "True" : "False");
|
||||
|
||||
if (!src->center[AXIS_X] && src->offset[AXIS_X] != 99999) {
|
||||
gint maxoffsetx = src->maxSize[AXIS_X] - src->size[AXIS_X];
|
||||
GST_DEBUG_OBJECT (src, "%s: %s", featCenter[axis], boolalpha(src->center[axis]));
|
||||
|
||||
if (maxoffsetx >= src->offset[AXIS_X]) {
|
||||
if (!src->center[axis] && src->offset[axis] != 99999) {
|
||||
gint maxoffset = src->maxSize[axis] - src->size[axis];
|
||||
|
||||
if (maxoffset >= src->offset[axis]) {
|
||||
res =
|
||||
PylonDeviceSetIntegerFeature (src->deviceHandle, "OffsetX",
|
||||
src->offset[AXIS_X]);
|
||||
PylonDeviceSetIntegerFeature (src->deviceHandle, featOffset[axis],
|
||||
src->offset[axis]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
GST_DEBUG_OBJECT (src, "Setting X offset to %d", src->offset[AXIS_X]);
|
||||
GST_DEBUG_OBJECT (src, "Setting %s to %d", featOffset[axis], src->offset[axis]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src,
|
||||
"Set X offset is above camera's capabilities. (%d > %d)",
|
||||
src->offset[AXIS_X], maxoffsetx);
|
||||
"Set %s is above camera's capabilities. (%d > %d)", featOffset[axis],
|
||||
src->offset[axis], maxoffset);
|
||||
GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
|
||||
("Failed to initialise the camera"),
|
||||
("Wrong offset for X axis specified"));
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (!src->center[AXIS_Y] && src->offset[AXIS_Y] != 99999) {
|
||||
gint maxoffsety = src->maxSize[AXIS_Y] - src->size[AXIS_Y];
|
||||
if (maxoffsety >= src->offset[AXIS_Y]) {
|
||||
res =
|
||||
PylonDeviceSetIntegerFeature (src->deviceHandle, "OffsetY",
|
||||
src->offset[AXIS_Y]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
GST_DEBUG_OBJECT (src, "Setting Y offset to %d", src->offset[AXIS_Y]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src,
|
||||
"Set Y offset is above camera's capabilities. (%d > %d)",
|
||||
src->offset[AXIS_Y], maxoffsety);
|
||||
GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
|
||||
("Failed to initialise the camera"),
|
||||
("Wrong offset for Y axis specified"));
|
||||
("Wrong %s specified", featOffset[axis]));
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
@ -1487,33 +1444,32 @@ error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_pylonsrc_set_reverse (GstPylonSrc * src)
|
||||
static _Bool
|
||||
gst_pylonsrc_set_offset (GstPylonSrc * src)
|
||||
{
|
||||
return gst_pylonsrc_set_offset_axis(src, AXIS_X) &&
|
||||
gst_pylonsrc_set_offset_axis(src, AXIS_Y);
|
||||
}
|
||||
|
||||
static _Bool
|
||||
gst_pylonsrc_set_reverse_axis (GstPylonSrc * src, GST_PYLONSRC_AXIS axis)
|
||||
{
|
||||
GENAPIC_RESULT res;
|
||||
|
||||
static const char* featReverse[2] = {"ReverseX", "ReverseY"};
|
||||
|
||||
// Flip the image
|
||||
if (!FEATURE_SUPPORTED ("ReverseX")) {
|
||||
src->flip[AXIS_X] = FALSE;
|
||||
if (!FEATURE_SUPPORTED (featReverse[axis])) {
|
||||
src->flip[axis] = FALSE;
|
||||
GST_WARNING_OBJECT (src,
|
||||
"Camera doesn't support reversing the X axis. Skipping...");
|
||||
"Camera doesn't support %s. Skipping...", featReverse[axis]);
|
||||
} else {
|
||||
if (!FEATURE_SUPPORTED ("ReverseY")) {
|
||||
src->flip[AXIS_Y] = FALSE;
|
||||
GST_WARNING_OBJECT (src,
|
||||
"Camera doesn't support reversing the Y axis. Skipping...");
|
||||
} else {
|
||||
res =
|
||||
PylonDeviceSetBooleanFeature (src->deviceHandle, "ReverseX",
|
||||
src->flip[AXIS_X]);
|
||||
PylonDeviceSetBooleanFeature (src->deviceHandle, featReverse[axis],
|
||||
src->flip[axis]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetBooleanFeature (src->deviceHandle, "ReverseY",
|
||||
src->flip[AXIS_Y]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
GST_DEBUG_OBJECT (src, "Flipping X: %s, Flipping Y: %s.",
|
||||
src->flip[AXIS_X] ? "True" : "False", src->flip[AXIS_Y] ? "True" : "False");
|
||||
}
|
||||
|
||||
GST_DEBUG_OBJECT (src, "%s: %s", featReverse[axis], boolalpha(src->flip[axis]));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
@ -1522,6 +1478,13 @@ error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static _Bool
|
||||
gst_pylonsrc_set_reverse (GstPylonSrc * src)
|
||||
{
|
||||
return gst_pylonsrc_set_reverse_axis(src, AXIS_X) &&
|
||||
gst_pylonsrc_set_reverse_axis(src, AXIS_Y);
|
||||
}
|
||||
|
||||
static GstCaps *
|
||||
gst_pylonsrc_get_supported_caps (GstPylonSrc * src)
|
||||
{
|
||||
@ -2038,7 +2001,113 @@ error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
static _Bool
|
||||
gst_pylonsrc_set_colour_balance(GstPylonSrc* src, GST_PYLONSRC_COLOUR colour)
|
||||
{
|
||||
GENAPIC_RESULT res;
|
||||
|
||||
if (src->balance[colour] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"BalanceRatioSelector", featColour[colour]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "BalanceRatio",
|
||||
src->balance[colour]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "%s balance set to %.2lf", featColour[colour], src->balance[colour]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using current settings for the colour %s.", featColour[colour]);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static _Bool
|
||||
gst_pylonsrc_set_colour_hue(GstPylonSrc* src, GST_PYLONSRC_COLOUR colour)
|
||||
{
|
||||
GENAPIC_RESULT res;
|
||||
|
||||
if (src->hue[colour] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", featColour[colour]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "ColorAdjustmentHue",
|
||||
src->hue[colour]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "%s hue set to %.2lf", featColour[colour], src->hue[colour]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved %s hue.", featColour[colour]);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static _Bool
|
||||
gst_pylonsrc_set_colour_saturation(GstPylonSrc* src, GST_PYLONSRC_COLOUR colour)
|
||||
{
|
||||
GENAPIC_RESULT res;
|
||||
|
||||
if (src->saturation[colour] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", featColour[colour]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorAdjustmentSaturation", src->saturation[colour]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "%s saturation set to %.2lf", featColour[colour], src->saturation[colour]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved %s saturation.", featColour[colour]);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static _Bool
|
||||
gst_pylonsrc_set_colour_transformation(GstPylonSrc* src, int i, int j)
|
||||
{
|
||||
GENAPIC_RESULT res;
|
||||
|
||||
static const char* featGain[3][3] = {
|
||||
{"Gain00", "Gain01", "Gain02"},
|
||||
{"Gain10", "Gain11", "Gain12"},
|
||||
{"Gain20", "Gain21", "Gain22"}
|
||||
};
|
||||
|
||||
if (src->transformation[i][j] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationSelector", featGain[i][j]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", src->transformation[i][j]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "%s set to %.2lf", featGain[i][j], src->transformation[i][j]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved %s transformation value.", featGain[i][j]);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
error:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static _Bool
|
||||
gst_pylonsrc_set_color (GstPylonSrc * src)
|
||||
{
|
||||
GENAPIC_RESULT res;
|
||||
@ -2046,50 +2115,11 @@ gst_pylonsrc_set_color (GstPylonSrc * src)
|
||||
// Configure colour balance
|
||||
if (PylonDeviceFeatureIsAvailable (src->deviceHandle, "BalanceRatio")) {
|
||||
if (strcmp (src->autowhitebalance, "off") == 0) {
|
||||
if (src->balance[COLOUR_RED] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"BalanceRatioSelector", "Red");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "BalanceRatio",
|
||||
src->balance[COLOUR_RED]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Red balance set to %.2lf", src->balance[COLOUR_RED]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using current settings for the colour red.");
|
||||
}
|
||||
|
||||
if (src->balance[COLOUR_GREEN] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"BalanceRatioSelector", "Green");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "BalanceRatio",
|
||||
src->balance[COLOUR_GREEN]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Green balance set to %.2lf", src->balance[COLOUR_GREEN]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using current settings for the colour green.");
|
||||
}
|
||||
|
||||
if (src->balance[COLOUR_BLUE] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"BalanceRatioSelector", "Blue");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "BalanceRatio",
|
||||
src->balance[COLOUR_BLUE]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Blue balance set to %.2lf", src->balance[COLOUR_BLUE]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using current settings for the colour blue.");
|
||||
}
|
||||
if(!gst_pylonsrc_set_colour_balance(src, COLOUR_RED) ||
|
||||
!gst_pylonsrc_set_colour_balance(src, COLOUR_GREEN) ||
|
||||
!gst_pylonsrc_set_colour_balance(src, COLOUR_BLUE)) {
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src,
|
||||
"Auto White Balance is enabled. Not setting Balance Ratio.");
|
||||
@ -2098,183 +2128,12 @@ gst_pylonsrc_set_color (GstPylonSrc * src)
|
||||
// Configure colour adjustment
|
||||
if (PylonDeviceFeatureIsAvailable (src->deviceHandle,
|
||||
"ColorAdjustmentSelector")) {
|
||||
if (src->hue[COLOUR_RED] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Red");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "ColorAdjustmentHue",
|
||||
src->hue[COLOUR_RED]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Red hue set to %.2lf", src->hue[COLOUR_RED]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour red's hue.");
|
||||
}
|
||||
if (src->saturation[COLOUR_RED] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Red");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorAdjustmentSaturation", src->saturation[COLOUR_RED]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Red saturation set to %.2lf", src->saturation[COLOUR_RED]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour red's saturation.");
|
||||
}
|
||||
|
||||
if (src->hue[COLOUR_YELLOW] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Yellow");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "ColorAdjustmentHue",
|
||||
src->hue[COLOUR_YELLOW]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Yellow hue set to %.2lf", src->hue[COLOUR_YELLOW]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour yellow's hue.");
|
||||
}
|
||||
if (src->saturation[COLOUR_YELLOW] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Yellow");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorAdjustmentSaturation", src->saturation[COLOUR_YELLOW]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Yellow saturation set to %.2lf",
|
||||
src->saturation[COLOUR_YELLOW]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour yellow's saturation.");
|
||||
}
|
||||
|
||||
if (src->hue[COLOUR_GREEN] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Green");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "ColorAdjustmentHue",
|
||||
src->hue[COLOUR_GREEN]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Green hue set to %.2lf", src->hue[COLOUR_GREEN]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour green's hue.");
|
||||
}
|
||||
if (src->saturation[COLOUR_GREEN] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Green");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorAdjustmentSaturation", src->saturation[COLOUR_GREEN]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Green saturation set to %.2lf",
|
||||
src->saturation[COLOUR_GREEN]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour green's saturation.");
|
||||
}
|
||||
|
||||
if (src->hue[COLOUR_CYAN] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Cyan");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "ColorAdjustmentHue",
|
||||
src->hue[COLOUR_CYAN]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Cyan hue set to %.2lf", src->hue[COLOUR_CYAN]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour cyan's hue.");
|
||||
}
|
||||
if (src->saturation[COLOUR_CYAN] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Cyan");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorAdjustmentSaturation", src->saturation[COLOUR_CYAN]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Cyan saturation set to %.2lf",
|
||||
src->saturation[COLOUR_CYAN]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour cyan's saturation.");
|
||||
}
|
||||
|
||||
if (src->hue[COLOUR_BLUE] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Blue");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "ColorAdjustmentHue",
|
||||
src->hue[COLOUR_BLUE]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Blue hue set to %.2lf", src->hue[COLOUR_BLUE]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour blue's hue.");
|
||||
}
|
||||
if (src->saturation[COLOUR_BLUE] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Blue");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorAdjustmentSaturation", src->saturation[COLOUR_BLUE]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Blue saturation set to %.2lf",
|
||||
src->saturation[COLOUR_BLUE]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour blue's saturation.");
|
||||
}
|
||||
|
||||
if (src->hue[COLOUR_MAGENTA] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Magenta");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle, "ColorAdjustmentHue",
|
||||
src->hue[COLOUR_MAGENTA]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Magenta hue set to %.2lf", src->hue[COLOUR_MAGENTA]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour magenta's hue.");
|
||||
}
|
||||
if (src->saturation[COLOUR_MAGENTA] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorAdjustmentSelector", "Magenta");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorAdjustmentSaturation", src->saturation[COLOUR_MAGENTA]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Magenta saturation set to %.2lf",
|
||||
src->saturation[COLOUR_MAGENTA]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved colour magenta's saturation.");
|
||||
for(int i = 0; i < 6; i++) {
|
||||
const GST_PYLONSRC_COLOUR colour = (GST_PYLONSRC_COLOUR) i;
|
||||
if(!gst_pylonsrc_set_colour_hue(src, colour) ||
|
||||
!gst_pylonsrc_set_colour_saturation(src, colour)) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src,
|
||||
@ -2296,14 +2155,14 @@ gst_pylonsrc_set_color (GstPylonSrc * src)
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationSelector", "RGBtoYUV");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
} else if (strcmp (src->transformationselector, "rgbyuv") == 0) {
|
||||
} else if (strcmp (src->transformationselector, "yuvrgb") == 0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationSelector", "YUVtoRGB");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
} else {
|
||||
GST_ERROR_OBJECT (src,
|
||||
"Invalid parameter value for transformationselector. Available values are: RGBtoRGB, RGBtoYUV, YUVtoRGB. Value provided: \"%s\".",
|
||||
"Invalid parameter value for transformationselector. Available values are: RGBRGB, RGBYUV, YUVRGB. Value provided: \"%s\".",
|
||||
src->transformationselector);
|
||||
GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
|
||||
("Failed to initialise the camera"),
|
||||
@ -2312,139 +2171,12 @@ gst_pylonsrc_set_color (GstPylonSrc * src)
|
||||
}
|
||||
}
|
||||
|
||||
if (src->transformation[0][0] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationSelector", "Gain00");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", src->transformation[0][0]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Gain00 set to %.2lf", src->transformation[0][0]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved Gain00 transformation value.");
|
||||
}
|
||||
|
||||
if (src->transformation[0][1] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", "Gain01");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValue", src->transformation[0][1]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Gain01 set to %.2lf", src->transformation[0][1]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved Gain01 transformation value.");
|
||||
}
|
||||
|
||||
if (src->transformation[0][2] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", "Gain02");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValue", src->transformation[0][2]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Gain02 set to %.2lf", src->transformation[0][2]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved Gain02 transformation value.");
|
||||
}
|
||||
|
||||
if (src->transformation[1][0] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", "Gain10");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValue", src->transformation[1][0]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Gain10 set to %.2lf", src->transformation[1][0]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved Gain10 transformation value.");
|
||||
}
|
||||
|
||||
if (src->transformation[1][1] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", "Gain11");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValue", src->transformation[1][1]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Gain11 set to %.2lf", src->transformation[1][1]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved Gain11 transformation value.");
|
||||
}
|
||||
|
||||
if (src->transformation[1][2] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", "Gain12");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValue", src->transformation[1][2]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Gain12 set to %.2lf", src->transformation[1][2]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved Gain12 transformation value.");
|
||||
}
|
||||
|
||||
if (src->transformation[2][0] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", "Gain20");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValue", src->transformation[2][0]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Gain20 set to %.2lf", src->transformation[2][0]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved Gain20 transformation value.");
|
||||
}
|
||||
|
||||
if (src->transformation[2][1] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", "Gain21");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValue", src->transformation[2][1]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Gain21 set to %.2lf", src->transformation[2][1]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved Gain21 transformation value.");
|
||||
}
|
||||
|
||||
if (src->transformation[2][2] != 999.0) {
|
||||
res =
|
||||
PylonDeviceFeatureFromString (src->deviceHandle,
|
||||
"ColorTransformationValueSelector", "Gain22");
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
res =
|
||||
PylonDeviceSetFloatFeature (src->deviceHandle,
|
||||
"ColorTransformationValue", src->transformation[2][2]);
|
||||
PYLONC_CHECK_ERROR (src, res);
|
||||
|
||||
GST_DEBUG_OBJECT (src, "Gain22 set to %.2lf", src->transformation[2][2]);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src, "Using saved Gain22 transformation value.");
|
||||
for(int j = 0; j < 3; j++) {
|
||||
for(int i = 0; i < 3; i++) {
|
||||
if(!gst_pylonsrc_set_colour_transformation(src, i, j)) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (src,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user