3 * this tests for proxying of caps from tee sink to src's in various situations
4 * it also tests if you get a good, unique pad when requesting a third one
5 * which shows a bug in 0.3.2 :
9 * request pad, get 1 (number of pads), already exists, assert fail
11 * thomas@apestaart.org
12 * originally written for 0.3.2
19 element_create (char *name, char *element)
22 * print an error if it can't be created
23 * return NULL if it couldn't be created
24 * return element if it did work
27 GstElement *el = NULL;
29 el = (GstElement *) gst_element_factory_make (element, name);
31 fprintf (stderr, "Could not create element %s (%s) !\n", name, element);
38 main (int argc, char *argv[])
40 GstElement *pipeline = NULL;
41 GstElement *tee, *src, *sink1, *sink2;
42 GstPad *tee_src1, *tee_src2;
45 GstCaps *src_caps = NULL;
46 GstCaps *sink_caps = NULL;
47 GstStructure *structure = NULL;
52 gst_init (&argc, &argv);
55 g_print ("Creating pipeline\n");
56 pipeline = gst_pipeline_new ("pipeline");
58 g_print ("Connecting signals to pipeline\n");
59 g_signal_connect (pipeline, "deep_notify",
60 G_CALLBACK (property_change_callback), NULL);
62 g_print ("Creating elements\n");
63 if (!(tee = element_create ("tee", "tee")))
65 if (!(src = element_create ("src", "fakesrc")))
67 g_object_set (G_OBJECT (src), "sizetype", 2, NULL);
68 if (!(sink1 = element_create ("sink1", "fakesink")))
70 if (!(sink2 = element_create ("sink2", "fakesink")))
74 g_print ("Adding elements to bin\n");
75 gst_bin_add (GST_BIN (pipeline), src);
76 gst_bin_add (GST_BIN (pipeline), tee);
79 g_print ("Linking input elements\n");
80 gst_pad_link (gst_element_get_pad (src, "src"),
81 gst_element_get_pad (tee, "sink"));
83 /* request one pad from tee */
84 g_print ("Requesting first pad\n");
85 tee_src1 = gst_element_get_request_pad (tee, "src%d");
86 gst_bin_add (GST_BIN (pipeline), sink1);
87 gst_pad_link (tee_src1, gst_element_get_pad (sink1, "sink"));
90 g_print ("Doing 1 iteration\n");
91 gst_element_set_state (pipeline, GST_STATE_PLAYING);
92 gst_bin_iterate (GST_BIN (pipeline));
94 /* pause and request another pad */
95 g_print ("Requesting second pad\n");
96 gst_element_set_state (pipeline, GST_STATE_PAUSED);
97 tee_src2 = gst_element_get_request_pad (tee, "src%d");
98 gst_bin_add (GST_BIN (pipeline), sink2);
99 gst_pad_link (tee_src2, gst_element_get_pad (sink2, "sink"));
101 /* now we have two fakesinks linked, iterate */
102 g_print ("Doing 1 iteration\n");
103 gst_element_set_state (pipeline, GST_STATE_PLAYING);
104 gst_bin_iterate (GST_BIN (pipeline));
106 /* We don't allow apps to call gst_pad_try_set_caps(). */
108 /* now we try setting caps on the src pad */
109 /* FIXME: should we set to pause here ? */
110 src_caps = gst_caps_from_string ("audio/raw, format=(s)\"int\", "
113 g_assert (src_caps != NULL);
114 g_print ("Setting caps on fakesrc's src pad\n");
115 pad = gst_element_get_pad (src, "src");
116 if ((gst_pad_try_set_caps (pad, src_caps)) <= 0) {
117 g_print ("Could not set caps !\n");
120 /* now iterate and see if it proxies caps ok */
121 gst_bin_iterate (GST_BIN (pipeline));
122 sink_caps = gst_pad_get_caps (gst_element_get_pad (sink1, "sink"));
123 if (sink_caps && gst_caps_is_fixed (sink_caps)) {
124 structure = gst_caps_get_structure (sink_caps, 0);
127 g_print ("sink_caps is not fixed\n");
129 if (structure == NULL || !(gst_structure_has_field (structure, "rate"))) {
130 g_print ("Hm, rate has not been propagated to sink1.\n");
135 gst_structure_get_int (structure, "rate", &rate);
136 g_print ("Rate of pad on sink1 : %d\n", rate);
138 sink_caps = gst_pad_get_caps (gst_element_get_pad (sink2, "sink"));
139 structure = gst_caps_get_structure (sink_caps, 0);
140 if (structure != NULL && !(gst_structure_has_field (structure, "rate"))) {
141 g_print ("Hm, rate has not been propagated to sink2.\n");
146 gst_structure_get_int (structure, "rate", &rate);
147 g_print ("Rate of pad on sink2 : %d\n", rate);
151 /* remove the first one, iterate */
152 g_print ("Removing first sink\n");
153 gst_element_set_state (pipeline, GST_STATE_PAUSED);
154 gst_pad_unlink (tee_src1, gst_element_get_pad (sink1, "sink"));
155 gst_bin_remove (GST_BIN (pipeline), sink1);
157 /* only second fakesink linked, iterate */
158 g_print ("Doing 1 iteration\n");
159 gst_element_set_state (pipeline, GST_STATE_PLAYING);
160 gst_bin_iterate (GST_BIN (pipeline));
162 /* request another pad */
163 g_print ("Requesting third pad\n");
164 gst_element_set_state (pipeline, GST_STATE_PAUSED);
165 /* in 0.3.2 the next statement gives an assert error */
166 tee_src1 = gst_element_get_request_pad (tee, "src%d");
168 gst_element_set_state (pipeline, GST_STATE_NULL);
170 g_print ("Done !\n");