This commit is contained in:
Joshua M. Doe 2010-04-26 09:51:17 -04:00
parent 93eb6a53cb
commit 91a8ce057e
2 changed files with 78 additions and 78 deletions

View File

@ -431,15 +431,15 @@ gst_niimaq_init (GstNiImaq * src, GstNiImaqClass * g_class)
static void static void
gst_niimaq_dispose (GObject * object) gst_niimaq_dispose (GObject * object)
{ {
GstNiImaq *src = GST_NIIMAQ (object); GstNiImaq *src = GST_NIIMAQ (object);
g_free (src->camera_name); g_free (src->camera_name);
src->camera_name = NULL; src->camera_name = NULL;
g_free (src->interface_name); g_free (src->interface_name);
src->interface_name = NULL; src->interface_name = NULL;
G_OBJECT_CLASS (parent_class)->dispose (object); G_OBJECT_CLASS (parent_class)->dispose (object);
} }
static void static void
@ -529,9 +529,9 @@ gst_niimaq_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
niimaq->height = height; niimaq->height = height;
niimaq->rate_numerator = rate_numerator; niimaq->rate_numerator = rate_numerator;
niimaq->rate_denominator = rate_denominator; niimaq->rate_denominator = rate_denominator;
niimaq->depth = depth; niimaq->depth = depth;
niimaq->bpp = bpp; niimaq->bpp = bpp;
niimaq->framesize = width * height * (depth/8); niimaq->framesize = width * height * (depth/8);
} }
return res; return res;
@ -578,9 +578,9 @@ gst_niimaq_create (GstPushSrc * psrc, GstBuffer ** buffer)
GST_INFO_OBJECT(src, "Examining buffer %d", src->cumbufnum); GST_INFO_OBJECT(src, "Examining buffer %d", src->cumbufnum);
rval=imgSessionExamineBuffer2(src->sid, src->cumbufnum, &newval, &bufaddr); rval=imgSessionExamineBuffer2(src->sid, src->cumbufnum, &newval, &bufaddr);
if (rval) { if (rval) {
GST_ELEMENT_ERROR (src, RESOURCE, FAILED, GST_ELEMENT_ERROR (src, RESOURCE, FAILED,
("failed to examine buffer %d", src->cumbufnum), ("failed to examine buffer %d", src->cumbufnum)); ("failed to examine buffer %d", src->cumbufnum), ("failed to examine buffer %d", src->cumbufnum));
goto error; goto error;
} }
memcpy (data, (guchar *) bufaddr, memcpy (data, (guchar *) bufaddr,
@ -606,8 +606,8 @@ gst_niimaq_create (GstPushSrc * psrc, GstBuffer ** buffer)
dropped = newval - src->cumbufnum; dropped = newval - src->cumbufnum;
if(dropped) { if(dropped) {
src->n_dropped_frames += dropped; src->n_dropped_frames += dropped;
GST_WARNING_OBJECT(src, "Dropped %d frames (%d total)",dropped,src->n_dropped_frames); GST_WARNING_OBJECT(src, "Dropped %d frames (%d total)",dropped,src->n_dropped_frames);
} }
src->cumbufnum = newval + 1; src->cumbufnum = newval + 1;
@ -670,9 +670,9 @@ gst_niimaq_set_caps_color (GstStructure * gs, int bpp, int depth)
gst_structure_set_name (gs, "video/x-raw-gray"); gst_structure_set_name (gs, "video/x-raw-gray");
gst_structure_set (gs, gst_structure_set (gs,
"bpp", G_TYPE_INT, bpp, "bpp", G_TYPE_INT, bpp,
"depth", G_TYPE_INT, depth, NULL); "depth", G_TYPE_INT, depth, NULL);
if(depth>8) if(depth>8)
gst_structure_set(gs, "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,NULL); gst_structure_set(gs, "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,NULL);
return ret; return ret;
} }
@ -703,22 +703,22 @@ gst_niimaq_get_all_niimaq_caps ()
gs = gst_structure_empty_new ("video"); gs = gst_structure_empty_new ("video");
gst_structure_set_name (gs, "video/x-raw-gray"); gst_structure_set_name (gs, "video/x-raw-gray");
gst_structure_set (gs, gst_structure_set (gs,
"width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
"height", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT,
"bpp", GST_TYPE_INT_RANGE, 10, 16, "bpp", GST_TYPE_INT_RANGE, 10, 16,
"depth", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16,
"endianness", G_TYPE_INT, G_LITTLE_ENDIAN, "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
gst_caps_append_structure (gcaps, gs); gst_caps_append_structure (gcaps, gs);
gs = gst_structure_empty_new ("video"); gs = gst_structure_empty_new ("video");
gst_structure_set_name (gs, "video/x-raw-gray"); gst_structure_set_name (gs, "video/x-raw-gray");
gst_structure_set (gs, gst_structure_set (gs,
"width", GST_TYPE_INT_RANGE, 1, G_MAXINT, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
"height", GST_TYPE_INT_RANGE, 1, G_MAXINT, "height", GST_TYPE_INT_RANGE, 1, G_MAXINT,
"bpp", G_TYPE_INT, 8, "bpp", G_TYPE_INT, 8,
"depth", G_TYPE_INT, 8, "depth", G_TYPE_INT, 8,
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
gst_caps_append_structure (gcaps, gs); gst_caps_append_structure (gcaps, gs);
return gcaps; return gcaps;
@ -751,15 +751,15 @@ gst_niimaq_get_cam_caps (GstNiImaq * src)
height = val; height = val;
if (rval) { if (rval) {
GST_ELEMENT_ERROR (src, STREAM, FAILED, GST_ELEMENT_ERROR (src, STREAM, FAILED,
("attempt to read attributes failed"), ("attempt to read attributes failed"),
("attempt to read attributes failed")); ("attempt to read attributes failed"));
goto error; goto error;
} }
gs = gst_structure_empty_new ("video"); gs = gst_structure_empty_new ("video");
if (!gst_niimaq_set_caps_color(gs, bpp, depth) || if (!gst_niimaq_set_caps_color(gs, bpp, depth) ||
!gst_niimaq_set_caps_framesize(gs, width, height)) { !gst_niimaq_set_caps_framesize(gs, width, height)) {
GST_ELEMENT_ERROR (src, STREAM, FAILED, GST_ELEMENT_ERROR (src, STREAM, FAILED,
("attempt to set caps %dx%dx%d (%d) failed", width,height,depth, bpp), ("attempt to set caps %dx%dx%d (%d) failed", width,height,depth, bpp),
("attempt to set caps %dx%dx%d (%d) failed", width,height,depth, bpp)); ("attempt to set caps %dx%dx%d (%d) failed", width,height,depth, bpp));
@ -796,39 +796,39 @@ gst_niimaq_start (GstBaseSrc * src)
rval=imgInterfaceOpen(filter->interface_name,&(filter->iid)); rval=imgInterfaceOpen(filter->interface_name,&(filter->iid));
if (rval) { if (rval) {
GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to open camera interface"), GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to open camera interface"),
("Failed to open camera interface %s", filter->interface_name)); ("Failed to open camera interface %s", filter->interface_name));
goto error; goto error;
} }
GST_LOG_OBJECT (filter, "Opening camera session: %s", filter->interface_name); GST_LOG_OBJECT (filter, "Opening camera session: %s", filter->interface_name);
rval=imgSessionOpen(filter->iid, &(filter->sid)); rval=imgSessionOpen(filter->iid, &(filter->sid));
if (rval) { if (rval) {
GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to open camera session"), GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to open camera session"),
("Failed to open camera session %d", filter->sid)); ("Failed to open camera session %d", filter->sid));
goto error; goto error;
} }
GST_LOG_OBJECT (filter, "Creating ring with %d buffers", filter->bufsize); GST_LOG_OBJECT (filter, "Creating ring with %d buffers", filter->bufsize);
filter->buflist = g_new(guint32*, filter->bufsize); filter->buflist = g_new(guint32*, filter->bufsize);
for(i=0;i<filter->bufsize;i++) { for(i=0;i<filter->bufsize;i++) {
filter->buflist[i] = 0; filter->buflist[i] = 0;
} }
rval=imgRingSetup(filter->sid, filter->bufsize, (void**)(filter->buflist), 0, FALSE); rval=imgRingSetup(filter->sid, filter->bufsize, (void**)(filter->buflist), 0, FALSE);
if(rval) { if(rval) {
GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to create ring buffer"), GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to create ring buffer"),
("Failed to create ring buffer with %d buffers", filter->bufsize)); ("Failed to create ring buffer with %d buffers", filter->bufsize));
goto error; goto error;
} }
//GST_LOG_OBJECT (filter, "Registering callback functions"); //GST_LOG_OBJECT (filter, "Registering callback functions");
//rval=imgSessionWaitSignalAsync2(filter->sid, IMG_SIGNAL_STATUS, IMG_BUF_COMPLETE, IMG_SIGNAL_STATE_RISING, Imaq_BUF_COMPLETE, filter); //rval=imgSessionWaitSignalAsync2(filter->sid, IMG_SIGNAL_STATUS, IMG_BUF_COMPLETE, IMG_SIGNAL_STATE_RISING, Imaq_BUF_COMPLETE, filter);
//if(rval) { //if(rval) {
// GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to register BUF_COMPLETE callback"), // GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to register BUF_COMPLETE callback"),
// ("Failed to register BUF_COMPLETE callback")); // ("Failed to register BUF_COMPLETE callback"));
// goto error; // goto error;
//} //}
GST_LOG_OBJECT (filter, "Starting acquisition"); GST_LOG_OBJECT (filter, "Starting acquisition");
@ -837,19 +837,19 @@ gst_niimaq_start (GstBaseSrc * src)
i = 0; i = 0;
while (rval != 0 && i++ < 5) { while (rval != 0 && i++ < 5) {
g_usleep (50000); g_usleep (50000);
if (rval=imgSessionStartAcquisition(filter->sid)) { if (rval=imgSessionStartAcquisition(filter->sid)) {
if (rval != 0) { if (rval != 0) {
GST_LOG_OBJECT (src, "camera is still off , retrying"); GST_LOG_OBJECT (src, "camera is still off , retrying");
} }
} }
} }
if (i >= 5) { if (i >= 5) {
GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, GST_ELEMENT_ERROR (filter, RESOURCE, FAILED,
("Camera doesn't seem to want to turn on!"), ("Camera doesn't seem to want to turn on!"),
("Camera doesn't seem to want to turn on!")); ("Camera doesn't seem to want to turn on!"));
goto error; goto error;
} }
GST_LOG_OBJECT (src, "got transmision status ON"); GST_LOG_OBJECT (src, "got transmision status ON");
@ -859,10 +859,10 @@ gst_niimaq_start (GstBaseSrc * src)
error: error:
if(filter->sid) if(filter->sid)
imgClose(filter->sid,TRUE); imgClose(filter->sid,TRUE);
filter->sid = 0; filter->sid = 0;
if(filter->iid) if(filter->iid)
imgClose(filter->iid,TRUE); imgClose(filter->iid,TRUE);
filter->iid = 0; filter->iid = 0;
return FALSE;; return FALSE;;
@ -872,39 +872,39 @@ error:
gboolean gst_niimaq_stop( GstBaseSrc * src ) gboolean gst_niimaq_stop( GstBaseSrc * src )
{ {
GstNiImaq* filter = GST_NIIMAQ(src); GstNiImaq* filter = GST_NIIMAQ(src);
Int32 rval; Int32 rval;
rval=imgSessionStopAcquisition(filter->sid); rval=imgSessionStopAcquisition(filter->sid);
if (rval) { if (rval) {
GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Unable to stop transmision"), GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Unable to stop transmision"),
("Unable to stop transmision")); ("Unable to stop transmision"));
} }
if(filter->sid) if(filter->sid)
imgClose(filter->sid,TRUE); imgClose(filter->sid,TRUE);
filter->sid = 0; filter->sid = 0;
if(filter->iid) if(filter->iid)
imgClose(filter->iid,TRUE); imgClose(filter->iid,TRUE);
filter->iid = 0; filter->iid = 0;
GST_DEBUG_OBJECT (filter, "Capture stoped"); GST_DEBUG_OBJECT (filter, "Capture stoped");
return TRUE; return TRUE;
} }
static gboolean static gboolean
plugin_init (GstPlugin * plugin) plugin_init (GstPlugin * plugin)
{ {
GST_DEBUG_CATEGORY_INIT (niimaq_debug, "niimaqsrc", 0, "NI-IMAQ interface"); GST_DEBUG_CATEGORY_INIT (niimaq_debug, "niimaqsrc", 0, "NI-IMAQ interface");
return gst_element_register (plugin, "niimaqsrc", GST_RANK_NONE, return gst_element_register (plugin, "niimaqsrc", GST_RANK_NONE,
GST_TYPE_NIIMAQ); GST_TYPE_NIIMAQ);
} }
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR, GST_VERSION_MINOR,
"niimaq", "niimaq",
"NI-IMAQ Video Source", "NI-IMAQ Video Source",
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)

View File

@ -58,9 +58,9 @@ struct _GstNiImaq {
gint rate_denominator; gint rate_denominator;
/* private */ /* private */
gint64 timestamp_offset; /* base offset */ gint64 timestamp_offset; /* base offset */
GstClockTime running_time; /* total running time */ GstClockTime running_time; /* total running time */
gint64 n_frames; /* total frames sent */ gint64 n_frames; /* total frames sent */
uInt32 cumbufnum; uInt32 cumbufnum;
gint64 n_dropped_frames; gint64 n_dropped_frames;
gboolean segment; gboolean segment;