diff --git a/doc/APIchanges b/doc/APIchanges index d8002533df..992a3b06e8 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 3cc811bccc..c447b5a10f 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; - } -#elif HAVE_ISATTY - use_color = !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR") && - (getenv("TERM") && isatty(2) || - getenv("AV_LOG_FORCE_COLOR")); -#else - use_color = getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") && - !getenv("AV_LOG_FORCE_NOCOLOR"); -#endif - } - + 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 + 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"); +#endif +} + +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 6d26b67db8..2f7811c072 100644 --- a/libavutil/log.h +++ b/libavutil/log.h @@ -143,6 +143,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 7f439d725a..f8bb4479e2 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, \