mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 13:06:23 +00:00
Docs updates
Original commit message from CVS: Docs updates
This commit is contained in:
parent
f12fae5c3d
commit
ded7ca6616
9 changed files with 212 additions and 85 deletions
|
@ -44,7 +44,8 @@
|
||||||
The basic main function of a chain-based element is like:
|
The basic main function of a chain-based element is like:
|
||||||
</para>
|
</para>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
static void chain_function (GstPad *pad, GstBuffer *buffer)
|
static void
|
||||||
|
chain_function (GstPad *pad, GstBuffer *buffer)
|
||||||
{
|
{
|
||||||
GstBuffer *outbuffer;
|
GstBuffer *outbuffer;
|
||||||
|
|
||||||
|
@ -55,6 +56,16 @@ static void chain_function (GstPad *pad, GstBuffer *buffer)
|
||||||
gst_pad_push (srcpad, outbuffer);
|
gst_pad_push (srcpad, outbuffer);
|
||||||
}
|
}
|
||||||
</programlisting>
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Chain based function are mainly used for elements that have a one to one
|
||||||
|
relation between their input and output behaviour. An example of such an
|
||||||
|
element can be a simple video blur filter. The filter takes a buffer in, performs
|
||||||
|
the blur operation on it and sends out the resulting buffer.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Another element, for example, is a volume filter. The filter takes audio samples as
|
||||||
|
input, performs the volume effect and sends out the resulting buffer.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
@ -71,6 +82,12 @@ static void chain_function (GstPad *pad, GstBuffer *buffer)
|
||||||
buffer = gst_pad_pull (sinkpad);
|
buffer = gst_pad_pull (sinkpad);
|
||||||
...
|
...
|
||||||
// process buffer, create outbuffer
|
// process buffer, create outbuffer
|
||||||
|
while (!done) {
|
||||||
|
....
|
||||||
|
// optionally request another buffer
|
||||||
|
buffer = gst_pad_pull (sinkpad);
|
||||||
|
....
|
||||||
|
}
|
||||||
...
|
...
|
||||||
gst_pad_push (srcpad, outbuffer);
|
gst_pad_push (srcpad, outbuffer);
|
||||||
}
|
}
|
||||||
|
@ -87,6 +104,13 @@ static void chain_function (GstPad *pad, GstBuffer *buffer)
|
||||||
complex using cothreads when there are multiple input/output pads for the
|
complex using cothreads when there are multiple input/output pads for the
|
||||||
loop-based element.
|
loop-based element.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
Loop based elements are mainly used for the more complex elements that need a
|
||||||
|
specific amount of data before they can start to produce output. An example
|
||||||
|
of such an element is the mpeg video decoder. the element will pull a buffer,
|
||||||
|
performs some decoding on it and optionally requests more buffers to decode, when
|
||||||
|
a complete video frame has been decoded, a buffer is send out.
|
||||||
|
</para>
|
||||||
<para>
|
<para>
|
||||||
There is no problem in putting cothreaded elements into a
|
There is no problem in putting cothreaded elements into a
|
||||||
<classname>GstThread</classname> to create even more complex pipelines with
|
<classname>GstThread</classname> to create even more complex pipelines with
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
<sect1>
|
<sect1>
|
||||||
<title>MIME Types</title>
|
<title>more on MIME Types</title>
|
||||||
<para>
|
<para>
|
||||||
GStreamer uses MIME types to indentify the different types of data
|
GStreamer uses MIME types to indentify the different types of data
|
||||||
that can be handled by the elements. They are the high level
|
that can be handled by the elements. They are the high level
|
||||||
|
@ -77,6 +77,10 @@
|
||||||
This allows for very dynamic and extensible element creation as we
|
This allows for very dynamic and extensible element creation as we
|
||||||
will see.
|
will see.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
As we have seen in the previous chapter, the MIME types are added
|
||||||
|
to the Capability structure of a pad.
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
In our helloworld example the elements we constructed would have the
|
In our helloworld example the elements we constructed would have the
|
||||||
|
|
|
@ -325,8 +325,8 @@ eos (GstSrc *src)
|
||||||
you can create a custom MP3 element with a more high level API.
|
you can create a custom MP3 element with a more high level API.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
It should be clear from the example that we can vary easily replace the
|
It should be clear from the example that we can very easily replace the
|
||||||
disksrc element with a httpsrc, giving you instant network streaming.
|
disksrc element with an httpsrc, giving you instant network streaming.
|
||||||
An element could be build to handle icecast connections, for example.
|
An element could be build to handle icecast connections, for example.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
In this chapter we will introduce you to autoplugging. Using the MIME
|
In this chapter we will introduce you to autoplugging. Using the MIME
|
||||||
types of the elements GStreamer can automatically create a pipeline
|
types of the elements <application>GStreamer</application> can automatically create a pipeline
|
||||||
for you.
|
for you.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
@ -26,63 +26,63 @@
|
||||||
static gboolean playing;
|
static gboolean playing;
|
||||||
|
|
||||||
/* eos will be called when the src element has an end of stream */
|
/* eos will be called when the src element has an end of stream */
|
||||||
void eos(GstSrc *src)
|
void
|
||||||
|
eos (GstSrc *src)
|
||||||
{
|
{
|
||||||
g_print("have eos, quitting\n");
|
g_print ("have eos, quitting\n");
|
||||||
|
|
||||||
playing = FALSE;
|
playing = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
GstElement *disksrc, *audiosink;
|
GstElement *disksrc, *audiosink;
|
||||||
GstElement *pipeline;
|
GstElement *pipeline;
|
||||||
|
|
||||||
if (argc != 2) {
|
if (argc != 2) {
|
||||||
g_print("usage: %s <filename>\n", argv[0]);
|
g_print ("usage: %s <filename>\n", argv[0]);
|
||||||
exit(-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_init(&argc,&argv);
|
gst_init (&argc, &argv);
|
||||||
|
|
||||||
/* create a new bin to hold the elements */
|
/* create a new bin to hold the elements */
|
||||||
pipeline = gst_pipeline_new("pipeline");
|
pipeline = gst_pipeline_new ("pipeline");
|
||||||
|
|
||||||
/* create a disk reader */
|
/* create a disk reader */
|
||||||
disksrc = gst_elementfactory_make("disksrc", "disk_source");
|
disksrc = gst_elementfactory_make ("disksrc", "disk_source");
|
||||||
gtk_object_set(GTK_OBJECT(disksrc),"location", argv[1],NULL);
|
gtk_object_set (GTK_OBJECT (disksrc), "location", argv[1], NULL);
|
||||||
gtk_signal_connect(GTK_OBJECT(disksrc),"eos",
|
gtk_signal_connect (GTK_OBJECT (disksrc), "eos",
|
||||||
GTK_SIGNAL_FUNC(eos),NULL);
|
GTK_SIGNAL_FUNC (eos), NULL);
|
||||||
|
|
||||||
/* and an audio sink */
|
/* and an audio sink */
|
||||||
audiosink = gst_elementfactory_make("audiosink", "play_audio");
|
audiosink = gst_elementfactory_make ("audiosink", "play_audio");
|
||||||
|
|
||||||
/* add objects to the main pipeline */
|
/* add objects to the main pipeline */
|
||||||
gst_pipeline_add_src(GST_PIPELINE(pipeline), disksrc);
|
gst_pipeline_add_src (GST_PIPELINE (pipeline), disksrc);
|
||||||
gst_pipeline_add_sink(GST_PIPELINE(pipeline), audiosink);
|
gst_pipeline_add_sink (GST_PIPELINE (pipeline), audiosink);
|
||||||
|
|
||||||
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
|
if (!gst_pipeline_autoplug (GST_PIPELINE (pipeline))) {
|
||||||
g_print("unable to handle stream\n");
|
g_print ("unable to handle stream\n");
|
||||||
exit(-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make it ready */
|
|
||||||
gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_READY);
|
|
||||||
/* start playing */
|
/* start playing */
|
||||||
gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);
|
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
|
||||||
|
|
||||||
playing = TRUE;
|
playing = TRUE;
|
||||||
|
|
||||||
while (playing) {
|
while (playing) {
|
||||||
gst_bin_iterate(GST_BIN(pipeline));
|
gst_bin_iterate (GST_BIN (pipeline));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stop the bin */
|
/* stop the bin */
|
||||||
gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL);
|
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
|
||||||
|
|
||||||
gst_pipeline_destroy(pipeline);
|
gst_pipeline_destroy (pipeline);
|
||||||
|
|
||||||
exit(0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
</programlisting>
|
</programlisting>
|
||||||
|
@ -99,9 +99,9 @@ int main(int argc,char *argv[])
|
||||||
<programlisting>
|
<programlisting>
|
||||||
|
|
||||||
...
|
...
|
||||||
if (!gst_pipeline_autoplug(pipeline)) {
|
if (!gst_pipeline_autoplug (pipeline)) {
|
||||||
g_print("unable to handle stream\n");
|
g_print ("unable to handle stream\n");
|
||||||
exit(-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
...
|
...
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ int main(int argc,char *argv[])
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
If you really want, you can use the GSteamer components to do the
|
If you really want, you can use the GSteamer components to do the
|
||||||
autoplugging yourself.
|
autoplugging yourself. We will cover this topic in the dynamic pipeline chapter.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
@ -165,9 +165,9 @@ int main(int argc,char *argv[])
|
||||||
</programlisting>
|
</programlisting>
|
||||||
<para>
|
<para>
|
||||||
You can also try to use an AVI or MPEG file as its input. Using autoplugging,
|
You can also try to use an AVI or MPEG file as its input. Using autoplugging,
|
||||||
GStreamer will automatically figure out how to handle the stream. Remember that
|
<application>GStreamer</application> will automatically figure out how to
|
||||||
only the audio part will be played because we have only added an audiosink to
|
handle the stream. Remember that only the audio part will be played because
|
||||||
the pipeline.
|
we have only added an audiosink to the pipeline.
|
||||||
</para>
|
</para>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
./helloworld2 mymovie.mpeg
|
./helloworld2 mymovie.mpeg
|
||||||
|
|
|
@ -157,6 +157,6 @@ Single
|
||||||
4 0 0 50 0 0 12 0.0000 4 135 75 3675 5475 ?\001
|
4 0 0 50 0 0 12 0.0000 4 135 75 3675 5475 ?\001
|
||||||
4 0 0 50 0 0 12 0.0000 4 135 735 9825 5475 audio/raw\001
|
4 0 0 50 0 0 12 0.0000 4 135 735 9825 5475 audio/raw\001
|
||||||
4 0 0 50 0 0 12 0.0000 4 180 855 4350 5325 audio/mpeg\001
|
4 0 0 50 0 0 12 0.0000 4 180 855 4350 5325 audio/mpeg\001
|
||||||
4 0 0 50 0 0 12 0.0000 4 180 1395 5475 5625 audio/mpeg-frame\001
|
|
||||||
4 0 0 50 0 0 12 0.0000 4 135 735 8700 5625 audio/raw\001
|
4 0 0 50 0 0 12 0.0000 4 135 735 8700 5625 audio/raw\001
|
||||||
4 0 0 50 0 0 12 0.0000 4 180 1395 6825 5325 audio/mpeg-frame\001
|
4 0 0 50 0 0 12 0.0000 4 180 855 5775 5625 audio/mpeg\001
|
||||||
|
4 0 0 50 0 0 12 0.0000 4 180 855 7125 5325 audio/mpeg\001
|
||||||
|
|
|
@ -116,6 +116,26 @@ Pads:
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
<sect2 id="sec-pads-caps-use">
|
||||||
|
<title>What are the capabilities used for?</title>
|
||||||
|
<para>
|
||||||
|
Capabilities describe in great detail the type of media that is handled by the pads.
|
||||||
|
They are mostly used for:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Autoplugging: automatically finding plugins for a set of capabilities
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Compatibility detection: when two pads are connected, <application>GStreamer</application>
|
||||||
|
can verify if the two pads are talking about the same media types.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
</sect1>
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
|
@ -103,6 +103,88 @@ gstreamer-launch disksrc redpill.vob ! css-descramble ! private_stream_1.0 ! \
|
||||||
</para>
|
</para>
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
<sect1>
|
||||||
|
<title><command>gstreamer-inspect</command></title>
|
||||||
|
<para>
|
||||||
|
This is a tool to query a plugin or an element about its properties.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To query the information about the element mpg123, you would specify:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
gstreamer-inspect mpg123
|
||||||
|
</screen>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Below is the output of a query for the audiosink element:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
Factory Details:
|
||||||
|
Long name: Audio Sink (OSS)
|
||||||
|
Class: Sink/Audio
|
||||||
|
Description: Output to a sound card via OSS
|
||||||
|
Version: 0.1.0
|
||||||
|
Author(s): Erik Walthinsen <omega@cse.ogi.edu>
|
||||||
|
Copyright: (C) 1999
|
||||||
|
|
||||||
|
Pad Templates:
|
||||||
|
SINK template: 'sink'
|
||||||
|
Exists: Always
|
||||||
|
Capabilities:
|
||||||
|
'audiosink_sink':
|
||||||
|
MIME type: 'audio/raw':
|
||||||
|
format: Integer: 16
|
||||||
|
depth: List:
|
||||||
|
Integer: 8
|
||||||
|
Integer: 16
|
||||||
|
rate: Integer range: 8000 - 48000
|
||||||
|
channels: Integer range: 1 - 2
|
||||||
|
|
||||||
|
Element Flags:
|
||||||
|
GST_ELEMENT_THREADSUGGESTED
|
||||||
|
no flags set
|
||||||
|
|
||||||
|
Element Implementation:
|
||||||
|
No loopfunc(), must be chain-based or not configured yet
|
||||||
|
Has change_state() function
|
||||||
|
|
||||||
|
Pads:
|
||||||
|
SINK: 'sink'
|
||||||
|
Implementation:
|
||||||
|
Has chainfunc(): 0x4001cde8
|
||||||
|
Has default eosfunc() gst_pad_eos_func()
|
||||||
|
Pad Template: 'sink'
|
||||||
|
Capabilities:
|
||||||
|
'audiosink_sink':
|
||||||
|
MIME type: 'audio/raw':
|
||||||
|
format: Integer: 16
|
||||||
|
depth: List:
|
||||||
|
Integer: 8
|
||||||
|
Integer: 16
|
||||||
|
rate: Integer range: 8000 - 48000
|
||||||
|
channels: Integer range: 1 - 2
|
||||||
|
|
||||||
|
Element Arguments:
|
||||||
|
GstAudioSink::mute: Boolean
|
||||||
|
GstAudioSink::format: Enum (default 16)
|
||||||
|
(8): 8 Bits
|
||||||
|
(16): 16 Bits
|
||||||
|
GstAudioSink::channels: Enum (default 2)
|
||||||
|
(1): Mono
|
||||||
|
(2): Stereo
|
||||||
|
GstAudioSink::frequency: Integer
|
||||||
|
</screen>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
To query the information about a plugin, you would do:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
gstreamer-inspect gstelements
|
||||||
|
</screen>
|
||||||
|
</sect1>
|
||||||
<sect1>
|
<sect1>
|
||||||
<title><command>gstmediaplay</command></title>
|
<title><command>gstmediaplay</command></title>
|
||||||
<para>
|
<para>
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
<chapter id="cha-queues">
|
<chapter id="cha-queues">
|
||||||
<title>Queues</title>
|
<title>Queues</title>
|
||||||
<para>
|
<para>
|
||||||
A <classname>GstQueue</classname> is an implementation of a <classname>GstConnection</classname>.
|
A <classname>GstQueue</classname> is a filter element.
|
||||||
Queues can be used to connect two elements in such way that the data can
|
Queues can be used to connect two elements in such way that the data can
|
||||||
be buffered.
|
be buffered.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
A buffer that is sinked to a Queue will not automatically be pushed to the
|
A buffer that is sinked to a Queue will not automatically be pushed to the
|
||||||
next connected element but will be buffered. It will be pushed to the next
|
next connected element but will be buffered. It will be pushed to the next
|
||||||
element as soon as gst_connection_push() is called.
|
element as soon as gst_connection_push () is called.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Queues are mostly used in conjunction with a <classname>GstThread</classname> to
|
Queues are mostly used in conjunction with a <classname>GstThread</classname> to
|
||||||
provide an external connection for the thread elements. You could have one
|
provide an external connection for the thread elements. You could have one
|
||||||
thread feeding buffers into a <classname>GstQueue</classname> and another
|
thread feeding buffers into a <classname>GstQueue</classname> and another
|
||||||
thread repeadedly calling gst_connection_push() on the queue to feed its
|
thread repeadedly calling gst_connection_push () on the queue to feed its
|
||||||
internal elements.
|
internal elements.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
|
|
@ -14,21 +14,18 @@
|
||||||
GstElement *my_thread;
|
GstElement *my_thread;
|
||||||
|
|
||||||
// create the thread object
|
// create the thread object
|
||||||
my_thread = gst_thread_new("my_thread");
|
my_thread = gst_thread_new ("my_thread");
|
||||||
g_return_if_fail(audio_thread != NULL);
|
g_return_if_fail (audio_thread != NULL);
|
||||||
|
|
||||||
// add some plugins
|
// add some plugins
|
||||||
gst_bin_add(GST_BIN(my_thread),GST_ELEMENT(funky_src));
|
gst_bin_add (GST_BIN (my_thread), GST_ELEMENT (funky_src));
|
||||||
gst_bin_add(GST_BIN(my_thread),GST_ELEMENT(cool_effect));
|
gst_bin_add (GST_BIN (my_thread), GST_ELEMENT (cool_effect));
|
||||||
|
|
||||||
// connect the elements here...
|
// connect the elements here...
|
||||||
...
|
...
|
||||||
|
|
||||||
// prepare the thread
|
|
||||||
gst_element_set_state(GST_ELEMENT(my_thread),GST_STATE_READY);
|
|
||||||
|
|
||||||
// start playing
|
// start playing
|
||||||
gst_element_set_state(GST_ELEMENT(my_thread),GST_STATE_PLAYING);
|
gst_element_set_state (GST_ELEMENT (my_thread), GST_STATE_PLAYING);
|
||||||
|
|
||||||
</programlisting>
|
</programlisting>
|
||||||
|
|
||||||
|
@ -39,8 +36,8 @@
|
||||||
|
|
||||||
<note>
|
<note>
|
||||||
<para>
|
<para>
|
||||||
The thread must contain at least one element of type <classname>GstSrc</classname>
|
A thread should normally contain a source element. Most often, the thread
|
||||||
or <classname>GstConnection</classname> in order to work.
|
is fed with data from a queue.
|
||||||
</para>
|
</para>
|
||||||
</note>
|
</note>
|
||||||
|
|
||||||
|
@ -60,82 +57,82 @@
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
|
|
||||||
/* eos will be called when the src element has an end of stream */
|
/* eos will be called when the src element has an end of stream */
|
||||||
void eos(GstSrc *src, gpointer data)
|
void
|
||||||
|
eos (GstSrc *src, gpointer data)
|
||||||
{
|
{
|
||||||
GstThread *thread = GST_THREAD(data);
|
GstThread *thread = GST_THREAD (data);
|
||||||
g_print("have eos, quitting\n");
|
g_print ("have eos, quitting\n");
|
||||||
|
|
||||||
/* stop the bin */
|
/* stop the bin */
|
||||||
gst_element_set_state(GST_ELEMENT(thread), GST_STATE_NULL);
|
gst_element_set_state (GST_ELEMENT (thread), GST_STATE_NULL);
|
||||||
|
|
||||||
gst_main_quit();
|
gst_main_quit ();
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
GstElement *disksrc, *audiosink;
|
GstElement *disksrc, *audiosink;
|
||||||
GstElement *pipeline;
|
GstElement *pipeline;
|
||||||
GstElement *thread;
|
GstElement *thread;
|
||||||
|
|
||||||
if (argc != 2) {
|
if (argc != 2) {
|
||||||
g_print("usage: %s <filename>\n", argv[0]);
|
g_print ("usage: %s <filename>\n", argv[0]);
|
||||||
exit(-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_init(&argc,&argv);
|
gst_init (&argc, &argv);
|
||||||
|
|
||||||
/* create a new thread to hold the elements */
|
/* create a new thread to hold the elements */
|
||||||
thread = gst_thread_new("thread");
|
thread = gst_thread_new ("thread");
|
||||||
g_assert(thread != NULL);
|
g_assert (thread != NULL);
|
||||||
|
|
||||||
/* create a new bin to hold the elements */
|
/* create a new bin to hold the elements */
|
||||||
pipeline = gst_pipeline_new("pipeline");
|
pipeline = gst_pipeline_new ("pipeline");
|
||||||
g_assert(pipeline != NULL);
|
g_assert (pipeline != NULL);
|
||||||
|
|
||||||
/* create a disk reader */
|
/* create a disk reader */
|
||||||
disksrc = gst_elementfactory_make("disksrc", "disk_source");
|
disksrc = gst_elementfactory_make ("disksrc", "disk_source");
|
||||||
g_assert(disksrc != NULL);
|
g_assert (disksrc != NULL);
|
||||||
gtk_object_set(GTK_OBJECT(disksrc),"location", argv[1],NULL);
|
gtk_object_set (GTK_OBJECT (disksrc), "location", argv[1], NULL);
|
||||||
gtk_signal_connect(GTK_OBJECT(disksrc),"eos",
|
gtk_signal_connect (GTK_OBJECT (disksrc), "eos",
|
||||||
GTK_SIGNAL_FUNC(eos), thread);
|
GTK_SIGNAL_FUNC (eos), thread);
|
||||||
|
|
||||||
/* and an audio sink */
|
/* and an audio sink */
|
||||||
audiosink = gst_elementfactory_make("audiosink", "play_audio");
|
audiosink = gst_elementfactory_make ("audiosink", "play_audio");
|
||||||
g_assert(audiosink != NULL);
|
g_assert (audiosink != NULL);
|
||||||
|
|
||||||
/* add objects to the main pipeline */
|
/* add objects to the main pipeline */
|
||||||
gst_bin_add(GST_BIN(pipeline), disksrc);
|
gst_bin_add (GST_BIN (pipeline), disksrc);
|
||||||
gst_bin_add(GST_BIN(pipeline), audiosink);
|
gst_bin_add (GST_BIN (pipeline), audiosink);
|
||||||
|
|
||||||
/* automatically setup the pipeline */
|
/* automatically setup the pipeline */
|
||||||
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
|
if (!gst_pipeline_autoplug (GST_PIPELINE (pipeline))) {
|
||||||
g_print("unable to handle stream\n");
|
g_print ("unable to handle stream\n");
|
||||||
exit(-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remove the source element from the pipeline */
|
/* remove the source element from the pipeline */
|
||||||
gst_bin_remove(GST_BIN(pipeline), disksrc);
|
gst_bin_remove (GST_BIN (pipeline), disksrc);
|
||||||
|
|
||||||
/* insert the source element in the thread, remember a thread needs at
|
/* insert the source element in the thread, remember a thread needs at
|
||||||
least one source or connection element */
|
least one source or connection element */
|
||||||
gst_bin_add(GST_BIN(thread), disksrc);
|
gst_bin_add (GST_BIN (thread), disksrc);
|
||||||
|
|
||||||
/* add the pipeline to the thread too */
|
/* add the pipeline to the thread too */
|
||||||
gst_bin_add(GST_BIN(thread), GST_ELEMENT(pipeline));
|
gst_bin_add (GST_BIN (thread), GST_ELEMENT (pipeline));
|
||||||
|
|
||||||
/* make it ready */
|
|
||||||
gst_element_set_state(GST_ELEMENT(thread), GST_STATE_READY);
|
|
||||||
/* start playing */
|
/* start playing */
|
||||||
gst_element_set_state(GST_ELEMENT(thread), GST_STATE_PLAYING);
|
gst_element_set_state (GST_ELEMENT (thread), GST_STATE_PLAYING);
|
||||||
|
|
||||||
/* do whatever you want here, the thread will be playing */
|
/* do whatever you want here, the thread will be playing */
|
||||||
...
|
...
|
||||||
|
|
||||||
gst_main();
|
gst_main ();
|
||||||
|
|
||||||
gst_pipeline_destroy(thread);
|
gst_pipeline_destroy (thread);
|
||||||
|
|
||||||
exit(0);
|
exit (0);
|
||||||
}
|
}
|
||||||
</programlisting>
|
</programlisting>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue