当前位置: 首页 > ds >正文

G_DEFINE_TYPE的作用

G_DEFINE_TYPE (GstPlay, gst_play, GST_TYPE_OBJECT);

1. 宏参数说明

  • GstPlay:要定义的新类型的名称(结构体标签名)。

  • gst_play:新类型相关函数的前缀(小写形式,用于生成函数名)。

  • GST_TYPE_OBJECT:父类的GType(这里表示GstPlay继承自GstObject)。

2. 宏展开后的主要功能

这个宏会展开为一段代码,完成以下任务:

a. 定义类型初始化函数

生成两个函数:

  • gst_play_init():实例初始化函数(每个实例创建时调用)。

  • gst_play_class_init():类初始化函数(在类第一次使用时调用)。

b. 注册类型

通过调用g_type_register_static_simple()将新类型注册到GObject的类型系统,包括:

  • 类型名称(例如:“GstPlay”)

  • 类结构体大小(sizeof(GstPlayClass)

  • 类初始化函数(gst_play_class_init

  • 实例结构体大小(sizeof(GstPlay)

  • 实例初始化函数(gst_play_init

  • 析构处理(通常为NULL,使用默认)

c. 定义类型转换宏

生成一组类型转换宏,例如:


#define GST_TYPE_PLAY (gst_play_get_type())#define GST_PLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_PLAY, GstPlay))#define GST_IS_PLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_PLAY))#define GST_PLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_PLAY, GstPlayClass))#define GST_IS_PLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_PLAY))#define GST_PLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_PLAY, GstPlayClass))

3. 使用前提

使用此宏前,必须已定义以下结构体:


// 实例结构体typedef struct _GstPlay {GstObject parent;   // 必须将父类实例作为第一个成员/* 子类实例变量 */} GstPlay;// 类结构体typedef struct _GstPlayClass {GstObjectClass parent_class; // 必须将父类类结构作为第一个成员/* 子类虚函数(方法) */} GstPlayClass;

4. 典型位置

此宏通常放在C文件的顶部(在实现任何方法之前),因为:

  • 它声明了gst_play_get_type()函数(该函数用于获取类型的GType)。

  • 生成的类型转换宏需要在后续代码中使用。

5. 宏展开示例(简化版)

static void gst_play_init(GstPlay *self);static void gst_play_class_init(GstPlayClass *klass);static gpointer gst_play_parent_class = NULL;GType gst_play_get_type(void){static volatile gsize g_define_type_id__volatile = 0;if (g_once_init_enter(&g_define_type_id__volatile)) {GType g_define_type_id = g_type_register_static_simple(GST_TYPE_OBJECT, // 父类型g_intern_static_string("GstPlay"), // 类型名sizeof(GstPlayClass), // 类结构体大小(GClassInitFunc)gst_play_class_init, // 类初始化函数sizeof(GstPlay), // 实例结构体大小(GInstanceInitFunc)gst_play_init, // 实例初始化函数0); // 标志位g_once_init_leave(&g_define_type_id__volatile, g_define_type_id);}return g_define_type_id__volatile;
}

6. 后续使用

定义类型后,可以:

  • 创建实例:g_object_new(GST_TYPE_PLAY, NULL)

    • 源码中是 self = g_object_new (GST_TYPE_PLAY, "video-renderer", video_renderer, NULL);
  • 实现类初始化函数:在其中注册信号、属性、覆盖虚函数等。

  • 实现实例初始化函数:初始化实例成员变量。

7. 在GStreamer中的意义

在GStreamer中,所有元素(GstElement)和插件都是基于GObject构建的。GstPlay作为媒体播放器的高级抽象,通过继承GstObject(GStreamer对象基类)获得:

  • 引用计数管理

  • 父子关系支持

  • 信号系统集成

  • 属性系统支持

8. 完整示例框架


// gstplay.htypedef struct _GstPlay GstPlay;typedef struct _GstPlayClass GstPlayClass;struct _GstPlay {GstObject parent;// 实例成员};struct _GstPlayClass {GstObjectClass parent_class;// 类方法(虚函数)};GType gst_play_get_type (void);// gstplay.c#include "gstplay.h"G_DEFINE_TYPE (GstPlay, gst_play, GST_TYPE_OBJECT);static voidgst_play_class_init (GstPlayClass *klass){// 注册信号、属性,设置虚函数等}static voidgst_play_init (GstPlay *self){// 初始化实例成员}

通过这个宏,GObject系统的类型定义变得简洁而标准化,大大减少了重复代码量。

http://www.xdnf.cn/news/14376.html

相关文章:

  • 山东大学软件学院项目实训-基于大模型的模拟面试系统-个人博客(十)
  • platformIO开发ESP32程序时,出现崩溃重启时如何根据堆栈定位到源代码位置
  • 节日快乐啊
  • 【Docker基础】Docker核心概念:资源隔离详解
  • Docker run 子命令与运行优化相关的参数
  • 因为没有使用路由懒加载,产生了一个难以寻找的bug
  • std::shared_ptr引起内存泄漏的例子
  • Guava RateLimiter 使用详解:从基础使用到生产实践
  • js调试技巧
  • Meta推出AI视频重塑风格工具,现已在Meta AI和Instagram的Edits应用中上线
  • 【项目实训#10】HarmonyOS API文档RAG检索系统后端实现
  • DAY 31 文件的规范拆分和写法
  • 【Erdas实验教程】020:遥感图像空间增强( 图像锐化)
  • 是否需要预先安装 CUDA Toolkit?——按使用场景分级推荐及进阶说明
  • Git可视化革命:3分钟学会用Mermaid+AI画专业分支图
  • 快速入门:创建 Azure 数据资源管理器群集和数据库
  • 《单光子成像》第五章 预习2025.6.14
  • 使用Cursor + Devbox + Uniapp 一站式AI编程开发移动端(App、H5、小程序)
  • wifi架构
  • pikachu靶场通关笔记31 文件包含02之远程文件包含
  • java hashmap详解篇
  • LeetCode - 35. 搜索插入位置
  • 家政维修平台实战27:服务流程搭建
  • 华为云Flexus+DeepSeek征文 | 基于Dify构建股票分析助手
  • Qt事件处理
  • 青少年编程与数学 01-011 系统软件简介 19 SSMS 数据库管理工具
  • Linux上安装Golang及服务服务指南
  • 【学习笔记】Langchain基础(二)
  • 【unitrix】 1.7 规范化常量类型结构(standardization.rs)
  • List的简单模拟实现