"); //-->
接着上篇,我们本篇将会对GObject的具体语法做出简介及其分析。
g_object_new函数
这个函数是个可变参数的函数, 第一个参数是需要创建的对象的类型, 当使用 g_object_new 来创建对象的时候,这个参数是必须的,同时它还要求这个函数所创建的对象必须是GObject的子对象. 在我们定义自己的对象时, 必须要在系统中注册自己的类型, 这里的系统指的是 glib 的系统, 即 glib 自己维护的一套数据结构. 先说一下第二个参数, 从第二个参数开始, 表示的是 object 的属性, 它们都是成对出现的,如果没有属性需要在创建对象的时候设置, 则第二个参数设置成 NULL. 如果有属性要设置, 那么最后一个参数也要设置成 NULL
Gstimxv4l2src.c架构分析---继承关系
先来看这个头文件,核心结构体是GstImxV4l2SrcGstImxV4l2SrcClass,他俩一起模拟了一个类。分别从这两个结构体中的第一个元素可以看出来它们的父类:GstPushSrc。对象分层结构如下:

根据这个分层结构可以看出来,对于GObject系统,类都是从GObject类继承过来的,而对于GStreamer来说,它们是从GstObject开始继承的,就是这样GstObject--->GstElement--->GstBaseSrc--->GstPushSrc--->GstImxV4l2Src这样继承下来的。为什么要这样继承呢?我认为是这样的原因:因为GStreamer中已经包含有有关src相关的类(GstPushSrc),
现在需要实现一个与imx相关的src插件,就直接从 GstPushSrc继承,这样的话,如果对于相同的元素或方法,直接使用GstPushSrc中已经实现的,这样可以减少开发难度。如果对于与imx6相关的元素或方法,就重载所需
的这些方法,让它们与硬件相关。
同样,如果对于sink插件,我们同样直接继承GStreamer中sink相关的类即可,如下图所示:

从这个图中可以看出来,sink插件是按照GstObject--->GstElement---
>GstBaseSink--->GstVideoSink--->GstImxV4l2Sink的方式继承下来的。
Gstimxv4l2src.c架构分析---初始化函数
• 类结构体初始化函数gst_imx_v4l2src_class_init和实例结构体初始
化函数gst_imx_v4l2src_init。
• 在实例结构体初始化函数gst_imx_v4l2src_init中,它只需要完成这
个类的成员的初始化即可。所以它的实现还是比较简单的,将那些元素赋初值即可。重点是类结构体初始化函数
gst_imx_v4l2src_class_init。在这个函数中,则需要根据结构体的继承关系来重载一些方法。
• 下面就按照这个继承关系来分析:
• GstObject--->GstElement--->GstBaseSrc--->GstPushSrc---
>GstImxV4l2Src
看看它的层次结构:
由于GStreamer相关的结构体都是从这个GstObject中继承过来的,所以上面的层次结构中就包含了所有系统已经设置好的结构体。因为这个GstObject也是从GObject结构体中继承过来的,所以需要重载GObject这个结构体里面的set/get_property函数以及finalize析构函数。
对于struct GObjectClass:
struct GObjectClass {
GTypeClass g_type_class;
/* seldom overidden */
GObject* (*constructor) (GType type,
guint
n_construct_properties,
GObjectConstructParam *construct_properties);
/* overridable methods */
void (*set_property) (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
void (*get_property) (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
void (*dispose) (GObject *object);
void (*finalize) (GObject *object);
/* seldom overidden */
void (*dispatch_properties_changed) (GObject *object,
guint n_pspecs,
GParamSpec **pspecs);
/* signals */
void (*notify) (GObject *object,
GParamSpec *pspec);
/* called when done constructing */
void (*constructed) (GObject *object);
};关于GObject这部分的语法特性我们就分析到这里,在接下来的博客中,我们将回归GstElement,我们来由此继续讨论与Gst相关的特性。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
据报道,美光退出为华为瞄准韩国消费级SSD市场打开了大门
美国代工厂首个真正制造的3D芯片,采用碳纳米管晶体管和内存集成于单芯片上——未来器件的能量延迟产物性能有望提升多达1000倍
protel 2004汉化程序(1)
中国价值164亿美元芯片巨型合并破裂,Hygon与Sugon取消交易
51系列I/O口上拉电阻使用点滴
Protel 2004汉化程序
POWERPCB中用的BMP2ASC程序
由OPA2662构成的数字440MBit/s发送系统的驱动放大电路
实现Stratix III FPGA和1,067-Mbps DDR3存储器的接口
中国GPU首次公开募股浪潮加剧:MetaX超越摩尔线索,吸引散户投资者兴趣
美国工程师研发出新型3D芯片,性能超2D芯片一个数量级
单碟存360TB,5D玻璃存储技术启动数据中心落地计划
即插即用信号完整性视频演示
有关微处理器的十条谎言
由双宽带跨导型运算放大器OPA2662构成的模拟-数字视频磁带录制放大电路
OPA660宽带跨导型运算放大和缓冲器
2026年量产,能取代GPU的QPU要来了?
POWERPCB汉字库
芯原微电子终止收购芯来智融剩余全部股权交易
今天看了PC-lint的东西,想再受一点打击,随便写写!
由OPA2662构成的1600×1200高分辨率图形监控器CRT输出级驱动电路
53年后,惠普于1972年推出的总线标准获得了稳定的Linux驱动——通用接口总线拥有惊人的8 MB/s带宽
三星CEO据报道将就紧张的移动DRAM供应问题,罕见的参加CES会议
由双宽带跨导型运算放大器OPA2662构成的二通道电流输出驱动电路
Comparing Stratix III and Virtex-5 Core Power
DSP技术与应用
TMS320C6472 多核 DSP & EVM 工业及嵌入式应用
TPA5050 社区视频
Protel 2000 电路图电路板设计软件
DSP编程和多个DSP并行处理