diff options
Diffstat (limited to 'lib/rbcodec/codecs/libwmavoice/libavutil/log.c')
-rw-r--r-- | lib/rbcodec/codecs/libwmavoice/libavutil/log.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/libwmavoice/libavutil/log.c b/lib/rbcodec/codecs/libwmavoice/libavutil/log.c new file mode 100644 index 0000000000..2e225b3b50 --- /dev/null +++ b/lib/rbcodec/codecs/libwmavoice/libavutil/log.c | |||
@@ -0,0 +1,150 @@ | |||
1 | /* | ||
2 | * log functions | ||
3 | * Copyright (c) 2003 Michel Bardiaux | ||
4 | * | ||
5 | * This file is part of FFmpeg. | ||
6 | * | ||
7 | * FFmpeg 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. | ||
11 | * | ||
12 | * FFmpeg 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. | ||
16 | * | ||
17 | * You should have received a copy of the GNU Lesser General Public | ||
18 | * License along with FFmpeg; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | */ | ||
21 | |||
22 | /** | ||
23 | * @file | ||
24 | * logging functions | ||
25 | */ | ||
26 | |||
27 | #include <unistd.h> | ||
28 | #include <stdlib.h> | ||
29 | #include "avutil.h" | ||
30 | #include "log.h" | ||
31 | |||
32 | #if LIBAVUTIL_VERSION_MAJOR > 50 | ||
33 | static | ||
34 | #endif | ||
35 | int av_log_level = AV_LOG_INFO; | ||
36 | |||
37 | #if defined(_WIN32) && !defined(__MINGW32CE__) | ||
38 | #include <windows.h> | ||
39 | static const uint8_t color[] = {12,12,12,14,7,7,7}; | ||
40 | static int16_t background, attr_orig; | ||
41 | static HANDLE con; | ||
42 | #define set_color(x) SetConsoleTextAttribute(con, background | color[x]) | ||
43 | #define reset_color() SetConsoleTextAttribute(con, attr_orig) | ||
44 | #else | ||
45 | static const uint8_t color[]={0x41,0x41,0x11,0x03,9,9,9}; | ||
46 | #define set_color(x) fprintf(stderr, "\033[%d;3%dm", color[x]>>4, color[x]&15) | ||
47 | #define reset_color() fprintf(stderr, "\033[0m") | ||
48 | #endif | ||
49 | static int use_color=-1; | ||
50 | |||
51 | #undef fprintf | ||
52 | static void colored_fputs(int level, const char *str){ | ||
53 | if(use_color<0){ | ||
54 | #if defined(_WIN32) && !defined(__MINGW32CE__) | ||
55 | CONSOLE_SCREEN_BUFFER_INFO con_info; | ||
56 | con = GetStdHandle(STD_ERROR_HANDLE); | ||
57 | use_color = (con != INVALID_HANDLE_VALUE) && !getenv("NO_COLOR"); | ||
58 | if (use_color) { | ||
59 | GetConsoleScreenBufferInfo(con, &con_info); | ||
60 | attr_orig = con_info.wAttributes; | ||
61 | background = attr_orig & 0xF0; | ||
62 | } | ||
63 | #elif HAVE_ISATTY | ||
64 | use_color= getenv("TERM") && !getenv("NO_COLOR") && isatty(2); | ||
65 | #else | ||
66 | use_color= 0; | ||
67 | #endif | ||
68 | } | ||
69 | |||
70 | if(use_color){ | ||
71 | set_color(level); | ||
72 | } | ||
73 | fputs(str, stderr); | ||
74 | if(use_color){ | ||
75 | reset_color(); | ||
76 | } | ||
77 | } | ||
78 | |||
79 | const char* av_default_item_name(void* ptr){ | ||
80 | return (*(AVClass**)ptr)->class_name; | ||
81 | } | ||
82 | |||
83 | void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) | ||
84 | { | ||
85 | static int print_prefix=1; | ||
86 | static int count; | ||
87 | static char line[1024], prev[1024]; | ||
88 | AVClass* avc= ptr ? *(AVClass**)ptr : NULL; | ||
89 | if(level>av_log_level) | ||
90 | return; | ||
91 | line[0]=0; | ||
92 | #undef fprintf | ||
93 | if(print_prefix && avc) { | ||
94 | if(avc->version >= (50<<16 | 15<<8 | 3) && 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); | ||
98 | } | ||
99 | } | ||
100 | snprintf(line + strlen(line), sizeof(line) - strlen(line), "[%s @ %p] ", avc->item_name(ptr), ptr); | ||
101 | } | ||
102 | |||
103 | vsnprintf(line + strlen(line), sizeof(line) - strlen(line), fmt, vl); | ||
104 | |||
105 | print_prefix= line[strlen(line)-1] == '\n'; | ||
106 | if(print_prefix && !strcmp(line, prev)){ | ||
107 | count++; | ||
108 | fprintf(stderr, " Last message repeated %d times\r", count); | ||
109 | return; | ||
110 | } | ||
111 | if(count>0){ | ||
112 | fprintf(stderr, " Last message repeated %d times\n", count); | ||
113 | count=0; | ||
114 | } | ||
115 | colored_fputs(av_clip(level>>3, 0, 6), line); | ||
116 | strcpy(prev, line); | ||
117 | } | ||
118 | |||
119 | static void (*av_log_callback)(void*, int, const char*, va_list) = av_log_default_callback; | ||
120 | |||
121 | void av_log(void* avcl, int level, const char *fmt, ...) | ||
122 | { | ||
123 | AVClass* avc= avcl ? *(AVClass**)avcl : NULL; | ||
124 | va_list vl; | ||
125 | va_start(vl, fmt); | ||
126 | if(avc && avc->version >= (50<<16 | 15<<8 | 2) && avc->log_level_offset_offset && level>=AV_LOG_FATAL) | ||
127 | level += *(int*)(((uint8_t*)avcl) + avc->log_level_offset_offset); | ||
128 | av_vlog(avcl, level, fmt, vl); | ||
129 | va_end(vl); | ||
130 | } | ||
131 | |||
132 | void av_vlog(void* avcl, int level, const char *fmt, va_list vl) | ||
133 | { | ||
134 | av_log_callback(avcl, level, fmt, vl); | ||
135 | } | ||
136 | |||
137 | int av_log_get_level(void) | ||
138 | { | ||
139 | return av_log_level; | ||
140 | } | ||
141 | |||
142 | void av_log_set_level(int level) | ||
143 | { | ||
144 | av_log_level = level; | ||
145 | } | ||
146 | |||
147 | void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)) | ||
148 | { | ||
149 | av_log_callback = callback; | ||
150 | } | ||