niimaqdx: add BayerBG8 support

This commit is contained in:
Joshua M. Doe 2013-01-29 11:19:03 -05:00
parent a5171fe410
commit 6c23f87572
2 changed files with 52 additions and 15 deletions

View File

@ -150,22 +150,40 @@ gst_niimaqdxsrc_frame_done_callback (IMAQdxSession session, uInt32 bufferNumber,
return 1;
}
typedef struct
{
const char *pixel_format;
const char *gst_caps_string;
int bpp;
int depth;
} ImaqDxCapsInfo;
#define GST_VIDEO_CAPS_BAYER(format) \
"video/x-raw-bayer, " \
"format = " format "," \
"width = " GST_VIDEO_SIZE_RANGE ", " \
"height = " GST_VIDEO_SIZE_RANGE ", " \
"framerate = " GST_VIDEO_FPS_RANGE
ImaqDxCapsInfo imaq_dx_caps_infos[] = {
{"Mono 8", GST_VIDEO_CAPS_GRAY8, 8, 8},
{"Mono 8", GST_VIDEO_CAPS_GRAY8, 8, 8, 4}
,
//TODO: for packed formats, should we unpack?
//{"Mono 12 Packed", GST_VIDEO_CAPS_GRAY16 ("BIG_ENDIAN"), 16, 16},
{"Mono 16", GST_VIDEO_CAPS_GRAY16 ("BIG_ENDIAN"), 16, 16},
{"YUV 422 Packed", GST_VIDEO_CAPS_YUV ("UYVY"), 16, 16}
{"Mono 16", GST_VIDEO_CAPS_GRAY16 ("BIG_ENDIAN"), 16, 16, 4}
,
{"YUV 422 Packed", GST_VIDEO_CAPS_YUV ("UYVY"), 16, 16, 4}
,
{"Bayer BG 8", GST_VIDEO_CAPS_BAYER ("bggr"), 8, 8, 1}
,
//TODO: use a caps string that agrees with Aravis
{"Bayer BG 16", GST_VIDEO_CAPS_BAYER ("bggr16"), 16, 16, 1}
};
static ImaqDxCapsInfo *
gst_niimaqdxsrc_get_caps_info (const char *pixel_format)
{
int i;
for (i = 0; i < G_N_ELEMENTS (imaq_dx_caps_infos); i++) {
if (g_strcmp0 (pixel_format, imaq_dx_caps_infos[i].pixel_format) == 0)
return &imaq_dx_caps_infos[i];
}
return NULL;
}
static const char *
gst_niimaqdxsrc_pixel_format_to_caps_string (const char *pixel_format)
{
@ -680,6 +698,8 @@ gst_niimaqdxsrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
pixel_format = gst_niimaqdxsrc_pixel_format_from_caps (caps);
g_assert (pixel_format);
niimaqdxsrc->caps_info = gst_niimaqdxsrc_get_caps_info (pixel_format);
niimaqdxsrc->dx_row_stride =
gst_niimaqdxsrc_pixel_format_get_stride (pixel_format,
niimaqdxsrc->width);
@ -771,6 +791,8 @@ gst_niimaqdxsrc_get_timestamp_from_buffer_number (GstNiImaqDxSrc * niimaqdxsrc,
return abstime;
}
#define ROUND_UP_N(num, n) (((num)+((n)-1))&~((n)-1))
static GstFlowReturn
gst_niimaqdxsrc_create (GstPushSrc * psrc, GstBuffer ** buffer)
{
@ -781,6 +803,7 @@ gst_niimaqdxsrc_create (GstPushSrc * psrc, GstBuffer ** buffer)
uInt32 copied_number;
IMAQdxError rval;
uInt32 dropped;
gboolean do_align_stride;
/* start the IMAQ acquisition session if we haven't done so yet */
if (!niimaqdxsrc->session_started) {
@ -803,8 +826,11 @@ gst_niimaqdxsrc_create (GstPushSrc * psrc, GstBuffer ** buffer)
goto error;
}
do_align_stride =
(niimaqdxsrc->dx_row_stride % niimaqdxsrc->caps_info->row_multiple) != 0;
g_mutex_lock (niimaqdxsrc->mutex);
if ((niimaqdxsrc->dx_row_stride & 0x3) == 0) {
if (!do_align_stride) {
// we have properly aligned strides, copy directly to buffer
rval = IMAQdxGetImageData (niimaqdxsrc->session, GST_BUFFER_DATA (*buffer),
GST_BUFFER_SIZE (*buffer), IMAQdxBufferNumberModeBufferNumber,
@ -822,16 +848,17 @@ gst_niimaqdxsrc_create (GstPushSrc * psrc, GstBuffer ** buffer)
g_mutex_unlock (niimaqdxsrc->mutex);
// adjust for row stride if needed (must be multiple of 4)
if ((niimaqdxsrc->dx_row_stride & 0x3) != 0) {
if (do_align_stride) {
int i;
int dx_row_stride = niimaqdxsrc->dx_row_stride;
int gst_row_stride = GST_ROUND_UP_4 (dx_row_stride);
int gst_row_stride =
ROUND_UP_N (dx_row_stride, niimaqdxsrc->caps_info->row_multiple);
guint8 *src = niimaqdxsrc->temp_buffer;
guint8 *dst = GST_BUFFER_DATA (*buffer);
GST_LOG_OBJECT (niimaqdxsrc,
"Row stride (%d) not a multiple of 4, need to copy data",
dx_row_stride);
"Row stride not aligned, copying %d -> %d",
dx_row_stride, gst_row_stride);
for (i = 0; i < niimaqdxsrc->height; i++)
memcpy (dst + i * gst_row_stride, src + i * dx_row_stride, dx_row_stride);
}

View File

@ -46,6 +46,15 @@ G_BEGIN_DECLS
typedef struct _GstNiImaqDxSrc GstNiImaqDxSrc;
typedef struct _GstNiImaqDxSrcClass GstNiImaqDxSrcClass;
typedef struct
{
const char *pixel_format;
const char *gst_caps_string;
int bpp;
int depth;
int row_multiple;
} ImaqDxCapsInfo;
struct _GstNiImaqDxSrc {
GstPushSrc element;
@ -59,6 +68,7 @@ struct _GstNiImaqDxSrc {
int dx_row_stride;
gint framesize;
guint8 *temp_buffer;
const ImaqDxCapsInfo *caps_info;
gint64 n_frames; /* total frames sent */
uInt32 cumbufnum;