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
This commit is contained in:
Nicolas Dufresne 2016-06-07 16:01:55 -04:00
parent ec169a1517
commit e228430788
2 changed files with 63 additions and 0 deletions

View 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);
}

View file

@ -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__ */