[FFmpeg-devel] [PATCH] lavu: 256 color support

Paul B Mahol onemda at gmail.com
Wed Jul 4 19:25:39 CEST 2012


Signed-off-by: Paul B Mahol <onemda at gmail.com>
---

Feel free to propose better colors.

There is nice perl script to show colors.
http://www.vim.org/scripts/script.php?script_id=1349

Needs xterm compiled with --enable-256-color.

---
 libavutil/log.c            |   48 +++++++++++++++++++++++++------------------
 libavutil/log.h            |    2 +
 libswresample/swresample.c |    1 +
 libswscale/options.c       |    1 +
 4 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/libavutil/log.c b/libavutil/log.c
index a08223e..4e28f13 100644
--- a/libavutil/log.c
+++ b/libavutil/log.c
@@ -58,6 +58,8 @@ static const uint8_t color[16 + AV_CLASS_CATEGORY_NB] = {
     [16+AV_CLASS_CATEGORY_DECODER         ] =  3,
     [16+AV_CLASS_CATEGORY_FILTER          ] = 10,
     [16+AV_CLASS_CATEGORY_BITSTREAM_FILTER] =  9,
+    [16+AV_CLASS_CATEGORY_SWSCALER        ] =  7,
+    [16+AV_CLASS_CATEGORY_SWRESAMPLER     ] =  7,
 };
 
 static int16_t background, attr_orig;
@@ -66,26 +68,29 @@ static HANDLE con;
 #define reset_color() SetConsoleTextAttribute(con, attr_orig)
 #else
 
-static const uint8_t color[16 + AV_CLASS_CATEGORY_NB] = {
-    [AV_LOG_PANIC  /8] = 0x41,
-    [AV_LOG_FATAL  /8] = 0x41,
-    [AV_LOG_ERROR  /8] = 0x11,
-    [AV_LOG_WARNING/8] = 0x03,
-    [AV_LOG_INFO   /8] =    9,
-    [AV_LOG_VERBOSE/8] = 0x02,
-    [AV_LOG_DEBUG  /8] = 0x02,
-    [16+AV_CLASS_CATEGORY_NA              ] =    9,
-    [16+AV_CLASS_CATEGORY_INPUT           ] = 0x15,
-    [16+AV_CLASS_CATEGORY_OUTPUT          ] = 0x05,
-    [16+AV_CLASS_CATEGORY_MUXER           ] = 0x15,
-    [16+AV_CLASS_CATEGORY_DEMUXER         ] = 0x05,
-    [16+AV_CLASS_CATEGORY_ENCODER         ] = 0x16,
-    [16+AV_CLASS_CATEGORY_DECODER         ] = 0x06,
-    [16+AV_CLASS_CATEGORY_FILTER          ] = 0x12,
-    [16+AV_CLASS_CATEGORY_BITSTREAM_FILTER] = 0x14,
+static const uint32_t color[16 + AV_CLASS_CATEGORY_NB] = {
+    [AV_LOG_PANIC  /8] = 9 << 16 | 0x41,
+    [AV_LOG_FATAL  /8] = 1 << 16 | 0x41,
+    [AV_LOG_ERROR  /8] =  9 << 8 | 0x11,
+    [AV_LOG_WARNING/8] = 11 << 8 | 0x03,
+    [AV_LOG_INFO   /8] = 15 << 8 |    9,
+    [AV_LOG_VERBOSE/8] = 40 << 8 | 0x02,
+    [AV_LOG_DEBUG  /8] = 34 << 8 | 0x02,
+    [16+AV_CLASS_CATEGORY_NA              ] =   8 << 8 |    9,
+    [16+AV_CLASS_CATEGORY_INPUT           ] =  38 << 8 | 0x15,
+    [16+AV_CLASS_CATEGORY_OUTPUT          ] =  51 << 8 | 0x05,
+    [16+AV_CLASS_CATEGORY_MUXER           ] = 160 << 8 | 0x15,
+    [16+AV_CLASS_CATEGORY_DEMUXER         ] = 196 << 8 | 0x05,
+    [16+AV_CLASS_CATEGORY_ENCODER         ] = 111 << 8 | 0x16,
+    [16+AV_CLASS_CATEGORY_DECODER         ] = 177 << 8 | 0x06,
+    [16+AV_CLASS_CATEGORY_FILTER          ] = 108 << 8 | 0x12,
+    [16+AV_CLASS_CATEGORY_BITSTREAM_FILTER] = 143 << 8 | 0x14,
+    [16+AV_CLASS_CATEGORY_SWSCALER        ] =  80 << 8 | 0x14,
+    [16+AV_CLASS_CATEGORY_SWRESAMPLER     ] = 189 << 8 | 0x14,
 };
 
-#define set_color(x)  fprintf(stderr, "\033[%d;3%dm", color[x] >> 4, color[x]&15)
+#define set_color(x)  fprintf(stderr, "\033[%d;3%dm", (color[x] >> 4)&15, color[x]&15)
+#define set_256color(x) fprintf(stderr, "\033[48;5;%dm\033[38;5;%dm", (color[x] >> 16) & 0xff, (color[x] >> 8 ) & 0xff)
 #define reset_color() fprintf(stderr, "\033[0m")
 #endif
 static int use_color = -1;
@@ -112,11 +117,14 @@ static void colored_fputs(int level, const char *str)
         use_color = getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") &&
                    !getenv("AV_LOG_FORCE_NOCOLOR");
 #endif
+        if (getenv("AV_LOG_FORCE_256COLOR"))
+            use_color *= 256;
     }
 
-    if (use_color) {
+    if (use_color == 1) {
         set_color(level);
-    }
+    } else if (use_color == 256)
+        set_256color(level);
     fputs(str, stderr);
     if (use_color) {
         reset_color();
diff --git a/libavutil/log.h b/libavutil/log.h
index 8d9601a..ba7315f 100644
--- a/libavutil/log.h
+++ b/libavutil/log.h
@@ -35,6 +35,8 @@ typedef enum {
     AV_CLASS_CATEGORY_DECODER,
     AV_CLASS_CATEGORY_FILTER,
     AV_CLASS_CATEGORY_BITSTREAM_FILTER,
+    AV_CLASS_CATEGORY_SWSCALER,
+    AV_CLASS_CATEGORY_SWRESAMPLER,
     AV_CLASS_CATEGORY_NB, ///< not part of ABI/API
 }AVClassCategory;
 
diff --git a/libswresample/swresample.c b/libswresample/swresample.c
index 55ba7e6..1b5492d 100644
--- a/libswresample/swresample.c
+++ b/libswresample/swresample.c
@@ -103,6 +103,7 @@ static const AVClass av_class = {
     .version                   = LIBAVUTIL_VERSION_INT,
     .log_level_offset_offset   = OFFSET(log_level_offset),
     .parent_log_context_offset = OFFSET(log_ctx),
+    .category                  = AV_CLASS_CATEGORY_SWRESAMPLER,
 };
 
 unsigned swresample_version(void)
diff --git a/libswscale/options.c b/libswscale/options.c
index a396a58..c02c084 100644
--- a/libswscale/options.c
+++ b/libswscale/options.c
@@ -70,6 +70,7 @@ const AVClass sws_context_class = {
     .class_name = "SWScaler",
     .item_name  = sws_context_to_name,
     .option     = options,
+    .category   = AV_CLASS_CATEGORY_SWSCALER,
 };
 
 const AVClass *sws_get_class(void)
-- 
1.7.7



More information about the ffmpeg-devel mailing list