FFmpeg打印日志函数分析

FFmpeg的打印日志实现在FFmpeg-n4.2.1/libavutil/log.c中。

一、设置log等级

1、设置日志级别

日志默认级别是AV_LOG_INFO

static int av_log_level = AV_LOG_INFO;

使用av_log_set_level将日志级别设置为调试级别(AV_LOG_DEBUG)

av_log_set_level(AV_LOG_DEBUG);

源码:

void av_log_set_level(int level){
    
    av_log_level = level;
}
2、日志级别列表
#define AV_LOG_QUIET    -8	 保持沉默,不输出
#define AV_LOG_PANIC     0	 确实出了问题,即将崩溃。
#define AV_LOG_FATAL     8	 有些地方出了问题,并且不可能修复
#define AV_LOG_ERROR    16	 有些地方出了问题,不能毫无损失地恢复。
#define AV_LOG_WARNING  24	 有些东西看起来不太对,有可能出问题
#define AV_LOG_INFO     32	 标准信息。
#define AV_LOG_VERBOSE  40	 详细的信息。
#define AV_LOG_DEBUG    48	 调试信息,只对libav*开发者有用的东西。
#define AV_LOG_TRACE    56	 非常冗长的调试信息,对libav*开发非常有用。

二、打印函数分析

例如下面的打印信息:

[mpegts @ 0x7f92cc002f00] Format mpegts probed with size=2048 and score=50

这个信息由下面的函数打印:

av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);

av_log 调用 av_vlog:

void av_log(void* avcl, int level, const char *fmt, ...){
    
    va_list vl;
    va_start(vl, fmt);
    av_vlog(avcl, level, fmt, vl);
    va_end(vl);
}

av_vlog则调用默认注册的回调函数av_log_default_callback

void av_vlog(void* avcl, int level, const char *fmt, va_list vl){
    
    void (*log_callback)(void*, int, const char*, va_list) = av_log_callback;
    if (log_callback)
        log_callback(avcl, level, fmt, vl);
}

static void (*av_log_callback)(void*, int, const char*, va_list) 
	= av_log_default_callback;

av_log_default_callback函数伪代码

void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl){
    
	if (level > av_log_level) return; "控制打印级别"
	format_line(...); "格式化输出"
	colored_fputs(...);"设置终端字体颜色:\033[字背景颜色;字体颜色m字符串\033[0m"
}
原文地址:https://www.cnblogs.com/lidabo/p/15573448.html