Add acelp_filters.o as QCELP decoder object file.
[libav.git] / libavutil / log.c
CommitLineData
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>
4b45de0e 28#include "avutil.h"
77652a6a 29#include "log.h"
4b45de0e 30
e244f54e
RP
31#if LIBAVUTIL_VERSION_MAJOR > 50
32static
33#endif
918a4591 34int av_log_level = AV_LOG_INFO;
4b45de0e 35
aebfb457 36#if (!HAVE_ISATTY) || defined(_WIN32)
51e026d1
MN
37#define isatty(s) 0
38#endif
39
40#undef fprintf
41static void colored_fputs(int color, const char *str){
42 if(isatty(2)){
7328cdfa 43 fprintf(stderr, "\033[%d;3%dm", color>>4, color&15);
51e026d1
MN
44 }
45 fputs(str, stderr);
46 if(isatty(2)){
841073ce 47 fprintf(stderr, "\033[0m");
51e026d1
MN
48 }
49}
50
411983c1 51void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl)
4b45de0e
LA
52{
53 static int print_prefix=1;
b9c353ff
MN
54 static int count;
55 static char line[1024], prev[1024];
51e026d1 56 static const uint8_t color[]={0x41,0x41,0x11,0x03,9,9,9};
4b45de0e
LA
57 AVClass* avc= ptr ? *(AVClass**)ptr : NULL;
58 if(level>av_log_level)
59 return;
60#undef fprintf
61 if(print_prefix && avc) {
b9c353ff
MN
62 snprintf(line, sizeof(line), "[%s @ %p]", avc->item_name(ptr), ptr);
63 }else
64 line[0]=0;
4b45de0e 65
b9c353ff 66 vsnprintf(line + strlen(line), sizeof(line) - strlen(line), fmt, vl);
4b45de0e 67
b9c353ff
MN
68 print_prefix= line[strlen(line)-1] == '\n';
69 if(print_prefix && !strcmp(line, prev)){
70 count++;
71 return;
72 }
73 if(count>0){
74 fprintf(stderr, " Last message repeated %d times\n", count);
75 count=0;
76 }
51e026d1 77 colored_fputs(color[av_clip(level>>3, 0, 6)], line);
b9c353ff 78 strcpy(prev, line);
4b45de0e
LA
79}
80
81static void (*av_log_callback)(void*, int, const char*, va_list) = av_log_default_callback;
82
83void av_log(void* avcl, int level, const char *fmt, ...)
84{
85 va_list vl;
86 va_start(vl, fmt);
87 av_vlog(avcl, level, fmt, vl);
88 va_end(vl);
89}
90
91void av_vlog(void* avcl, int level, const char *fmt, va_list vl)
92{
93 av_log_callback(avcl, level, fmt, vl);
94}
95
96int av_log_get_level(void)
97{
98 return av_log_level;
99}
100
101void av_log_set_level(int level)
102{
103 av_log_level = level;
104}
105
106void av_log_set_callback(void (*callback)(void*, int, const char*, va_list))
107{
108 av_log_callback = callback;
109}