diff --git a/sys/v4l2/v4l2-utils.c b/sys/v4l2/v4l2-utils.c index 899c19119d..ce364a0a06 100644 --- a/sys/v4l2/v4l2-utils.c +++ b/sys/v4l2/v4l2-utils.c @@ -164,3 +164,38 @@ gst_v4l2_iterator_free (GstV4l2Iterator * _it) } #endif + +void +gst_v4l2_clear_error (GstV4l2Error * v4l2err) +{ + if (v4l2err) { + g_clear_error (&v4l2err->error); + g_free (v4l2err->dbg_message); + } +} + +void +gst_v4l2_error (gpointer element, GstV4l2Error * v4l2err) +{ + GError *error; + + if (!v4l2err || !v4l2err->error) + return; + + error = v4l2err->error; + + if (error->message) + GST_WARNING_OBJECT (element, "error: %s", error->message); + + if (v4l2err->dbg_message) + GST_WARNING_OBJECT (element, "error: %s", v4l2err->dbg_message); + + gst_element_message_full (GST_ELEMENT (element), GST_MESSAGE_ERROR, + error->domain, error->code, error->message, v4l2err->dbg_message, + v4l2err->file, v4l2err->func, v4l2err->line); + + error->message = NULL; + v4l2err->dbg_message = NULL; + + gst_v4l2_clear_error (v4l2err); +} diff --git a/sys/v4l2/v4l2-utils.h b/sys/v4l2/v4l2-utils.h index 9a73bd9139..1bc0062f15 100644 --- a/sys/v4l2/v4l2-utils.h +++ b/sys/v4l2/v4l2-utils.h @@ -26,7 +26,23 @@ G_BEGIN_DECLS +#define GST_V4L2_ERROR_INIT { NULL, NULL } +#define GST_V4L2_ERROR(v4l2err,domain,code,msg,dbg) \ +{\ + if (v4l2err) { \ + gchar *_msg = _gst_element_error_printf msg; \ + v4l2err->error = g_error_new_literal (GST_##domain##_ERROR, \ + GST_##domain##_ERROR_##code, _msg); \ + g_free (_msg); \ + v4l2err->dbg_message = _gst_element_error_printf dbg; \ + v4l2err->file = __FILE__; \ + v4l2err->func = GST_FUNCTION; \ + v4l2err->line = __LINE__; \ + } \ +} + typedef struct _GstV4l2Iterator GstV4l2Iterator; +typedef struct _GstV4l2Error GstV4l2Error; struct _GstV4l2Iterator { @@ -35,6 +51,15 @@ struct _GstV4l2Iterator const gchar *sys_path; }; +struct _GstV4l2Error +{ + GError *error; + gchar *dbg_message; + const gchar *file; + const gchar *func; + gint line; +}; + GstV4l2Iterator * gst_v4l2_iterator_new (void); gboolean gst_v4l2_iterator_next (GstV4l2Iterator *it); void gst_v4l2_iterator_free (GstV4l2Iterator *it); @@ -43,6 +68,9 @@ const gchar * gst_v4l2_iterator_get_device_path (GstV4l2Iterator *it); const gchar * gst_v4l2_iterator_get_device_name (GstV4l2Iterator *it); const gchar * gst_v4l2_iterator_get_sys_path (GstV4l2Iterator *it); +void gst_v4l2_clear_error (GstV4l2Error *error); +void gst_v4l2_error (gpointer element, GstV4l2Error *error); + G_END_DECLS #endif /* __V4L2_UTILS_H__ */