3 * Copyright (c) 2003 Michel Bardiaux
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
32 static int av_log_level
= AV_LOG_INFO
;
35 #if defined(_WIN32) && !defined(__MINGW32CE__)
37 static const uint8_t color
[] = {12,12,12,14,7,7,7};
38 static int16_t background
, attr_orig
;
40 #define set_color(x) SetConsoleTextAttribute(con, background | color[x])
41 #define reset_color() SetConsoleTextAttribute(con, attr_orig)
43 static const uint8_t color
[]={0x41,0x41,0x11,0x03,9,9,9};
44 #define set_color(x) fprintf(stderr, "\033[%d;3%dm", color[x]>>4, color[x]&15)
45 #define reset_color() fprintf(stderr, "\033[0m")
47 static int use_color
=-1;
50 static void colored_fputs(int level
, const char *str
){
52 #if defined(_WIN32) && !defined(__MINGW32CE__)
53 CONSOLE_SCREEN_BUFFER_INFO con_info
;
54 con
= GetStdHandle(STD_ERROR_HANDLE
);
55 use_color
= (con
!= INVALID_HANDLE_VALUE
) && !getenv("NO_COLOR") && !getenv("FFMPEG_FORCE_NOCOLOR");
57 GetConsoleScreenBufferInfo(con
, &con_info
);
58 attr_orig
= con_info
.wAttributes
;
59 background
= attr_orig
& 0xF0;
62 use_color
= !getenv("NO_COLOR") && !getenv("FFMPEG_FORCE_NOCOLOR") &&
63 (getenv("TERM") && isatty(2) || getenv("FFMPEG_FORCE_COLOR"));
65 use_color
= getenv("FFMPEG_FORCE_COLOR") && !getenv("NO_COLOR") && !getenv("FFMPEG_FORCE_NOCOLOR");
78 const char* av_default_item_name(void* ptr
){
79 return (*(AVClass
**)ptr
)->class_name
;
82 void av_log_default_callback(void* ptr
, int level
, const char* fmt
, va_list vl
)
84 static int print_prefix
=1;
86 static char line
[1024], prev
[1024];
88 AVClass
* avc
= ptr ?
*(AVClass
**)ptr
: NULL
;
89 if(level
>av_log_level
)
93 if(print_prefix
&& avc
) {
94 if (avc
->parent_log_context_offset
) {
95 AVClass
** parent
= *(AVClass
***)(((uint8_t*)ptr
) + avc
->parent_log_context_offset
);
96 if(parent
&& *parent
){
97 snprintf(line
, sizeof(line
), "[%s @ %p] ", (*parent
)->item_name(parent
), parent
);
100 snprintf(line
+ strlen(line
), sizeof(line
) - strlen(line
), "[%s @ %p] ", avc
->item_name(ptr
), ptr
);
103 vsnprintf(line
+ strlen(line
), sizeof(line
) - strlen(line
), fmt
, vl
);
105 print_prefix
= line
[strlen(line
)-1] == '\n';
108 if(!is_atty
) is_atty
= isatty(2) ?
1 : -1;
111 if(print_prefix
&& (flags
& AV_LOG_SKIP_REPEATED
) && !strcmp(line
, prev
)){
114 fprintf(stderr
, " Last message repeated %d times\r", count
);
118 fprintf(stderr
, " Last message repeated %d times\n", count
);
121 colored_fputs(av_clip(level
>>3, 0, 6), line
);
125 static void (*av_log_callback
)(void*, int, const char*, va_list) = av_log_default_callback
;
127 void av_log(void* avcl
, int level
, const char *fmt
, ...)
129 AVClass
* avc
= avcl ?
*(AVClass
**)avcl
: NULL
;
132 if(avc
&& avc
->version
>= (50<<16 | 15<<8 | 2) && avc
->log_level_offset_offset
&& level
>=AV_LOG_FATAL
)
133 level
+= *(int*)(((uint8_t*)avcl
) + avc
->log_level_offset_offset
);
134 av_vlog(avcl
, level
, fmt
, vl
);
138 void av_vlog(void* avcl
, int level
, const char *fmt
, va_list vl
)
140 av_log_callback(avcl
, level
, fmt
, vl
);
143 int av_log_get_level(void)
148 void av_log_set_level(int level
)
150 av_log_level
= level
;
153 void av_log_set_flags(int arg
)
158 void av_log_set_callback(void (*callback
)(void*, int, const char*, va_list))
160 av_log_callback
= callback
;