Merge commit '7763118cae4eb468b032dbd29af15a011c2c233b'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 3 Apr 2014 18:40:33 +0000 (20:40 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 3 Apr 2014 18:44:14 +0000 (20:44 +0200)
* commit '7763118cae4eb468b032dbd29af15a011c2c233b':
  log: Support for 256color terminals

Conflicts:
doc/APIchanges
libavutil/log.c
libavutil/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/APIchanges
libavutil/log.c
libavutil/log.h
libavutil/version.h

diff --cc doc/APIchanges
@@@ -15,13 -13,9 +15,16 @@@ libavutil:     2012-10-2
  
  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-04-xx - xxxxxxx - lavu 52.72.100 - opt.h
 +  Add AV_OPT_MULTI_COMPONENT_RANGE define to allow return
 +  multi-component option ranges.
 +
 +2014-03-xx - xxxxxxx - lavu 52.70.100 - mem.h
 +  Add av_dynarray_add_nofree() function.
 +
  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 --cc libavutil/log.c
@@@ -126,47 -71,37 +126,55 @@@ static void check_color_terminal(void
          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"));
-     if (getenv("AV_LOG_FORCE_256COLOR"))
 -    use_color += !!strstr(term, "256color") ;
++    if (   getenv("AV_LOG_FORCE_256COLOR")
++        || strstr(term, "256color"));
 +        use_color *= 256;
  #else
      use_color = getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") &&
                 !getenv("AV_LOG_FORCE_NOCOLOR");
  #endif
  }
  
- static void colored_fputs(int level, const char *str)
+ static void colored_fputs(int level, int tint, const char *str)
  {
 +    if (!*str)
 +        return;
 +
      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;
 -    }
 +#if HAVE_SETCONSOLETEXTATTRIBUTE
 +    if (use_color && level != AV_LOG_INFO/8)
 +        SetConsoleTextAttribute(con, background | color[level]);
      fputs(str, stderr);
 -    if (use_color) {
 -        reset_color();
 -    }
 +    if (use_color && level != AV_LOG_INFO/8)
 +        SetConsoleTextAttribute(con, attr_orig);
 +#else
 +    if (use_color == 1 && level != AV_LOG_INFO/8) {
 +        fprintf(stderr,
 +                "\033[%d;3%dm%s\033[0m",
 +                (color[level] >> 4) & 15,
 +                color[level] & 15,
 +                str);
++    } else if (tint && use_color == 256) {
++        fprintf(stderr,
++                "\033[48;5;%dm\033[38;5;%dm%s\033[0m",
++                (color[level] >> 16) & 0xff,
++                tint,
++                str);
 +    } else if (use_color == 256 && level != AV_LOG_INFO/8) {
 +        fprintf(stderr,
 +                "\033[48;5;%dm\033[38;5;%dm%s\033[0m",
 +                (color[level] >> 16) & 0xff,
 +                (color[level] >> 8) & 0xff,
 +                str);
 +    } else
 +        fputs(str, stderr);
 +#endif
 +
  }
  
  const char *av_default_item_name(void *ptr)
@@@ -214,51 -129,17 +222,55 @@@ static void format_line(void *avcl, in
              AVClass** parent = *(AVClass ***) (((uint8_t *) avcl) +
                                     avc->parent_log_context_offset);
              if (parent && *parent) {
 -                snprintf(line, sizeof(line), "[%s @ %p] ",
 +                av_bprintf(part+0, "[%s @ %p] ",
                           (*parent)->item_name(parent), parent);
 +                if(type) type[0] = get_category(parent);
              }
          }
 -        snprintf(line + strlen(line), sizeof(line) - strlen(line), "[%s @ %p] ",
 +        av_bprintf(part+1, "[%s @ %p] ",
                   avc->item_name(avcl), avcl);
 +        if(type) type[1] = get_category(avcl);
      }
  
 -    vsnprintf(line + strlen(line), sizeof(line) - strlen(line), fmt, vl);
 +    av_vbprintf(part+2, fmt, vl);
 +
 +    if(*part[0].str || *part[1].str || *part[2].str) {
 +        char lastc = part[2].len && part[2].len <= part[2].size ? part[2].str[part[2].len - 1] : 0;
 +        *print_prefix = lastc == '\n' || lastc == '\r';
 +    }
 +}
  
 -    print_prefix = strlen(line) && line[strlen(line) - 1] == '\n';
 +void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl,
 +                        char *line, int line_size, int *print_prefix)
 +{
 +    AVBPrint part[3];
 +    format_line(ptr, level, fmt, vl, part, print_prefix, NULL);
 +    snprintf(line, line_size, "%s%s%s", part[0].str, part[1].str, part[2].str);
 +    av_bprint_finalize(part+2, NULL);
 +}
 +
 +void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl)
 +{
 +    static int print_prefix = 1;
 +    static int count;
 +    static char prev[LINE_SZ];
 +    AVBPrint part[3];
 +    char line[LINE_SZ];
 +    static int is_atty;
 +    int type[2];
++    int tint = av_clip(level >> 8, 0, 256);
++
++    level &= 0xff;
++
 +
 +    if (level > av_log_level)
 +        return;
 +#if HAVE_PTHREADS
 +    pthread_mutex_lock(&mutex);
 +#endif
 +
 +    format_line(ptr, level, fmt, vl, part, &print_prefix, type);
 +    snprintf(line, sizeof(line), "%s%s%s", part[0].str, part[1].str, part[2].str);
  
  #if HAVE_ISATTY
      if (!is_atty)
          fprintf(stderr, "    Last message repeated %d times\n", count);
          count = 0;
      }
 -    colored_fputs(av_clip(level >> 3, 0, 6), tint, line);
 -    av_strlcpy(prev, line, sizeof line);
 +    strcpy(prev, line);
 +    sanitize(part[0].str);
-     colored_fputs(type[0], part[0].str);
++    colored_fputs(type[0], 0, part[0].str);
 +    sanitize(part[1].str);
-     colored_fputs(type[1], part[1].str);
++    colored_fputs(type[1], 0, part[1].str);
 +    sanitize(part[2].str);
-     colored_fputs(av_clip(level >> 3, 0, 6), part[2].str);
++    colored_fputs(av_clip(level >> 3, 0, 6), tint, part[2].str);
 +end:
 +    av_bprint_finalize(part+2, NULL);
 +#if HAVE_PTHREADS
 +    pthread_mutex_unlock(&mutex);
 +#endif
  }
  
  static void (*av_log_callback)(void*, int, const char*, va_list) =
diff --cc libavutil/log.h
@@@ -185,9 -143,15 +185,17 @@@ typedef struct AVClass 
   */
  #define AV_LOG_DEBUG    48
  
 +#define AV_LOG_MAX_OFFSET (AV_LOG_DEBUG - AV_LOG_QUIET)
 +
  /**
+  * Sets additional colors for extended debugging sessions.
+  * Requires 256color terminal support. Use outside debugging is not
+  * recommended.
+  */
+ #define AV_LOG_C(x) (x << 8)
+ /**
   * @}
   */
  
@@@ -55,9 -53,9 +55,9 @@@
   * @{
   */
  
 -#define LIBAVUTIL_VERSION_MAJOR 53
 -#define LIBAVUTIL_VERSION_MINOR  9
 -#define LIBAVUTIL_VERSION_MICRO  0
 +#define LIBAVUTIL_VERSION_MAJOR  52
- #define LIBAVUTIL_VERSION_MINOR  72
++#define LIBAVUTIL_VERSION_MINOR  73
 +#define LIBAVUTIL_VERSION_MICRO 100
  
  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                 LIBAVUTIL_VERSION_MINOR, \