gstreamer插件开发手册.pdf(3)
make_element 的参数为:1. 插件的名称。2. 本工具使用的源文件名,缺省使用gstplugin.{c,h}。注意,插件名称的大小写很重要。在一些操作系统中,路径名的大小写同样很重要。例如:以下的基于插件模板创建一个ExampleFilter 插件,并将所有输出文件放入gst-template/gst-plugin/src 目录下:shell $ cd gst-template/gst-plugin/srcshell $ ../tools/make_element ExampleFilter最后一个命令创建了两个文件: gstexamplefilter.c 和 gstexamplefilter.h。3.3. 检查基本代码首先我们将检查你要放入头文件中的代码(即使代码的所有接口都在插件系统中定义,用太关心头文件里的内容,那 是很紧要的。)下面的代码可以在examples/pwg/examplefilter/boiler/gstexamplefilter.h 中找到。Example 3-1. Example Plugin Header File#include <gst/gst.h>/* Definition of structure storing data for this element. */typedef struct _GstMyFilter {GstElement element;GstPad *sinkpad, *srcpad;gboolean silent;15lenove 内部使用 PDF 文件使用 "pdfFactory Pro" 试用版本创建GStreamer件开发手册} GstMyFilter;/* Standard definition defining a class for this element. */typedef struct _GstMyFilterClass {GstElementClass parent_class;} GstMyFilterClass;/* Standard macros for defining types for this element. */#define GST_TYPE_MY_FILTER \(gst_my_filter_get_type())#define GST_MY_FILTER(obj) \(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MY_FILTER,GstMyFilter))#define GST_MY_FILTER_CLASS(klass) \(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MY_FILTER,GstMyFilterClass))#define GST_IS_MY_FILTER(obj) \(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MY_FILTER))#define GST_IS_MY_FILTER_CLASS(obj) \(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MY_FILTER))/* Standard function returning type information. */GType gst_my_filter_get_type (void);使用这个头文件,你可以在你的代码中用下面的宏来生成GObject 基本信息,这样所有的函数都可以被恰当的调用:#include "filter.h"GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);3.4. GstElementDetailsGstElementDetails 结构给出了元件的一个层次类型,一个有可读性的描述,以及作者和版本信息。
该结构的成员有:插件的一个长英文名。在一个层次树中的元件的类型。层次树定义为:指定一个顶层类型,后跟一个“/”,再跟下一层的类型,依次进行下去。类型的定义应该根据遍布在该文档中的指导方针进行。 (FIXME:写下这些方针,并给出一个好的索引)对元件要实现 标的简短描述。16lenove 内部使用 PDF 文件使用 "pdfFactory Pro" 试用版本创建GStreamer件开发手册元件作者的名字,可选的跟一个由尖括号括起来的email 地址。例如:static GstElementDetails my_filter_details = {"An example plugin","Example/FirstExample","Shows the basic structure of a plugin","your name <@your.isp>"};元件细节在_base_init ()函数中被注册到插件中,作为GObject 系统的一部分。你应该在用Glib 注册类型 的函数中来设置该GObject 的_base_init ()函数。
static voidgst_my_filter_base_init (gpointer klass){GstElementClass *element_class = GST_ELEMENT_CLASS (klass);static GstElementDetails my_filter_details = {[..]};[..]gst_element_class_set_details (element_class, &my_filter_details);}3.5. GstStaticPadTemplate一个GstStaticPadTemplate 是一个element 将 (也许)会创建并使用的pad 的描述。它包含:Pad 的一个简短的名字。Pad 的方向。现有属性。这表示pad 是否总是存在 (一个“always” pad),只在一些情况下存在(一个“sometimes”pad),或只在程序请求时存在(一个“request”pad)。该element 支持的类型(capabilities)。例如:17lenove 内部使用 PDF 文件使用 "pdfFactory Pro" 试用版本创建GStreamer件开发手册static GstStaticPadTemplate sink_factory =GST_STATIC_PAD_TEMPLATE ("sink",GST_PAD_SINK,GST_PAD_ALWAYS,GST_STATIC_CAPS ("ANY"));那些pad 模板在 _base_init ()函数中被注册。
在_init ()函数中用gst_pad_new_from_template ()根据模板来创建pad。该模板可以使用gst_element_class_get_pad_template ()函数从element 类中得到。更详细的信息见下面。要想用gst_pad_new_from_template (),函数从模板中创建一个新的pad,你必须将模板定义成全局变量。更多详情请参考第四章。static GstStaticPadTemplate sink_factory = [..],src_factory = [..];static voidgst_my_filter_base_init (gpointer klass){GstElementClass *element_class = GST_ELEMENT_CLASS (klass);[..]gst_element_class_add_pad_template (element_class,gst_static_pad_template_get (&src_factory));gst_element_class_add_pad_template (element_class,gst_static_pad_template_get (&sink_factory));}模板的最后一个参数是它的类型或所支持的类型列表。
在这个例子中,我们使用了‘ANY’,意思是这个element 接受所有输入格式。在一个实用的插件中,你会设置一个MIME 类型,以及一个可选的属性集合来保证只有支持的输入格式可以通过。参数的格式是一个以MIME 类型开头,后跟一个以逗号分隔的所支持的属性集。一个支持16位整型原始音频,环绕或立体声的音频过滤器看起来会是这样:static GstStaticPadTemplate sink_factory =GST_STATIC_PAD_TEMPLATE ("sink",GST_PAD_SINK,18lenove 内部使用 PDF 文件使用 "pdfFactory Pro" 试用版本创建GStreamer件开发手册GST_PAD_ALWAYS,
已经做了n次作战方案