FFprobe源码分析-2 - 弦外之音

/ 0评 / 0

上一篇讲完 命令行参数 是如何解析到全局变量的,这篇文章主要分析 writer_open() 函数,

FFprobe 支持几种输出格式,defaultxmljson。每种格式都有各自的 Writerxml_writerjson_writerdefault_writer 等等。

writer_open() 这个函数主要是初始化 WriterContext。下图以 default_writer 为例,展示初始化完成之后的数据结构关系。

上图的数据结构非常精妙,他定义一个 struct WriterContext 作为一个通用 writer 的上下文,AVClass 里面有一个 writer_options 通用设置。然后他里面还有一个 void * priv 用来存储不通用的context,这个 context 里面也有一个 default_option 作为独立的设置选项。

这种 通用 context 套 独立contexnt 的用法,在 ffmpeg 整个项目是非常常见的,好几处地方都是如此,推荐阅读雷神文章,结构体成员管理系统-AVOption

这就是内核+插件的模式。通用的就是内核,不通用的就是插件。例如

AVCodecContext 里面包一个独立的 H264 contexnt

AVCodecContext 里面包一个独立的 HEVC contexnt

ffmpeg 编解码 api,只需用到 AVCodecContext

其实不必太过纠结 writer 的实现,把他看成一个 print 的封装就行,writer 不会影响到编解码之类的东西,writer只是决定输出格式。


©版权所属:知识星球:弦外之音,QQ:2338195090。

由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注