gstreamer源码阅读笔记:类型系统

gstreamer采用GObject注册和管理类型,这套类型系统需要实现以下几个功能:

1.按类型查找并引用函数

        在面向对象的编程中,非静态变量属于对象,方法是属于类的。注册类型的同时需要注册方法,把方法的函数指针保存在类对象的成员变量中。比如类的初始化函数xxx_class_init,对象的初始化函数_init,类的析构函数_class_finalize,对象的析构函数_finalize。当把这些方法的地址保存在类对象的时候,当我们需要在对象上执行这些方法的时候可以通过注册的类对象引用这些函数。

2.实现属性和方法的继承

        可以通过注册类型的方式实现属性和方法的继承,在注册的时候声明类型的继承关系。当访问子类对象的属性和方法时,如果在子类型对象的空间内没有找到对应的属性和方法,可以通过注册的类型系统查找该类型的父类型,然后在对应的父类型对象的空间类查找需要的方法和属性。

GObject用c语言实现了面向对象的编程。具体使用过程如下。GObject类型系统需要定义类型结构体xxxClass,对象结构体xxx,类型初始化函数xxx_class_init,对象初始化函数xxx_init,类型析构函数xxx_class_finalize,对象析构函数xxx_finalize。然后利用g_type_register_static函数注册。

GType
g_type_register_static (
  GType parent_type,
  const gchar* type_name,
  const GTypeInfo* info,
  GTypeFlags flags
)

 更多的时候会使用G_DEFINE_TYPE宏来注册类型,G_DEFINE_TYPE在 GLIB 的gobject/gtype.h 中定义

#define G_DEFINE_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
#define G_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_)      _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
 
#define _G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \
\
static void     type_name##_init              (TypeName        *self); \
static void     type_name##_class_init        (TypeName##Class *klass); \
static gpointer type_name##_parent_class = NULL; \
static void     type_name##_class_intern_init (gpointer klass) \
{ \
  type_name##_parent_class = g_type_class_peek_parent (klass); \
  type_name##_class_init ((TypeName##Class*) klass); \
} \
\
gulong\
type_name##_get_type (void) \
{ \
  static volatile gsize g_define_type_id__volatile = 0; \
  if (g_once_init_enter (&g_define_type_id__volatile))  \
    { \
      gulongg_define_type_id = \
        g_type_register_static_simple (TYPE_PARENT, \
                                       g_intern_static_string (#TypeName), \
                                       sizeof (TypeName##Class), \
                                       (GClassInitFunc) type_name##_class_intern_init, \
                                       sizeof (TypeName), \
                                       (GInstanceInitFunc) type_name##_init, \
                                       (GTypeFlags) flags); \
      { /* custom code follows */
          #define _G_DEFINE_TYPE_EXTENDED_END()   \
        /* following custom code */ \
      }                 \
      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
    }                   \
  return g_define_type_id__volatile;    \
} /* closes type_name##_get_type() */

        G_DEFINE_TYPE展开的g_type_register_static_simple会把类型初始化函数,对象初始化函数也注册进系统。当使用g_object_new创建对象的时候,该过程自动调用对象初始化函数来初始化对象。G_DEFINE_TYPE同时定义xxx_get_type()函数,该函数返回该类型的注册得到的GType。

GObject*
g_object_new (
  GType object_type,
  const gchar* first_property_name,
  ...
)

g_object_unref会减少对于该对象的引用计数,当引用彻底消失后,会调用_finalize函数。

https://docs.gtk.org/gobject/ctor.Object.new.html

https://docs.gtk.org/gobject/func.type_register_static.html
https://blog.csdn.net/yanbixing123/article/details/52970804

https://blog.csdn.net/chudaiao7567/article/details/100817127

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值