gentlsrc: add additional pixel formats

This commit is contained in:
Joshua M. Doe 2021-03-23 15:44:07 -04:00
parent 842651e1bc
commit 71631261be
2 changed files with 59 additions and 44 deletions

View File

@ -8,6 +8,7 @@ set (HEADERS
include_directories (AFTER include_directories (AFTER
${GSTREAMER_INCLUDE_DIR}/.. ${GSTREAMER_INCLUDE_DIR}/..
${PROJECT_SOURCE_DIR}/common
) )
set (libname gstgentl) set (libname gstgentl)

View File

@ -41,6 +41,8 @@
#include <gst/base/gstpushsrc.h> #include <gst/base/gstpushsrc.h>
#include <gst/video/video.h> #include <gst/video/video.h>
#include "genicampixelformat.h"
#include "unzip.h" #include "unzip.h"
#include "gstgentlsrc.h" #include "gstgentlsrc.h"
@ -57,6 +59,7 @@
// EVT // EVT
#define GENAPI_WIDTH 0xA000 #define GENAPI_WIDTH 0xA000
#define GENAPI_HEIGHT 0xA004 #define GENAPI_HEIGHT 0xA004
#define GENAPI_PIXFMT 0xA008
#define GENAPI_PAYLOAD_SIZE 0xD008 #define GENAPI_PAYLOAD_SIZE 0xD008
#define GENAPI_ACQMODE 0xB000 #define GENAPI_ACQMODE 0xB000
#define GENAPI_ACQSTART 0xB004 #define GENAPI_ACQSTART 0xB004
@ -122,9 +125,13 @@ static GstStaticPadTemplate gst_gentlsrc_src_template =
GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC, GST_PAD_SRC,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE GST_STATIC_CAPS(GST_VIDEO_CAPS_MAKE
("{ GRAY8, GRAY16_LE, GRAY16_BE, BGRA }")) ("{ GRAY8, GRAY16_LE, GRAY16_BE, BGRA, UYVY }") ";"
); GST_GENICAM_PIXEL_FORMAT_MAKE_BAYER8("{ bggr, grbg, rggb, gbrg }") ";"
GST_GENICAM_PIXEL_FORMAT_MAKE_BAYER16
("{ bggr16, grbg16, rggb16, gbrg16 }", "1234")
)
);
#define HANDLE_GTL_ERROR(arg) \ #define HANDLE_GTL_ERROR(arg) \
if (ret != GC_ERR_SUCCESS) { \ if (ret != GC_ERR_SUCCESS) { \
@ -769,7 +776,7 @@ gst_gentlsrc_start (GstBaseSrc * bsrc)
GstGenTlSrc *src = GST_GENTL_SRC (bsrc); GstGenTlSrc *src = GST_GENTL_SRC (bsrc);
GC_ERROR ret; GC_ERROR ret;
uint32_t i, num_ifaces, num_devs; uint32_t i, num_ifaces, num_devs;
guint32 width, height, bpp, stride; guint32 width, height, stride;
GstVideoInfo vinfo; GstVideoInfo vinfo;
GST_DEBUG_OBJECT (src, "start"); GST_DEBUG_OBJECT (src, "start");
@ -1047,7 +1054,53 @@ gst_gentlsrc_start (GstBaseSrc * bsrc)
HANDLE_GTL_ERROR ("Failed to get height"); HANDLE_GTL_ERROR ("Failed to get height");
height = GUINT32_FROM_BE (val); height = GUINT32_FROM_BE (val);
GST_DEBUG_OBJECT(src, "Width and height %dx%d", width, height); GST_DEBUG_OBJECT(src, "Width and height %dx%d", width, height);
bpp = 8;
ret = GTL_GCReadPort(src->hDevPort, GENAPI_PIXFMT, &val, &datasize);
HANDLE_GTL_ERROR("Failed to get height");
const char* genicam_pixfmt;
guint32 pixfmt_enum = GUINT32_FROM_BE(val);
switch (pixfmt_enum) {
case 0x01080009:
genicam_pixfmt = "BayerRG8";
break;
case 0x01100011:
genicam_pixfmt = "BayerRG12";
break;
case 0x02180014:
genicam_pixfmt = "RGB8Packed";
break;
case 0x02180015:
genicam_pixfmt = "BGR8Packed";
break;
case 0x0210001F:
genicam_pixfmt = "YUV422Packed";
break;
case 0x02180020:
genicam_pixfmt = "YUV444Packed";
break;
default:
GST_ELEMENT_ERROR(src, RESOURCE, TOO_LAZY, ("Unrecognized PixelFormat enum value: %d", pixfmt_enum),
(NULL));
goto error;
}
/* create caps */
if (src->caps) {
gst_caps_unref(src->caps);
src->caps = NULL;
}
src->caps = gst_genicam_pixel_format_caps_from_pixel_format(genicam_pixfmt, G_LITTLE_ENDIAN, width, height, 30, 1, 1, 1);
gst_video_info_from_caps(&vinfo, src->caps);
if (!src->caps) {
GST_ELEMENT_ERROR(src, STREAM, WRONG_TYPE,
("Unknown or unsupported pixel format (%s).", genicam_pixfmt), (NULL));
goto error;
}
src->height = vinfo.height;
src->gst_stride = GST_VIDEO_INFO_COMP_STRIDE(&vinfo, 0);
} }
if (!gst_gentlsrc_prepare_buffers (src)) { if (!gst_gentlsrc_prepare_buffers (src)) {
@ -1087,45 +1140,6 @@ gst_gentlsrc_start (GstBaseSrc * bsrc)
HANDLE_GTL_ERROR ("Failed to start device acquisition"); HANDLE_GTL_ERROR ("Failed to start device acquisition");
} }
/* create caps */
if (src->caps) {
gst_caps_unref (src->caps);
src->caps = NULL;
}
gst_video_info_init (&vinfo);
if (bpp <= 8) {
gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_GRAY8, width, height);
src->caps = gst_video_info_to_caps (&vinfo);
} else if (bpp > 8 && bpp <= 16) {
GValue val = G_VALUE_INIT;
GstStructure *s;
if (G_BYTE_ORDER == G_LITTLE_ENDIAN) {
gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_GRAY16_LE, width,
height);
} else if (G_BYTE_ORDER == G_BIG_ENDIAN) {
gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_GRAY16_BE, width,
height);
}
src->caps = gst_video_info_to_caps (&vinfo);
/* set bpp, extra info for GRAY16 so elements can scale properly */
s = gst_caps_get_structure (src->caps, 0);
g_value_init (&val, G_TYPE_INT);
g_value_set_int (&val, bpp);
gst_structure_set_value (s, "bpp", &val);
g_value_unset (&val);
} else {
GST_ELEMENT_ERROR (src, STREAM, WRONG_TYPE,
("Unknown or unsupported bit depth (%d).", bpp), (NULL));
return FALSE;
}
src->height = vinfo.height;
src->gst_stride = GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 0);
GST_DEBUG_OBJECT (src, "starting acquisition"); GST_DEBUG_OBJECT (src, "starting acquisition");
//TODO: start acquisition engine //TODO: start acquisition engine