examples/thread/Makefile
examples/launch/Makefile
examples/xml/Makefile
+examples/plugins/Makefile
editor/Makefile
editor/pixmaps/Makefile
tools/Makefile
sgml_files = gst-plugin-writers-guide.sgml \
titlepage.sgml \
intro.sgml \
- concepts.sgml
+ concepts.sgml \
+ firstplugin.sgml
fig_files =
eps_files =
--- /dev/null
+<chapter id="cha-boilerplate">
+ <title>Constructing the boilerplate</title>
+ <para>
+ The first thing to do when making a new element is to specify some basic
+ details about it: what its name is, who wrote it, what version number it
+ is, etc. We also need to define an object to represent the element and to
+ store the data the element needs. I shall refer to these details
+ collectively as the <emphasis>boilerplate</emphasis>.
+ </para>
+
+ <sect1 id="sect-boilerplate-gobject">
+ <title>Doing it the hard way with GstObject</title>
+ <para>
+ The standard way of defining the boilerplate is simply to write some
+ code, and fill in some structures. The easiest way to do this is to
+ copy an example and modify according to your needs.
+ </para>
+ <para>
+ First we will examine the code you would be likely to place in a header
+ file (although since the interface to the code is entirely defined
+ by the pluging system, and doesn't depend on reading a header file,
+ this is not crucial.)
+
+ The code here can be found in
+ <filename>examples/plugins/example.h</filename>
+ </para>
+
+ <programlisting>
+ /* Definition of structure storing data for this element. */
+ typedef struct _GstExample GstExample;
+ struct _GstExample {
+ GstElement element;
+
+ GstPad *sinkpad,*srcpad;
+
+ gint8 active;
+ };
+
+ /* Standard definition defining a class for this element. */
+ typedef struct _GstExampleClass GstExampleClass;
+ struct _GstExampleClass {
+ GstElementClass parent_class;
+ };
+
+ /* Standard macros for defining types for this element. */
+ #define GST_TYPE_EXAMPLE \
+ (gst_example_get_type())
+ #define GST_EXAMPLE(obj) \
+ (GTK_CHECK_CAST((obj),GST_TYPE_EXAMPLE,GstExample))
+ #define GST_EXAMPLE_CLASS(klass) \
+ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EXAMPLE,GstExample))
+ #define GST_IS_EXAMPLE(obj) \
+ (GTK_CHECK_TYPE((obj),GST_TYPE_EXAMPLE))
+ #define GST_IS_EXAMPLE_CLASS(obj) \
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EXAMPLE))
+
+ /* Standard function returning type information. */
+ GtkType gst_example_get_type(void);
+ </programlisting>
+
+ </sect1>
+
+ <sect1 id="sect-boilerplate-filterfactory">
+ <title>Doing it the easy way with FilterFactory</title>
+ <para>
+ A plan for the future is to create a FilterFactory, to make the
+ process of making a new filter a simple process of specifying a few
+ details, and writing a small amount of code to perform the actual
+ data processing.
+ </para>
+ <para>
+ Unfortunately, this hasn't yet been implemented. It is also likely
+ that when it is, it will not be possible to cover all the possibilities
+ available by writing the boilerplate yourself, so some plugins will
+ always need to be manually registered.
+ </para>
+ </sect1>
+</chapter>
+
+<chapter id="cha-idfilter">
+ <title>An identity filter</title>
+ <para>
+ </para>
+
+ <sect1 id="sect-idfilter-pads">
+ <title>Building an object with pads</title>
+ <para>
+ </para>
+ </sect1>
+
+ <sect1 id="sect-idfilter-fns">
+ <title>Attaching functions</title>
+
+ <para>
+ </para>
+ </sect1>
+
+ <sect1 id="sect-idfilter-fns">
+ <title>The chain function</title>
+ <para>
+ </para>
+ </sect1>
+</chapter>
+
+<chapter id="cha-plugininit">
+ <title>The plugin_init function</title>
+ <para>
+ </para>
+
+ <sect1 id="sect-plugininit-types">
+ <title>Registering the types</title>
+ <para>
+ </para>
+ </sect1>
+
+ <sect1 id="sect-plugininit-filter">
+ <title>Registering the filter</title>
+
+ <para>
+ </para>
+ </sect1>
+
+ <sect1 id="sect-plugininit-multiple">
+ <title>Having multiple filters in a single plugin</title>
+ <para>
+ </para>
+ </sect1>
+</chapter>
<!ENTITY CONCEPTS SYSTEM "concepts.sgml">
-<!ENTITY FIRSTPLUGIN SYSTEM ".sgml">
+<!ENTITY FIRSTPLUGIN SYSTEM "firstplugin.sgml">
<!ENTITY TESTAPP SYSTEM ".sgml">
We are now have the neccessary concepts to build our first plugin.
We are going to build an element which has a single input pad and
a single output pad, and simply passes anything it reads on
- the input pad through and out on the output pad. In a later
- section we will convert this plugin into something less useless.
+ the input pad through and out on the output pad. We will also
+ see where we could add code to convert this plugin into something
+ more useful.
+ </para>
+ <para>
+ The example code used in this section can be found in
+ <filename>examples/plugins/</filename>
</para>
</partintro>
&FIRSTPLUGIN;
- Constructing the boilerplate
- Doing it the easy way with FilterFactory
- (NOTE: FilterFactory doesn't exist yet)
- Doing it the hard way with G[tk]Object
- An identity filter
- Building an object with pads
- Attaching functions
- The chain function
- The plugin_init function
- Registering the types
- Registering the filter
</part>
<!-- ############ part ############# -->
<authorgroup>
<author>
<firstname>Richard</firstname>
+ <othername>John</othername>
<surname>Boulton</surname>
<authorblurb>
<para>
We often hang out on the #gstreamer IRC channel on
irc.openprojects.net: the following are a selection of amusing<footnote>
<para>No guarantee of sense of humour compatibility is given.</para>
- </footnote>quotes
- from our conversations.
+ </footnote> quotes from our conversations.
</para>
<variablelist>
if HAVE_DB2HTML
db2html $(manualname).sgml
else
- echo "Can't build $@: don't have db2html tool"
+ @echo "Can't build $@: don't have db2html tool"
endif
$(manualname).pdf: $(manualname).ps
if HAVE_PS2PDF
@if [ -r $< ] ; then ps2pdf $< $@ ; fi
else
- echo "Can't build $@: don't have ps2pdf tool"
+ @echo "Can't build $@: don't have ps2pdf tool"
endif
if HAVE_FIG2DEV_EPS
if HAVE_DB2PS
@if [ -r $< ] ; then db2ps $(manualname).sgml ; fi
else
- echo "Can't build $@: don't have db2ps tool"
+ @echo "Can't build $@: don't have db2ps tool"
endif
images :
SUBDIRS = autoplug \
helloworld helloworld2 \
queue queue2 queue3 queue4 \
- launch thread xml
+ launch thread xml plugins
--- /dev/null
+Makefile
+Makefile.in
+*.o
+*.lo
+*.la
+.deps
+.libs
--- /dev/null
+noinst_LTLIBRARIES = libexample.la
+
+libexample_la_SOURCES = example.c
+noinst_HEADERS = example.h
+
+INCLUDES = $(GLIB_CFLAGS) $(GTK_CFLAGS) -I$(top_srcdir)
+
+libexample_la_LIBADD = $(GLIB_LIBS) $(GTK_LIBS)
--- /dev/null
+/* Gnome-Streamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "example.h"
+
+/* elementfactory information */
+static GstElementDetails example_details = {
+ "An example plugin",
+ "Example",
+ "Shows the basic structure of a plugin",
+ VERSION,
+ "your name <your.name@your.isp>",
+ "(C) 2000",
+};
+
+/* Example signals and args */
+enum {
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum {
+ ARG_0,
+ ARG_ACTIVE
+};
+
+static GstPadFactory sink_factory = {
+ "sink", /* the name of the pads */
+ GST_PAD_FACTORY_SINK, /* type of the pad */
+ GST_PAD_FACTORY_ALWAYS, /* ALWAYS/SOMETIMES */
+ GST_PAD_FACTORY_CAPS(
+ "example_sink", /* the name of the caps */
+ "unknown/unknown", /* the mime type of the caps */
+ "something", GST_PROPS_INT (1), /* a property */
+ "foo", GST_PROPS_BOOLEAN (TRUE) /* another property */
+ ),
+ NULL
+};
+
+static GstPadFactory src_factory = {
+ "src",
+ GST_PAD_FACTORY_SRC,
+ GST_PAD_FACTORY_ALWAYS,
+ GST_PAD_FACTORY_CAPS(
+ "example_src",
+ "unknown/unknown"
+ ),
+ NULL
+};
+
+
+static void gst_example_class_init (GstExampleClass *klass);
+static void gst_example_init (GstExample *example);
+
+static void gst_example_chain (GstPad *pad, GstBuffer *buf);
+
+static void gst_example_set_arg (GtkObject *object,GtkArg *arg,guint id);
+static void gst_example_get_arg (GtkObject *object,GtkArg *arg,guint id);
+
+GstPadTemplate *src_template, *sink_template;
+
+static GstElementClass *parent_class = NULL;
+static guint gst_example_signals[LAST_SIGNAL] = { 0 };
+
+GtkType
+gst_example_get_type(void)
+{
+ static GtkType example_type = 0;
+
+ if (!example_type) {
+ static const GtkTypeInfo example_info = {
+ "GstExample",
+ sizeof(GstExample),
+ sizeof(GstExampleClass),
+ (GtkClassInitFunc)gst_example_class_init,
+ (GtkObjectInitFunc)gst_example_init,
+ (GtkArgSetFunc)gst_example_set_arg,
+ (GtkArgGetFunc)gst_example_get_arg,
+ (GtkClassInitFunc)NULL,
+ };
+ example_type = gtk_type_unique(GST_TYPE_ELEMENT,&example_info);
+ }
+ return example_type;
+}
+
+static void
+gst_example_class_init (GstExampleClass *klass)
+{
+ GtkObjectClass *gtkobject_class;
+ GstElementClass *gstelement_class;
+
+ gtkobject_class = (GtkObjectClass*)klass;
+ gstelement_class = (GstElementClass*)klass;
+
+ parent_class = gtk_type_class(GST_TYPE_ELEMENT);
+
+ gtk_object_add_arg_type("GstExample::active", GTK_TYPE_INT,
+ GTK_ARG_READWRITE, ARG_ACTIVE);
+
+ gtkobject_class->set_arg = gst_example_set_arg;
+ gtkobject_class->get_arg = gst_example_get_arg;
+}
+
+static void
+gst_example_init(GstExample *example)
+{
+ example->sinkpad = gst_pad_new_from_template (sink_template, "sink");
+ gst_element_add_pad(GST_ELEMENT(example),example->sinkpad);
+ gst_pad_set_chain_function(example->sinkpad,gst_example_chain);
+
+ example->srcpad = gst_pad_new_from_template (src_template, "src");
+ gst_element_add_pad(GST_ELEMENT(example),example->srcpad);
+
+ example->active = FALSE;
+}
+
+static void
+gst_example_chain (GstPad *pad, GstBuffer *buf)
+{
+ GstExample *example;
+ guchar *data;
+ gint i;
+
+ g_return_if_fail(pad != NULL);
+ g_return_if_fail(GST_IS_PAD(pad));
+ g_return_if_fail(buf != NULL);
+ //g_return_if_fail(GST_IS_BUFFER(buf));
+
+ example = GST_EXAMPLE(pad->parent);
+
+ g_return_if_fail(example != NULL);
+ g_return_if_fail(GST_IS_EXAMPLE(example));
+
+ if (example->active) {
+ /* DO STUFF */
+ }
+
+ gst_pad_push(example->srcpad,buf);
+}
+
+static void
+gst_example_set_arg (GtkObject *object,GtkArg *arg,guint id)
+{
+ GstExample *example;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail(GST_IS_EXAMPLE(object));
+ example = GST_EXAMPLE(object);
+
+ switch(id) {
+ case ARG_ACTIVE:
+ example->active = GTK_VALUE_INT(*arg);
+ g_print("example: set active to %d\n",example->active);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+gst_example_get_arg (GtkObject *object,GtkArg *arg,guint id)
+{
+ GstExample *example;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail(GST_IS_EXAMPLE(object));
+ example = GST_EXAMPLE(object);
+
+ switch (id) {
+ case ARG_ACTIVE:
+ GTK_VALUE_INT(*arg) = example->active;
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+GstPlugin*
+plugin_init (GModule *module)
+{
+ GstPlugin *plugin;
+ GstElementFactory *factory;
+
+ plugin = gst_plugin_new("example");
+ g_return_if_fail(plugin != NULL);
+
+ factory = gst_elementfactory_new("example", GST_TYPE_EXAMPLE, &example_details);
+ g_return_if_fail(factory != NULL);
+
+ sink_template = gst_padtemplate_new (&sink_factory);
+ gst_elementfactory_add_padtemplate (factory, sink_template);
+
+ src_template = gst_padtemplate_new (&src_factory);
+ gst_elementfactory_add_padtemplate (factory, src_template);
+
+ gst_plugin_add_factory (plugin, factory);
+
+ return plugin;
+}
--- /dev/null
+/* Gnome-Streamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_EXAMPLE_H__
+#define __GST_EXAMPLE_H__
+
+#include <gst/gst.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Definition of structure storing data for this element. */
+typedef struct _GstExample GstExample;
+struct _GstExample {
+ GstElement element;
+
+ GstPad *sinkpad,*srcpad;
+
+ gint8 active;
+};
+
+/* Standard definition defining a class for this element. */
+typedef struct _GstExampleClass GstExampleClass;
+struct _GstExampleClass {
+ GstElementClass parent_class;
+};
+
+/* Standard macros for defining types for this element. */
+#define GST_TYPE_EXAMPLE \
+ (gst_example_get_type())
+#define GST_EXAMPLE(obj) \
+ (GTK_CHECK_CAST((obj),GST_TYPE_EXAMPLE,GstExample))
+#define GST_EXAMPLE_CLASS(klass) \
+ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EXAMPLE,GstExample))
+#define GST_IS_EXAMPLE(obj) \
+ (GTK_CHECK_TYPE((obj),GST_TYPE_EXAMPLE))
+#define GST_IS_EXAMPLE_CLASS(obj) \
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EXAMPLE))
+
+/* Standard function returning type information. */
+GtkType gst_example_get_type(void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __GST_EXAMPLE_H__ */
SUBDIRS = autoplug \
helloworld helloworld2 \
queue queue2 queue3 queue4 \
- launch thread xml
+ launch thread xml plugins
--- /dev/null
+Makefile
+Makefile.in
+*.o
+*.lo
+*.la
+.deps
+.libs
--- /dev/null
+noinst_LTLIBRARIES = libexample.la
+
+libexample_la_SOURCES = example.c
+noinst_HEADERS = example.h
+
+INCLUDES = $(GLIB_CFLAGS) $(GTK_CFLAGS) -I$(top_srcdir)
+
+libexample_la_LIBADD = $(GLIB_LIBS) $(GTK_LIBS)
--- /dev/null
+/* Gnome-Streamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "example.h"
+
+/* elementfactory information */
+static GstElementDetails example_details = {
+ "An example plugin",
+ "Example",
+ "Shows the basic structure of a plugin",
+ VERSION,
+ "your name <your.name@your.isp>",
+ "(C) 2000",
+};
+
+/* Example signals and args */
+enum {
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum {
+ ARG_0,
+ ARG_ACTIVE
+};
+
+static GstPadFactory sink_factory = {
+ "sink", /* the name of the pads */
+ GST_PAD_FACTORY_SINK, /* type of the pad */
+ GST_PAD_FACTORY_ALWAYS, /* ALWAYS/SOMETIMES */
+ GST_PAD_FACTORY_CAPS(
+ "example_sink", /* the name of the caps */
+ "unknown/unknown", /* the mime type of the caps */
+ "something", GST_PROPS_INT (1), /* a property */
+ "foo", GST_PROPS_BOOLEAN (TRUE) /* another property */
+ ),
+ NULL
+};
+
+static GstPadFactory src_factory = {
+ "src",
+ GST_PAD_FACTORY_SRC,
+ GST_PAD_FACTORY_ALWAYS,
+ GST_PAD_FACTORY_CAPS(
+ "example_src",
+ "unknown/unknown"
+ ),
+ NULL
+};
+
+
+static void gst_example_class_init (GstExampleClass *klass);
+static void gst_example_init (GstExample *example);
+
+static void gst_example_chain (GstPad *pad, GstBuffer *buf);
+
+static void gst_example_set_arg (GtkObject *object,GtkArg *arg,guint id);
+static void gst_example_get_arg (GtkObject *object,GtkArg *arg,guint id);
+
+GstPadTemplate *src_template, *sink_template;
+
+static GstElementClass *parent_class = NULL;
+static guint gst_example_signals[LAST_SIGNAL] = { 0 };
+
+GtkType
+gst_example_get_type(void)
+{
+ static GtkType example_type = 0;
+
+ if (!example_type) {
+ static const GtkTypeInfo example_info = {
+ "GstExample",
+ sizeof(GstExample),
+ sizeof(GstExampleClass),
+ (GtkClassInitFunc)gst_example_class_init,
+ (GtkObjectInitFunc)gst_example_init,
+ (GtkArgSetFunc)gst_example_set_arg,
+ (GtkArgGetFunc)gst_example_get_arg,
+ (GtkClassInitFunc)NULL,
+ };
+ example_type = gtk_type_unique(GST_TYPE_ELEMENT,&example_info);
+ }
+ return example_type;
+}
+
+static void
+gst_example_class_init (GstExampleClass *klass)
+{
+ GtkObjectClass *gtkobject_class;
+ GstElementClass *gstelement_class;
+
+ gtkobject_class = (GtkObjectClass*)klass;
+ gstelement_class = (GstElementClass*)klass;
+
+ parent_class = gtk_type_class(GST_TYPE_ELEMENT);
+
+ gtk_object_add_arg_type("GstExample::active", GTK_TYPE_INT,
+ GTK_ARG_READWRITE, ARG_ACTIVE);
+
+ gtkobject_class->set_arg = gst_example_set_arg;
+ gtkobject_class->get_arg = gst_example_get_arg;
+}
+
+static void
+gst_example_init(GstExample *example)
+{
+ example->sinkpad = gst_pad_new_from_template (sink_template, "sink");
+ gst_element_add_pad(GST_ELEMENT(example),example->sinkpad);
+ gst_pad_set_chain_function(example->sinkpad,gst_example_chain);
+
+ example->srcpad = gst_pad_new_from_template (src_template, "src");
+ gst_element_add_pad(GST_ELEMENT(example),example->srcpad);
+
+ example->active = FALSE;
+}
+
+static void
+gst_example_chain (GstPad *pad, GstBuffer *buf)
+{
+ GstExample *example;
+ guchar *data;
+ gint i;
+
+ g_return_if_fail(pad != NULL);
+ g_return_if_fail(GST_IS_PAD(pad));
+ g_return_if_fail(buf != NULL);
+ //g_return_if_fail(GST_IS_BUFFER(buf));
+
+ example = GST_EXAMPLE(pad->parent);
+
+ g_return_if_fail(example != NULL);
+ g_return_if_fail(GST_IS_EXAMPLE(example));
+
+ if (example->active) {
+ /* DO STUFF */
+ }
+
+ gst_pad_push(example->srcpad,buf);
+}
+
+static void
+gst_example_set_arg (GtkObject *object,GtkArg *arg,guint id)
+{
+ GstExample *example;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail(GST_IS_EXAMPLE(object));
+ example = GST_EXAMPLE(object);
+
+ switch(id) {
+ case ARG_ACTIVE:
+ example->active = GTK_VALUE_INT(*arg);
+ g_print("example: set active to %d\n",example->active);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+gst_example_get_arg (GtkObject *object,GtkArg *arg,guint id)
+{
+ GstExample *example;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail(GST_IS_EXAMPLE(object));
+ example = GST_EXAMPLE(object);
+
+ switch (id) {
+ case ARG_ACTIVE:
+ GTK_VALUE_INT(*arg) = example->active;
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+GstPlugin*
+plugin_init (GModule *module)
+{
+ GstPlugin *plugin;
+ GstElementFactory *factory;
+
+ plugin = gst_plugin_new("example");
+ g_return_if_fail(plugin != NULL);
+
+ factory = gst_elementfactory_new("example", GST_TYPE_EXAMPLE, &example_details);
+ g_return_if_fail(factory != NULL);
+
+ sink_template = gst_padtemplate_new (&sink_factory);
+ gst_elementfactory_add_padtemplate (factory, sink_template);
+
+ src_template = gst_padtemplate_new (&src_factory);
+ gst_elementfactory_add_padtemplate (factory, src_template);
+
+ gst_plugin_add_factory (plugin, factory);
+
+ return plugin;
+}
--- /dev/null
+/* Gnome-Streamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_EXAMPLE_H__
+#define __GST_EXAMPLE_H__
+
+#include <gst/gst.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Definition of structure storing data for this element. */
+typedef struct _GstExample GstExample;
+struct _GstExample {
+ GstElement element;
+
+ GstPad *sinkpad,*srcpad;
+
+ gint8 active;
+};
+
+/* Standard definition defining a class for this element. */
+typedef struct _GstExampleClass GstExampleClass;
+struct _GstExampleClass {
+ GstElementClass parent_class;
+};
+
+/* Standard macros for defining types for this element. */
+#define GST_TYPE_EXAMPLE \
+ (gst_example_get_type())
+#define GST_EXAMPLE(obj) \
+ (GTK_CHECK_CAST((obj),GST_TYPE_EXAMPLE,GstExample))
+#define GST_EXAMPLE_CLASS(klass) \
+ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EXAMPLE,GstExample))
+#define GST_IS_EXAMPLE(obj) \
+ (GTK_CHECK_TYPE((obj),GST_TYPE_EXAMPLE))
+#define GST_IS_EXAMPLE_CLASS(obj) \
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EXAMPLE))
+
+/* Standard function returning type information. */
+GtkType gst_example_get_type(void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __GST_EXAMPLE_H__ */