From e228430788c920cba8812021d2ed12061951a81a Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Tue, 7 Jun 2016 16:01:55 -0400 Subject: [PATCH] v4l2-util: Introduce GstV4l2Error This is to allow returning an error that can easily be sent as message to the application if the element needs it. Using this also allow ignoring errors. https://bugzilla.gnome.org/show_bug.cgi?id=766172 --- sys/v4l2/v4l2-utils.c | 35 +++++++++++++++++++++++++++++++++++ sys/v4l2/v4l2-utils.h | 28 ++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) 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__ */