niimaqsrc: cleanup after stopping, and better error handling
This commit is contained in:
parent
ff5ca051ea
commit
2dd264d533
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user