"); //-->
接着上篇,我们本篇将会对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相关的特性。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。