Commit | Line | Data |
---|---|---|
4b45de0e LA |
1 | /* |
2 | * log functions | |
3 | * Copyright (c) 2003 Michel Bardiaux | |
4 | * | |
b78e7197 DB |
5 | * This file is part of FFmpeg. |
6 | * | |
7 | * FFmpeg is free software; you can redistribute it and/or | |
4b45de0e LA |
8 | * modify it under the terms of the GNU Lesser General Public |
9 | * License as published by the Free Software Foundation; either | |
b78e7197 | 10 | * version 2.1 of the License, or (at your option) any later version. |
4b45de0e | 11 | * |
b78e7197 | 12 | * FFmpeg is distributed in the hope that it will be useful, |
4b45de0e LA |
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 | |
b78e7197 | 18 | * License along with FFmpeg; if not, write to the Free Software |
4b45de0e LA |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | */ | |
21 | ||
22 | /** | |
ba87f080 | 23 | * @file |
7d685b48 | 24 | * logging functions |
4b45de0e LA |
25 | */ |
26 | ||
51e026d1 | 27 | #include <unistd.h> |
62044024 | 28 | #include <stdlib.h> |
4b45de0e | 29 | #include "avutil.h" |
77652a6a | 30 | #include "log.h" |
4b45de0e | 31 | |
e244f54e RP |
32 | #if LIBAVUTIL_VERSION_MAJOR > 50 |
33 | static | |
34 | #endif | |
918a4591 | 35 | int av_log_level = AV_LOG_INFO; |
4b45de0e | 36 | |
62044024 | 37 | static int use_ansi_color=-1; |
51e026d1 MN |
38 | |
39 | #undef fprintf | |
40 | static void colored_fputs(int color, const char *str){ | |
62044024 MN |
41 | if(use_ansi_color<0){ |
42 | #if HAVE_ISATTY && !defined(_WIN32) | |
43 | use_ansi_color= getenv("TERM") && !getenv("NO_COLOR") && isatty(2); | |
44 | #else | |
45 | use_ansi_color= 0; | |
46 | #endif | |
47 | } | |
48 | ||
49 | if(use_ansi_color){ | |
7328cdfa | 50 | fprintf(stderr, "\033[%d;3%dm", color>>4, color&15); |
51e026d1 MN |
51 | } |
52 | fputs(str, stderr); | |
62044024 | 53 | if(use_ansi_color){ |
841073ce | 54 | fprintf(stderr, "\033[0m"); |
51e026d1 MN |
55 | } |
56 | } | |
57 | ||
8d2a5139 MN |
58 | const char* av_default_item_name(void* ptr){ |
59 | return (*(AVClass**)ptr)->class_name; | |
60 | } | |
61 | ||
411983c1 | 62 | void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) |
4b45de0e LA |
63 | { |
64 | static int print_prefix=1; | |
b9c353ff MN |
65 | static int count; |
66 | static char line[1024], prev[1024]; | |
51e026d1 | 67 | static const uint8_t color[]={0x41,0x41,0x11,0x03,9,9,9}; |
4b45de0e LA |
68 | AVClass* avc= ptr ? *(AVClass**)ptr : NULL; |
69 | if(level>av_log_level) | |
70 | return; | |
71 | #undef fprintf | |
72 | if(print_prefix && avc) { | |
b9c353ff MN |
73 | snprintf(line, sizeof(line), "[%s @ %p]", avc->item_name(ptr), ptr); |
74 | }else | |
75 | line[0]=0; | |
4b45de0e | 76 | |
b9c353ff | 77 | vsnprintf(line + strlen(line), sizeof(line) - strlen(line), fmt, vl); |
4b45de0e | 78 | |
b9c353ff MN |
79 | print_prefix= line[strlen(line)-1] == '\n'; |
80 | if(print_prefix && !strcmp(line, prev)){ | |
81 | count++; | |
82 | return; | |
83 | } | |
84 | if(count>0){ | |
85 | fprintf(stderr, " Last message repeated %d times\n", count); | |
86 | count=0; | |
87 | } | |
51e026d1 | 88 | colored_fputs(color[av_clip(level>>3, 0, 6)], line); |
b9c353ff | 89 | strcpy(prev, line); |
4b45de0e LA |
90 | } |
91 | ||
92 | static void (*av_log_callback)(void*, int, const char*, va_list) = av_log_default_callback; | |
93 | ||
94 | void av_log(void* avcl, int level, const char *fmt, ...) | |
95 | { | |
3fe1ec39 | 96 | AVClass* avc= avcl ? *(AVClass**)avcl : NULL; |
4b45de0e LA |
97 | va_list vl; |
98 | va_start(vl, fmt); | |
3fe1ec39 MN |
99 | if(avc && avc->version >= (50<<16 | 15<<8 | 2) && avc->log_level_offset_offset && level>=AV_LOG_FATAL) |
100 | level += *(int*)(((uint8_t*)avcl) + avc->log_level_offset_offset); | |
4b45de0e LA |
101 | av_vlog(avcl, level, fmt, vl); |
102 | va_end(vl); | |
103 | } | |
104 | ||
105 | void av_vlog(void* avcl, int level, const char *fmt, va_list vl) | |
106 | { | |
107 | av_log_callback(avcl, level, fmt, vl); | |
108 | } | |
109 | ||
110 | int av_log_get_level(void) | |
111 | { | |
112 | return av_log_level; | |
113 | } | |
114 | ||
115 | void av_log_set_level(int level) | |
116 | { | |
117 | av_log_level = level; | |
118 | } | |
119 | ||
120 | void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)) | |
121 | { | |
122 | av_log_callback = callback; | |
123 | } |