3 //[.. my_bus_callback goes here ..]
5 static GMainLoop *loop;
8 my_bus_callback (GstBus * bus, GstMessage * message, gpointer data)
10 g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));
12 switch (GST_MESSAGE_TYPE (message)) {
13 case GST_MESSAGE_ERROR:{
17 gst_message_parse_error (message, &err, &debug);
18 g_print ("Error: %s\n", err->message);
22 g_main_loop_quit (loop);
27 g_main_loop_quit (loop);
30 /* unhandled message */
33 /* we want to be notified again the next time there is a message
34 * on the bus, so returning TRUE (FALSE means we want to stop watching
35 * for messages on the bus and our callback should not be called again)
41 switch_cb (gpointer user_data)
44 GstElement *sel = GST_ELEMENT (user_data);
45 gchar *old_pad_name, *new_pad_name;
47 g_object_get (G_OBJECT (sel), "active-pad", &old_pad_name, NULL);
49 if (g_str_equal (old_pad_name, "src0"))
50 new_pad_name = "src1";
52 new_pad_name = "src0";
54 g_object_set (G_OBJECT (sel), "active-pad", new_pad_name, NULL);
56 g_print ("switched from %s to %s\n", old_pad_name, new_pad_name);
57 g_free (old_pad_name);
64 main (gint argc, gchar * argv[])
66 GstElement *pipeline, *src, *toverlay, *osel, *sink1, *sink2, *convert;
67 GstPad *osel_src1, *osel_src2, *sinkpad;
71 gst_init (&argc, &argv);
72 loop = g_main_loop_new (NULL, FALSE);
75 pipeline = gst_element_factory_make ("pipeline", "pipeline");
76 src = gst_element_factory_make ("videotestsrc", "src");
77 toverlay = gst_element_factory_make ("timeoverlay", "timeoverlay");
78 osel = gst_element_factory_make ("output-selector", "osel");
79 convert = gst_element_factory_make ("ffmpegcolorspace", "convert");
80 sink1 = gst_element_factory_make ("xvimagesink", "sink1");
81 sink2 = gst_element_factory_make ("ximagesink", "sink2");
83 if (!pipeline || !src || !toverlay || !osel || !convert || !sink1 || !sink2) {
84 g_print ("missing element\n");
89 gst_bin_add_many (GST_BIN (pipeline), src, toverlay, osel, convert, sink1,
93 g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
94 g_object_set (G_OBJECT (src), "do-timestamp", TRUE, NULL);
95 g_object_set (G_OBJECT (src), "num-buffers", 500, NULL);
96 g_object_set (G_OBJECT (sink1), "sync", FALSE, "async", FALSE, NULL);
97 g_object_set (G_OBJECT (sink2), "sync", FALSE, "async", FALSE, NULL);
98 g_object_set (G_OBJECT (osel), "resend-latest", TRUE, NULL);
100 /* link src ! timeoverlay ! osel */
101 if (!gst_element_link_many (src, toverlay, osel, NULL)) {
102 g_print ("linking failed\n");
107 sinkpad = gst_element_get_static_pad (sink1, "sink");
108 osel_src1 = gst_element_get_request_pad (osel, "src%d");
109 if (gst_pad_link (osel_src1, sinkpad) != GST_PAD_LINK_OK) {
110 g_print ("linking output 1 failed\n");
113 gst_object_unref (sinkpad);
116 sinkpad = gst_element_get_static_pad (convert, "sink");
117 osel_src2 = gst_element_get_request_pad (osel, "src%d");
118 if (gst_pad_link (osel_src2, sinkpad) != GST_PAD_LINK_OK) {
119 g_print ("linking output 2 failed\n");
122 gst_object_unref (sinkpad);
124 if (!gst_element_link (convert, sink2)) {
125 g_print ("linking output 2 failed\n");
129 /* add switch callback */
130 g_timeout_add (1000, switch_cb, osel);
132 /* change to playing */
133 bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
134 gst_bus_add_watch (bus, my_bus_callback, loop);
135 gst_object_unref (bus);
137 gst_element_set_state (pipeline, GST_STATE_PLAYING);
140 g_main_loop_run (loop);
143 gst_element_set_state (pipeline, GST_STATE_NULL);
144 gst_element_release_request_pad (osel, osel_src1);
145 gst_element_release_request_pad (osel, osel_src2);
146 gst_object_unref (GST_OBJECT (pipeline));