[SCM] libav/experimental: log: Support for 256color terminals

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Aug 10 16:02:35 UTC 2014


The following commit has been merged in the experimental branch:
commit 7763118cae4eb468b032dbd29af15a011c2c233b
Author: Luca Barbato <lu_zero at gentoo.org>
Date:   Fri Apr 26 15:12:05 2013 +0200

    log: Support for 256color terminals
    
    And provide extended coloring capabilities for debugging.
    The default colors do not change in 256 more to keep
    supporting people using Black on White, White on Black and
    Solarized terminals.
    
    Signed-off-by: Luca Barbato <lu_zero at gentoo.org>

diff --git a/doc/APIchanges b/doc/APIchanges
index d800253..992a3b0 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil:     2013-12-xx
 
 API changes, most recent first:
 
+2014-04-xx - xxxxxxx - lavu 53.09.0 - log.h
+  Add AV_LOG(c) macro to have 256 color debug messages.
+
 2014-02-xx - xxxxxxx - lavu 53.08.0 - frame.h
   Add av_frame_remove_side_data() for removing a single side data
   instance from a frame.
diff --git a/libavutil/log.c b/libavutil/log.c
index 3cc811b..c447b5a 100644
--- a/libavutil/log.c
+++ b/libavutil/log.c
@@ -53,35 +53,50 @@ static HANDLE con;
 #else
 static const uint8_t color[] = { 0x41, 0x41, 0x11, 0x03, 9, 0x02, 0x06 };
 #define set_color(x)  fprintf(stderr, "\033[%d;3%dm", color[x] >> 4, color[x]&15)
+#define print_256color(x) fprintf(stderr, "\033[38;5;%dm", x)
 #define reset_color() fprintf(stderr, "\033[0m")
 #endif
 static int use_color = -1;
 
-static void colored_fputs(int level, const char *str)
+static void check_color_terminal(void)
 {
-    if (use_color < 0) {
 #if HAVE_SETCONSOLETEXTATTRIBUTE
-        CONSOLE_SCREEN_BUFFER_INFO con_info;
-        con = GetStdHandle(STD_ERROR_HANDLE);
-        use_color = (con != INVALID_HANDLE_VALUE) && !getenv("NO_COLOR") &&
-                    !getenv("AV_LOG_FORCE_NOCOLOR");
-        if (use_color) {
-            GetConsoleScreenBufferInfo(con, &con_info);
-            attr_orig  = con_info.wAttributes;
-            background = attr_orig & 0xF0;
-        }
+    CONSOLE_SCREEN_BUFFER_INFO con_info;
+    con = GetStdHandle(STD_ERROR_HANDLE);
+    use_color = (con != INVALID_HANDLE_VALUE) && !getenv("NO_COLOR") &&
+                !getenv("AV_LOG_FORCE_NOCOLOR");
+    if (use_color) {
+        GetConsoleScreenBufferInfo(con, &con_info);
+        attr_orig  = con_info.wAttributes;
+        background = attr_orig & 0xF0;
+    }
 #elif HAVE_ISATTY
-        use_color = !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR") &&
-                    (getenv("TERM") && isatty(2) ||
-                     getenv("AV_LOG_FORCE_COLOR"));
+    char *term = getenv("TERM");
+    use_color = !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR") &&
+                (getenv("TERM") && isatty(2) || getenv("AV_LOG_FORCE_COLOR"));
+    use_color += !!strstr(term, "256color") ;
 #else
-        use_color = getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") &&
-                   !getenv("AV_LOG_FORCE_NOCOLOR");
+    use_color = getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") &&
+               !getenv("AV_LOG_FORCE_NOCOLOR");
 #endif
-    }
+}
 
-    if (use_color) {
+static void colored_fputs(int level, int tint, const char *str)
+{
+    if (use_color < 0)
+        check_color_terminal();
+
+    switch (use_color) {
+    case 1:
+        set_color(level);
+        break;
+    case 2:
         set_color(level);
+        if (tint)
+            print_256color(tint);
+        break;
+    default:
+        break;
     }
     fputs(str, stderr);
     if (use_color) {
@@ -102,6 +117,10 @@ void av_log_default_callback(void *avcl, int level, const char *fmt, va_list vl)
     char line[1024];
     static int is_atty;
     AVClass* avc = avcl ? *(AVClass **) avcl : NULL;
+    int tint = av_clip(level >> 8, 0, 256);
+
+    level &= 0xff;
+
     if (level > av_log_level)
         return;
     line[0] = 0;
@@ -138,7 +157,7 @@ void av_log_default_callback(void *avcl, int level, const char *fmt, va_list vl)
         fprintf(stderr, "    Last message repeated %d times\n", count);
         count = 0;
     }
-    colored_fputs(av_clip(level >> 3, 0, 6), line);
+    colored_fputs(av_clip(level >> 3, 0, 6), tint, line);
     av_strlcpy(prev, line, sizeof line);
 }
 
diff --git a/libavutil/log.h b/libavutil/log.h
index 6d26b67..2f7811c 100644
--- a/libavutil/log.h
+++ b/libavutil/log.h
@@ -144,6 +144,14 @@ typedef struct AVClass {
 #define AV_LOG_DEBUG    48
 
 /**
+ * Sets additional colors for extended debugging sessions.
+ * Requires 256color terminal support. Use outside debugging is not
+ * recommended.
+ */
+
+#define AV_LOG_C(x) (x << 8)
+
+/**
  * @}
  */
 
diff --git a/libavutil/version.h b/libavutil/version.h
index 7f439d7..f8bb447 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -54,7 +54,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR 53
-#define LIBAVUTIL_VERSION_MINOR  8
+#define LIBAVUTIL_VERSION_MINOR  9
 #define LIBAVUTIL_VERSION_MICRO  0
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list