GstPadPushFunction
GstPadPullFunction
+GstRegionType
GstPadPullRegionFunction
GstPadDirection
gst_pad_disconnect
gst_pad_push
gst_pad_pull
-gst_pad_pull_region
gst_pad_pullregion
-gst_pad_select
gst_pad_set_eos
gst_pad_handle_qos
gst_pad_eos
gst_pad_load_and_connect
+GST_RPAD_LEN
+GST_RPAD_OFFSET
+GST_RPAD_REGIONTYPE
+
GstRealPad
GST_RPAD_DIRECTION
GST_RPAD_CAPS
GST_DISKSRC_CLASS
GST_IS_DISKSRC
GST_IS_DISKSRC_CLASS
-gst_disksrc_details
</SECTION>
<SECTION>
<!-- ##### ENUM GstBufferFlags ##### -->
<para>
-FIXME this is strange.
-
-<informaltable pgwide=1 frame="none" role="enum">
-<tgroup cols="2"><colspec colwidth="2*"><colspec colwidth="8*">
-<tbody>
-<row>
-<entry>GST_BUFFER_READONLY</entry>
-<entry>the buffer is read only</entry>
-</row>
-
-<row>
-<entry>GST_BUFFER_EOS</entry>
-<entry>this buffer is the last one in the stream</entry>
-</row>
-
-<row>
-<entry>GST_BUFFER_ORIGINAL</entry>
-<entry>this buffer not a copy</entry>
-</row>
-
-<row>
-<entry>GST_BUFFER_DONTFREE</entry>
-<entry>do not try to free the data when this buffer is unref-ed</entry>
-</row>
-
-<row>
-<entry>GST_BUFFER_FLUSH</entry>
-<entry>this buffer is not related to previous buffers. This flag is mainly
-used when data in a stream has been skipped</entry>
-</row>
-
-</tbody></tgroup></informaltable>
-
</para>
@GST_BUFFER_READONLY: the buffer is read only
@GST_BUFFER_FLUSH: this buffer is not related to previous buffers. This flag is mainly
used when data in a stream has been skipped
@GST_BUFFER_EOS: this buffer is the last one in the stream
-@GST_BUFFER_DISCONTINUOUS:
+@GST_BUFFER_DISCONTINUOUS: The buffer has a discontinuity
<!-- ##### STRUCT GstBuffer ##### -->
<para>
GstDiskSrc
<!-- ##### SECTION Short_Description ##### -->
-Synchronous read from a file (disksrc)
+Asynchronous read from a file (disksrc)
<!-- ##### SECTION Long_Description ##### -->
<para>
-Synchonously read buffers from a file. If you need asynchronous reading
-with seeking capabilities use a <classname>GstAsynDiskSrc</classname> instead.
+Asynchonously read buffers from a file.
</para>
<!-- ##### ARG GstDiskSrc:offset ##### -->
<para>
-Get the current offset in the file.
+Get/set the current offset in the file.
</para>
<!-- ##### ARG GstDiskSrc:size ##### -->
<para>
-
+Get the size of the file.
</para>
<!-- ##### MACRO GST_GET_LOCK ##### -->
<para>
-
+Acquire a reference to the mutex of this object.
</para>
-@obj:
+@obj: Object to get the mutex of.
<!-- ##### MACRO GST_OBJECT_PARENT ##### -->
<para>
-
+Get the parent of this object
</para>
-@obj:
+@obj: Object to get the parent of.
<!-- ##### MACRO GST_OBJECT_NAME ##### -->
<para>
-
+Get the name of this object
</para>
-@obj:
+@obj: Object to get the name of.
<!-- ##### FUNCTION gst_object_new ##### -->
<!-- ##### USER_FUNCTION GstPadGetRegionFunction ##### -->
<para>
The function that will be called when pulling a region buffer.
+You can specify which buffer to get using an offset/length pair or
+a start/stop timecode pair.
</para>
@pad: the pad to get a buffer from
-@type:
+@type: the type of region to get (time or offset based)
@offset: the offset of the region to get
-@len:
+@len: the length of the region to get
@Returns: a #GstBuffer
-<!-- # Unused Parameters # -->
-@size: the size of the region to get
<!-- ##### USER_FUNCTION GstPadQoSFunction ##### -->
@Returns: a GstBuffer
+<!-- ##### ENUM GstRegionType ##### -->
+<para>
+the region types for #gst_pad_pullregion.
+</para>
+
+@GST_REGION_NONE: no type specified
+@GST_REGION_OFFSET_LEN: an offet/length pair
+@GST_REGION_TIME_LEN: a time start/length pair
+
<!-- ##### USER_FUNCTION GstPadPullRegionFunction ##### -->
<para>
The function that will be called when pulling a region buffer.
+You can specify which buffer to get using an offset/length pair or
+a start/stop timecode pair.
</para>
-@pad: the pad to pull
-@type:
-@offset: the offset of the region to pull
-@len:
-@Returns: a GstBuffer
-<!-- # Unused Parameters # -->
-@size: the size of the region to pull
+@pad: the pad to get a buffer from
+@type: the type of region to get (time or offset based)
+@offset: the offset of the region to get
+@len: the length of the region to get
+@Returns: a #GstBuffer
+</para>
<!-- ##### ENUM GstPadDirection ##### -->
</para>
@pad:
+@buf:
+<!-- # Unused Parameters # -->
@buffer:
@size:
-<!-- ##### FUNCTION gst_pad_select ##### -->
-<para>
-
-</para>
-
-@nextpad:
-@Varargs:
-@Returns:
-
-
<!-- ##### FUNCTION gst_pad_set_eos ##### -->
<para>
@elements:
+<!-- ##### MACRO GST_RPAD_LEN ##### -->
+<para>
+
+</para>
+
+@pad:
+
+
+<!-- ##### MACRO GST_RPAD_OFFSET ##### -->
+<para>
+
+</para>
+
+@pad:
+
+
+<!-- ##### MACRO GST_RPAD_REGIONTYPE ##### -->
+<para>
+
+</para>
+
+@pad:
+
+
<!-- ##### STRUCT GstRealPad ##### -->
<para>
</para>
-<!-- ##### FUNCTION gst_fdsink_chain ##### -->
+<!-- ##### FUNCTION gst_pad_remove_ghost_parent ##### -->
<para>
</para>
@pad:
-@buf:
+@parent:
-<!-- ##### FUNCTION gst_pad_remove_ghost_parent ##### -->
+<!-- ##### FUNCTION gst_fdsink_chain ##### -->
<para>
</para>
@pad:
-@parent:
+@buf:
<!-- ##### MACRO GST_SRC_UNSET_FLAGS ##### -->
<para>
</para>
+<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:Short_Description ##### -->
+Asynchronous disk reader. (asyncdisksrc)
+
+
<!-- ##### FUNCTION gst_src_signal_eos ##### -->
<para>
@klass:
+<!-- ##### FUNCTION gst_pad_select ##### -->
+<para>
+
+</para>
+
+@nextpad:
+@Varargs:
+@Returns:
+
<!-- ##### FUNCTION gst_identity_get_type ##### -->
<para>
@klass:
+<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:Title ##### -->
+GstAsyncDiskSrc
+
+
<!-- ##### MACRO GST_TYPE_ASYNCDISKSRC ##### -->
<para>
@GST_SRC_ASYNC: Indicates that this src is asynchronous
@GST_SRC_FLAG_LAST: subclasses can use this to number their flags
+<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:See_Also ##### -->
+<para>
+
+</para>
+
+
<!-- ##### MACRO GST_HTTPSRC ##### -->
<para>
@format:
@args...:
+<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:Long_Description ##### -->
+<para>
+Reads data from a file. You can seek to a specific location by setting
+the offset.
+</para>
+
+
<!-- ##### MACRO GST_IS_ASYNCDISKSRC_CLASS ##### -->
<para>
motivation.sgml \
plugins.sgml \
programs.sgml \
+ debugging.sgml \
queues.sgml \
states.sgml \
threads.sgml \
--- /dev/null
+<chapter id="cha-debugging">
+ <title>Debugging</title>
+ <para>
+ GStreamer has an extensive set of debugging tools for
+ plugin developers.
+ </para>
+
+ <sect1>
+ <title>Command line options</title>
+ <para>
+ Applications using the GStreamer libraries accept the following set
+ of command line argruments to enable the debugging system.
+ </para>
+
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <option>--gst-debug-mask=<replaceable>mask</replaceable></option>
+ Sets the mask for the debugging output.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>--gst-info-mask=<replaceable>mask</replaceable></option>
+ Sets the mask for the info output.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>--help</option> Print the a short desciption of the
+ options and an overview of the current debugging/info masks
+ set.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ <para>
+ The follwing table gives an overview of the mask values and
+ their meaning. (enabled) means that the corresponding flag
+ has been set.
+ </para>
+ <programlisting>
+Mask (to be OR'ed) info/debug FLAGS
+--------------------------------------------------------
+0x00000001 (enabled)/ GST_INIT
+0x00000002 / COTHREADS
+0x00000004 / COTHREAD_SWITCH
+0x00000008 / AUTOPLUG
+0x00000010 / AUTOPLUG_ATTEMPT
+0x00000020 / PARENTAGE
+0x00000040 / STATES
+0x00000080 / PLANING
+0x00000100 / SCHEDULING
+0x00000200 / OPERATION
+0x00000400 / BUFFER
+0x00000800 / CAPS
+0x00001000 / CLOCK
+0x00002000 / ELEMENT_PADS
+0x00004000 / ELEMENTFACTORY
+0x00008000 / PADS
+0x00010000 / PIPELINE
+0x00020000 / PLUGIN_LOADING
+0x00040000 / PLUGIN_ERRORS
+0x00080000 / PROPERTIES
+0x00100000 / THREAD
+0x00200000 / TYPES
+0x00400000 / XML
+ </programlisting>
+ </sect1>
+ <sect1>
+ <title>Adding a custom debug handler</title>
+ <para>
+ </para>
+ </sect1>
+
+</chapter>
<!ENTITY XML SYSTEM "xml.sgml">
<!ENTITY PLUGINS SYSTEM "plugins.sgml">
+<!ENTITY DEBUGGING SYSTEM "debugging.sgml">
<!ENTITY PROGRAMS SYSTEM "programs.sgml">
<!ENTITY COMPONENTS SYSTEM "components.sgml">
<!ENTITY QUOTES SYSTEM "quotes.sgml">
<partintro>
<para>
<application>GStreamer</application> comes prepackaged with a few programs.
+ and some usefull debugging options.
</para>
</partintro>
+ &DEBUGGING;
+
&PROGRAMS;
&COMPONENTS;
GstObject.
</para>
</sect2>
- <sect2 id="sec-pads-synamic">
+ <sect2 id="sec-pads-dynamic">
<title>Dynamic pads</title>
<para>
Some elements might not have their pads when they are created. This can, for
</para>
</note>
</sect2>
+ <sect2 id="sec-pads-request">
+ <title>Request pads</title>
+ <para>
+ An element can also have request pads. These pads are not created automatically
+ but are only created on demand. This is very usefull for muxers, aggregators
+ and tee elements.
+ </para>
+ <para>
+ The tee element, for example, has one input pad and a request padtemplate for the
+ output pads. Whenever an element wants to get an output pad from the tee element, it
+ has to request the pad.
+ </para>
+ <para>
+ The following piece of code can be used to get a pad from the tee element. After
+ the pad has been requested, it can be used to connect another element to it.
+ </para>
+ <programlisting>
+ ...
+ GstPad *pad;
+ ...
+ element = gst_elementfactory_make ("tee", "element");
+
+ pad = gst_element_request_pad_by_name (element, "src%d");
+ g_print ("new pad %s\n", gst_pad_get_name (pad));
+ ...
+ </programlisting>
+ <para>
+ The gst_element_request_pad_by_name method can be used to get a pad
+ from the element based on the name_template of the padtemplate.
+ </para>
+ <para>
+ It is also possible to request a pad that is compatible with another
+ padtemplate. This is very usefull if you want to connect an element to
+ a muxer element and you need to request a pad that is compatible. The
+ gst_element_request_compatible_pad is used to request a compatible pad, as
+ is shown in the next example.
+ </para>
+ <programlisting>
+ ...
+ GstPadTemplate *templ;
+ GstPad *pad;
+ ...
+ element = gst_elementfactory_make ("tee", "element");
+ mp3parse = gst_elementfactory_make ("mp3parse", "mp3parse");
+
+ templ = gst_element_get_padtemplate_by_name (mp3parse, "sink");
+
+ pad = gst_element_request_compatible_pad (element, templ);
+ g_print ("new pad %s\n", gst_pad_get_name (pad));
+ ...
+ </programlisting>
+ </sect2>
</sect1>
<sect1 id="sec-pads-description">
<title>Capabilities of a GstPad</title>
<term>16 Feb 2001</term>
<listitem>
<para>
- <emphasis>wtay:
- I shipped a few commerical products to >40000 people now but
+ <emphasis>wtay:</emphasis>
+ I shipped a few commerical products to >40000 people now but
GStreamer is way more exciting...
</para>
</listitem>
<listitem>
<para>
*
- <emphasis>tool-man</emphasis
+ <emphasis>tool-man</emphasis>
is a gstreamer groupie
</para>
</listitem>
<sect1 id="sec-xml-load">
<title>Loading a GstElement from an XML file</title>
<para>
- A saved XML file can be loade with the gst_xml_new (filename, rootelement).
+ Before an XML file can be loaded, you must create a GstXML object.
+ A saved XML file can then be loaded with the
+ gst_xml_parse_file (xml, filename, rootelement) method.
The root element can optionally left NULL. The following code example loads
the previously created XML file and runs it.
</para>
#include <stdlib.h>
#include <gst/gst.h>
-gboolean playing;
-
-/* eos will be called when the src element has an end of stream */
-void
-eos (GstElement *element, gpointer data)
-{
- g_print ("have eos, quitting\n");
-
- playing = FALSE;
-}
-
int
main(int argc, char *argv[])
{
GstXML *xml;
GstElement *bin;
- GstElement *disk;
+ gboolean ret;
gst_init (&argc, &argv);
- xml = gst_xml_new ("xmlTest.gst", NULL);
+ xml = gst_xml_new ();
+
+ ret = gst_xml_parse_file(xml, "xmlTest.gst", NULL);
+ g_assert (ret == TRUE);
bin = gst_xml_get_element (xml, "bin");
+ g_assert (bin != NULL);
gst_element_set_state (bin, GST_STATE_PLAYING);
- playing = TRUE;
-
- while (playing) {
- gst_bin_iterate (GST_BIN (bin));
- }
+ while (gst_bin_iterate(GST_BIN(bin)));
gst_element_set_state (bin, GST_STATE_NULL);
gst_xml_get_topelements (xml) can be used to get a list of all toplevel elements
in the XML file.
</para>
+ <para>
+ In addition to loading a file, you can also load a from a xmlDocPtr and
+ an in memory buffer using gst_xml_parse_doc and gst_xml_parse_memory
+ respectivily. both of these methods return a gboolean indicating success
+ or failure of the requested action.
+ </para>
+ </sect1>
+ <sect1 id="sec-xml-custom">
+ <title>Adding custom XML tags into the core XML data</title>
+
+ <para>
+ It is possible to add custom XML tags to the core XML created with
+ gst_xml_write. This feature can be used by an application to add more
+ information to the save plugins. the editor will for example insert
+ the position of the elements on the screen using the custom XML tags.
+ </para>
+ <para>
+ It is strongly suggested to save and load the custom XML tags using
+ a namespace. This will solve the problem of having your XML tags
+ interfere with the core XML tags.
+ </para>
+ <para>
+ To insert a hook into the element saving procedure you can connect
+ a signal to the GstElement using the following piece of code:
+ </para>
+ <programlisting>
+xmlNsPtr ns;
+
+ ...
+ ns = xmlNewNs (NULL, "http://gstreamer.net/gst-test/1.0/", "test");
+ ...
+ thread = gst_elementfactory_make("thread", "thread");
+ gtk_signal_connect (GTK_OBJECT (thread), "object_saved", object_saved, g_strdup ("decoder thread"));
+ ...
+ </programlisting>
+ <para>
+ When the thread is saved, the object_save method will be caled. Our example
+ will insert a comment tag:
+ </para>
+ <programlisting>
+static void
+object_saved (GstObject *object, xmlNodePtr parent, gpointer data)
+{
+ xmlNodePtr child;
+
+ child = xmlNewChild(parent, ns, "comment", NULL);
+ xmlNewChild(child, ns, "text", (gchar *)data);
+}
+ </programlisting>
+ <para>
+ Adding the custom tag code to the above example you will get an XML file
+ with the custom tags in it. Here's an excerpt:
+ </para>
+ <programlisting>
+ ...
+ <gst:element>
+ <gst:name>thread</gst:name>
+ <gst:type>thread</gst:type>
+ <gst:version>0.1.0</gst:version>
+ ...
+ </gst:children>
+ <test:comment>
+ <test:text>decoder thread</test:text>
+ </test:comment>
+ </gst:element>
+ ...
+ </programlisting>
+ <para>
+ To retrieve the custom XML again, you need to attach a signal to
+ the GstXML object used to load the XML data. You can then parse your
+ custom XML from the XML tree whenever an object is loaded.
+ </para>
+
+ <para>
+ We can extend our previous example with the following piece of
+ code.
+ </para>
+
+ <programlisting>
+ xml = gst_xml_new ();
+
+ gtk_signal_connect (GTK_OBJECT (xml), "object_loaded", xml_loaded, xml);
+
+ ret = gst_xml_parse_file(xml, "xmlTest.gst", NULL);
+ g_assert (ret == TRUE);
+ </programlisting>
+
+ <para>
+ Whenever a new object has been loaded, the xml_loaded function will be
+ called. this function looks like:
+ </para>
+ <programlisting>
+static void
+xml_loaded (GstXML *xml, GstObject *object, xmlNodePtr self, gpointer data)
+{
+ xmlNodePtr children = self->xmlChildrenNode;
+
+ while (children) {
+ if (!strcmp (children->name, "comment")) {
+ xmlNodePtr nodes = children->xmlChildrenNode;
+
+ while (nodes) {
+ if (!strcmp (nodes->name, "text")) {
+ gchar *name = g_strdup (xmlNodeGetContent (nodes));
+ g_print ("object %s loaded with comment '%s'\n",
+ gst_object_get_name (object), name);
+ }
+ nodes = nodes->next;
+ }
+ }
+ children = children->next;
+ }
+}
+ </programlisting>
+ <para>
+ As you can see, you'll get a handle to the GstXML object, the
+ newly loaded GstObject and the xmlNodePtr that was used to create
+ this object. In the above example we look for our special tag inside
+ the XML tree that was used to load the object and we print our
+ comment to the console.
+ </para>
</sect1>
</chapter>
"example_sink", /* The name of the caps */
"unknown/unknown", /* The overall MIME/type */
"foo", GST_PROPS_INT (1), /* An integer property */
- "bar", GST_PROPS_BOOLEAN (TRUE) /* A boolean */
+ "bar", GST_PROPS_BOOLEAN (TRUE), /* A boolean */
"baz", GST_PROPS_LIST ( /* A list of values for */
GST_PROPS_INT (1),
- GST_PROPS_INT (3),
- ),
+ GST_PROPS_INT (3)
+ )
),
NULL /* All factories must be NULL-terminated */
};
gtk_object_add_arg_type("GstExample::active", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_ACTIVE);
+ /* Here we add a signal to the object. This is avery useless signal
+ * called asdf. The signal will also pass a pointer to the listeners
+ * which happens to be the example element itself */
+ gst_example_signals[ASDF] =
+ gtk_signal_new("asdf", GTK_RUN_LAST, gtkobject_class->type,
+ GTK_SIGNAL_OFFSET (GstExampleClass, asdf),
+ gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
+ GST_TYPE_EXAMPLE);
+
+ gtk_object_class_add_signals (gtkobject_class, gst_example_signals,
+ LAST_SIGNAL);
+
/* The last thing is to provide the functions that implement get and set
* of arguments.
*/
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));
/* We need to get a pointer to the element this pad belogs to. */
example = GST_EXAMPLE(gst_pad_get_parent (pad));
*/
gst_pad_push(example->srcpad,outbuf);
+ /* For fun we'll emit our useless signal here */
+ gtk_signal_emit (GTK_OBJECT (example), gst_example_signals[ASDF],
+ example);
+
/* If we're not doing something, just send the original incoming buffer. */
} else {
gst_pad_push(example->srcpad,buf);
struct _GstExampleClass {
GstElementClass parent_class;
+
+ /* signals */
+ void (*asdf) (GstElement *element, GstExample *example);
};
/* Five standard preprocessing macros are used in the Gtk+ object system.
g_print (" --gst-info-mask=FLAGS Gst info flags to set (current %08x)\n", gst_info_get_categories());
g_print (" --gst-debug-mask=FLAGS Gst debugging flags to set\n");
- g_print ("\nGStreamer info/debug FLAGS (to be OR'ed)\n");
+ g_print ("\n Mask (to be OR'ed) info/debug FLAGS \n");
+ g_print ("--------------------------------------------------------\n");
for (i = 0; i<GST_CAT_MAX_CATEGORY; i++) {
- g_print (" 0x%08x %s %s\n", 1<<i,
+ g_print (" 0x%08x %s%s %s\n", 1<<i,
(gst_info_get_categories() & (1<<i)?"(enabled)":" "),
+ (gst_debug_get_categories() & (1<<i)?"/(enabled)":"/ "),
gst_get_category_name (i));
}
}
#ifndef gst_pad_push
-void gst_pad_push(GstPad *pad,GstBuffer *buf) {
- GstRealPad *peer = GST_RPAD_PEER(pad);
- GST_DEBUG_ENTER("(%s:%s)",GST_DEBUG_PAD_NAME(pad));
+/**
+ * gst_pad_push:
+ * @pad: the pad to push
+ * @buf: the buffer to push
+ *
+ * Push a buffer to the peer of the pad.
+ */
+void
+gst_pad_push (GstPad *pad, GstBuffer *buf)
+{
+ GstRealPad *peer = GST_RPAD_PEER (pad);
+
+ g_return_if_fail (peer != NULL);
+
+ GST_DEBUG_ENTER ("(%s:%s)", GST_DEBUG_PAD_NAME (pad));
+
if (peer->pushfunc) {
- GST_DEBUG (0,"calling pushfunc &%s of peer pad %s:%s\n",
- GST_DEBUG_FUNCPTR_NAME(peer->pushfunc),GST_DEBUG_PAD_NAME(((GstPad*)peer)));
- (peer->pushfunc)(((GstPad*)peer),buf);
+ GST_DEBUG (0, "calling pushfunc &%s of peer pad %s:%s\n",
+ GST_DEBUG_FUNCPTR_NAME (peer->pushfunc), GST_DEBUG_PAD_NAME (((GstPad*)peer)));
+ (peer->pushfunc) (((GstPad*)peer), buf);
} else
- GST_DEBUG (0,"no pushfunc\n");
+ GST_DEBUG (0, "no pushfunc\n");
}
#endif
#ifndef gst_pad_pull
-GstBuffer *gst_pad_pull(GstPad *pad) {
+/**
+ * gst_pad_pull:
+ * @pad: the pad to pull
+ *
+ * Pull a buffer from the peer pad.
+ *
+ * Returns: a new buffer from the peer pad.
+ */
+GstBuffer*
+gst_pad_pull (GstPad *pad)
+{
GstRealPad *peer = GST_RPAD_PEER(pad);
+
+ g_return_if_fail (peer != NULL);
+
GST_DEBUG_ENTER("(%s:%s)",GST_DEBUG_PAD_NAME(pad));
+
if (peer->pullfunc) {
GST_DEBUG (0,"calling pullfunc &%s (@%p) of peer pad %s:%s\n",
GST_DEBUG_FUNCPTR_NAME(peer->pullfunc),&peer->pullfunc,GST_DEBUG_PAD_NAME(((GstPad*)peer)));
#endif
#ifndef gst_pad_pullregion
-GstBuffer *gst_pad_pullregion(GstPad *pad,GstRegionType type,guint64 offset,guint64 len) {
+/**
+ * gst_pad_pullregion:
+ * @pad: the pad to pull the region from
+ * @type: the regiontype
+ * @offset: the offset/start of the buffer to pull
+ * @len: the length of the buffer to pull
+ *
+ * Pull a buffer region from the peer pad. The region to pull can be
+ * specified with a offset/lenght pair or with a start/legnth time
+ * indicator as specified by the type parameter.
+ *
+ * Returns: a new buffer from the peer pad with data in the specified
+ * region.
+ */
+GstBuffer*
+gst_pad_pullregion (GstPad *pad, GstRegionType type, guint64 offset, guint64 len)
+{
GstRealPad *peer = GST_RPAD_PEER(pad);
+
+ g_return_if_fail (peer != NULL);
+
GST_DEBUG_ENTER("(%s:%s,%d,%lld,%lld)",GST_DEBUG_PAD_NAME(pad),type,offset,len);
+
if (peer->pullregionfunc) {
GST_DEBUG (0,"calling pullregionfunc &%s of peer pad %s:%s\n",
GST_DEBUG_FUNCPTR_NAME(peer->pullregionfunc),GST_DEBUG_PAD_NAME(((GstPad*)peer)));
return TRUE;
}
-/*
-GstPad *
-gst_pad_select(GstPad *nextpad, ...) {
- va_list args;
- GstPad *pad;
- GSList *pads = NULL;
-
- // construct the list of pads
- va_start (args, nextpad);
- while ((pad = va_arg (args, GstPad*)))
- pads = g_slist_prepend (pads, pad);
- va_end (args);
-
- // now switch to the nextpad
-*/
-
-
/**
* gst_pad_set_element_private:
* @pad: the pad to set the private data to
void gst_pad_disconnect (GstPad *srcpad, GstPad *sinkpad);
#if 1
-void gst_pad_push (GstPad *pad, GstBuffer *buffer);
+void gst_pad_push (GstPad *pad, GstBuffer *buf);
#else
#define gst_pad_push(pad,buf) G_STMT_START{ \
if ((pad)->peer->pushfunc) ((pad)->peer->pushfunc)((pad)->peer,(buf)); \
(((pad)->peer->pullregionfunc) ? ((pad)->peer->pullregionfunc)((pad)->peer,(type),(offset),(len)) : NULL)
#endif
-GstPad * gst_pad_select (GstPad *nextpad, ...);
-
#define gst_pad_eos(pad) (GST_RPAD_EOSFUNC(GST_RPAD_PEER(pad))(GST_PAD(GST_RPAD_PEER(pad))))
gboolean gst_pad_set_eos (GstPad *pad);
"example_sink", /* The name of the caps */
"unknown/unknown", /* The overall MIME/type */
"foo", GST_PROPS_INT (1), /* An integer property */
- "bar", GST_PROPS_BOOLEAN (TRUE) /* A boolean */
+ "bar", GST_PROPS_BOOLEAN (TRUE), /* A boolean */
"baz", GST_PROPS_LIST ( /* A list of values for */
GST_PROPS_INT (1),
- GST_PROPS_INT (3),
- ),
+ GST_PROPS_INT (3)
+ )
),
NULL /* All factories must be NULL-terminated */
};
gtk_object_add_arg_type("GstExample::active", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_ACTIVE);
+ /* Here we add a signal to the object. This is avery useless signal
+ * called asdf. The signal will also pass a pointer to the listeners
+ * which happens to be the example element itself */
+ gst_example_signals[ASDF] =
+ gtk_signal_new("asdf", GTK_RUN_LAST, gtkobject_class->type,
+ GTK_SIGNAL_OFFSET (GstExampleClass, asdf),
+ gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
+ GST_TYPE_EXAMPLE);
+
+ gtk_object_class_add_signals (gtkobject_class, gst_example_signals,
+ LAST_SIGNAL);
+
/* The last thing is to provide the functions that implement get and set
* of arguments.
*/
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));
/* We need to get a pointer to the element this pad belogs to. */
example = GST_EXAMPLE(gst_pad_get_parent (pad));
*/
gst_pad_push(example->srcpad,outbuf);
+ /* For fun we'll emit our useless signal here */
+ gtk_signal_emit (GTK_OBJECT (example), gst_example_signals[ASDF],
+ example);
+
/* If we're not doing something, just send the original incoming buffer. */
} else {
gst_pad_push(example->srcpad,buf);
struct _GstExampleClass {
GstElementClass parent_class;
+
+ /* signals */
+ void (*asdf) (GstElement *element, GstExample *example);
};
/* Five standard preprocessing macros are used in the Gtk+ object system.