1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * log functions 3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michel Bardiaux 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * logging functions 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "config.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#if HAVE_UNISTD_H 30cabdff1aSopenharmony_ci#include <unistd.h> 31cabdff1aSopenharmony_ci#endif 32cabdff1aSopenharmony_ci#if HAVE_IO_H 33cabdff1aSopenharmony_ci#include <io.h> 34cabdff1aSopenharmony_ci#endif 35cabdff1aSopenharmony_ci#include <inttypes.h> 36cabdff1aSopenharmony_ci#include <stdarg.h> 37cabdff1aSopenharmony_ci#include <stdio.h> 38cabdff1aSopenharmony_ci#include <stdlib.h> 39cabdff1aSopenharmony_ci#include <string.h> 40cabdff1aSopenharmony_ci#include "bprint.h" 41cabdff1aSopenharmony_ci#include "common.h" 42cabdff1aSopenharmony_ci#include "internal.h" 43cabdff1aSopenharmony_ci#include "log.h" 44cabdff1aSopenharmony_ci#include "thread.h" 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_cistatic AVMutex mutex = AV_MUTEX_INITIALIZER; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci#define LINE_SZ 1024 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci#if HAVE_VALGRIND_VALGRIND_H 51cabdff1aSopenharmony_ci#include <valgrind/valgrind.h> 52cabdff1aSopenharmony_ci/* this is the log level at which valgrind will output a full backtrace */ 53cabdff1aSopenharmony_ci#define BACKTRACE_LOGLEVEL AV_LOG_ERROR 54cabdff1aSopenharmony_ci#endif 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_cistatic int av_log_level = AV_LOG_INFO; 57cabdff1aSopenharmony_cistatic int flags; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci#define NB_LEVELS 8 60cabdff1aSopenharmony_ci#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE 61cabdff1aSopenharmony_ci#include <windows.h> 62cabdff1aSopenharmony_cistatic const uint8_t color[16 + AV_CLASS_CATEGORY_NB] = { 63cabdff1aSopenharmony_ci [AV_LOG_PANIC /8] = 12, 64cabdff1aSopenharmony_ci [AV_LOG_FATAL /8] = 12, 65cabdff1aSopenharmony_ci [AV_LOG_ERROR /8] = 12, 66cabdff1aSopenharmony_ci [AV_LOG_WARNING/8] = 14, 67cabdff1aSopenharmony_ci [AV_LOG_INFO /8] = 7, 68cabdff1aSopenharmony_ci [AV_LOG_VERBOSE/8] = 10, 69cabdff1aSopenharmony_ci [AV_LOG_DEBUG /8] = 10, 70cabdff1aSopenharmony_ci [AV_LOG_TRACE /8] = 8, 71cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_NA ] = 7, 72cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_INPUT ] = 13, 73cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_OUTPUT ] = 5, 74cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_MUXER ] = 13, 75cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEMUXER ] = 5, 76cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_ENCODER ] = 11, 77cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DECODER ] = 3, 78cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_FILTER ] = 10, 79cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_BITSTREAM_FILTER] = 9, 80cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_SWSCALER ] = 7, 81cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_SWRESAMPLER ] = 7, 82cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT ] = 13, 83cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT ] = 5, 84cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT ] = 13, 85cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT ] = 5, 86cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_OUTPUT ] = 13, 87cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_INPUT ] = 5, 88cabdff1aSopenharmony_ci}; 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_cistatic int16_t background, attr_orig; 91cabdff1aSopenharmony_cistatic HANDLE con; 92cabdff1aSopenharmony_ci#else 93cabdff1aSopenharmony_ci 94cabdff1aSopenharmony_cistatic const uint32_t color[16 + AV_CLASS_CATEGORY_NB] = { 95cabdff1aSopenharmony_ci [AV_LOG_PANIC /8] = 52 << 16 | 196 << 8 | 0x41, 96cabdff1aSopenharmony_ci [AV_LOG_FATAL /8] = 208 << 8 | 0x41, 97cabdff1aSopenharmony_ci [AV_LOG_ERROR /8] = 196 << 8 | 0x11, 98cabdff1aSopenharmony_ci [AV_LOG_WARNING/8] = 226 << 8 | 0x03, 99cabdff1aSopenharmony_ci [AV_LOG_INFO /8] = 253 << 8 | 0x09, 100cabdff1aSopenharmony_ci [AV_LOG_VERBOSE/8] = 40 << 8 | 0x02, 101cabdff1aSopenharmony_ci [AV_LOG_DEBUG /8] = 34 << 8 | 0x02, 102cabdff1aSopenharmony_ci [AV_LOG_TRACE /8] = 34 << 8 | 0x07, 103cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_NA ] = 250 << 8 | 0x09, 104cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_INPUT ] = 219 << 8 | 0x15, 105cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_OUTPUT ] = 201 << 8 | 0x05, 106cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_MUXER ] = 213 << 8 | 0x15, 107cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEMUXER ] = 207 << 8 | 0x05, 108cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_ENCODER ] = 51 << 8 | 0x16, 109cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DECODER ] = 39 << 8 | 0x06, 110cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_FILTER ] = 155 << 8 | 0x12, 111cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_BITSTREAM_FILTER] = 192 << 8 | 0x14, 112cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_SWSCALER ] = 153 << 8 | 0x14, 113cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_SWRESAMPLER ] = 147 << 8 | 0x14, 114cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT ] = 213 << 8 | 0x15, 115cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT ] = 207 << 8 | 0x05, 116cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT ] = 213 << 8 | 0x15, 117cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT ] = 207 << 8 | 0x05, 118cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_OUTPUT ] = 213 << 8 | 0x15, 119cabdff1aSopenharmony_ci [16+AV_CLASS_CATEGORY_DEVICE_INPUT ] = 207 << 8 | 0x05, 120cabdff1aSopenharmony_ci}; 121cabdff1aSopenharmony_ci 122cabdff1aSopenharmony_ci#endif 123cabdff1aSopenharmony_cistatic int use_color = -1; 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE 126cabdff1aSopenharmony_cistatic void win_console_puts(const char *str) 127cabdff1aSopenharmony_ci{ 128cabdff1aSopenharmony_ci const uint8_t *q = str; 129cabdff1aSopenharmony_ci uint16_t line[LINE_SZ]; 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_ci while (*q) { 132cabdff1aSopenharmony_ci uint16_t *buf = line; 133cabdff1aSopenharmony_ci DWORD nb_chars = 0; 134cabdff1aSopenharmony_ci DWORD written; 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci while (*q && nb_chars < LINE_SZ - 1) { 137cabdff1aSopenharmony_ci uint32_t ch; 138cabdff1aSopenharmony_ci uint16_t tmp; 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci GET_UTF8(ch, *q ? *q++ : 0, ch = 0xfffd; goto continue_on_invalid;) 141cabdff1aSopenharmony_cicontinue_on_invalid: 142cabdff1aSopenharmony_ci PUT_UTF16(ch, tmp, *buf++ = tmp; nb_chars++;) 143cabdff1aSopenharmony_ci } 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci WriteConsoleW(con, line, nb_chars, &written, NULL); 146cabdff1aSopenharmony_ci } 147cabdff1aSopenharmony_ci} 148cabdff1aSopenharmony_ci#endif 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_cistatic void check_color_terminal(void) 151cabdff1aSopenharmony_ci{ 152cabdff1aSopenharmony_ci char *term = getenv("TERM"); 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_ci#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE 155cabdff1aSopenharmony_ci CONSOLE_SCREEN_BUFFER_INFO con_info; 156cabdff1aSopenharmony_ci DWORD dummy; 157cabdff1aSopenharmony_ci con = GetStdHandle(STD_ERROR_HANDLE); 158cabdff1aSopenharmony_ci if (con != INVALID_HANDLE_VALUE && !GetConsoleMode(con, &dummy)) 159cabdff1aSopenharmony_ci con = INVALID_HANDLE_VALUE; 160cabdff1aSopenharmony_ci if (con != INVALID_HANDLE_VALUE) { 161cabdff1aSopenharmony_ci GetConsoleScreenBufferInfo(con, &con_info); 162cabdff1aSopenharmony_ci attr_orig = con_info.wAttributes; 163cabdff1aSopenharmony_ci background = attr_orig & 0xF0; 164cabdff1aSopenharmony_ci } 165cabdff1aSopenharmony_ci#endif 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_ci if (getenv("AV_LOG_FORCE_NOCOLOR")) { 168cabdff1aSopenharmony_ci use_color = 0; 169cabdff1aSopenharmony_ci } else if (getenv("AV_LOG_FORCE_COLOR")) { 170cabdff1aSopenharmony_ci use_color = 1; 171cabdff1aSopenharmony_ci } else { 172cabdff1aSopenharmony_ci#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE 173cabdff1aSopenharmony_ci use_color = (con != INVALID_HANDLE_VALUE); 174cabdff1aSopenharmony_ci#elif HAVE_ISATTY 175cabdff1aSopenharmony_ci use_color = (term && isatty(2)); 176cabdff1aSopenharmony_ci#else 177cabdff1aSopenharmony_ci use_color = 0; 178cabdff1aSopenharmony_ci#endif 179cabdff1aSopenharmony_ci } 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ci if (getenv("AV_LOG_FORCE_256COLOR") || term && strstr(term, "256color")) 182cabdff1aSopenharmony_ci use_color *= 256; 183cabdff1aSopenharmony_ci} 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_cistatic void ansi_fputs(int level, int tint, const char *str, int local_use_color) 186cabdff1aSopenharmony_ci{ 187cabdff1aSopenharmony_ci if (local_use_color == 1) { 188cabdff1aSopenharmony_ci fprintf(stderr, 189cabdff1aSopenharmony_ci "\033[%"PRIu32";3%"PRIu32"m%s\033[0m", 190cabdff1aSopenharmony_ci (color[level] >> 4) & 15, 191cabdff1aSopenharmony_ci color[level] & 15, 192cabdff1aSopenharmony_ci str); 193cabdff1aSopenharmony_ci } else if (tint && use_color == 256) { 194cabdff1aSopenharmony_ci fprintf(stderr, 195cabdff1aSopenharmony_ci "\033[48;5;%"PRIu32"m\033[38;5;%dm%s\033[0m", 196cabdff1aSopenharmony_ci (color[level] >> 16) & 0xff, 197cabdff1aSopenharmony_ci tint, 198cabdff1aSopenharmony_ci str); 199cabdff1aSopenharmony_ci } else if (local_use_color == 256) { 200cabdff1aSopenharmony_ci fprintf(stderr, 201cabdff1aSopenharmony_ci "\033[48;5;%"PRIu32"m\033[38;5;%"PRIu32"m%s\033[0m", 202cabdff1aSopenharmony_ci (color[level] >> 16) & 0xff, 203cabdff1aSopenharmony_ci (color[level] >> 8) & 0xff, 204cabdff1aSopenharmony_ci str); 205cabdff1aSopenharmony_ci } else 206cabdff1aSopenharmony_ci fputs(str, stderr); 207cabdff1aSopenharmony_ci} 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_cistatic void colored_fputs(int level, int tint, const char *str) 210cabdff1aSopenharmony_ci{ 211cabdff1aSopenharmony_ci int local_use_color; 212cabdff1aSopenharmony_ci if (!*str) 213cabdff1aSopenharmony_ci return; 214cabdff1aSopenharmony_ci 215cabdff1aSopenharmony_ci if (use_color < 0) 216cabdff1aSopenharmony_ci check_color_terminal(); 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci if (level == AV_LOG_INFO/8) local_use_color = 0; 219cabdff1aSopenharmony_ci else local_use_color = use_color; 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE 222cabdff1aSopenharmony_ci if (con != INVALID_HANDLE_VALUE) { 223cabdff1aSopenharmony_ci if (local_use_color) 224cabdff1aSopenharmony_ci SetConsoleTextAttribute(con, background | color[level]); 225cabdff1aSopenharmony_ci win_console_puts(str); 226cabdff1aSopenharmony_ci if (local_use_color) 227cabdff1aSopenharmony_ci SetConsoleTextAttribute(con, attr_orig); 228cabdff1aSopenharmony_ci } else { 229cabdff1aSopenharmony_ci ansi_fputs(level, tint, str, local_use_color); 230cabdff1aSopenharmony_ci } 231cabdff1aSopenharmony_ci#else 232cabdff1aSopenharmony_ci ansi_fputs(level, tint, str, local_use_color); 233cabdff1aSopenharmony_ci#endif 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci} 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ciconst char *av_default_item_name(void *ptr) 238cabdff1aSopenharmony_ci{ 239cabdff1aSopenharmony_ci return (*(AVClass **) ptr)->class_name; 240cabdff1aSopenharmony_ci} 241cabdff1aSopenharmony_ci 242cabdff1aSopenharmony_ciAVClassCategory av_default_get_category(void *ptr) 243cabdff1aSopenharmony_ci{ 244cabdff1aSopenharmony_ci return (*(AVClass **) ptr)->category; 245cabdff1aSopenharmony_ci} 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_cistatic void sanitize(uint8_t *line){ 248cabdff1aSopenharmony_ci while(*line){ 249cabdff1aSopenharmony_ci if(*line < 0x08 || (*line > 0x0D && *line < 0x20)) 250cabdff1aSopenharmony_ci *line='?'; 251cabdff1aSopenharmony_ci line++; 252cabdff1aSopenharmony_ci } 253cabdff1aSopenharmony_ci} 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_cistatic int get_category(void *ptr){ 256cabdff1aSopenharmony_ci AVClass *avc = *(AVClass **) ptr; 257cabdff1aSopenharmony_ci if( !avc 258cabdff1aSopenharmony_ci || (avc->version&0xFF)<100 259cabdff1aSopenharmony_ci || avc->version < (51 << 16 | 59 << 8) 260cabdff1aSopenharmony_ci || avc->category >= AV_CLASS_CATEGORY_NB) return AV_CLASS_CATEGORY_NA + 16; 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci if(avc->get_category) 263cabdff1aSopenharmony_ci return avc->get_category(ptr) + 16; 264cabdff1aSopenharmony_ci 265cabdff1aSopenharmony_ci return avc->category + 16; 266cabdff1aSopenharmony_ci} 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_cistatic const char *get_level_str(int level) 269cabdff1aSopenharmony_ci{ 270cabdff1aSopenharmony_ci switch (level) { 271cabdff1aSopenharmony_ci case AV_LOG_QUIET: 272cabdff1aSopenharmony_ci return "quiet"; 273cabdff1aSopenharmony_ci case AV_LOG_DEBUG: 274cabdff1aSopenharmony_ci return "debug"; 275cabdff1aSopenharmony_ci case AV_LOG_TRACE: 276cabdff1aSopenharmony_ci return "trace"; 277cabdff1aSopenharmony_ci case AV_LOG_VERBOSE: 278cabdff1aSopenharmony_ci return "verbose"; 279cabdff1aSopenharmony_ci case AV_LOG_INFO: 280cabdff1aSopenharmony_ci return "info"; 281cabdff1aSopenharmony_ci case AV_LOG_WARNING: 282cabdff1aSopenharmony_ci return "warning"; 283cabdff1aSopenharmony_ci case AV_LOG_ERROR: 284cabdff1aSopenharmony_ci return "error"; 285cabdff1aSopenharmony_ci case AV_LOG_FATAL: 286cabdff1aSopenharmony_ci return "fatal"; 287cabdff1aSopenharmony_ci case AV_LOG_PANIC: 288cabdff1aSopenharmony_ci return "panic"; 289cabdff1aSopenharmony_ci default: 290cabdff1aSopenharmony_ci return ""; 291cabdff1aSopenharmony_ci } 292cabdff1aSopenharmony_ci} 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_cistatic void format_line(void *avcl, int level, const char *fmt, va_list vl, 295cabdff1aSopenharmony_ci AVBPrint part[4], int *print_prefix, int type[2]) 296cabdff1aSopenharmony_ci{ 297cabdff1aSopenharmony_ci AVClass* avc = avcl ? *(AVClass **) avcl : NULL; 298cabdff1aSopenharmony_ci av_bprint_init(part+0, 0, AV_BPRINT_SIZE_AUTOMATIC); 299cabdff1aSopenharmony_ci av_bprint_init(part+1, 0, AV_BPRINT_SIZE_AUTOMATIC); 300cabdff1aSopenharmony_ci av_bprint_init(part+2, 0, AV_BPRINT_SIZE_AUTOMATIC); 301cabdff1aSopenharmony_ci av_bprint_init(part+3, 0, 65536); 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci if(type) type[0] = type[1] = AV_CLASS_CATEGORY_NA + 16; 304cabdff1aSopenharmony_ci if (*print_prefix && avc) { 305cabdff1aSopenharmony_ci if (avc->parent_log_context_offset) { 306cabdff1aSopenharmony_ci AVClass** parent = *(AVClass ***) (((uint8_t *) avcl) + 307cabdff1aSopenharmony_ci avc->parent_log_context_offset); 308cabdff1aSopenharmony_ci if (parent && *parent) { 309cabdff1aSopenharmony_ci av_bprintf(part+0, "[%s @ %p] ", 310cabdff1aSopenharmony_ci (*parent)->item_name(parent), parent); 311cabdff1aSopenharmony_ci if(type) type[0] = get_category(parent); 312cabdff1aSopenharmony_ci } 313cabdff1aSopenharmony_ci } 314cabdff1aSopenharmony_ci av_bprintf(part+1, "[%s @ %p] ", 315cabdff1aSopenharmony_ci avc->item_name(avcl), avcl); 316cabdff1aSopenharmony_ci if(type) type[1] = get_category(avcl); 317cabdff1aSopenharmony_ci } 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci if (*print_prefix && (level > AV_LOG_QUIET) && (flags & AV_LOG_PRINT_LEVEL)) 320cabdff1aSopenharmony_ci av_bprintf(part+2, "[%s] ", get_level_str(level)); 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci av_vbprintf(part+3, fmt, vl); 323cabdff1aSopenharmony_ci 324cabdff1aSopenharmony_ci if(*part[0].str || *part[1].str || *part[2].str || *part[3].str) { 325cabdff1aSopenharmony_ci char lastc = part[3].len && part[3].len <= part[3].size ? part[3].str[part[3].len - 1] : 0; 326cabdff1aSopenharmony_ci *print_prefix = lastc == '\n' || lastc == '\r'; 327cabdff1aSopenharmony_ci } 328cabdff1aSopenharmony_ci} 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_civoid av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, 331cabdff1aSopenharmony_ci char *line, int line_size, int *print_prefix) 332cabdff1aSopenharmony_ci{ 333cabdff1aSopenharmony_ci av_log_format_line2(ptr, level, fmt, vl, line, line_size, print_prefix); 334cabdff1aSopenharmony_ci} 335cabdff1aSopenharmony_ci 336cabdff1aSopenharmony_ciint av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl, 337cabdff1aSopenharmony_ci char *line, int line_size, int *print_prefix) 338cabdff1aSopenharmony_ci{ 339cabdff1aSopenharmony_ci AVBPrint part[4]; 340cabdff1aSopenharmony_ci int ret; 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci format_line(ptr, level, fmt, vl, part, print_prefix, NULL); 343cabdff1aSopenharmony_ci ret = snprintf(line, line_size, "%s%s%s%s", part[0].str, part[1].str, part[2].str, part[3].str); 344cabdff1aSopenharmony_ci av_bprint_finalize(part+3, NULL); 345cabdff1aSopenharmony_ci return ret; 346cabdff1aSopenharmony_ci} 347cabdff1aSopenharmony_ci 348cabdff1aSopenharmony_civoid av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) 349cabdff1aSopenharmony_ci{ 350cabdff1aSopenharmony_ci static int print_prefix = 1; 351cabdff1aSopenharmony_ci static int count; 352cabdff1aSopenharmony_ci static char prev[LINE_SZ]; 353cabdff1aSopenharmony_ci AVBPrint part[4]; 354cabdff1aSopenharmony_ci char line[LINE_SZ]; 355cabdff1aSopenharmony_ci static int is_atty; 356cabdff1aSopenharmony_ci int type[2]; 357cabdff1aSopenharmony_ci unsigned tint = 0; 358cabdff1aSopenharmony_ci 359cabdff1aSopenharmony_ci if (level >= 0) { 360cabdff1aSopenharmony_ci tint = level & 0xff00; 361cabdff1aSopenharmony_ci level &= 0xff; 362cabdff1aSopenharmony_ci } 363cabdff1aSopenharmony_ci 364cabdff1aSopenharmony_ci if (level > av_log_level) 365cabdff1aSopenharmony_ci return; 366cabdff1aSopenharmony_ci ff_mutex_lock(&mutex); 367cabdff1aSopenharmony_ci 368cabdff1aSopenharmony_ci format_line(ptr, level, fmt, vl, part, &print_prefix, type); 369cabdff1aSopenharmony_ci snprintf(line, sizeof(line), "%s%s%s%s", part[0].str, part[1].str, part[2].str, part[3].str); 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci#if HAVE_ISATTY 372cabdff1aSopenharmony_ci if (!is_atty) 373cabdff1aSopenharmony_ci is_atty = isatty(2) ? 1 : -1; 374cabdff1aSopenharmony_ci#endif 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci if (print_prefix && (flags & AV_LOG_SKIP_REPEATED) && !strcmp(line, prev) && 377cabdff1aSopenharmony_ci *line && line[strlen(line) - 1] != '\r'){ 378cabdff1aSopenharmony_ci count++; 379cabdff1aSopenharmony_ci if (is_atty == 1) 380cabdff1aSopenharmony_ci fprintf(stderr, " Last message repeated %d times\r", count); 381cabdff1aSopenharmony_ci goto end; 382cabdff1aSopenharmony_ci } 383cabdff1aSopenharmony_ci if (count > 0) { 384cabdff1aSopenharmony_ci fprintf(stderr, " Last message repeated %d times\n", count); 385cabdff1aSopenharmony_ci count = 0; 386cabdff1aSopenharmony_ci } 387cabdff1aSopenharmony_ci strcpy(prev, line); 388cabdff1aSopenharmony_ci sanitize(part[0].str); 389cabdff1aSopenharmony_ci colored_fputs(type[0], 0, part[0].str); 390cabdff1aSopenharmony_ci sanitize(part[1].str); 391cabdff1aSopenharmony_ci colored_fputs(type[1], 0, part[1].str); 392cabdff1aSopenharmony_ci sanitize(part[2].str); 393cabdff1aSopenharmony_ci colored_fputs(av_clip(level >> 3, 0, NB_LEVELS - 1), tint >> 8, part[2].str); 394cabdff1aSopenharmony_ci sanitize(part[3].str); 395cabdff1aSopenharmony_ci colored_fputs(av_clip(level >> 3, 0, NB_LEVELS - 1), tint >> 8, part[3].str); 396cabdff1aSopenharmony_ci 397cabdff1aSopenharmony_ci#if CONFIG_VALGRIND_BACKTRACE 398cabdff1aSopenharmony_ci if (level <= BACKTRACE_LOGLEVEL) 399cabdff1aSopenharmony_ci VALGRIND_PRINTF_BACKTRACE("%s", ""); 400cabdff1aSopenharmony_ci#endif 401cabdff1aSopenharmony_ciend: 402cabdff1aSopenharmony_ci av_bprint_finalize(part+3, NULL); 403cabdff1aSopenharmony_ci ff_mutex_unlock(&mutex); 404cabdff1aSopenharmony_ci} 405cabdff1aSopenharmony_ci 406cabdff1aSopenharmony_cistatic void (*av_log_callback)(void*, int, const char*, va_list) = 407cabdff1aSopenharmony_ci av_log_default_callback; 408cabdff1aSopenharmony_ci 409cabdff1aSopenharmony_civoid av_log(void* avcl, int level, const char *fmt, ...) 410cabdff1aSopenharmony_ci{ 411cabdff1aSopenharmony_ci va_list vl; 412cabdff1aSopenharmony_ci va_start(vl, fmt); 413cabdff1aSopenharmony_ci av_vlog(avcl, level, fmt, vl); 414cabdff1aSopenharmony_ci va_end(vl); 415cabdff1aSopenharmony_ci} 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_civoid av_log_once(void* avcl, int initial_level, int subsequent_level, int *state, const char *fmt, ...) 418cabdff1aSopenharmony_ci{ 419cabdff1aSopenharmony_ci va_list vl; 420cabdff1aSopenharmony_ci va_start(vl, fmt); 421cabdff1aSopenharmony_ci av_vlog(avcl, *state ? subsequent_level : initial_level, fmt, vl); 422cabdff1aSopenharmony_ci va_end(vl); 423cabdff1aSopenharmony_ci *state = 1; 424cabdff1aSopenharmony_ci} 425cabdff1aSopenharmony_ci 426cabdff1aSopenharmony_civoid av_vlog(void* avcl, int level, const char *fmt, va_list vl) 427cabdff1aSopenharmony_ci{ 428cabdff1aSopenharmony_ci AVClass* avc = avcl ? *(AVClass **) avcl : NULL; 429cabdff1aSopenharmony_ci void (*log_callback)(void*, int, const char*, va_list) = av_log_callback; 430cabdff1aSopenharmony_ci if (avc && avc->version >= (50 << 16 | 15 << 8 | 2) && 431cabdff1aSopenharmony_ci avc->log_level_offset_offset && level >= AV_LOG_FATAL) 432cabdff1aSopenharmony_ci level += *(int *) (((uint8_t *) avcl) + avc->log_level_offset_offset); 433cabdff1aSopenharmony_ci if (log_callback) 434cabdff1aSopenharmony_ci log_callback(avcl, level, fmt, vl); 435cabdff1aSopenharmony_ci} 436cabdff1aSopenharmony_ci 437cabdff1aSopenharmony_ciint av_log_get_level(void) 438cabdff1aSopenharmony_ci{ 439cabdff1aSopenharmony_ci return av_log_level; 440cabdff1aSopenharmony_ci} 441cabdff1aSopenharmony_ci 442cabdff1aSopenharmony_civoid av_log_set_level(int level) 443cabdff1aSopenharmony_ci{ 444cabdff1aSopenharmony_ci av_log_level = level; 445cabdff1aSopenharmony_ci} 446cabdff1aSopenharmony_ci 447cabdff1aSopenharmony_civoid av_log_set_flags(int arg) 448cabdff1aSopenharmony_ci{ 449cabdff1aSopenharmony_ci flags = arg; 450cabdff1aSopenharmony_ci} 451cabdff1aSopenharmony_ci 452cabdff1aSopenharmony_ciint av_log_get_flags(void) 453cabdff1aSopenharmony_ci{ 454cabdff1aSopenharmony_ci return flags; 455cabdff1aSopenharmony_ci} 456cabdff1aSopenharmony_ci 457cabdff1aSopenharmony_civoid av_log_set_callback(void (*callback)(void*, int, const char*, va_list)) 458cabdff1aSopenharmony_ci{ 459cabdff1aSopenharmony_ci av_log_callback = callback; 460cabdff1aSopenharmony_ci} 461cabdff1aSopenharmony_ci 462cabdff1aSopenharmony_cistatic void missing_feature_sample(int sample, void *avc, const char *msg, 463cabdff1aSopenharmony_ci va_list argument_list) 464cabdff1aSopenharmony_ci{ 465cabdff1aSopenharmony_ci av_vlog(avc, AV_LOG_WARNING, msg, argument_list); 466cabdff1aSopenharmony_ci av_log(avc, AV_LOG_WARNING, " is not implemented. Update your FFmpeg " 467cabdff1aSopenharmony_ci "version to the newest one from Git. If the problem still " 468cabdff1aSopenharmony_ci "occurs, it means that your file has a feature which has not " 469cabdff1aSopenharmony_ci "been implemented.\n"); 470cabdff1aSopenharmony_ci if (sample) 471cabdff1aSopenharmony_ci av_log(avc, AV_LOG_WARNING, "If you want to help, upload a sample " 472cabdff1aSopenharmony_ci "of this file to https://streams.videolan.org/upload/ " 473cabdff1aSopenharmony_ci "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)\n"); 474cabdff1aSopenharmony_ci} 475cabdff1aSopenharmony_ci 476cabdff1aSopenharmony_civoid avpriv_request_sample(void *avc, const char *msg, ...) 477cabdff1aSopenharmony_ci{ 478cabdff1aSopenharmony_ci va_list argument_list; 479cabdff1aSopenharmony_ci 480cabdff1aSopenharmony_ci va_start(argument_list, msg); 481cabdff1aSopenharmony_ci missing_feature_sample(1, avc, msg, argument_list); 482cabdff1aSopenharmony_ci va_end(argument_list); 483cabdff1aSopenharmony_ci} 484cabdff1aSopenharmony_ci 485cabdff1aSopenharmony_civoid avpriv_report_missing_feature(void *avc, const char *msg, ...) 486cabdff1aSopenharmony_ci{ 487cabdff1aSopenharmony_ci va_list argument_list; 488cabdff1aSopenharmony_ci 489cabdff1aSopenharmony_ci va_start(argument_list, msg); 490cabdff1aSopenharmony_ci missing_feature_sample(0, avc, msg, argument_list); 491cabdff1aSopenharmony_ci va_end(argument_list); 492cabdff1aSopenharmony_ci} 493