niimaqsrc: cleanup after stopping, and better error handling

This commit is contained in:
Joshua M. Doe 2012-07-16 01:12:44 -04:00
parent ff5ca051ea
commit 2dd264d533

View File

@ -99,7 +99,7 @@ static GstFlowReturn gst_niimaqsrc_create (GstPushSrc * psrc,
/* GstNiImaq methods */ /* GstNiImaq methods */
static GstCaps *gst_niimaqsrc_get_cam_caps (GstNiImaqSrc * src); static GstCaps *gst_niimaqsrc_get_cam_caps (GstNiImaqSrc * src);
static void gst_niimaqsrc_close_interface (GstNiImaqSrc * niimaqsrc); static gboolean gst_niimaqsrc_close_interface (GstNiImaqSrc * niimaqsrc);
uInt32 uInt32
gst_niimaqsrc_report_imaq_error (uInt32 code) gst_niimaqsrc_report_imaq_error (uInt32 code)
@ -1033,53 +1033,61 @@ gst_niimaqsrc_stop (GstBaseSrc * src)
{ {
GstNiImaqSrc *niimaqsrc = GST_NIIMAQSRC (src); GstNiImaqSrc *niimaqsrc = GST_NIIMAQSRC (src);
Int32 rval; Int32 rval;
gboolean result = TRUE;
/* stop IMAQ session */ /* stop IMAQ session */
if (niimaqsrc->session_started) { if (niimaqsrc->session_started) {
rval = imgSessionStopAcquisition (niimaqsrc->sid); rval = imgSessionStopAcquisition (niimaqsrc->sid);
if (rval) { if (rval != IMG_ERR_GOOD) {
gst_niimaqsrc_report_imaq_error (rval); gst_niimaqsrc_report_imaq_error (rval);
GST_ELEMENT_ERROR (niimaqsrc, RESOURCE, FAILED, GST_ELEMENT_ERROR (niimaqsrc, RESOURCE, FAILED,
("Unable to stop acquisition"), ("Unable to stop acquisition")); ("Unable to stop acquisition"), ("Unable to stop acquisition"));
result = FALSE;
} }
niimaqsrc->session_started = FALSE; niimaqsrc->session_started = FALSE;
GST_DEBUG_OBJECT (niimaqsrc, "Acquisition stopped"); GST_DEBUG_OBJECT (niimaqsrc, "Acquisition stopped");
} }
gst_niimaqsrc_close_interface (niimaqsrc); result &= gst_niimaqsrc_close_interface (niimaqsrc);
return TRUE; gst_niimaqsrc_reset (niimaqsrc);
return result;
} }
static gboolean static gboolean
gst_niimaqsrc_query (GstBaseSrc * src, GstQuery * query) gst_niimaqsrc_query (GstBaseSrc * src, GstQuery * query)
{ {
GstNiImaqSrc *niimaqsrc = GST_NIIMAQSRC (src); GstNiImaqSrc *niimaqsrc = GST_NIIMAQSRC (src);
gboolean res;
switch (GST_QUERY_TYPE (query)) { switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_LATENCY:{ case GST_QUERY_LATENCY:{
GstClockTime min_latency, max_latency;
if (!niimaqsrc->session_started) { if (!niimaqsrc->session_started) {
GST_WARNING_OBJECT (niimaqsrc, GST_WARNING_OBJECT (niimaqsrc,
"Can't give latency since device isn't open!"); "Can't give latency since device isn't open!");
return FALSE; res = FALSE;
} else {
GstClockTime min_latency, max_latency;
/* TODO: this is a ballpark figure, estimate from FVAL times */
min_latency = 33 * GST_MSECOND;
max_latency = 33 * GST_MSECOND * niimaqsrc->bufsize;
GST_DEBUG_OBJECT (niimaqsrc,
"report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
gst_query_set_latency (query, TRUE, min_latency, max_latency);
res = TRUE;
} }
/* TODO: this is a ballpark figure, estimate from FVAL times */
min_latency = 33 * GST_MSECOND;
max_latency = 33 * GST_MSECOND * niimaqsrc->bufsize;
GST_DEBUG_OBJECT (niimaqsrc,
"report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
gst_query_set_latency (query, TRUE, min_latency, max_latency);
return TRUE;
} }
default:
res = FALSE;
break;
} }
/*FIXME: return what value? */
return res;
} }
/** /**
@ -1089,24 +1097,34 @@ gst_niimaqsrc_query (GstBaseSrc * src, GstQuery * query)
* Close IMAQ session and interface * Close IMAQ session and interface
* *
*/ */
static void static gboolean
gst_niimaqsrc_close_interface (GstNiImaqSrc * niimaqsrc) gst_niimaqsrc_close_interface (GstNiImaqSrc * niimaqsrc)
{ {
Int32 rval; Int32 rval;
gboolean result = TRUE;
/* close IMAQ session and interface */ /* close IMAQ session and interface */
if (niimaqsrc->sid) { if (niimaqsrc->sid) {
rval = imgClose (niimaqsrc->sid, TRUE); rval = imgClose (niimaqsrc->sid, TRUE);
gst_niimaqsrc_report_imaq_error (rval); if (rval != IMG_ERR_GOOD) {
gst_niimaqsrc_report_imaq_error (rval);
result = FALSE;
} else
GST_LOG_OBJECT (niimaqsrc, "IMAQ session closed");
niimaqsrc->sid = 0; niimaqsrc->sid = 0;
GST_LOG_OBJECT (niimaqsrc, "IMAQ session closed");
} }
if (niimaqsrc->iid) { if (niimaqsrc->iid) {
rval = imgClose (niimaqsrc->iid, TRUE); rval = imgClose (niimaqsrc->iid, TRUE);
gst_niimaqsrc_report_imaq_error (rval); if (rval != IMG_ERR_GOOD) {
gst_niimaqsrc_report_imaq_error (rval);
result = FALSE;
} else {
GST_LOG_OBJECT (niimaqsrc, "IMAQ interface closed");
}
niimaqsrc->iid = 0; niimaqsrc->iid = 0;
GST_LOG_OBJECT (niimaqsrc, "IMAQ interface closed");
} }
return result;
} }
/** /**