mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 11:41:09 +00:00
More doc updates
Original commit message from CVS: More doc updates Manual additions: xml/load save of custom XML, debugging, request pads added a signal to the example plugin fixed a bug in mp3parse (ifdef 1)
This commit is contained in:
parent
94472df1c2
commit
1340064d57
19 changed files with 476 additions and 139 deletions
|
@ -343,6 +343,7 @@ GstPadEOSFunction
|
|||
|
||||
GstPadPushFunction
|
||||
GstPadPullFunction
|
||||
GstRegionType
|
||||
GstPadPullRegionFunction
|
||||
|
||||
GstPadDirection
|
||||
|
@ -374,14 +375,16 @@ gst_pad_connect
|
|||
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
|
||||
|
@ -734,7 +737,6 @@ GST_DISKSRC
|
|||
GST_DISKSRC_CLASS
|
||||
GST_IS_DISKSRC
|
||||
GST_IS_DISKSRC_CLASS
|
||||
gst_disksrc_details
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
|
|
|
@ -134,39 +134,6 @@ This macro releases a lock on the object.
|
|||
<!-- ##### 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
|
||||
|
@ -175,7 +142,7 @@ used when data in a stream has been skipped</entry>
|
|||
@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>
|
||||
|
|
|
@ -2,12 +2,11 @@
|
|||
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>
|
||||
|
||||
|
@ -45,11 +44,11 @@ Specify how many bytes to read at a time.
|
|||
|
||||
<!-- ##### 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>
|
||||
|
||||
|
|
|
@ -101,26 +101,26 @@ This macro releases a lock on the object.
|
|||
|
||||
<!-- ##### 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 ##### -->
|
||||
|
|
|
@ -124,15 +124,15 @@ The function that will be called when pulling a buffer.
|
|||
<!-- ##### 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 ##### -->
|
||||
|
@ -172,18 +172,28 @@ The function that will be called when pulling buffers.
|
|||
@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 ##### -->
|
||||
|
@ -440,6 +450,8 @@ Destroy the pad.
|
|||
</para>
|
||||
|
||||
@pad:
|
||||
@buf:
|
||||
<!-- # Unused Parameters # -->
|
||||
@buffer:
|
||||
|
||||
|
||||
|
@ -466,16 +478,6 @@ Destroy the pad.
|
|||
@size:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION gst_pad_select ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@nextpad:
|
||||
@Varargs:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION gst_pad_set_eos ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -514,6 +516,30 @@ Call the EOS function of the pad
|
|||
@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>
|
||||
|
||||
|
|
|
@ -65,14 +65,6 @@ Query the element for the current mime type
|
|||
</para>
|
||||
|
||||
|
||||
<!-- ##### FUNCTION gst_fdsink_chain ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@pad:
|
||||
@buf:
|
||||
|
||||
<!-- ##### FUNCTION gst_pad_remove_ghost_parent ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -81,6 +73,14 @@ Query the element for the current mime type
|
|||
@pad:
|
||||
@parent:
|
||||
|
||||
<!-- ##### FUNCTION gst_fdsink_chain ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@pad:
|
||||
@buf:
|
||||
|
||||
<!-- ##### MACRO GST_SRC_UNSET_FLAGS ##### -->
|
||||
<para>
|
||||
This macro usets the given flags.
|
||||
|
@ -780,6 +780,10 @@ Query whether this object has multiple input pads.
|
|||
</para>
|
||||
|
||||
|
||||
<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:Short_Description ##### -->
|
||||
Asynchronous disk reader. (asyncdisksrc)
|
||||
|
||||
|
||||
<!-- ##### FUNCTION gst_src_signal_eos ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -895,6 +899,15 @@ Specify the current offset in the file.
|
|||
|
||||
@klass:
|
||||
|
||||
<!-- ##### FUNCTION gst_pad_select ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@nextpad:
|
||||
@Varargs:
|
||||
@Returns:
|
||||
|
||||
<!-- ##### FUNCTION gst_identity_get_type ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -1370,6 +1383,10 @@ The start point of a filter graph
|
|||
|
||||
@klass:
|
||||
|
||||
<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:Title ##### -->
|
||||
GstAsyncDiskSrc
|
||||
|
||||
|
||||
<!-- ##### MACRO GST_TYPE_ASYNCDISKSRC ##### -->
|
||||
<para>
|
||||
|
||||
|
@ -2000,6 +2017,12 @@ Flags for the GstSrc element
|
|||
@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>
|
||||
|
||||
|
@ -2191,6 +2214,13 @@ The end point of a filter graph
|
|||
@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>
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ sgml_files = gstreamer-manual.sgml \
|
|||
motivation.sgml \
|
||||
plugins.sgml \
|
||||
programs.sgml \
|
||||
debugging.sgml \
|
||||
queues.sgml \
|
||||
states.sgml \
|
||||
threads.sgml \
|
||||
|
|
78
docs/manual/debugging.sgml
Normal file
78
docs/manual/debugging.sgml
Normal file
|
@ -0,0 +1,78 @@
|
|||
<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>
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
<!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">
|
||||
|
@ -183,9 +184,12 @@
|
|||
<partintro>
|
||||
<para>
|
||||
<application>GStreamer</application> comes prepackaged with a few programs.
|
||||
and some usefull debugging options.
|
||||
</para>
|
||||
</partintro>
|
||||
|
||||
&DEBUGGING;
|
||||
|
||||
&PROGRAMS;
|
||||
|
||||
&COMPONENTS;
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
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
|
||||
|
@ -119,6 +119,58 @@ main(int argc, char *argv[])
|
|||
</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>
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
<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>
|
||||
|
@ -26,7 +26,7 @@
|
|||
<listitem>
|
||||
<para>
|
||||
*
|
||||
<emphasis>tool-man</emphasis
|
||||
<emphasis>tool-man</emphasis>
|
||||
is a gstreamer groupie
|
||||
</para>
|
||||
</listitem>
|
||||
|
|
|
@ -120,7 +120,9 @@ main (int argc, char *argv[])
|
|||
<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>
|
||||
|
@ -128,37 +130,26 @@ main (int argc, char *argv[])
|
|||
#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);
|
||||
|
||||
|
@ -173,6 +164,127 @@ main(int argc, char *argv[])
|
|||
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>
|
||||
|
|
|
@ -65,11 +65,11 @@ static GstPadFactory sink_factory = {
|
|||
"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 */
|
||||
};
|
||||
|
@ -165,6 +165,18 @@ gst_example_class_init (GstExampleClass *klass)
|
|||
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.
|
||||
*/
|
||||
|
@ -221,7 +233,6 @@ gst_example_chain (GstPad *pad, GstBuffer *buf)
|
|||
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));
|
||||
|
@ -254,6 +265,10 @@ gst_example_chain (GstPad *pad, GstBuffer *buf)
|
|||
*/
|
||||
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);
|
||||
|
|
|
@ -54,6 +54,9 @@ typedef struct _GstExampleClass GstExampleClass;
|
|||
|
||||
struct _GstExampleClass {
|
||||
GstElementClass parent_class;
|
||||
|
||||
/* signals */
|
||||
void (*asdf) (GstElement *element, GstExample *example);
|
||||
};
|
||||
|
||||
/* Five standard preprocessing macros are used in the Gtk+ object system.
|
||||
|
|
|
@ -156,11 +156,13 @@ gst_init_check (int *argc,
|
|||
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));
|
||||
}
|
||||
|
||||
|
|
82
gst/gstpad.c
82
gst/gstpad.c
|
@ -909,22 +909,49 @@ gst_pad_ghost_save_thyself (GstPad *pad,
|
|||
}
|
||||
|
||||
#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)));
|
||||
|
@ -937,9 +964,29 @@ GstBuffer *gst_pad_pull(GstPad *pad) {
|
|||
#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)));
|
||||
|
@ -1193,23 +1240,6 @@ gst_pad_set_eos(GstPad *pad)
|
|||
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
|
||||
|
|
|
@ -289,7 +289,7 @@ void gst_pad_connect (GstPad *srcpad, GstPad *sinkpad);
|
|||
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)); \
|
||||
|
@ -305,8 +305,6 @@ GstBuffer* gst_pad_pullregion (GstPad *pad, GstRegionType type, guint64 offset
|
|||
(((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);
|
||||
|
||||
|
|
|
@ -65,11 +65,11 @@ static GstPadFactory sink_factory = {
|
|||
"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 */
|
||||
};
|
||||
|
@ -165,6 +165,18 @@ gst_example_class_init (GstExampleClass *klass)
|
|||
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.
|
||||
*/
|
||||
|
@ -221,7 +233,6 @@ gst_example_chain (GstPad *pad, GstBuffer *buf)
|
|||
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));
|
||||
|
@ -254,6 +265,10 @@ gst_example_chain (GstPad *pad, GstBuffer *buf)
|
|||
*/
|
||||
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);
|
||||
|
|
|
@ -54,6 +54,9 @@ typedef struct _GstExampleClass GstExampleClass;
|
|||
|
||||
struct _GstExampleClass {
|
||||
GstElementClass parent_class;
|
||||
|
||||
/* signals */
|
||||
void (*asdf) (GstElement *element, GstExample *example);
|
||||
};
|
||||
|
||||
/* Five standard preprocessing macros are used in the Gtk+ object system.
|
||||
|
|
Loading…
Reference in a new issue