0 概述
FFMPEG中有一种非常棒的访问结构体成员,以及成员的子成员方法,且称为“结构体成员管理系统”吧,该系统涉及到几个FFMPEG中特别常见的结构体AVClass,AVOption,AVDictionary,AVDictionaryEntry等,以及一系列操作这些结构体的函数。也许,有的人会奇怪:C语言中访问结构体变量,直接使用结构体的"."运算符取值,直接使用等于号“=”赋值不就可以了嘛?为什么还要专门定义这么多结构体和函数,来设计这么复杂的系统来实现这么直接易得的功能呢?
传统意义上,如果结构体的成员变量类型为int,则需要使用整数来赋值;如果成员变量为double,则需要使用小数来赋值;如果成员变量类型为char *,才需要使用字符串来赋值。而“结构体成员管理系统”将这些赋值“归一化”了,统一使用字符串赋值。例如给int型成员变量qp设定值为20,只需传递两个字符串(一个是变量名称字符串“qp”,一个是变量值字符串“20”)就可以改变结构体成员变量的值;对于其他类型的成员变量,也可以以同样的方式来操作。
本文将详细讨论这个系统的实现细节:包括AVClass,AVOption,AVDictionary等结构体每个字段的详细解析;一些重要API的使用细节,以及调用/被调用的关系;并举几个实例来说明这些结构体和APIs如何构建这个“结构体成员管理系统”的。
本文是在参考学习雷神博客以及详细阅读FFMPEG4.1版本的源码后总结而出,参阅雷神博客以了解FFMPEG早期版本相关内容:
1 Strcutures
1.1 AVClass
1.2 AVOption
1.3 AVDictionary
2 APIs
写博客是个费脑费时的事,今天先写到这儿,未完待续