pylonsrc: moved setting pixel format to _set_caps()

This commit is contained in:
mrstecklo 2021-02-15 18:14:50 +03:00 committed by joshdoe
parent f9d9af433c
commit 19a198895c

View File

@ -100,6 +100,9 @@ static gboolean gst_pylonsrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps);
static GstFlowReturn gst_pylonsrc_create (GstPushSrc * bsrc, GstBuffer ** buf); static GstFlowReturn gst_pylonsrc_create (GstPushSrc * bsrc, GstBuffer ** buf);
static void gst_pylonsrc_update_caps (GstPylonSrc * src);
static gchar *read_string_feature (GstPylonSrc * src, const char *feature);
/* parameters */ /* parameters */
typedef enum _GST_PYLONSRC_PROP typedef enum _GST_PYLONSRC_PROP
{ {
@ -1355,6 +1358,7 @@ gst_pylonsrc_get_caps (GstBaseSrc * bsrc, GstCaps * filter)
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 {
gst_pylonsrc_update_caps (src);
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); GST_DEBUG_OBJECT (src, "Return caps:\n%" GST_PTR_FORMAT, result);
return result; return result;
@ -1387,13 +1391,34 @@ gst_pylonsrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
} }
g_string_free (format, TRUE); g_string_free (format, TRUE);
if (src->pixel_format == NULL) if (src->pixel_format != NULL) {
goto unsupported_caps; // check if we need to change PixelFormat
char *const current_format = read_string_feature (src, "PixelFormat");
const _Bool is_current_format =
g_ascii_strcasecmp (src->pixel_format, current_format) == 0;
g_free (current_format);
if (!is_current_format) {
GST_DEBUG_OBJECT (src, "Setting PixelFormat to %s", src->pixel_format);
GENAPIC_RESULT res;
res =
PylonDeviceFeatureFromString (src->deviceHandle, "PixelFormat",
src->pixel_format);
PYLONC_CHECK_ERROR (src, res);
}
char *pixelSize = read_string_feature (src, "PixelSize");
if (pixelSize != NULL) {
GST_DEBUG_OBJECT (src, "Pixel is %s bits large.", pixelSize + 3);
g_free (pixelSize);
}
return TRUE; return TRUE;
}
unsupported_caps:
GST_ERROR_OBJECT (bsrc, "Unsupported caps: %" GST_PTR_FORMAT, caps); GST_ERROR_OBJECT (bsrc, "Unsupported caps: %" GST_PTR_FORMAT, caps);
error:
return FALSE; return FALSE;
} }
@ -1949,38 +1974,24 @@ gst_pylonsrc_get_supported_caps (GstPylonSrc * src)
return caps; return caps;
} }
static void
gst_pylonsrc_update_caps (GstPylonSrc * src)
{
if (src->caps != NULL) {
gst_caps_unref (src->caps);
}
src->caps = gst_pylonsrc_get_supported_caps (src);
// TODO: handle caps renegotiation
}
static gboolean static gboolean
gst_pylonsrc_set_pixel_format (GstPylonSrc * src) gst_pylonsrc_set_pixel_format (GstPylonSrc * src)
{ {
// TODO: handle PixelFormat change and caps renegotiation if possible
if (is_prop_implicit (src, PROP_PIXEL_FORMAT)) { if (is_prop_implicit (src, PROP_PIXEL_FORMAT)) {
GENAPIC_RESULT res;
GST_DEBUG_OBJECT (src, "Using %s PixelFormat.", src->pixel_format); GST_DEBUG_OBJECT (src, "Using %s PixelFormat.", src->pixel_format);
res =
PylonDeviceFeatureFromString (src->deviceHandle, "PixelFormat",
src->pixel_format);
PYLONC_CHECK_ERROR (src, res);
// Output the size of a pixel
if (PylonDeviceFeatureIsReadable (src->deviceHandle, "PixelSize")) {
char pixelSize[10];
size_t siz = sizeof (pixelSize);
res =
PylonDeviceFeatureToString (src->deviceHandle, "PixelSize", pixelSize,
&siz);
PYLONC_CHECK_ERROR (src, res);
GST_DEBUG_OBJECT (src, "Pixel is %s bits large.", pixelSize + 3);
} else {
GST_WARNING_OBJECT (src, "Couldn't read pixel size from the camera");
}
reset_prop (src, PROP_PIXEL_FORMAT); reset_prop (src, PROP_PIXEL_FORMAT);
} }
return TRUE; return TRUE;
error:
return FALSE;
} }
static gboolean static gboolean
@ -3723,8 +3734,6 @@ gst_pylonsrc_start (GstBaseSrc * bsrc)
!gst_pylonsrc_connect_device (src) || !gst_pylonsrc_set_properties (src)) !gst_pylonsrc_connect_device (src) || !gst_pylonsrc_set_properties (src))
goto error; goto error;
src->caps = gst_pylonsrc_get_supported_caps (src);
return TRUE; return TRUE;
error: error: