结构体成员管理AVClass AVOption之1AVClass
来源:互联网 发布:pg dump 导出数据库 编辑:程序博客网 时间:2024/05/20 21:57
所有和AVOption有关的数据都存储在AVClass结构体中。如果一个结构体(例如AVFormatContext或者AVCodecContext)想要支持AVOption的话,它的第一个成员变量必须是一个指向AVClass结构体的指针。该AVClass中的成员变量option必须指向一个AVOption类型的静态数组。
何为AVOption?
AVOption是用来设置FFmpeg中变量值的结构体。特点就在于它赋值的灵活性。AVOption可以使用字符串为任何类型的变量赋值。统一使用字符串赋值。例如给int型变量qp设定值为20,通过AVOption需要传递进去一个内容为“20”的字符串。此外,AVOption中变量的名称也使用字符串来表示。传递两个字符串(一个是变量的名称,一个是变量的值)就可以改变系统中变量的值。
对于从外部系统中调用FFmpeg的人来说,作用就很大了:从外部系统中只可以传递字符串给内部系统。比如说对于直接调用ffmpeg.exe的人来说,他们是无法修改FFmpeg内部各个变量的数值的,这种情况下只能通过输入“名称”和“值”这样的字符串,通过AVOption改变FFmpeg内部变量的值。由此可见,使用AVOption可以使FFmpeg更加适应多种多样的外部系统。如互联网上只可以传输字符串。
其实除了可以对FFmpeg常用结构体AVFormatContext,AVCodecContext等进行赋值之外,还可以对它们的私有数据priv_data进行赋值。例如使用libx264进行编码的时候,通过AVCodecContext的priv_data字段可以对X264Context结构体中的变量进行赋值,设置preset,profile等。使用libx265进行编码的时候,通过AVCodecContext的priv_data字段可以对libx265Context结构体中的变量进行赋值,设置preset,tune等。
何为AVClass?
AVClass最主要的作用就是给结构体(例如AVFormatContext等)增加AVOption功能的支持。AVClass就是AVOption和目标结构体之间的“桥梁”。AVClass要求必须声明为目标结构体的第一个变量。
AVClass中有一个option数组用于存储目标结构体的所有的AVOption。举个例子,AVFormatContext结构体,AVClass和AVOption之间的关系如下图所示。
AVOption
其中,default_val是一个union类型的变量,可以根据选项数据类型的不同,取int,double,char*,AVRational(表示分数)几种类型。
AVClass
AVClass中存储了AVOption类型的数组option,用于存储选项信息。AVClass有一个特点就是它必须位于其支持的结构体的第一个位置。下面通过具体的例子看一下AVClass这个结构体。我们看几个具体的例子:
- AVFormatContext中的AVClass
- AVCodecContext中的AVClass
- AVFrame中的AVClass
- 各种组件(libRTMP,libx264,libx265)里面特有的AVClass。
AVFormatContext
AVFormatContext 中的AVClass定义位于libavformat\options.c中,是一个名称为av_format_context_class的静态结构体。如下所示。从源代码可以看出以下几点
(1)class_name: 该AVClass名称是“AVFormatContext”。
(2)item_name
item_name指向一个函数format_to_name(),该函数定义如下所示。
从函数的定义可以看出,如果AVFormatContext结构体中的AVInputFormat结构体不为空,则返回AVInputFormat的name,然后尝试返回AVOutputFormat的name,如果AVOutputFormat也为空,则返回“NULL”。
(3)optionoption字段则指向一个元素个数很多的静态数组avformat_options。该数组单独定义于libavformat\options_table.h中。其中包含了AVFormatContext支持的所有的AVOption
AVCodecContext
位于libavcodec\options.c中,是一个名称为av_codec_context_class的静态结构体。如下所示。(1)class_name:该AVClass名称是“AVCodecContext”。
(2)item_name
item_name指向一个函数context_to_name (),该函数定义如下所示。
从函数的定义可以看出,如果AVCodecContext中的Codec结构体不为空,则返回Codec(AVCodec类型的)的name,否则返回“NULL”。
(3)option
option字段则指向一个元素个数极多的静态数组avcodec_options。该数组单独定义于libavcodec\options_table.h中。其中包含了AVCodecContext支持的所有的AVOption
AVFrame
位于libavcodec\options.c中,是一个名称为av_frame_class的静态结构体。如下所示。option字段则指向静态数组frame_options。frame_options定义如下所示。
可以看出AVFrame的选项数组中包含了“width”,“height”这类用于视频帧的选项,以及“channel_layout”,“sample_rate”这类用于音频帧的选项。
各种组件特有的AVClass
除了FFmpeg中通用的AVFormatContext,AVCodecContext,AVFrame这类的结构体之外,每种特定的组件也包含自己的AVClass。
LibRTMP
libRTMP中根据协议类型的不同定义了多种的AVClass。由于这些AVClass除了名字不一样之外,其他的字段一模一样,所以AVClass的声明写成了一个名为RTMP_CLASS的宏。这些AVClass的option字段指向的数组是一样的,如下所示。
Libx264
Libx264的AVClass定义如下所示。其中option字段指向的数组定义如下所示。这些option的使用频率还是比较高的。
Libx265
Libx265的AVClass定义如下所示。其中option字段指向的数组定义如下所示。
官方代码中有关AVClass和AVOption的示例
官方代码中给出了一小段示例代码,演示了如何给一个普通的结构体添加AVOption的支持。AVClass有关的API
与AVClass相关的API很少。AVFormatContext提供了一个获取当前AVClass的函数avformat_get_class()。它的代码很简单,直接返回全局静态变量av_format_context_class。定义如下所示。同样,AVCodecContext也提供了一个获取当前AVClass的函数avcodec_get_class()。它直接返回静态变量av_codec_context_class。定义如下所示。
参考:
- 结构体成员管理AVClass AVOption之1AVClass
- 结构体成员管理AVClass AVOption之2AVOption,设置选项值
- FFmpeg源代码简单分析:结构体成员管理系统-AVClass
- AVClass和AVOption
- AVClass
- 需要复习的:FFmpeg源代码简单分析:结构体成员管理系统-AVClass
- ffmpeg源码简析(九)av_log(),AVClass,AVOption
- FFmpeg源代码简单分析:结构体成员管理系统-AVOption
- FFmpeg源代码简单分析:结构体成员管理系统-AVOption
- FFmpeg源代码简单分析:结构体成员管理系统-AVOption
- FFmpeg源代码简单分析:结构体成员管理系统-AVOption
- 需要复习的:FFmpeg源代码简单分析:结构体成员管理系统-AVOption
- ffmpeg——AVOptions/AVClass 接口
- AVOption
- IRP结构体之Flag成员
- 结构体成员排序
- 结构体成员
- 结构体互为成员
- CSS图片宽度设置百分比 , 高度同宽度相同
- 列表和字典嵌套完成电话簿(增删改查)
- 游标查询,最好控制在1万条以内
- SSH和SSM对比总结
- 回收VMWare虚拟机占用的磁盘空间
- 结构体成员管理AVClass AVOption之1AVClass
- 在线签名组件GroupDocs.Signature V17.8发布 | 新增多项功能
- Maven学习总结(八)——eclipse中使用Maven创建Web项目
- 今天是我来到csdn的第一天,从今天开始我要在csdn上学习和交流
- android Gradle 深入须知
- Jmeter简单控制器
- 搞Java的程序员怎么做到年薪40W?
- 看车牌识别软件在移动警务中的作用到底有多大
- 使用group by,having,count函数查询表中某字段相同内容的数据