}
#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);
+}
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
{
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);
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__ */