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