简介:CSDN博客专家、《Android系统多媒体进阶实战》作者
博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址:Audio工程师进阶系列【原创干货持续更新中……】🚀
Android多媒体专栏地址:多媒体系统工程师系列【原创干货持续更新中……】🚀
专题一 二:AAOS车载系统+AOSP14系统攻城狮入门视频实战课🚀
专题三:Android14 Binder之HIDL与AIDL通信实战课🚀
专题四:Android15快速自定义与集成音效实战课🚀
专题五:Android15音频策略实战课🚀
专题六:Android15音频性能实战课(无声/杂音/断音/爆音实战案例)🚀
人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.应用场景和用法
- 2.1类型标识的使用场景
- 2.2函数原型与类型关系
- 🌻3.调用流程剖析
- 3.1从类型定义生成get_type
- 3.2类型注册后连接类与实例初始化
- 🌻4.实战案例
- 4.1准备类型系统查询
- 4.2调用get_type并检查父类型
- 4.3完整代码
- 🌻5.总结
🌻1.前言
本篇目的:理解
gst_audio_aggregator_pad_get_type()如何注册并返回GstAudioAggregatorPad的GType,分析类型定义、父类型和元素Pad模板之间的关系。
GStreamer使用GType描述对象的类型、父子关系和类信息。gst_audio_aggregator_pad_get_type()返回GstAudioAggregatorPad对应的类型标识,供类型检查、对象系统和Pad模板使用。它不创建Pad实例,也不处理Caps或音频Buffer。
🌻2.应用场景和用法
2.1类型标识的使用场景
gst_audio_aggregator_pad_get_type()主要用于取得类型系统中的Pad类型标识。通常应用代码通过GST_TYPE_AUDIO_AGGREGATOR_PAD宏间接调用它。
| 场景 | 类型标识的用途 | 结果 |
|---|---|---|
| 类型检查 | 判断对象是否为GstAudioAggregatorPad或其子类 | 确认对象可以按该Pad类型处理 |
| 类型转换 | 使用GST_AUDIO_AGGREGATOR_PAD()进行对象转换 | 得到聚合器Pad指针 |
| Pad模板声明 | 给静态Pad模板指定实例类型 | 新建Pad时使用匹配的类型 |
| 子类定义 | 将GstAudioAggregatorPad作为父类型 | 扩展Pad行为或私有状态 |
类型标识与对象实例不是一回事。取得GType不会分配Pad,也不会将Pad加入某个元素。实例创建和Pad连接由对象创建及元素Pad管理流程负责。
2.2函数原型与类型关系
函数原型如下:
GTypegst_audio_aggregator_pad_get_type(void);头文件中的类型宏会调用该函数:
#defineGST_TYPE_AUDIO_AGGREGATOR_PAD\(gst_audio_aggregator_pad_get_type())源码使用G_DEFINE_TYPE_WITH_PRIVATE定义GstAudioAggregatorPad,父类型是GST_TYPE_AGGREGATOR_PAD。该宏生成gst_audio_aggregator_pad_get_type(),并把类型注册逻辑与类初始化、实例初始化和私有数据布局关联起来。
| 概念 | 职责 |
|---|---|
GType | 类型系统中的稳定类型标识 |
GstAggregatorPad | GstAudioAggregatorPad的父类型 |
GstAudioAggregatorPad | 增加音频格式信息的聚合器Pad对象 |
G_DEFINE_TYPE_WITH_PRIVATE | 生成类型注册与私有实例数据支持代码 |
GST_TYPE_AUDIO_AGGREGATOR_PAD | 获取该类型标识的便捷宏 |
🌻3.调用流程剖析
3.1从类型定义生成get_type
gst_audio_aggregator_pad_get_type()不是手写的普通业务函数。源码通过G_DEFINE_TYPE_WITH_PRIVATE声明类型实现,并指定GST_TYPE_AGGREGATOR_PAD作为父类型。
首次请求该类型时,生成的类型注册逻辑会向GObject类型系统登记类型及父子关系,后续请求得到同一个GType标识。类型系统据此找到对应的类初始化和实例初始化入口。
3.2类型注册后连接类与实例初始化
类型注册后,类初始化函数安装对象属性处理和Pad的flush实现,并设置析构逻辑。实例初始化函数取得私有数据,初始化GstAudioInfo,并将内部缓冲区、位置和时间状态设置为初始值。
源码中的GstAudioAggregatorConvertPad以GstAudioAggregatorPad为父类型。interleave的Src Pad模板也使用GST_TYPE_AUDIO_AGGREGATOR_PAD指定Pad实例类型。这说明get_type()提供的是类型系统入口,具体对象由模板或对象创建流程实例化。
🌻4.实战案例
4.1准备类型系统查询
这个案例只验证类型系统信息,不创建Pad实例。程序取得GstAudioAggregatorPad和GstAggregatorPad的类型标识,再检查前者的父类型以及继承关系。
4.2调用get_type并检查父类型
GST_TYPE_AUDIO_AGGREGATOR_PAD宏会调用gst_audio_aggregator_pad_get_type()。程序同时直接调用函数并与宏结果比较,确认宏和函数对应同一类型。随后检查父类型是否为GST_TYPE_AGGREGATOR_PAD。
4.3完整代码
#include<gst/gst.h>#include<gst/base/gstaggregator.h>#include<gst/audio/audio.h>intmain(intargc,char*argv[]){GType pad_type;GType parent_type;gboolean valid;gst_init(&argc,&argv);/* 直接取得音频聚合器Pad的GType */pad_type=gst_audio_aggregator_pad_get_type();/* 宏展开后调用同一个get_type函数 */valid=pad_type==GST_TYPE_AUDIO_AGGREGATOR_PAD;if(!valid)return1;/* 检查类型系统记录的直接父类型 */parent_type=g_type_parent(pad_type);valid=parent_type==GST_TYPE_AGGREGATOR_PAD;/* 确认该类型继承自GstAggregatorPad */valid=valid&&g_type_is_a(pad_type,GST_TYPE_AGGREGATOR_PAD);returnvalid?0:1;}🌻5.总结
gst_audio_aggregator_pad_get_type()由类型定义宏生成,用于向GObject类型系统注册并取得继承自GstAggregatorPad的GstAudioAggregatorPad类型标识。