nengel@2: /* nengel@2: * log functions nengel@2: * Copyright (c) 2003 Michel Bardiaux nengel@2: * nengel@2: * This file is part of FFmpeg. nengel@2: * nengel@2: * FFmpeg is free software; you can redistribute it and/or nengel@2: * modify it under the terms of the GNU Lesser General Public nengel@2: * License as published by the Free Software Foundation; either nengel@2: * version 2.1 of the License, or (at your option) any later version. nengel@2: * nengel@2: * FFmpeg is distributed in the hope that it will be useful, nengel@2: * but WITHOUT ANY WARRANTY; without even the implied warranty of nengel@2: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU nengel@2: * Lesser General Public License for more details. nengel@2: * nengel@2: * You should have received a copy of the GNU Lesser General Public nengel@2: * License along with FFmpeg; if not, write to the Free Software nengel@2: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA nengel@2: */ nengel@2: nengel@2: /** nengel@2: * @file nengel@2: * logging functions nengel@2: */ nengel@2: #include "error.h" nengel@2: #include nengel@2: #include nengel@2: #include "log.h" nengel@2: nengel@2: nengel@2: static int av_log_level = AV_LOG_INFO; nengel@2: nengel@2: static int use_ansi_color=-1; nengel@2: nengel@2: #undef fprintf nengel@2: static void colored_fputs(int color, const char *str){ nengel@2: if(use_ansi_color<0){ nengel@2: #if HAVE_ISATTY && !defined(_WIN32) nengel@2: use_ansi_color= getenv("TERM") && !getenv("NO_COLOR") && isatty(2); nengel@2: #else nengel@2: use_ansi_color= 0; nengel@2: #endif nengel@2: } nengel@2: nengel@2: if(use_ansi_color){ nengel@2: fprintf(stderr, "\033[%d;3%dm", color>>4, color&15); nengel@2: } nengel@2: fputs(str, stderr); nengel@2: if(use_ansi_color){ nengel@2: fprintf(stderr, "\033[0m"); nengel@2: } nengel@2: } nengel@2: nengel@2: void av_log_default_callback(int level, const char* fmt, va_list vl) nengel@2: { nengel@2: static int print_prefix=1; nengel@2: static int count; nengel@2: static char line[1024], prev[1024]; nengel@2: static const uint8_t color[]={0x41,0x41,0x11,0x03,9,9,9}; nengel@2: nengel@2: if(level>av_log_level) nengel@2: return; nengel@2: #undef fprintf nengel@2: nengel@2: line[0]=0; nengel@2: nengel@2: vsnprintf(line + strlen(line), sizeof(line) - strlen(line), fmt, vl); nengel@2: nengel@2: print_prefix= line[strlen(line)-1] == '\n'; nengel@2: if(print_prefix && !strcmp(line, prev)){ nengel@2: count++; nengel@2: return; nengel@2: } nengel@2: if(count>0){ nengel@2: fprintf(stderr, " Last message repeated %d times\n", count); nengel@2: count=0; nengel@2: } nengel@2: colored_fputs(color[av_clip(level>>3, 0, 6)], line); nengel@2: strcpy(prev, line); nengel@2: } nengel@2: nengel@2: static void (*av_log_callback)(int, const char*, va_list) = av_log_default_callback; nengel@2: nengel@2: void av_log(int level, const char *fmt, ...) nengel@2: { nengel@2: va_list vl; nengel@2: va_start(vl, fmt); nengel@2: av_vlog(level, fmt, vl); nengel@2: va_end(vl); nengel@2: } nengel@2: nengel@2: void av_vlog(int level, const char *fmt, va_list vl) nengel@2: { nengel@2: av_log_callback(level, fmt, vl); nengel@2: } nengel@2: nengel@2: int av_log_get_level(void) nengel@2: { nengel@2: return av_log_level; nengel@2: } nengel@2: nengel@2: void av_log_set_level(int level) nengel@2: { nengel@2: av_log_level = level; nengel@2: } nengel@2: nengel@2: void av_log_set_callback(void (*callback)(int, const char*, va_list)) nengel@2: { nengel@2: av_log_callback = callback; nengel@2: }