It support syslog(3) and android-specific logging.
---
 configure       |   5 ++
 libavutil/log.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++---------
 libavutil/log.h |  14 ++++++
 3 files changed, 147 insertions(+), 24 deletions(-)

diff --git a/configure b/configure
index 03742f0..a74b4b2 100755
--- a/configure
+++ b/configure
@@ -1365,6 +1365,7 @@ HAVE_LIST_PUB="
 HEADERS_LIST="
     alsa_asoundlib_h
     altivec_h
+    android_log_h
     arpa_inet_h
     cdio_paranoia_h
     cdio_paranoia_paranoia_h
@@ -1393,6 +1394,7 @@ HEADERS_LIST="
     sys_time_h
     sys_un_h
     sys_videoio_h
+    syslog_h
     unistd_h
     windows_h
     winsock2_h
@@ -4042,6 +4044,7 @@ check_header sys/resource.h
 check_header sys/select.h
 check_header sys/time.h
 check_header sys/un.h
+check_header syslog.h
 check_header unistd.h
 check_header vdpau/vdpau.h
 check_header vdpau/vdpau_x11.h
@@ -4049,6 +4052,8 @@ check_header VideoDecodeAcceleration/VDADecoder.h
 check_header windows.h
 check_header X11/extensions/XvMClib.h
 
+check_lib2 "android/log.h" __android_log_print -llog
+
 check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
 check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
 check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
diff --git a/libavutil/log.c b/libavutil/log.c
index 5a8f293..2d15e50 100644
--- a/libavutil/log.c
+++ b/libavutil/log.c
@@ -26,6 +26,14 @@
 
 #include "config.h"
 
+#if HAVE_ANDROID_LOG_H
+#include <android/log.h>
+#endif
+
+#if HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
+
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
@@ -110,16 +118,118 @@ const char *av_default_item_name(void *ptr)
     return (*(AVClass **) ptr)->class_name;
 }
 
-void av_log_default_callback(void *avcl, int level, const char *fmt, va_list 
vl)
+/*
+void av_log_syslog_callback(void *avcl, int level, const char *fmt, va_list vl)
+{
+
+
+}
+*/
+
+#define LINE_SIZE 1024
+static int print_prefix = 1;
+static int count;
+static char prev[LINE_SIZE];
+static int is_atty;
+
+static void default_print(int level, const char *line)
 {
-    static int print_prefix = 1;
-    static int count;
-    static char prev[1024];
-    char line[1024];
-    static int is_atty;
-    AVClass* avc = avcl ? *(AVClass **) avcl : NULL;
     unsigned tint = level & 0xff00;
 
+#if HAVE_ISATTY
+    if (!is_atty)
+        is_atty = isatty(2) ? 1 : -1;
+#endif
+
+    if (print_prefix && (flags & AV_LOG_SKIP_REPEATED) &&
+        !strncmp(line, prev, LINE_SIZE)) {
+        count++;
+        if (is_atty == 1)
+            fprintf(stderr, "    Last message repeated %d times\r", count);
+        return;
+    }
+    if (count > 0) {
+        fprintf(stderr, "    Last message repeated %d times\n", count);
+        count = 0;
+    }
+    colored_fputs(av_clip(level >> 3, 0, 6), tint >> 8, line);
+    av_strlcpy(prev, line, LINE_SIZE);
+}
+
+#if HAVE_ANDROID_LOG_H
+
+static void syslog_print(int level, const char *line)
+{
+    switch(level) {
+    case AV_LOG_PANIC:
+    case AV_LOG_FATAL:
+        level = ANDROID_LOG_FATAL;
+        break;
+    case AV_LOG_ERROR:
+        level = ANDROID_LOG_ERROR;
+        break;
+    case AV_LOG_WARNING:
+        level = ANDROID_LOG_WARN;
+        break;
+    case AV_LOG_INFO:
+        level = ANDROID_LOG_INFO;
+        break;
+    case AV_LOG_VERBOSE:
+        level = ANDROID_LOG_VERBOSE;
+        break;
+    case AV_LOG_DEBUG:
+        level = ANDROID_LOG_DEBUG;
+        break;
+    default:
+        level = ANDROID_LOG_INFO;
+    }
+
+    return __android_log_print(level, "libav", "%s", line);
+}
+
+#elif HAVE_SYSLOG_H
+
+static void syslog_print(int level, const char *line)
+{
+    switch(level) {
+    case AV_LOG_PANIC:
+        level = LOG_EMERG;
+        break;
+    case AV_LOG_FATAL:
+        level = LOG_CRIT;
+        break;
+    case AV_LOG_ERROR:
+        level = LOG_ERR;
+        break;
+    case AV_LOG_WARNING:
+        level = LOG_WARNING;
+        break;
+    case AV_LOG_INFO:
+        level = LOG_NOTICE;
+        break;
+    case AV_LOG_VERBOSE:
+        level = LOG_INFO;
+        break;
+    case AV_LOG_DEBUG:
+        level = LOG_DEBUG;
+        break;
+    default:
+        level = LOG_INFO;
+    }
+
+    syslog(level, "%s", line);
+}
+
+#else
+static void (*syslog_print)(int, const char *) = default_print;
+#endif
+
+static void log_format(void *avcl, int level, const char *fmt, va_list vl,
+                       void (*print)(int level, const char *line))
+{
+    char line[LINE_SIZE];
+    AVClass* avc = avcl ? *(AVClass **) avcl : NULL;
+
     level &= 0xff;
 
     if (level > av_log_level)
@@ -142,26 +252,20 @@ void av_log_default_callback(void *avcl, int level, const 
char *fmt, va_list vl)
 
     print_prefix = strlen(line) && line[strlen(line) - 1] == '\n';
 
-#if HAVE_ISATTY
-    if (!is_atty)
-        is_atty = isatty(2) ? 1 : -1;
-#endif
+    print(level, line);
+}
 
-    if (print_prefix && (flags & AV_LOG_SKIP_REPEATED) &&
-        !strncmp(line, prev, sizeof line)) {
-        count++;
-        if (is_atty == 1)
-            fprintf(stderr, "    Last message repeated %d times\r", count);
-        return;
-    }
-    if (count > 0) {
-        fprintf(stderr, "    Last message repeated %d times\n", count);
-        count = 0;
-    }
-    colored_fputs(av_clip(level >> 3, 0, 6), tint >> 8, line);
-    av_strlcpy(prev, line, sizeof line);
+void av_log_default_callback(void *avcl, int level, const char *fmt, va_list 
vl)
+{
+    log_format(avcl, level, fmt, vl, default_print);
 }
 
+void av_log_syslog_callback(void *avcl, int level, const char *fmt, va_list vl)
+{
+    log_format(avcl, level, fmt, vl, syslog_print);
+}
+
+
 static void (*av_log_callback)(void*, int, const char*, va_list) =
     av_log_default_callback;
 
diff --git a/libavutil/log.h b/libavutil/log.h
index 4e4424a..4bab6a0 100644
--- a/libavutil/log.h
+++ b/libavutil/log.h
@@ -235,6 +235,20 @@ void av_log_default_callback(void *avcl, int level, const 
char *fmt,
                              va_list vl);
 
 /**
+ * Syslog logging callback
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ *        pointer to an AVClass struct.
+ * @param level The importance level of the message expressed using a @ref
+ *        lavu_log_constants "Logging Constant".
+ * @param fmt The format string (printf-compatible) that specifies how
+ *        subsequent arguments are converted to output.
+ * @param vl The arguments referenced by the format string.
+ */
+void av_log_syslog_callback(void *avcl, int level, const char *fmt,
+                            va_list vl);
+
+/**
  * Return the context name
  *
  * @param  ctx The AVClass context
-- 
1.9.0

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to