diff --git a/doc/APIchanges b/doc/APIchanges
index d8002533df388603d775b8bf8246c596431c911d..992a3b06e8df3e56dc02511fb9c0e699237912df 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 3cc811bcccf8ef2cc0c637027638877b5df07e0a..c447b5a10fd8f3621af0b7b6efd380a37924090d 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 6d26b67db85d6ee49be65671fa2e489618e90858..2f7811c0723d4992eedaf25290b1b6921ebd6c8d 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 7f439d725aa8bf4df7e35df6d36e11b8de4fabc4..f8bb4479e22d1c6add5132146ca89e54e5538923 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, \