tests/icles/output-selector-test.c: Add a fixme comment.
[platform/upstream/gstreamer.git] / tests / icles / output-selector-test.c
1 #include <gst/gst.h>
2
3 //[.. my_bus_callback goes here ..]
4
5 static GMainLoop *loop;
6
7 static gboolean
8 my_bus_callback (GstBus * bus, GstMessage * message, gpointer data)
9 {
10   g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));
11
12   switch (GST_MESSAGE_TYPE (message)) {
13     case GST_MESSAGE_ERROR:{
14       GError *err;
15       gchar *debug;
16
17       gst_message_parse_error (message, &err, &debug);
18       g_print ("Error: %s\n", err->message);
19       g_error_free (err);
20       g_free (debug);
21
22       g_main_loop_quit (loop);
23       break;
24     }
25     case GST_MESSAGE_EOS:
26       /* end-of-stream */
27       g_main_loop_quit (loop);
28       break;
29     default:
30       /* unhandled message */
31       break;
32   }
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)
36    */
37   return TRUE;
38 }
39
40 static gboolean
41 switch_cb (gpointer user_data)
42 {
43
44   GstElement *sel = GST_ELEMENT (user_data);
45   gchar *old_pad_name, *new_pad_name;
46
47   g_object_get (G_OBJECT (sel), "active-pad", &old_pad_name, NULL);
48
49   if (g_str_equal (old_pad_name, "src0"))
50     new_pad_name = "src1";
51   else
52     new_pad_name = "src0";
53
54   g_object_set (G_OBJECT (sel), "active-pad", new_pad_name, NULL);
55
56   g_print ("switched from %s to %s\n", old_pad_name, new_pad_name);
57   g_free (old_pad_name);
58
59   return TRUE;
60
61 }
62
63 gint
64 main (gint argc, gchar * argv[])
65 {
66   GstElement *pipeline, *src, *toverlay, *osel, *sink1, *sink2, *convert;
67   GstPad *osel_src1, *osel_src2, *sinkpad;
68   GstBus *bus;
69
70   /* init GStreamer */
71   gst_init (&argc, &argv);
72   loop = g_main_loop_new (NULL, FALSE);
73
74   /* create elements */
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");
82
83   if (!pipeline || !src || !toverlay || !osel || !convert || !sink1 || !sink2) {
84     g_print ("missing element\n");
85     return -1;
86   }
87
88   /* add them to bin */
89   gst_bin_add_many (GST_BIN (pipeline), src, toverlay, osel, convert, sink1,
90       sink2, NULL);
91
92   /* set properties */
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);
99
100   /* link src ! timeoverlay ! osel */
101   if (!gst_element_link_many (src, toverlay, osel, NULL)) {
102     g_print ("linking failed\n");
103     return -1;
104   }
105
106   /* link output 1 */
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");
111     return -1;
112   }
113   gst_object_unref (sinkpad);
114
115   /* link output 2 */
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");
120     return -1;
121   }
122   gst_object_unref (sinkpad);
123
124   if (!gst_element_link (convert, sink2)) {
125     g_print ("linking output 2 failed\n");
126     return -1;
127   }
128
129   /* add switch callback */
130   g_timeout_add (1000, switch_cb, osel);
131
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);
136
137   gst_element_set_state (pipeline, GST_STATE_PLAYING);
138
139   /* now run */
140   g_main_loop_run (loop);
141
142   /* also clean up */
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));
147
148   return 0;
149 }