1 #include "common.h"
2 
3 static void
test_simplest_full(void)4 test_simplest_full (void)
5 {
6   gboolean ret = FALSE;
7   GstElement *pipeline;
8   GstElement *comp, *sink, *source1;
9   CollectStructure *collect;
10   GstBus *bus;
11   GstPad *sinkpad;
12 
13   pipeline = gst_pipeline_new ("test_pipeline");
14   comp =
15       gst_element_factory_make_or_warn ("gnlcomposition", "test_composition");
16   fail_if (comp == NULL);
17 
18   /*
19      Source 1
20      Start : 0s
21      Duration : 1s
22      Media start : 5s
23      Media Duartion : 1s
24      Priority : 1
25    */
26   source1 =
27       videotest_gnl_src_full ("source1", 0, 1 * GST_SECOND, 5 * GST_SECOND, 3,
28       1);
29   fail_if (source1 == NULL);
30   check_start_stop_duration (source1, 0, 1 * GST_SECOND, 1 * GST_SECOND);
31 
32   /* Add one source */
33 
34   gst_bin_add (GST_BIN (comp), source1);
35   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
36   fail_unless (ret);
37   check_start_stop_duration (source1, 0, 1 * GST_SECOND, 1 * GST_SECOND);
38   check_start_stop_duration (comp, 0, 1 * GST_SECOND, 1 * GST_SECOND);
39   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
40 
41   sink = gst_element_factory_make_or_warn ("fakesink", "sink");
42   fail_if (sink == NULL);
43 
44   gst_bin_add_many (GST_BIN (pipeline), comp, sink, NULL);
45 
46   /* Shared data */
47   collect = g_new0 (CollectStructure, 1);
48   collect->comp = comp;
49   collect->sink = sink;
50 
51   /* Expected segments */
52   collect->expected_segments = g_list_append (collect->expected_segments,
53       segment_new (1.0, GST_FORMAT_TIME, 5 * GST_SECOND, 6 * GST_SECOND, 0));
54 
55   g_signal_connect (G_OBJECT (comp), "pad-added",
56       G_CALLBACK (composition_pad_added_cb), collect);
57 
58   sinkpad = gst_element_get_static_pad (sink, "sink");
59   gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM,
60       (GstPadProbeCallback) sinkpad_probe, collect, NULL);
61 
62   bus = gst_element_get_bus (GST_ELEMENT (pipeline));
63 
64   GST_DEBUG ("Setting pipeline to PLAYING");
65   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
66 
67   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
68           GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
69 
70   GST_DEBUG ("Let's poll the bus");
71 
72   poll_the_bus (bus);
73 
74   GST_DEBUG ("Setting pipeline to NULL");
75 
76   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
77           GST_STATE_READY) == GST_STATE_CHANGE_FAILURE);
78 
79   fail_if (collect->expected_segments != NULL);
80 
81   GST_DEBUG ("Resetted pipeline to READY");
82 
83   /* Expected segments */
84   collect->expected_segments = g_list_append (collect->expected_segments,
85       segment_new (1.0, GST_FORMAT_TIME, 5 * GST_SECOND, 6 * GST_SECOND, 0));
86   collect->expected_base = 0;
87   collect->gotsegment = FALSE;
88 
89   GST_DEBUG ("Setting pipeline to PLAYING again");
90 
91   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
92           GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
93 
94   GST_DEBUG ("Let's poll the bus AGAIN");
95 
96   poll_the_bus (bus);
97 
98   fail_if (collect->expected_segments != NULL);
99 
100   gst_object_unref (GST_OBJECT (sinkpad));
101 
102   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
103           GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE);
104 
105   ASSERT_OBJECT_REFCOUNT_BETWEEN (pipeline, "main pipeline", 1, 2);
106   gst_object_unref (pipeline);
107   ASSERT_OBJECT_REFCOUNT_BETWEEN (bus, "main bus", 1, 2);
108   gst_object_unref (bus);
109 
110   g_free (collect);
111 }
112 
113 static void
test_time_duration_full(void)114 test_time_duration_full (void)
115 {
116   gboolean ret = FALSE;
117   GstElement *comp, *source1, *source2;
118 
119   comp =
120       gst_element_factory_make_or_warn ("gnlcomposition", "test_composition");
121 
122   /*
123      Source 1
124      Start : 0s
125      Duration : 1s
126      Priority : 1
127    */
128   source1 = videotest_gnl_src ("source1", 0, 1 * GST_SECOND, 3, 1);
129   fail_if (source1 == NULL);
130   check_start_stop_duration (source1, 0, 1 * GST_SECOND, 1 * GST_SECOND);
131 
132   /*
133      Source 2
134      Start : 1s
135      Duration : 1s
136      Priority : 1
137    */
138   source2 = videotest_gnl_src ("source2", 1 * GST_SECOND, 1 * GST_SECOND, 2, 1);
139   fail_if (source2 == NULL);
140   check_start_stop_duration (source2, 1 * GST_SECOND, 2 * GST_SECOND,
141       1 * GST_SECOND);
142 
143   /* Add one source */
144   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
145   ASSERT_OBJECT_REFCOUNT (source2, "source2", 1);
146 
147   gst_bin_add (GST_BIN (comp), source1);
148   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
149   fail_unless (ret == TRUE);
150   check_start_stop_duration (comp, 0, 1 * GST_SECOND, 1 * GST_SECOND);
151 
152   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
153 
154   /* Second source */
155 
156   ret = FALSE;
157   gst_bin_add (GST_BIN (comp), source2);
158   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
159   fail_unless (ret == TRUE);
160   check_start_stop_duration (comp, 0, 2 * GST_SECOND, 2 * GST_SECOND);
161 
162   ASSERT_OBJECT_REFCOUNT (source2, "source2", 1);
163 
164   /* Remove first source */
165 
166   gst_object_ref (source1);
167   gst_bin_remove (GST_BIN (comp), source1);
168   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
169   check_start_stop_duration (comp, 1 * GST_SECOND, 2 * GST_SECOND,
170       1 * GST_SECOND);
171 
172   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
173 
174   /* Re-add first source */
175 
176   gst_bin_add (GST_BIN (comp), source1);
177   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
178   check_start_stop_duration (comp, 0, 2 * GST_SECOND, 2 * GST_SECOND);
179   gst_object_unref (source1);
180 
181   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
182 
183   gst_object_unref (comp);
184 }
185 
186 static void
test_one_after_other_full(void)187 test_one_after_other_full (void)
188 {
189   GstElement *pipeline;
190   GstElement *comp, *sink, *source1, *source2;
191   CollectStructure *collect;
192   GstBus *bus;
193   GstMessage *message;
194   gboolean carry_on = TRUE;
195   GstPad *sinkpad;
196 
197   gboolean ret = FALSE;
198 
199   pipeline = gst_pipeline_new ("test_pipeline");
200   comp =
201       gst_element_factory_make_or_warn ("gnlcomposition", "test_composition");
202   fail_if (comp == NULL);
203 
204   /*
205      Source 1
206      Start : 0s
207      Duration : 1s
208      Media start : 5s
209      Priority : 1
210    */
211   source1 =
212       videotest_gnl_src_full ("source1", 0, 1 * GST_SECOND, 5 * GST_SECOND, 3,
213       1);
214   fail_if (source1 == NULL);
215   check_start_stop_duration (source1, 0, 1 * GST_SECOND, 1 * GST_SECOND);
216 
217   /*
218      Source 2
219      Start : 1s
220      Duration : 1s
221      Media start : 2s
222      Priority : 1
223    */
224   source2 = videotest_gnl_src_full ("source2", 1 * GST_SECOND, 1 * GST_SECOND,
225       2 * GST_SECOND, 2, 1);
226   fail_if (source2 == NULL);
227   check_start_stop_duration (source2, 1 * GST_SECOND, 2 * GST_SECOND,
228       1 * GST_SECOND);
229 
230   /* Add one source */
231   gst_bin_add (GST_BIN (comp), source1);
232   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
233   check_start_stop_duration (comp, 0, 1 * GST_SECOND, 1 * GST_SECOND);
234 
235   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
236 
237   /* Second source */
238   gst_bin_add (GST_BIN (comp), source2);
239 
240   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
241   fail_unless (ret);
242   check_start_stop_duration (source1, 0 * GST_SECOND, 1 * GST_SECOND,
243       1 * GST_SECOND);
244   check_start_stop_duration (source2, 1 * GST_SECOND, 2 * GST_SECOND,
245       1 * GST_SECOND);
246   check_start_stop_duration (comp, 0, 2 * GST_SECOND, 2 * GST_SECOND);
247 
248   ASSERT_OBJECT_REFCOUNT (source2, "source2", 1);
249 
250   /* Remove first source */
251 
252   gst_object_ref (source1);
253   gst_bin_remove (GST_BIN (comp), source1);
254   check_start_stop_duration (comp, 1 * GST_SECOND, 2 * GST_SECOND,
255       1 * GST_SECOND);
256 
257   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
258 
259   /* Re-add first source */
260 
261   gst_bin_add (GST_BIN (comp), source1);
262   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
263   check_start_stop_duration (comp, 0, 2 * GST_SECOND, 2 * GST_SECOND);
264   gst_object_unref (source1);
265 
266   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
267 
268   sink = gst_element_factory_make_or_warn ("fakesink", "sink");
269   fail_if (sink == NULL);
270 
271   gst_bin_add_many (GST_BIN (pipeline), comp, sink, NULL);
272 
273   /* Shared data */
274   collect = g_new0 (CollectStructure, 1);
275   collect->comp = comp;
276   collect->sink = sink;
277 
278   /* Expected segments */
279   collect->expected_segments = g_list_append (collect->expected_segments,
280       segment_new (1.0, GST_FORMAT_TIME, 5 * GST_SECOND, 6 * GST_SECOND, 0));
281   collect->expected_segments = g_list_append (collect->expected_segments,
282       segment_new (1.0, GST_FORMAT_TIME,
283           2 * GST_SECOND, 3 * GST_SECOND, 1 * GST_SECOND));
284 
285   g_signal_connect (G_OBJECT (comp), "pad-added",
286       G_CALLBACK (composition_pad_added_cb), collect);
287 
288   sinkpad = gst_element_get_static_pad (sink, "sink");
289   gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM,
290       (GstPadProbeCallback) sinkpad_probe, collect, NULL);
291 
292   bus = gst_element_get_bus (GST_ELEMENT (pipeline));
293 
294   GST_DEBUG ("Setting pipeline to PLAYING");
295   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
296 
297   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
298           GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
299 
300   GST_DEBUG ("Let's poll the bus");
301 
302   while (carry_on) {
303     message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 10);
304     if (message) {
305       switch (GST_MESSAGE_TYPE (message)) {
306         case GST_MESSAGE_EOS:
307           /* we should check if we really finished here */
308           GST_WARNING ("Got an EOS");
309           carry_on = FALSE;
310           break;
311         case GST_MESSAGE_SEGMENT_START:
312         case GST_MESSAGE_SEGMENT_DONE:
313           /* We shouldn't see any segement messages, since we didn't do a segment seek */
314           GST_WARNING ("Saw a Segment start/stop");
315           fail_if (TRUE);
316           break;
317         case GST_MESSAGE_ERROR:
318           fail_error_message (message);
319         default:
320           break;
321       }
322       gst_mini_object_unref (GST_MINI_OBJECT (message));
323     }
324   }
325 
326   GST_DEBUG ("Setting pipeline to NULL");
327 
328   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
329           GST_STATE_READY) == GST_STATE_CHANGE_FAILURE);
330 
331   fail_if (collect->expected_segments != NULL);
332 
333   GST_DEBUG ("Resetted pipeline to READY");
334 
335   /* Expected segments */
336   collect->expected_segments = g_list_append (collect->expected_segments,
337       segment_new (1.0, GST_FORMAT_TIME, 5 * GST_SECOND, 6 * GST_SECOND, 0));
338   collect->expected_segments = g_list_append (collect->expected_segments,
339       segment_new (1.0, GST_FORMAT_TIME,
340           2 * GST_SECOND, 3 * GST_SECOND, 1 * GST_SECOND));
341   collect->gotsegment = FALSE;
342   collect->expected_base = 0;
343 
344 
345   GST_DEBUG ("Setting pipeline to PLAYING again");
346 
347   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
348           GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
349 
350   carry_on = TRUE;
351 
352   GST_DEBUG ("Let's poll the bus AGAIN");
353 
354   while (carry_on) {
355     message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 10);
356     if (message) {
357       switch (GST_MESSAGE_TYPE (message)) {
358         case GST_MESSAGE_EOS:
359           /* we should check if we really finished here */
360           carry_on = FALSE;
361           break;
362         case GST_MESSAGE_SEGMENT_START:
363         case GST_MESSAGE_SEGMENT_DONE:
364           /* We shouldn't see any segement messages, since we didn't do a segment seek */
365           GST_WARNING ("Saw a Segment start/stop");
366           fail_if (TRUE);
367           break;
368         case GST_MESSAGE_ERROR:
369           fail_error_message (message);
370         default:
371           break;
372       }
373       gst_mini_object_unref (GST_MINI_OBJECT (message));
374     } else {
375       GST_DEBUG ("bus_poll responded, but there wasn't any message...");
376     }
377   }
378 
379   fail_if (collect->expected_segments != NULL);
380 
381   gst_object_unref (GST_OBJECT (sinkpad));
382 
383   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
384           GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE);
385 
386   ASSERT_OBJECT_REFCOUNT_BETWEEN (pipeline, "main pipeline", 1, 2);
387   gst_object_unref (pipeline);
388   ASSERT_OBJECT_REFCOUNT_BETWEEN (bus, "main bus", 1, 2);
389   gst_object_unref (bus);
390 
391   g_free (collect);
392 }
393 
394 static void
test_one_under_another_full(void)395 test_one_under_another_full (void)
396 {
397   gboolean ret = FALSE;
398   GstElement *pipeline;
399   GstElement *comp, *sink, *source1, *source2;
400   CollectStructure *collect;
401   GstBus *bus;
402   GstMessage *message;
403   gboolean carry_on = TRUE;
404   GstPad *sinkpad;
405 
406   pipeline = gst_pipeline_new ("test_pipeline");
407   comp =
408       gst_element_factory_make_or_warn ("gnlcomposition", "test_composition");
409   fail_if (comp == NULL);
410 
411   /* TOPOLOGY
412    *
413    * 0           1           2           3           4          5 | Priority
414    * ----------------------------------------------------------------------------
415    * [-      source1       -]                                     | 1
416    *             [-      source2       -]                         | 2
417    * */
418 
419   /*
420      Source 1
421      Start : 0s
422      Duration : 2s
423      Priority : 1
424    */
425   source1 = videotest_gnl_src ("source1", 0, 2 * GST_SECOND, 3, 1);
426   fail_if (source1 == NULL);
427   check_start_stop_duration (source1, 0, 2 * GST_SECOND, 2 * GST_SECOND);
428 
429   /*
430      Source 2
431      Start : 1s
432      Duration : 2s
433      Priority : 2
434    */
435   source2 = videotest_gnl_src ("source2", 1 * GST_SECOND, 2 * GST_SECOND, 2, 2);
436   fail_if (source2 == NULL);
437   check_start_stop_duration (source2, 1 * GST_SECOND, 3 * GST_SECOND,
438       2 * GST_SECOND);
439 
440   /* Add two sources */
441 
442   gst_bin_add (GST_BIN (comp), source1);
443   gst_bin_add (GST_BIN (comp), source2);
444   check_start_stop_duration (comp, 0, 0 * GST_SECOND, 0 * GST_SECOND);
445   /* Now commiting changes */
446   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
447   check_start_stop_duration (comp, 0, 3 * GST_SECOND, 3 * GST_SECOND);
448   check_start_stop_duration (source1, 0, 2 * GST_SECOND, 2 * GST_SECOND);
449   check_start_stop_duration (source2, 1 * GST_SECOND, 3 * GST_SECOND,
450       2 * GST_SECOND);
451 
452   /* Remove second source */
453 
454   gst_object_ref (source1);
455   gst_bin_remove (GST_BIN (comp), source1);
456   check_start_stop_duration (comp, 1 * GST_SECOND, 3 * GST_SECOND,
457       2 * GST_SECOND);
458 
459   /* Re-add second source */
460 
461   gst_bin_add (GST_BIN (comp), source1);
462   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
463   check_start_stop_duration (comp, 0, 3 * GST_SECOND, 3 * GST_SECOND);
464   gst_object_unref (source1);
465 
466   sink = gst_element_factory_make_or_warn ("fakesink", "sink");
467   fail_if (sink == NULL);
468 
469   gst_bin_add_many (GST_BIN (pipeline), comp, sink, NULL);
470 
471   /* Shared data */
472   collect = g_new0 (CollectStructure, 1);
473   collect->comp = comp;
474   collect->sink = sink;
475 
476   /* Expected segments */
477   collect->expected_segments = g_list_append (collect->expected_segments,
478       segment_new (1.0, GST_FORMAT_TIME, 0, GST_SECOND, 0));
479 
480   collect->expected_segments = g_list_append (collect->expected_segments,
481       segment_new (1.0, GST_FORMAT_TIME, GST_SECOND, 2 * GST_SECOND,
482           GST_SECOND));
483 
484   collect->expected_segments = g_list_append (collect->expected_segments,
485       segment_new (1.0, GST_FORMAT_TIME,
486           2 * GST_SECOND, 3 * GST_SECOND, 2 * GST_SECOND));
487 
488   g_signal_connect (G_OBJECT (comp), "pad-added",
489       G_CALLBACK (composition_pad_added_cb), collect);
490 
491   sinkpad = gst_element_get_static_pad (sink, "sink");
492   gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM,
493       (GstPadProbeCallback) sinkpad_probe, collect, NULL);
494 
495   bus = gst_element_get_bus (GST_ELEMENT (pipeline));
496 
497   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
498           GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
499 
500   while (carry_on) {
501     message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 10);
502     if (message) {
503       switch (GST_MESSAGE_TYPE (message)) {
504         case GST_MESSAGE_EOS:
505           /* we should check if we really finished here */
506           carry_on = FALSE;
507           break;
508         case GST_MESSAGE_SEGMENT_START:
509         case GST_MESSAGE_SEGMENT_DONE:
510           /* check if the segment is the correct one (0s-4s) */
511           carry_on = FALSE;
512           break;
513         case GST_MESSAGE_ERROR:
514           fail_error_message (message);
515         default:
516           break;
517       }
518       gst_message_unref (message);
519     }
520   }
521 
522   fail_if (collect->expected_segments != NULL);
523 
524   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
525           GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE);
526 
527   gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 10);
528   gst_object_unref (GST_OBJECT (sinkpad));
529   ASSERT_OBJECT_REFCOUNT_BETWEEN (pipeline, "main pipeline", 1, 2);
530   gst_object_unref (pipeline);
531   ASSERT_OBJECT_REFCOUNT_BETWEEN (bus, "main bus", 1, 2);
532   gst_object_unref (bus);
533 
534   g_free (collect);
535 }
536 
537 static void
test_one_bin_after_other_full(void)538 test_one_bin_after_other_full (void)
539 {
540   gboolean ret = FALSE;
541   GstElement *pipeline;
542   GstElement *comp, *sink, *source1, *source2;
543   CollectStructure *collect;
544   GstBus *bus;
545   GstMessage *message;
546   gboolean carry_on = TRUE;
547   GstPad *sinkpad;
548 
549   pipeline = gst_pipeline_new ("test_pipeline");
550   comp =
551       gst_element_factory_make_or_warn ("gnlcomposition", "test_composition");
552   fail_if (comp == NULL);
553 
554   /*
555      Source 1
556      Start : 0s
557      Duration : 1s
558      Priority : 1
559    */
560   source1 = videotest_in_bin_gnl_src ("source1", 0, 1 * GST_SECOND, 3, 1);
561   if (source1 == NULL) {
562     gst_object_unref (pipeline);
563     gst_object_unref (comp);
564     return;
565   }
566   check_start_stop_duration (source1, 0, 1 * GST_SECOND, 1 * GST_SECOND);
567 
568   /*
569      Source 2
570      Start : 1s
571      Duration : 1s
572      Priority : 1
573    */
574   source2 =
575       videotest_in_bin_gnl_src ("source2", 1 * GST_SECOND, 1 * GST_SECOND, 2,
576       1);
577   fail_if (source2 == NULL);
578   check_start_stop_duration (source2, 1 * GST_SECOND, 2 * GST_SECOND,
579       1 * GST_SECOND);
580 
581   /* Add one source */
582 
583   gst_bin_add (GST_BIN (comp), source1);
584   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
585   fail_unless (ret);
586   check_start_stop_duration (comp, 0, 1 * GST_SECOND, 1 * GST_SECOND);
587   check_start_stop_duration (source1, 0, 1 * GST_SECOND, 1 * GST_SECOND);
588 
589   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
590 
591   /* Second source */
592 
593   gst_bin_add (GST_BIN (comp), source2);
594   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
595   check_start_stop_duration (comp, 0, 2 * GST_SECOND, 2 * GST_SECOND);
596   check_start_stop_duration (source1, 0, 1 * GST_SECOND, 1 * GST_SECOND);
597   check_start_stop_duration (source2, 1 * GST_SECOND, 2 * GST_SECOND,
598       1 * GST_SECOND);
599 
600   ASSERT_OBJECT_REFCOUNT (source2, "source2", 1);
601 
602   /* Remove first source */
603 
604   gst_object_ref (source1);
605   gst_bin_remove (GST_BIN (comp), source1);
606   check_start_stop_duration (comp, 1 * GST_SECOND, 2 * GST_SECOND,
607       1 * GST_SECOND);
608 
609   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
610 
611   /* Re-add first source */
612 
613   gst_bin_add (GST_BIN (comp), source1);
614   g_signal_emit_by_name (comp, "commit", TRUE, &ret);
615   check_start_stop_duration (comp, 0, 2 * GST_SECOND, 2 * GST_SECOND);
616   gst_object_unref (source1);
617 
618   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
619 
620   sink = gst_element_factory_make_or_warn ("fakesink", "sink");
621   fail_if (sink == NULL);
622 
623   gst_bin_add_many (GST_BIN (pipeline), comp, sink, NULL);
624 
625   /* Shared data */
626   collect = g_new0 (CollectStructure, 1);
627   collect->comp = comp;
628   collect->sink = sink;
629 
630   /* Expected segments */
631   collect->expected_segments = g_list_append (collect->expected_segments,
632       segment_new (1.0, GST_FORMAT_TIME, 0, 1 * GST_SECOND, 0));
633   collect->expected_segments = g_list_append (collect->expected_segments,
634       segment_new (1.0, GST_FORMAT_TIME,
635           1 * GST_SECOND, 2 * GST_SECOND, 1 * GST_SECOND));
636 
637   g_signal_connect (G_OBJECT (comp), "pad-added",
638       G_CALLBACK (composition_pad_added_cb), collect);
639 
640   sinkpad = gst_element_get_static_pad (sink, "sink");
641   gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM,
642       (GstPadProbeCallback) sinkpad_probe, collect, NULL);
643 
644   bus = gst_element_get_bus (GST_ELEMENT (pipeline));
645 
646   GST_DEBUG ("Setting pipeline to PLAYING");
647   ASSERT_OBJECT_REFCOUNT (source1, "source1", 1);
648 
649   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
650           GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
651 
652   GST_DEBUG ("Let's poll the bus");
653 
654   while (carry_on) {
655     message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 10);
656     if (message) {
657       switch (GST_MESSAGE_TYPE (message)) {
658         case GST_MESSAGE_EOS:
659           /* we should check if we really finished here */
660           GST_WARNING ("Got an EOS");
661           carry_on = FALSE;
662           break;
663         case GST_MESSAGE_SEGMENT_START:
664         case GST_MESSAGE_SEGMENT_DONE:
665           /* We shouldn't see any segement messages, since we didn't do a segment seek */
666           GST_WARNING ("Saw a Segment start/stop");
667           fail_if (FALSE);
668           break;
669         case GST_MESSAGE_ERROR:
670           fail_error_message (message);
671         default:
672           break;
673       }
674       gst_mini_object_unref (GST_MINI_OBJECT (message));
675     }
676   }
677 
678   GST_DEBUG ("Setting pipeline to NULL");
679 
680   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
681           GST_STATE_READY) == GST_STATE_CHANGE_FAILURE);
682 
683   fail_if (collect->expected_segments != NULL);
684 
685   GST_DEBUG ("Resetted pipeline to READY");
686 
687   /* Expected segments */
688   collect->expected_segments = g_list_append (collect->expected_segments,
689       segment_new (1.0, GST_FORMAT_TIME, 0, 1 * GST_SECOND, 0));
690   collect->expected_segments = g_list_append (collect->expected_segments,
691       segment_new (1.0, GST_FORMAT_TIME,
692           1 * GST_SECOND, 2 * GST_SECOND, 1 * GST_SECOND));
693   collect->gotsegment = FALSE;
694   collect->expected_base = 0;
695 
696   GST_DEBUG ("Setting pipeline to PLAYING again");
697 
698   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
699           GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
700 
701   carry_on = TRUE;
702   while (carry_on) {
703     message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 10);
704     if (message) {
705       switch (GST_MESSAGE_TYPE (message)) {
706         case GST_MESSAGE_EOS:
707           /* we should check if we really finished here */
708           carry_on = FALSE;
709           break;
710         case GST_MESSAGE_SEGMENT_START:
711         case GST_MESSAGE_SEGMENT_DONE:
712           /* We shouldn't see any segement messages, since we didn't do a segment seek */
713           GST_WARNING ("Saw a Segment start/stop");
714           fail_if (FALSE);
715           break;
716         case GST_MESSAGE_ERROR:
717           fail_error_message (message);
718         default:
719           break;
720       }
721       gst_mini_object_unref (GST_MINI_OBJECT (message));
722     }
723   }
724 
725   gst_object_unref (GST_OBJECT (sinkpad));
726 
727   fail_if (collect->expected_segments != NULL);
728 
729   fail_if (gst_element_set_state (GST_ELEMENT (pipeline),
730           GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE);
731 
732   ASSERT_OBJECT_REFCOUNT_BETWEEN (pipeline, "main pipeline", 1, 2);
733   gst_object_unref (pipeline);
734   ASSERT_OBJECT_REFCOUNT_BETWEEN (bus, "main bus", 1, 2);
735   gst_object_unref (bus);
736 
737   g_free (collect);
738 }
739 
GST_START_TEST(test_simplest)740 GST_START_TEST (test_simplest)
741 {
742   test_simplest_full ();
743 }
744 
745 GST_END_TEST;
746 
GST_START_TEST(test_time_duration)747 GST_START_TEST (test_time_duration)
748 {
749   test_time_duration_full ();
750 }
751 
752 GST_END_TEST;
753 
GST_START_TEST(test_one_after_other)754 GST_START_TEST (test_one_after_other)
755 {
756   test_one_after_other_full ();
757 }
758 
759 GST_END_TEST;
760 
GST_START_TEST(test_one_under_another)761 GST_START_TEST (test_one_under_another)
762 {
763   test_one_under_another_full ();
764 }
765 
766 GST_END_TEST;
767 
GST_START_TEST(test_one_bin_after_other)768 GST_START_TEST (test_one_bin_after_other)
769 {
770   test_one_bin_after_other_full ();
771 }
772 
773 GST_END_TEST;
774 
775 static Suite *
gnonlin_suite(void)776 gnonlin_suite (void)
777 {
778   Suite *s = suite_create ("gnonlin-simple");
779   TCase *tc_chain = tcase_create ("general");
780 
781   suite_add_tcase (s, tc_chain);
782 
783   tcase_add_test (tc_chain, test_time_duration);
784   tcase_add_test (tc_chain, test_simplest);
785   tcase_add_test (tc_chain, test_one_after_other);
786   tcase_add_test (tc_chain, test_one_under_another);
787   tcase_add_test (tc_chain, test_one_bin_after_other);
788   return s;
789 }
790 
791 GST_CHECK_MAIN (gnonlin)
792