[Libva] [PATCH] Add callbacks for error and info messages.

Emmanuel Gil Peyrot linkmauve at linkmauve.fr
Wed Oct 19 12:37:36 UTC 2016


This lets any application using libva choose the best way to report
info and error messages to the user, for example graphical application
can open a popup on errors and write info messages in the toolbar.

Signed-off-by: Emmanuel Gil Peyrot <linkmauve at linkmauve.fr>
---
 va/sysdeps.h | 20 --------------------
 va/va.c      | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 va/va.h      | 15 +++++++++++++++
 3 files changed, 68 insertions(+), 20 deletions(-)

diff --git a/va/sysdeps.h b/va/sysdeps.h
index 4de764d..164a274 100644
--- a/va/sysdeps.h
+++ b/va/sysdeps.h
@@ -46,26 +46,6 @@
 
 /* Android logging utilities */
 # include <utils/Log.h>
-
-# ifdef ANDROID_ALOG
-#  define va_log_error(buffer)  do { ALOGE("%s", buffer); } while (0)
-#  define va_log_info(buffer)   do { ALOGI("%s", buffer); } while (0)
-# elif ANDROID_LOG
-#  define va_log_error(buffer)  do { LOGE("%s", buffer); } while (0)
-#  define va_log_info(buffer)   do { LOGI("%s", buffer); } while (0)
-# endif
-#endif
-
-#ifndef va_log_error
-#define va_log_error(buffer) do {                       \
-        fprintf(stderr, "libva error: %s", buffer);     \
-    } while (0)
-#endif
-
-#ifndef va_log_info
-#define va_log_info(buffer) do {                        \
-        fprintf(stderr, "libva info: %s", buffer);      \
-    } while (0)
 #endif
 
 #if defined __GNUC__ && defined HAVE_GNUC_VISIBILITY_ATTRIBUTE
diff --git a/va/va.c b/va/va.c
index b524fc7..5cf7220 100644
--- a/va/va.c
+++ b/va/va.c
@@ -106,12 +106,62 @@ int vaDisplayIsValid(VADisplay dpy)
     return pDisplayContext && (pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC) && pDisplayContext->vaIsValid(pDisplayContext);
 }
 
+static void default_log_error(const char *buffer)
+{
+# ifdef ANDROID_ALOG
+    ALOGE("%s", buffer);
+# elif ANDROID_LOG
+    LOGE("%s", buffer);
+# else
+    fprintf(stderr, "libva error: %s", buffer);
+# endif
+}
+
+static void default_log_info(const char *buffer)
+{
+# ifdef ANDROID_ALOG
+    ALOGI("%s", buffer);
+# elif ANDROID_LOG
+    LOGI("%s", buffer);
+# else
+    fprintf(stderr, "libva info: %s", buffer);
+# endif
+}
+
+static vaMessageCallback va_log_error = default_log_error;
+static vaMessageCallback va_log_info = default_log_info;
+
+/**
+ * Set the callback for error messages, or NULL for no logging.
+ * Returns the previous one, or NULL if it was disabled.
+ */
+vaMessageCallback vaSetErrorCallback(vaMessageCallback callback)
+{
+    vaMessageCallback old_callback = va_log_error;
+    va_log_error = callback;
+    return old_callback;
+}
+
+/**
+ * Set the callback for info messages, or NULL for no logging.
+ * Returns the previous one, or NULL if it was disabled.
+ */
+vaMessageCallback vaSetInfoCallback(vaMessageCallback callback)
+{
+    vaMessageCallback old_callback = va_log_info;
+    va_log_info = callback;
+    return old_callback;
+}
+
 void va_errorMessage(const char *msg, ...)
 {
     char buf[512], *dynbuf;
     va_list args;
     int n, len;
 
+    if (va_log_error == NULL)
+        return;
+
     va_start(args, msg);
     len = vsnprintf(buf, sizeof(buf), msg, args);
     va_end(args);
@@ -137,6 +187,9 @@ void va_infoMessage(const char *msg, ...)
     va_list args;
     int n, len;
 
+    if (va_log_info == NULL)
+        return;
+
     va_start(args, msg);
     len = vsnprintf(buf, sizeof(buf), msg, args);
     va_end(args);
diff --git a/va/va.h b/va/va.h
index 665aafb..88628a8 100644
--- a/va/va.h
+++ b/va/va.h
@@ -230,6 +230,21 @@ typedef struct _VARectangle
     unsigned short height;
 } VARectangle;
 
+/** Type of a message callback, used for both error and info log. */
+typedef void (*vaMessageCallback)(const char *message);
+
+/**
+ * Set the callback for error messages, or NULL for no logging.
+ * Returns the previous one, or NULL if it was disabled.
+ */
+vaMessageCallback vaSetErrorCallback(vaMessageCallback);
+
+/**
+ * Set the callback for info messages, or NULL for no logging.
+ * Returns the previous one, or NULL if it was disabled.
+ */
+vaMessageCallback vaSetInfoCallback(vaMessageCallback);
+
 /**
  * Initialization:
  * A display must be obtained by calling vaGetDisplay() before calling
-- 
2.10.0



More information about the Libva mailing list