Commit 7763118c authored by Luca Barbato's avatar Luca Barbato

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: 's avatarLuca Barbato <lu_zero@gentoo.org>
parent 006c2533
...@@ -13,6 +13,9 @@ libavutil: 2013-12-xx ...@@ -13,6 +13,9 @@ libavutil: 2013-12-xx
API changes, most recent first: 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 2014-02-xx - xxxxxxx - lavu 53.08.0 - frame.h
Add av_frame_remove_side_data() for removing a single side data Add av_frame_remove_side_data() for removing a single side data
instance from a frame. instance from a frame.
......
...@@ -53,35 +53,50 @@ static HANDLE con; ...@@ -53,35 +53,50 @@ static HANDLE con;
#else #else
static const uint8_t color[] = { 0x41, 0x41, 0x11, 0x03, 9, 0x02, 0x06 }; 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 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") #define reset_color() fprintf(stderr, "\033[0m")
#endif #endif
static int use_color = -1; 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 #if HAVE_SETCONSOLETEXTATTRIBUTE
CONSOLE_SCREEN_BUFFER_INFO con_info; CONSOLE_SCREEN_BUFFER_INFO con_info;
con = GetStdHandle(STD_ERROR_HANDLE); con = GetStdHandle(STD_ERROR_HANDLE);
use_color = (con != INVALID_HANDLE_VALUE) && !getenv("NO_COLOR") && use_color = (con != INVALID_HANDLE_VALUE) && !getenv("NO_COLOR") &&
!getenv("AV_LOG_FORCE_NOCOLOR"); !getenv("AV_LOG_FORCE_NOCOLOR");
if (use_color) { if (use_color) {
GetConsoleScreenBufferInfo(con, &con_info); GetConsoleScreenBufferInfo(con, &con_info);
attr_orig = con_info.wAttributes; attr_orig = con_info.wAttributes;
background = attr_orig & 0xF0; background = attr_orig & 0xF0;
} }
#elif HAVE_ISATTY #elif HAVE_ISATTY
use_color = !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR") && char *term = getenv("TERM");
(getenv("TERM") && isatty(2) || use_color = !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR") &&
getenv("AV_LOG_FORCE_COLOR")); (getenv("TERM") && isatty(2) || getenv("AV_LOG_FORCE_COLOR"));
use_color += !!strstr(term, "256color") ;
#else #else
use_color = getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") && use_color = getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") &&
!getenv("AV_LOG_FORCE_NOCOLOR"); !getenv("AV_LOG_FORCE_NOCOLOR");
#endif #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); set_color(level);
if (tint)
print_256color(tint);
break;
default:
break;
} }
fputs(str, stderr); fputs(str, stderr);
if (use_color) { if (use_color) {
...@@ -102,6 +117,10 @@ void av_log_default_callback(void *avcl, int level, const char *fmt, va_list vl) ...@@ -102,6 +117,10 @@ void av_log_default_callback(void *avcl, int level, const char *fmt, va_list vl)
char line[1024]; char line[1024];
static int is_atty; static int is_atty;
AVClass* avc = avcl ? *(AVClass **) avcl : NULL; AVClass* avc = avcl ? *(AVClass **) avcl : NULL;
int tint = av_clip(level >> 8, 0, 256);
level &= 0xff;
if (level > av_log_level) if (level > av_log_level)
return; return;
line[0] = 0; line[0] = 0;
...@@ -138,7 +157,7 @@ void av_log_default_callback(void *avcl, int level, const char *fmt, va_list vl) ...@@ -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); fprintf(stderr, " Last message repeated %d times\n", count);
count = 0; 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); av_strlcpy(prev, line, sizeof line);
} }
......
...@@ -143,6 +143,14 @@ typedef struct AVClass { ...@@ -143,6 +143,14 @@ typedef struct AVClass {
*/ */
#define AV_LOG_DEBUG 48 #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)
/** /**
* @} * @}
*/ */
......
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 53 #define LIBAVUTIL_VERSION_MAJOR 53
#define LIBAVUTIL_VERSION_MINOR 8 #define LIBAVUTIL_VERSION_MINOR 9
#define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment