[GLib][GStreamer] GType的创建

参考:

GObject – 2.0https://docs.gtk.org/gobject/?q=G_DEFINE_TYPE

G_DEFINE_TYPE 做了什么?

以 G_DEFINE_TYPE(GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT); 为例

1.声明了如下几个static函数

static void     gst_my_filter_init              (GstMyFilter        *self);
static void     gst_my_filter_class_init        (GstMyFilterClass *klass);
static GType    gst_my_filter_get_type_once     (void);
static gpointer gst_my_filter_parent_class = NULL;
static gint     GstMyFilter_private_offset;

2.定义函数

static void gst_my_filter_class_intern_init(gpointer klass)
{
  gst_my_filter_parent_class = g_type_class_peek_parent (klass);
  if (GstMyFilter_private_offset != 0)
    g_type_class_adjust_private_offset (klass, &GstMyFilter_private_offset);
  gst_my_filter_class_init ((GstMyFilterClass*) klass);
}

static inline gpointer gst_my_filter_get_instance_private(GstMyFilter *self)
{
...
}

GType gst_my_filter_get_type (void)
{
    //GLib 在内部为我们找一个未使用的int类型,然后作为GType返回。
    //如果我们想要自行指定int值,可以在这个函数里面实现,具体的流程可以参考
    //https://docs.gtk.org/gobject/func.DEFINE_TYPE_EXTENDED.html
}

3.ps

如果不使用 G_DEFINE_TYPE ,则需要自己实现 GType gst_my_filter_get_type (void)

其他扩展的 G_DEFINE_TYPE_XXX函数

NameDescription
G_DEFINE_TYPEGObject.DEFINE_TYPE
G_DEFINE_TYPE_EXTENDEDGObject.DEFINE_TYPE_EXTENDED
G_DEFINE_TYPE_WITH_CODEGObject.DEFINE_TYPE_WITH_CODE
G_DEFINE_TYPE_WITH_PRIVATEGObject.DEFINE_TYPE_WITH_PRIVATE
G_DEFINE_BOXED_TYPEGObject.DEFINE_BOXED_TYPE
G_DEFINE_FINAL_TYPEGObject.DEFINE_FINAL_TYPE
G_DEFINE_DYNAMIC_TYPEGObject.DEFINE_DYNAMIC_TYPE
G_DEFINE_POINTER_TYPEGObject.DEFINE_POINTER_TYPE
G_DEFINE_ABSTRACT_TYPEGObject.DEFINE_ABSTRACT_TYPE
G_DEFINE_BOXED_TYPE_WITH_CODEGObject.DEFINE_BOXED_TYPE_WITH_CODE
G_DEFINE_FINAL_TYPE_WITH_CODEGObject.DEFINE_FINAL_TYPE_WITH_CODE
G_DEFINE_DYNAMIC_TYPE_EXTENDEDGObject.DEFINE_DYNAMIC_TYPE_EXTENDED
G_DEFINE_FINAL_TYPE_WITH_PRIVATEGObject.DEFINE_FINAL_TYPE_WITH_PRIVATE
G_DEFINE_POINTER_TYPE_WITH_CODEGObject.DEFINE_POINTER_TYPE_WITH_CODE
G_DEFINE_ABSTRACT_TYPE_WITH_CODEGObject.DEFINE_ABSTRACT_TYPE_WITH_CODE
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATEGObject.DEFINE_ABSTRACT_TYPE_WITH_PRIVATE

GType的创建和管理

定义:

#if     GLIB_SIZEOF_SIZE_T != GLIB_SIZEOF_LONG || !defined __cplusplus
typedef gsize                           GType;
#else   /* for historic reasons, C++ links against gulong GTypes */
typedef gulong                          GType;
#endif

GType类型是一个整形值,本身本没有任何意义,但是它和一个结构体数组相关联:

//长度为255+1的数组,这个数组中每一项都对应一个GType
static TypeNode	*static_fundamental_type_nodes[(G_TYPE_FUNDAMENTAL_MAX >> G_TYPE_FUNDAMENTAL_SHIFT) + 1] = { NULL, };


/* --- structures --- */
struct _TypeNode
{
  guint        ref_count;  /* (atomic) */
#ifdef G_ENABLE_DEBUG
  guint        instance_count;  /* (atomic) */
#endif
  GTypePlugin *plugin;
  guint        n_children; /* writable with lock */
  guint        n_supers : 8;
  guint        n_prerequisites : 9;
  guint        is_classed : 1;
  guint        is_instantiatable : 1;
  guint        mutatable_check_cache : 1;	/* combines some common path checks */
  GType       *children; /* writable with lock */
  TypeData    *data;
  GQuark       qname;
  GData       *global_gdata;
  union {
    GAtomicArray iface_entries;		/* for !iface types */
    GAtomicArray offsets;
  } _prot;
  GType       *prerequisites;
  GType        supers[1]; /* flexible array */
};


//以GType为缩引查找数组中相应的结构体
static inline TypeNode*
lookup_type_node_I (GType utype)
{
  if (utype > G_TYPE_FUNDAMENTAL_MAX)
    return (TypeNode*) (utype & ~TYPE_ID_MASK);
  else
    return static_fundamental_type_nodes[utype >> G_TYPE_FUNDAMENTAL_SHIFT];
}

用户定义的GType的序号起始点为:

static GType		 static_fundamental_next = G_TYPE_RESERVED_USER_FIRST;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值