mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 16:08:51 +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
|
GstPadPushFunction
|
||||||
GstPadPullFunction
|
GstPadPullFunction
|
||||||
|
GstRegionType
|
||||||
GstPadPullRegionFunction
|
GstPadPullRegionFunction
|
||||||
|
|
||||||
GstPadDirection
|
GstPadDirection
|
||||||
|
@ -374,14 +375,16 @@ gst_pad_connect
|
||||||
gst_pad_disconnect
|
gst_pad_disconnect
|
||||||
gst_pad_push
|
gst_pad_push
|
||||||
gst_pad_pull
|
gst_pad_pull
|
||||||
gst_pad_pull_region
|
|
||||||
gst_pad_pullregion
|
gst_pad_pullregion
|
||||||
gst_pad_select
|
|
||||||
gst_pad_set_eos
|
gst_pad_set_eos
|
||||||
gst_pad_handle_qos
|
gst_pad_handle_qos
|
||||||
gst_pad_eos
|
gst_pad_eos
|
||||||
gst_pad_load_and_connect
|
gst_pad_load_and_connect
|
||||||
|
|
||||||
|
GST_RPAD_LEN
|
||||||
|
GST_RPAD_OFFSET
|
||||||
|
GST_RPAD_REGIONTYPE
|
||||||
|
|
||||||
GstRealPad
|
GstRealPad
|
||||||
GST_RPAD_DIRECTION
|
GST_RPAD_DIRECTION
|
||||||
GST_RPAD_CAPS
|
GST_RPAD_CAPS
|
||||||
|
@ -734,7 +737,6 @@ GST_DISKSRC
|
||||||
GST_DISKSRC_CLASS
|
GST_DISKSRC_CLASS
|
||||||
GST_IS_DISKSRC
|
GST_IS_DISKSRC
|
||||||
GST_IS_DISKSRC_CLASS
|
GST_IS_DISKSRC_CLASS
|
||||||
gst_disksrc_details
|
|
||||||
</SECTION>
|
</SECTION>
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
|
|
|
@ -134,39 +134,6 @@ This macro releases a lock on the object.
|
||||||
<!-- ##### ENUM GstBufferFlags ##### -->
|
<!-- ##### ENUM GstBufferFlags ##### -->
|
||||||
<para>
|
<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>
|
</para>
|
||||||
|
|
||||||
@GST_BUFFER_READONLY: the buffer is read only
|
@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
|
@GST_BUFFER_FLUSH: this buffer is not related to previous buffers. This flag is mainly
|
||||||
used when data in a stream has been skipped
|
used when data in a stream has been skipped
|
||||||
@GST_BUFFER_EOS: this buffer is the last one in the stream
|
@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 ##### -->
|
<!-- ##### STRUCT GstBuffer ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
|
@ -2,12 +2,11 @@
|
||||||
GstDiskSrc
|
GstDiskSrc
|
||||||
|
|
||||||
<!-- ##### SECTION Short_Description ##### -->
|
<!-- ##### SECTION Short_Description ##### -->
|
||||||
Synchronous read from a file (disksrc)
|
Asynchronous read from a file (disksrc)
|
||||||
|
|
||||||
<!-- ##### SECTION Long_Description ##### -->
|
<!-- ##### SECTION Long_Description ##### -->
|
||||||
<para>
|
<para>
|
||||||
Synchonously read buffers from a file. If you need asynchronous reading
|
Asynchonously read buffers from a file.
|
||||||
with seeking capabilities use a <classname>GstAsynDiskSrc</classname> instead.
|
|
||||||
|
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
@ -45,11 +44,11 @@ Specify how many bytes to read at a time.
|
||||||
|
|
||||||
<!-- ##### ARG GstDiskSrc:offset ##### -->
|
<!-- ##### ARG GstDiskSrc:offset ##### -->
|
||||||
<para>
|
<para>
|
||||||
Get the current offset in the file.
|
Get/set the current offset in the file.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<!-- ##### ARG GstDiskSrc:size ##### -->
|
<!-- ##### ARG GstDiskSrc:size ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
Get the size of the file.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
|
|
@ -101,26 +101,26 @@ This macro releases a lock on the object.
|
||||||
|
|
||||||
<!-- ##### MACRO GST_GET_LOCK ##### -->
|
<!-- ##### MACRO GST_GET_LOCK ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
Acquire a reference to the mutex of this object.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
@obj:
|
@obj: Object to get the mutex of.
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### MACRO GST_OBJECT_PARENT ##### -->
|
<!-- ##### MACRO GST_OBJECT_PARENT ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
Get the parent of this object
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
@obj:
|
@obj: Object to get the parent of.
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### MACRO GST_OBJECT_NAME ##### -->
|
<!-- ##### MACRO GST_OBJECT_NAME ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
Get the name of this object
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
@obj:
|
@obj: Object to get the name of.
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION gst_object_new ##### -->
|
<!-- ##### FUNCTION gst_object_new ##### -->
|
||||||
|
|
|
@ -124,15 +124,15 @@ The function that will be called when pulling a buffer.
|
||||||
<!-- ##### USER_FUNCTION GstPadGetRegionFunction ##### -->
|
<!-- ##### USER_FUNCTION GstPadGetRegionFunction ##### -->
|
||||||
<para>
|
<para>
|
||||||
The function that will be called when pulling a region buffer.
|
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>
|
</para>
|
||||||
|
|
||||||
@pad: the pad to get a buffer from
|
@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
|
@offset: the offset of the region to get
|
||||||
@len:
|
@len: the length of the region to get
|
||||||
@Returns: a #GstBuffer
|
@Returns: a #GstBuffer
|
||||||
<!-- # Unused Parameters # -->
|
|
||||||
@size: the size of the region to get
|
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### USER_FUNCTION GstPadQoSFunction ##### -->
|
<!-- ##### USER_FUNCTION GstPadQoSFunction ##### -->
|
||||||
|
@ -172,18 +172,28 @@ The function that will be called when pulling buffers.
|
||||||
@Returns: a GstBuffer
|
@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 ##### -->
|
<!-- ##### USER_FUNCTION GstPadPullRegionFunction ##### -->
|
||||||
<para>
|
<para>
|
||||||
The function that will be called when pulling a region buffer.
|
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>
|
</para>
|
||||||
|
|
||||||
@pad: the pad to pull
|
@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 pull
|
@offset: the offset of the region to get
|
||||||
@len:
|
@len: the length of the region to get
|
||||||
@Returns: a GstBuffer
|
@Returns: a #GstBuffer
|
||||||
<!-- # Unused Parameters # -->
|
</para>
|
||||||
@size: the size of the region to pull
|
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### ENUM GstPadDirection ##### -->
|
<!-- ##### ENUM GstPadDirection ##### -->
|
||||||
|
@ -440,6 +450,8 @@ Destroy the pad.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
@pad:
|
@pad:
|
||||||
|
@buf:
|
||||||
|
<!-- # Unused Parameters # -->
|
||||||
@buffer:
|
@buffer:
|
||||||
|
|
||||||
|
|
||||||
|
@ -466,16 +478,6 @@ Destroy the pad.
|
||||||
@size:
|
@size:
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION gst_pad_select ##### -->
|
|
||||||
<para>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
|
|
||||||
@nextpad:
|
|
||||||
@Varargs:
|
|
||||||
@Returns:
|
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION gst_pad_set_eos ##### -->
|
<!-- ##### FUNCTION gst_pad_set_eos ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
@ -514,6 +516,30 @@ Call the EOS function of the pad
|
||||||
@elements:
|
@elements:
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ##### MACRO GST_RPAD_LEN ##### -->
|
||||||
|
<para>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
@pad:
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ##### MACRO GST_RPAD_OFFSET ##### -->
|
||||||
|
<para>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
@pad:
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ##### MACRO GST_RPAD_REGIONTYPE ##### -->
|
||||||
|
<para>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
@pad:
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### STRUCT GstRealPad ##### -->
|
<!-- ##### STRUCT GstRealPad ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
|
|
@ -65,14 +65,6 @@ Query the element for the current mime type
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION gst_fdsink_chain ##### -->
|
|
||||||
<para>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
|
|
||||||
@pad:
|
|
||||||
@buf:
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION gst_pad_remove_ghost_parent ##### -->
|
<!-- ##### FUNCTION gst_pad_remove_ghost_parent ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
@ -81,6 +73,14 @@ Query the element for the current mime type
|
||||||
@pad:
|
@pad:
|
||||||
@parent:
|
@parent:
|
||||||
|
|
||||||
|
<!-- ##### FUNCTION gst_fdsink_chain ##### -->
|
||||||
|
<para>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
@pad:
|
||||||
|
@buf:
|
||||||
|
|
||||||
<!-- ##### MACRO GST_SRC_UNSET_FLAGS ##### -->
|
<!-- ##### MACRO GST_SRC_UNSET_FLAGS ##### -->
|
||||||
<para>
|
<para>
|
||||||
This macro usets the given flags.
|
This macro usets the given flags.
|
||||||
|
@ -780,6 +780,10 @@ Query whether this object has multiple input pads.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:Short_Description ##### -->
|
||||||
|
Asynchronous disk reader. (asyncdisksrc)
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### FUNCTION gst_src_signal_eos ##### -->
|
<!-- ##### FUNCTION gst_src_signal_eos ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
@ -895,6 +899,15 @@ Specify the current offset in the file.
|
||||||
|
|
||||||
@klass:
|
@klass:
|
||||||
|
|
||||||
|
<!-- ##### FUNCTION gst_pad_select ##### -->
|
||||||
|
<para>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
@nextpad:
|
||||||
|
@Varargs:
|
||||||
|
@Returns:
|
||||||
|
|
||||||
<!-- ##### FUNCTION gst_identity_get_type ##### -->
|
<!-- ##### FUNCTION gst_identity_get_type ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
@ -1370,6 +1383,10 @@ The start point of a filter graph
|
||||||
|
|
||||||
@klass:
|
@klass:
|
||||||
|
|
||||||
|
<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:Title ##### -->
|
||||||
|
GstAsyncDiskSrc
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### MACRO GST_TYPE_ASYNCDISKSRC ##### -->
|
<!-- ##### MACRO GST_TYPE_ASYNCDISKSRC ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
@ -2000,6 +2017,12 @@ Flags for the GstSrc element
|
||||||
@GST_SRC_ASYNC: Indicates that this src is asynchronous
|
@GST_SRC_ASYNC: Indicates that this src is asynchronous
|
||||||
@GST_SRC_FLAG_LAST: subclasses can use this to number their flags
|
@GST_SRC_FLAG_LAST: subclasses can use this to number their flags
|
||||||
|
|
||||||
|
<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:See_Also ##### -->
|
||||||
|
<para>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
<!-- ##### MACRO GST_HTTPSRC ##### -->
|
<!-- ##### MACRO GST_HTTPSRC ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
@ -2191,6 +2214,13 @@ The end point of a filter graph
|
||||||
@format:
|
@format:
|
||||||
@args...:
|
@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 ##### -->
|
<!-- ##### MACRO GST_IS_ASYNCDISKSRC_CLASS ##### -->
|
||||||
<para>
|
<para>
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ sgml_files = gstreamer-manual.sgml \
|
||||||
motivation.sgml \
|
motivation.sgml \
|
||||||
plugins.sgml \
|
plugins.sgml \
|
||||||
programs.sgml \
|
programs.sgml \
|
||||||
|
debugging.sgml \
|
||||||
queues.sgml \
|
queues.sgml \
|
||||||
states.sgml \
|
states.sgml \
|
||||||
threads.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 XML SYSTEM "xml.sgml">
|
||||||
<!ENTITY PLUGINS SYSTEM "plugins.sgml">
|
<!ENTITY PLUGINS SYSTEM "plugins.sgml">
|
||||||
|
<!ENTITY DEBUGGING SYSTEM "debugging.sgml">
|
||||||
<!ENTITY PROGRAMS SYSTEM "programs.sgml">
|
<!ENTITY PROGRAMS SYSTEM "programs.sgml">
|
||||||
<!ENTITY COMPONENTS SYSTEM "components.sgml">
|
<!ENTITY COMPONENTS SYSTEM "components.sgml">
|
||||||
<!ENTITY QUOTES SYSTEM "quotes.sgml">
|
<!ENTITY QUOTES SYSTEM "quotes.sgml">
|
||||||
|
@ -183,9 +184,12 @@
|
||||||
<partintro>
|
<partintro>
|
||||||
<para>
|
<para>
|
||||||
<application>GStreamer</application> comes prepackaged with a few programs.
|
<application>GStreamer</application> comes prepackaged with a few programs.
|
||||||
|
and some usefull debugging options.
|
||||||
</para>
|
</para>
|
||||||
</partintro>
|
</partintro>
|
||||||
|
|
||||||
|
&DEBUGGING;
|
||||||
|
|
||||||
&PROGRAMS;
|
&PROGRAMS;
|
||||||
|
|
||||||
&COMPONENTS;
|
&COMPONENTS;
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
GstObject.
|
GstObject.
|
||||||
</para>
|
</para>
|
||||||
</sect2>
|
</sect2>
|
||||||
<sect2 id="sec-pads-synamic">
|
<sect2 id="sec-pads-dynamic">
|
||||||
<title>Dynamic pads</title>
|
<title>Dynamic pads</title>
|
||||||
<para>
|
<para>
|
||||||
Some elements might not have their pads when they are created. This can, for
|
Some elements might not have their pads when they are created. This can, for
|
||||||
|
@ -119,6 +119,58 @@ main(int argc, char *argv[])
|
||||||
</para>
|
</para>
|
||||||
</note>
|
</note>
|
||||||
</sect2>
|
</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>
|
||||||
<sect1 id="sec-pads-description">
|
<sect1 id="sec-pads-description">
|
||||||
<title>Capabilities of a GstPad</title>
|
<title>Capabilities of a GstPad</title>
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
<term>16 Feb 2001</term>
|
<term>16 Feb 2001</term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
<emphasis>wtay:
|
<emphasis>wtay:</emphasis>
|
||||||
I shipped a few commerical products to >40000 people now but
|
I shipped a few commerical products to >40000 people now but
|
||||||
GStreamer is way more exciting...
|
GStreamer is way more exciting...
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
*
|
*
|
||||||
<emphasis>tool-man</emphasis
|
<emphasis>tool-man</emphasis>
|
||||||
is a gstreamer groupie
|
is a gstreamer groupie
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
|
@ -120,7 +120,9 @@ main (int argc, char *argv[])
|
||||||
<sect1 id="sec-xml-load">
|
<sect1 id="sec-xml-load">
|
||||||
<title>Loading a GstElement from an XML file</title>
|
<title>Loading a GstElement from an XML file</title>
|
||||||
<para>
|
<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 root element can optionally left NULL. The following code example loads
|
||||||
the previously created XML file and runs it.
|
the previously created XML file and runs it.
|
||||||
</para>
|
</para>
|
||||||
|
@ -128,37 +130,26 @@ main (int argc, char *argv[])
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <gst/gst.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
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
GstXML *xml;
|
GstXML *xml;
|
||||||
GstElement *bin;
|
GstElement *bin;
|
||||||
GstElement *disk;
|
gboolean ret;
|
||||||
|
|
||||||
gst_init (&argc, &argv);
|
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");
|
bin = gst_xml_get_element (xml, "bin");
|
||||||
|
g_assert (bin != NULL);
|
||||||
|
|
||||||
gst_element_set_state (bin, GST_STATE_PLAYING);
|
gst_element_set_state (bin, GST_STATE_PLAYING);
|
||||||
|
|
||||||
playing = TRUE;
|
while (gst_bin_iterate(GST_BIN(bin)));
|
||||||
|
|
||||||
while (playing) {
|
|
||||||
gst_bin_iterate (GST_BIN (bin));
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_element_set_state (bin, GST_STATE_NULL);
|
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
|
gst_xml_get_topelements (xml) can be used to get a list of all toplevel elements
|
||||||
in the XML file.
|
in the XML file.
|
||||||
</para>
|
</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>
|
</sect1>
|
||||||
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
|
@ -65,11 +65,11 @@ static GstPadFactory sink_factory = {
|
||||||
"example_sink", /* The name of the caps */
|
"example_sink", /* The name of the caps */
|
||||||
"unknown/unknown", /* The overall MIME/type */
|
"unknown/unknown", /* The overall MIME/type */
|
||||||
"foo", GST_PROPS_INT (1), /* An integer property */
|
"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 */
|
"baz", GST_PROPS_LIST ( /* A list of values for */
|
||||||
GST_PROPS_INT (1),
|
GST_PROPS_INT (1),
|
||||||
GST_PROPS_INT (3),
|
GST_PROPS_INT (3)
|
||||||
),
|
)
|
||||||
),
|
),
|
||||||
NULL /* All factories must be NULL-terminated */
|
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_object_add_arg_type("GstExample::active", GTK_TYPE_INT,
|
||||||
GTK_ARG_READWRITE, ARG_ACTIVE);
|
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
|
/* The last thing is to provide the functions that implement get and set
|
||||||
* of arguments.
|
* of arguments.
|
||||||
*/
|
*/
|
||||||
|
@ -221,7 +233,6 @@ gst_example_chain (GstPad *pad, GstBuffer *buf)
|
||||||
g_return_if_fail(pad != NULL);
|
g_return_if_fail(pad != NULL);
|
||||||
g_return_if_fail(GST_IS_PAD(pad));
|
g_return_if_fail(GST_IS_PAD(pad));
|
||||||
g_return_if_fail(buf != NULL);
|
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. */
|
/* We need to get a pointer to the element this pad belogs to. */
|
||||||
example = GST_EXAMPLE(gst_pad_get_parent (pad));
|
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);
|
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. */
|
/* If we're not doing something, just send the original incoming buffer. */
|
||||||
} else {
|
} else {
|
||||||
gst_pad_push(example->srcpad,buf);
|
gst_pad_push(example->srcpad,buf);
|
||||||
|
|
|
@ -54,6 +54,9 @@ typedef struct _GstExampleClass GstExampleClass;
|
||||||
|
|
||||||
struct _GstExampleClass {
|
struct _GstExampleClass {
|
||||||
GstElementClass parent_class;
|
GstElementClass parent_class;
|
||||||
|
|
||||||
|
/* signals */
|
||||||
|
void (*asdf) (GstElement *element, GstExample *example);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Five standard preprocessing macros are used in the Gtk+ object system.
|
/* 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-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 (" --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++) {
|
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_info_get_categories() & (1<<i)?"(enabled)":" "),
|
||||||
|
(gst_debug_get_categories() & (1<<i)?"/(enabled)":"/ "),
|
||||||
gst_get_category_name (i));
|
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
|
#ifndef gst_pad_push
|
||||||
void gst_pad_push(GstPad *pad,GstBuffer *buf) {
|
/**
|
||||||
GstRealPad *peer = GST_RPAD_PEER(pad);
|
* gst_pad_push:
|
||||||
GST_DEBUG_ENTER("(%s:%s)",GST_DEBUG_PAD_NAME(pad));
|
* @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) {
|
if (peer->pushfunc) {
|
||||||
GST_DEBUG (0,"calling pushfunc &%s of peer pad %s:%s\n",
|
GST_DEBUG (0, "calling pushfunc &%s of peer pad %s:%s\n",
|
||||||
GST_DEBUG_FUNCPTR_NAME(peer->pushfunc),GST_DEBUG_PAD_NAME(((GstPad*)peer)));
|
GST_DEBUG_FUNCPTR_NAME (peer->pushfunc), GST_DEBUG_PAD_NAME (((GstPad*)peer)));
|
||||||
(peer->pushfunc)(((GstPad*)peer),buf);
|
(peer->pushfunc) (((GstPad*)peer), buf);
|
||||||
} else
|
} else
|
||||||
GST_DEBUG (0,"no pushfunc\n");
|
GST_DEBUG (0, "no pushfunc\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef gst_pad_pull
|
#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);
|
GstRealPad *peer = GST_RPAD_PEER(pad);
|
||||||
|
|
||||||
|
g_return_if_fail (peer != NULL);
|
||||||
|
|
||||||
GST_DEBUG_ENTER("(%s:%s)",GST_DEBUG_PAD_NAME(pad));
|
GST_DEBUG_ENTER("(%s:%s)",GST_DEBUG_PAD_NAME(pad));
|
||||||
|
|
||||||
if (peer->pullfunc) {
|
if (peer->pullfunc) {
|
||||||
GST_DEBUG (0,"calling pullfunc &%s (@%p) of peer pad %s:%s\n",
|
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)));
|
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
|
#endif
|
||||||
|
|
||||||
#ifndef gst_pad_pullregion
|
#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);
|
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);
|
GST_DEBUG_ENTER("(%s:%s,%d,%lld,%lld)",GST_DEBUG_PAD_NAME(pad),type,offset,len);
|
||||||
|
|
||||||
if (peer->pullregionfunc) {
|
if (peer->pullregionfunc) {
|
||||||
GST_DEBUG (0,"calling pullregionfunc &%s of peer pad %s:%s\n",
|
GST_DEBUG (0,"calling pullregionfunc &%s of peer pad %s:%s\n",
|
||||||
GST_DEBUG_FUNCPTR_NAME(peer->pullregionfunc),GST_DEBUG_PAD_NAME(((GstPad*)peer)));
|
GST_DEBUG_FUNCPTR_NAME(peer->pullregionfunc),GST_DEBUG_PAD_NAME(((GstPad*)peer)));
|
||||||
|
@ -1193,23 +1240,6 @@ gst_pad_set_eos(GstPad *pad)
|
||||||
return TRUE;
|
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:
|
* gst_pad_set_element_private:
|
||||||
* @pad: the pad to set the private data to
|
* @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);
|
void gst_pad_disconnect (GstPad *srcpad, GstPad *sinkpad);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
void gst_pad_push (GstPad *pad, GstBuffer *buffer);
|
void gst_pad_push (GstPad *pad, GstBuffer *buf);
|
||||||
#else
|
#else
|
||||||
#define gst_pad_push(pad,buf) G_STMT_START{ \
|
#define gst_pad_push(pad,buf) G_STMT_START{ \
|
||||||
if ((pad)->peer->pushfunc) ((pad)->peer->pushfunc)((pad)->peer,(buf)); \
|
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)
|
(((pad)->peer->pullregionfunc) ? ((pad)->peer->pullregionfunc)((pad)->peer,(type),(offset),(len)) : NULL)
|
||||||
#endif
|
#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))))
|
#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);
|
gboolean gst_pad_set_eos (GstPad *pad);
|
||||||
|
|
||||||
|
|
|
@ -65,11 +65,11 @@ static GstPadFactory sink_factory = {
|
||||||
"example_sink", /* The name of the caps */
|
"example_sink", /* The name of the caps */
|
||||||
"unknown/unknown", /* The overall MIME/type */
|
"unknown/unknown", /* The overall MIME/type */
|
||||||
"foo", GST_PROPS_INT (1), /* An integer property */
|
"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 */
|
"baz", GST_PROPS_LIST ( /* A list of values for */
|
||||||
GST_PROPS_INT (1),
|
GST_PROPS_INT (1),
|
||||||
GST_PROPS_INT (3),
|
GST_PROPS_INT (3)
|
||||||
),
|
)
|
||||||
),
|
),
|
||||||
NULL /* All factories must be NULL-terminated */
|
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_object_add_arg_type("GstExample::active", GTK_TYPE_INT,
|
||||||
GTK_ARG_READWRITE, ARG_ACTIVE);
|
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
|
/* The last thing is to provide the functions that implement get and set
|
||||||
* of arguments.
|
* of arguments.
|
||||||
*/
|
*/
|
||||||
|
@ -221,7 +233,6 @@ gst_example_chain (GstPad *pad, GstBuffer *buf)
|
||||||
g_return_if_fail(pad != NULL);
|
g_return_if_fail(pad != NULL);
|
||||||
g_return_if_fail(GST_IS_PAD(pad));
|
g_return_if_fail(GST_IS_PAD(pad));
|
||||||
g_return_if_fail(buf != NULL);
|
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. */
|
/* We need to get a pointer to the element this pad belogs to. */
|
||||||
example = GST_EXAMPLE(gst_pad_get_parent (pad));
|
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);
|
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. */
|
/* If we're not doing something, just send the original incoming buffer. */
|
||||||
} else {
|
} else {
|
||||||
gst_pad_push(example->srcpad,buf);
|
gst_pad_push(example->srcpad,buf);
|
||||||
|
|
|
@ -54,6 +54,9 @@ typedef struct _GstExampleClass GstExampleClass;
|
||||||
|
|
||||||
struct _GstExampleClass {
|
struct _GstExampleClass {
|
||||||
GstElementClass parent_class;
|
GstElementClass parent_class;
|
||||||
|
|
||||||
|
/* signals */
|
||||||
|
void (*asdf) (GstElement *element, GstExample *example);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Five standard preprocessing macros are used in the Gtk+ object system.
|
/* Five standard preprocessing macros are used in the Gtk+ object system.
|
||||||
|
|
Loading…
Reference in a new issue