Fix the "dynamic" example

Original commit message from CVS:
Fix the "dynamic" example
This commit is contained in:
Wim Taymans 2002-09-14 22:53:21 +00:00
parent 5a559c5b6c
commit 890c2c7eec

View file

@ -18,9 +18,10 @@
We'll start with a simple main function: We'll start with a simple main function:
</para> </para>
<programlisting> <programlisting>
/* example-begin dynamic.c */ /* example-begin dynamic.c */
#include &lt;string.h&gt;
#include &lt;gst/gst.h&gt; #include &lt;gst/gst.h&gt;
#include &lt;gnome.h&gt;
void void
eof (GstElement *src) eof (GstElement *src)
@ -60,22 +61,23 @@ new_pad_created (GstElement *parse, GstPad *pad, GstElement *pipeline)
/* create the thread and pack stuff into it */ /* create the thread and pack stuff into it */
audio_thread = gst_thread_new ("audio_thread"); audio_thread = gst_thread_new ("audio_thread");
g_return_if_fail (audio_thread != NULL); g_return_if_fail (audio_thread != NULL);
gst_bin_add_many (GST_BIN (audio_thread), decode_audio, play, NULL);
/* set up pad connections */
gst_element_add_ghost_pad (GST_ELEMENT (audio_thread),
gst_element_get_pad (decode_audio, "sink"),
"sink");
gst_element_connect (decode_audio, play);
/* construct queue and connect everything in the main pipeline */ /* construct queue and connect everything in the main pipeline */
audio_queue = gst_element_factory_make ("queue", "audio_queue"); audio_queue = gst_element_factory_make ("queue", "audio_queue");
g_return_if_fail (audio_queue != NULL); g_return_if_fail (audio_queue != NULL);
gst_bin_add_many (GST_BIN (pipeline), audio_queue, audio_thread, NULL); gst_bin_add_many (GST_BIN (audio_thread), audio_queue, decode_audio, play, NULL);
gst_pad_connect (pad, gst_element_get_pad (audio_queue, "sink")); /* set up pad connections */
gst_element_connect (audio_queue, audio_thread); gst_element_add_ghost_pad (audio_thread,
gst_element_get_pad (audio_queue, "sink"),
"sink");
gst_element_connect (audio_queue, decode_audio);
gst_element_connect (decode_audio, play);
gst_bin_add (GST_BIN (pipeline), audio_thread);
gst_pad_connect (pad, gst_element_get_pad (audio_thread, "sink"));
/* set up thread state and kick things off */ /* set up thread state and kick things off */
g_print ("setting to READY state\n"); g_print ("setting to READY state\n");
@ -91,31 +93,30 @@ new_pad_created (GstElement *parse, GstPad *pad, GstElement *pipeline)
show = gst_element_factory_make ("xvideosink", "show"); show = gst_element_factory_make ("xvideosink", "show");
g_return_if_fail (show != NULL); g_return_if_fail (show != NULL);
/* create the thread and pack stuff into it */
video_thread = gst_thread_new ("video_thread");
g_return_if_fail (video_thread != NULL);
gst_bin_add_many (GST_BIN (video_thread), decode_video, show, NULL);
/* set up pad connections */
gst_element_add_ghost_pad (GST_ELEMENT (video_thread),
gst_element_get_pad (parse, "sink"),
"sink");
gst_element_connect (decode_video, show);
/* construct queue and connect everything in the main pipeline */ /* construct queue and connect everything in the main pipeline */
video_queue = gst_element_factory_make ("queue", "video_queue"); video_queue = gst_element_factory_make ("queue", "video_queue");
g_return_if_fail (video_queue != NULL); g_return_if_fail (video_queue != NULL);
gst_bin_add_many (GST_BIN (pipeline), video_queue, video_thread, NULL); /* create the thread and pack stuff into it */
video_thread = gst_thread_new ("video_thread");
g_return_if_fail (video_thread != NULL);
gst_bin_add_many (GST_BIN (video_thread), video_queue, decode_video, show, NULL);
gst_pad_connect (pad, gst_element_get_pad (video_queue, "sink")); /* set up pad connections */
gst_element_connect (video_queue, video_thread); gst_element_add_ghost_pad (video_thread,
gst_element_get_pad (video_queue, "sink"),
"sink");
gst_element_connect (video_queue, decode_video);
gst_element_connect (decode_video, show);
gst_bin_add (GST_BIN (pipeline), video_thread);
gst_pad_connect (pad, gst_element_get_pad (video_thread, "sink"));
/* set up thread state and kick things off */ /* set up thread state and kick things off */
g_print ("setting to READY state\n"); g_print ("setting to READY state\n");
gst_element_set_state (GST_ELEMENT (video_thread), GST_STATE_READY); gst_element_set_state (GST_ELEMENT (video_thread), GST_STATE_READY);
} }
g_print("\n");
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
} }
@ -131,7 +132,7 @@ main (int argc, char *argv[])
src = gst_element_factory_make ("filesrc", "src"); src = gst_element_factory_make ("filesrc", "src");
g_return_val_if_fail (src != NULL, -1); g_return_val_if_fail (src != NULL, -1);
if (argc < 2) if (argc &lt; 2)
g_error ("Please specify a video file to play !"); g_error ("Please specify a video file to play !");
g_object_set (G_OBJECT (src), "location", argv[1], NULL); g_object_set (G_OBJECT (src), "location", argv[1], NULL);
@ -153,9 +154,7 @@ main (int argc, char *argv[])
g_idle_add (idle_func, pipeline); g_idle_add (idle_func, pipeline);
gdk_threads_enter ();
gst_main (); gst_main ();
gdk_threads_leave ();
return 0; return 0;
} }
@ -163,11 +162,9 @@ main (int argc, char *argv[])
</programlisting> </programlisting>
<para> <para>
We create two elements: a file source and an MPEG demuxer. We create two elements: a file source and an MPEG demuxer.
We also add an EOS (End Of Stream) signal to the filesrc so that There's nothing special about this piece of code except for
we will be notified when the file has ended. There's nothing the signal 'new_pad' that we connected to the mpegdemux
special about this piece of code except for the signal 'new_pad' element using:
that we connected to the
mpegdemux element using:
</para> </para>
<programlisting> <programlisting>
g_signal_connect (G_OBJECT (demux), "new_pad", g_signal_connect (G_OBJECT (demux), "new_pad",
@ -185,4 +182,8 @@ main (int argc, char *argv[])
There are other possibilities to check the type of the pad, for There are other possibilities to check the type of the pad, for
example by using the MIME type and the properties of the pad. example by using the MIME type and the properties of the pad.
</para> </para>
<para>
Note that the pipeline has to be in the PAUSED state before changes
can be made to its structure.
</para>
</chapter> </chapter>