v4l2-util: Introduce GstV4l2Error
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 7 Jun 2016 20:01:55 +0000 (16:01 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 7 Jun 2016 21:02:34 +0000 (17:02 -0400)
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
sys/v4l2/v4l2-utils.h

index 899c191..ce364a0 100644 (file)
@@ -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);
+}
index 9a73bd9..1bc0062 100644 (file)
 
 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__ */