diff options
Diffstat (limited to 'examples/seeking/chained.c')
-rw-r--r-- | examples/seeking/chained.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/examples/seeking/chained.c b/examples/seeking/chained.c new file mode 100644 index 00000000..5bd0e12d --- /dev/null +++ b/examples/seeking/chained.c @@ -0,0 +1,104 @@ +#include <stdlib.h> +#include <gst/gst.h> +#include <string.h> + +static GstElement *bin; + +static void +unlinked (GstPad * pad, GstPad * peerpad, GstElement * pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PAUSED); + gst_bin_remove (GST_BIN (pipeline), bin); + gst_element_set_state (bin, GST_STATE_READY); + gst_element_set_state (pipeline, GST_STATE_PLAYING); +} + +static void +new_pad (GstElement * elem, GstPad * newpad, GstElement * pipeline) +{ + GstScheduler *sched; + GstClock *clock; + + g_print ("new pad %s\n", gst_pad_get_name (newpad)); + + gst_element_set_state (pipeline, GST_STATE_PAUSED); + gst_bin_add (GST_BIN (pipeline), bin); + + sched = gst_element_get_scheduler (GST_ELEMENT (pipeline)); + clock = gst_scheduler_get_clock (sched); + gst_scheduler_set_clock (sched, clock); + + gst_pad_link (newpad, gst_element_get_pad (bin, "sink")); + + g_signal_connect (G_OBJECT (newpad), "unlinked", G_CALLBACK (unlinked), + pipeline); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); +} + +int +main (int argc, char **argv) +{ + GstElement *pipeline; + GstElement *filesrc; + GstElement *oggdemux; + GstElement *vorbisdec; + GstElement *audioconvert; + GstElement *osssink; + + gst_init (&argc, &argv); + + if (argc < 2) { + g_print ("usage: %s <oggfile>\n", argv[0]); + return (-1); + } + + pipeline = gst_pipeline_new ("pipeline"); + + filesrc = gst_element_factory_make ("filesrc", "filesrc"); + g_assert (filesrc); + g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL); + + oggdemux = gst_element_factory_make ("oggdemux", "oggdemux"); + g_assert (oggdemux); + + gst_bin_add (GST_BIN (pipeline), filesrc); + gst_bin_add (GST_BIN (pipeline), oggdemux); + + gst_element_link_pads (filesrc, "src", oggdemux, "sink"); + + g_signal_connect (G_OBJECT (oggdemux), "new_pad", G_CALLBACK (new_pad), + pipeline); + + bin = gst_bin_new ("bin"); + vorbisdec = gst_element_factory_make ("vorbisdec", "vorbisdec"); + g_assert (vorbisdec); + audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); + g_assert (audioconvert); + osssink = gst_element_factory_make ("osssink", "osssink"); + g_assert (osssink); + gst_bin_add (GST_BIN (bin), vorbisdec); + gst_bin_add (GST_BIN (bin), audioconvert); + gst_bin_add (GST_BIN (bin), osssink); + + gst_element_link_pads (vorbisdec, "src", audioconvert, "sink"); + gst_element_link_pads (audioconvert, "src", osssink, "sink"); + + gst_element_add_ghost_pad (bin, gst_element_get_pad (vorbisdec, "sink"), + "sink"); + + g_object_ref (G_OBJECT (bin)); + + g_signal_connect (pipeline, "deep_notify", + G_CALLBACK (gst_element_default_deep_notify), NULL); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + while (gst_bin_iterate (GST_BIN (pipeline))) + /* nop */ ; + + /* stop probe */ + gst_element_set_state (pipeline, GST_STATE_NULL); + + return 0; +} |