当前位置: 首页 > ds >正文

修改FFMpeg的日志函数av_log,使其在记录日志时能显示调用该函数的位置(文件名和行号)

需要注释掉原有的 av_log 声明和实现,然后将新代码添加到 log.h 中。以下是完整、优化的实现方案:

在log.h中添加一下代码,已定义新的av_log函数。

// log.h// 修改函数签名,增加 file 和 line 参数
static void av_log_impl(void* avcl, int level, const char *file, int line, const char *fmt, ...) {va_list vl;va_start(vl, fmt);// 动态拼接调用位置信息(避免缓冲区溢出)char new_fmt[1024];snprintf(new_fmt, sizeof(new_fmt), "[%s:%d] %s", file, line, fmt);av_vlog(avcl, level, new_fmt, vl); // 调用底层日志函数va_end(vl);
}// 定义包装宏:在调用点展开 __FILE__ 和 __LINE__
#define av_log(avcl, level, fmt, ...) \av_log_impl(avcl, level, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

需要同时进行的修改:

  1. 在实现文件中注释掉原有函数定义
    在你的实现文件(如 log.c)中找到原函数并注释掉:

    // void av_log(void* avcl, int level, const char *fmt, ...)
    // {
    //     ... 原有实现 ...
    // }
    
  2. 注释掉原来的av_log声明
    在 log.h 中,注释掉原来的av_log声明:

     // 注释掉原来的av_log声明// void av_log(void* avcl, int level, const char *fmt, ...);
    
  3. 确保 av_vlog 可用
    确保在 log.h 中声明了 av_vlog 函数:

    void av_vlog(void* avcl, int level, const char *fmt, va_list vl);
    

关键优化说明:

  1. 安全缓冲区

    • 使用固定大小缓冲区避免动态内存分配
    • 安全截断确保不会越界 (snprintf 的自动截断特性)
  2. 性能考虑

    • static 函数定义避免符号冲突
    • 内联调用位置信息仅在启用日志时才处理
  3. 编译器兼容性

    • ##__VA_ARGS__ 处理 GNU C/C++ 的空参数情况
    • 使用标准 C99 特性保证可移植性
  4. 日志格式灵活性
    如果想添加更多上下文(如函数名),可扩展为:

    #define av_log(avcl, level, fmt, ...) \av_log_impl(avcl, level, __FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)
    

    然后在函数中修改格式字符串为 "[%s:%d] %s: %s"

这样修改后,所有调用 av_log 的地方都会自动添加准确的位置信息,例如:

av_log(NULL, 1, "Starting playback");
// 输出格式: [player.c:42] Starting playback
http://www.xdnf.cn/news/13852.html

相关文章:

  • Metastore 架构示意图和常用 SQL
  • 前端加密当日
  • 力扣前缀和
  • 河南农担携手Gitee企业版:构建农业金融数字化研发新基建
  • 网络层协议:IP
  • qt初识--02
  • 移动电储能工作原理及SOC约束解析
  • 光谱相机叶绿素荧光成像技术的原理
  • Vue 组件通信
  • Jenkins 配置信息导出 的详细说明(中英对照)
  • 如何用AI赋能学习
  • OpenCV CUDA模块图像变形------对图像进行 尺寸缩放(Resize)操作函数resize()
  • Elasticsearch:使用 ES|QL 进行地理空间距离搜索
  • Linux612 chroot_list开放;FTP服务ftp:get put,指定上传路径报错553;ftp查看文件夹权限
  • 28-Oracle 23ai Fast Ingest(Memoptimized Rowstore)高频写入
  • 西电【信息与内容安全】课程期末复习笔记
  • jupyter notebook的相关知识及可能遇到的问题
  • LeetCode 2917.找出数组中的K-or值
  • Shell 脚本:系统管理与任务自动化的利器
  • docker compose安装Prometheus、Grafana
  • ubuntu网络连接失败 + mobaxterm拖拽文件出错等问题解决方法
  • CQL3D编译指南
  • PPIO 上线 Qwen3-Embedding 系列模型
  • C++学习-入门到精通【19】杂项汇总
  • 企业级人员评价系统Web端重构实战:前端架构效能升级
  • 【11408学习记录】考研数学核心突破:矩阵本质、系统信息与向量空间基
  • Linux系统lvm操作演示
  • 傲火集团传媒基地武汉启幕 构建数字娱乐产业生态闭环
  • 图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)
  • linux安装Redis6.0.8