3 * some unit tests for GstBaseTransform
5 * Copyright (C) 2008 Wim Taymans <wim.taymans@gmail.com>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
27 #include <gst/check/gstcheck.h>
28 #include <gst/base/gstbasetransform.h>
30 #include "test_transform.c"
32 static gboolean set_caps_pt1_called;
35 set_caps_pt1 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
37 GST_DEBUG_OBJECT (trans, "set_caps called");
39 set_caps_pt1_called = TRUE;
44 /* basic passthrough, we don't have any transform functions so we can only
45 * perform passthrough. We also don't have caps, which is fine */
46 GST_START_TEST (basetransform_chain_pt1)
53 klass_set_caps = set_caps_pt1;
54 trans = gst_test_trans_new ();
56 gst_test_trans_push_segment (trans);
58 GST_DEBUG_OBJECT (trans, "buffer without caps, size 20");
60 buffer = gst_buffer_new_and_alloc (20);
62 set_caps_pt1_called = FALSE;
63 res = gst_test_trans_push (trans, buffer);
64 fail_unless (res == GST_FLOW_OK);
65 fail_unless (set_caps_pt1_called == FALSE);
67 buffer = gst_test_trans_pop (trans);
68 fail_unless (buffer != NULL);
69 fail_unless (gst_buffer_get_size (buffer) == 20);
71 gst_buffer_unref (buffer);
73 GST_DEBUG_OBJECT (trans, "buffer without caps, size 10");
75 buffer = gst_buffer_new_and_alloc (10);
76 set_caps_pt1_called = FALSE;
77 res = gst_test_trans_push (trans, buffer);
78 fail_unless (res == GST_FLOW_OK);
79 fail_unless (set_caps_pt1_called == FALSE);
81 buffer = gst_test_trans_pop (trans);
82 fail_unless (buffer != NULL);
83 fail_unless (gst_buffer_get_size (buffer) == 10);
85 gst_buffer_unref (buffer);
87 gst_pad_push_event (trans->srcpad, gst_event_new_flush_start ());
88 gst_pad_push_event (trans->srcpad, gst_event_new_flush_stop (TRUE));
90 caps = gst_caps_new_empty_simple ("foo/x-bar");
91 set_caps_pt1_called = FALSE;
92 gst_test_trans_setcaps (trans, caps);
93 fail_unless (set_caps_pt1_called == TRUE);
94 gst_caps_unref (caps);
96 gst_test_trans_push_segment (trans);
98 gst_test_trans_free (trans);
100 klass_transform_ip = NULL;
101 klass_transform = NULL;
102 klass_transform_caps = NULL;
103 klass_transform_size = NULL;
104 klass_set_caps = NULL;
105 klass_submit_input_buffer = NULL;
106 klass_generate_output = NULL;
111 static gboolean set_caps_pt2_called;
114 set_caps_pt2 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
116 GST_DEBUG_OBJECT (trans, "set_caps called");
118 set_caps_pt2_called = TRUE;
120 fail_unless (gst_caps_is_equal (incaps, outcaps));
125 /* basic passthrough, we don't have any transform functions so we can only
126 * perform passthrough with same caps */
127 GST_START_TEST (basetransform_chain_pt2)
129 TestTransData *trans;
134 klass_set_caps = set_caps_pt2;
135 trans = gst_test_trans_new ();
138 set_caps_pt2_called = FALSE;
139 caps = gst_caps_new_empty_simple ("foo/x-bar");
140 gst_test_trans_setcaps (trans, caps);
141 gst_test_trans_push_segment (trans);
143 GST_DEBUG_OBJECT (trans, "buffer with caps, size 20");
145 buffer = gst_buffer_new_and_alloc (20);
147 res = gst_test_trans_push (trans, buffer);
148 fail_unless (res == GST_FLOW_OK);
149 fail_unless (set_caps_pt2_called == TRUE);
151 buffer = gst_test_trans_pop (trans);
152 fail_unless (buffer != NULL);
153 fail_unless (gst_buffer_get_size (buffer) == 20);
155 gst_buffer_unref (buffer);
157 gst_caps_unref (caps);
159 /* second buffer, renegotiates, keeps extra type arg in caps */
160 caps = gst_caps_new_simple ("foo/x-bar", "type", G_TYPE_INT, 1, NULL);
161 set_caps_pt2_called = FALSE;
162 gst_test_trans_setcaps (trans, caps);
164 GST_DEBUG_OBJECT (trans, "buffer with caps, size 10");
166 buffer = gst_buffer_new_and_alloc (10);
168 res = gst_test_trans_push (trans, buffer);
169 fail_unless (res == GST_FLOW_OK);
170 fail_unless (set_caps_pt2_called == TRUE);
172 buffer = gst_test_trans_pop (trans);
173 fail_unless (buffer != NULL);
174 fail_unless (gst_buffer_get_size (buffer) == 10);
176 gst_buffer_unref (buffer);
178 gst_caps_unref (caps);
180 /* with caps that is a superset */
181 caps = gst_caps_new_empty_simple ("foo/x-bar");
182 set_caps_pt2_called = FALSE;
183 gst_test_trans_setcaps (trans, caps);
185 GST_DEBUG_OBJECT (trans, "buffer with caps, size 10");
187 buffer = gst_buffer_new_and_alloc (10);
189 res = gst_test_trans_push (trans, buffer);
190 fail_unless (res == GST_FLOW_OK);
191 fail_unless (set_caps_pt2_called == TRUE);
193 buffer = gst_test_trans_pop (trans);
194 fail_unless (buffer != NULL);
195 fail_unless (gst_buffer_get_size (buffer) == 10);
197 gst_buffer_unref (buffer);
199 gst_caps_unref (caps);
201 gst_test_trans_free (trans);
206 static gboolean transform_ip_1_called;
207 static gboolean transform_ip_1_writable;
210 transform_ip_1 (GstBaseTransform * trans, GstBuffer * buf)
212 GST_DEBUG_OBJECT (trans, "transform called");
214 transform_ip_1_called = TRUE;
215 transform_ip_1_writable = gst_buffer_is_writable (buf);
217 GST_DEBUG_OBJECT (trans, "writable: %d", transform_ip_1_writable);
222 /* basic in-place, check if the _ip function is called, buffer should
223 * be writable. no setcaps is set */
224 GST_START_TEST (basetransform_chain_ip1)
226 TestTransData *trans;
230 klass_transform_ip = transform_ip_1;
231 trans = gst_test_trans_new ();
233 gst_test_trans_push_segment (trans);
235 GST_DEBUG_OBJECT (trans, "buffer without caps, size 20");
237 buffer = gst_buffer_new_and_alloc (20);
239 transform_ip_1_called = FALSE;
240 transform_ip_1_writable = TRUE;
241 res = gst_test_trans_push (trans, buffer);
242 fail_unless (res == GST_FLOW_OK);
243 fail_unless (transform_ip_1_called == TRUE);
244 fail_unless (transform_ip_1_writable == TRUE);
246 buffer = gst_test_trans_pop (trans);
247 fail_unless (buffer != NULL);
248 fail_unless (gst_buffer_get_size (buffer) == 20);
249 gst_buffer_unref (buffer);
251 GST_DEBUG_OBJECT (trans, "buffer without caps extra ref, size 20");
253 buffer = gst_buffer_new_and_alloc (20);
254 /* take additional ref to make it non-writable */
255 gst_buffer_ref (buffer);
257 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
259 transform_ip_1_called = FALSE;
260 transform_ip_1_writable = FALSE;
261 res = gst_test_trans_push (trans, buffer);
262 fail_unless (res == GST_FLOW_OK);
263 fail_unless (transform_ip_1_called == TRUE);
264 /* copy should have been taken with pad-alloc */
265 fail_unless (transform_ip_1_writable == TRUE);
266 /* after push, get rid of the final ref we had */
267 gst_buffer_unref (buffer);
269 buffer = gst_test_trans_pop (trans);
270 fail_unless (buffer != NULL);
271 fail_unless (gst_buffer_get_size (buffer) == 20);
273 /* output buffer has refcount 1 */
274 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
275 gst_buffer_unref (buffer);
277 /* with caps buffer */
278 GST_DEBUG_OBJECT (trans, "alloc without caps, size 20");
280 gst_test_trans_free (trans);
285 static gboolean set_caps_1_called;
288 set_caps_1 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
292 GST_DEBUG_OBJECT (trans, "set_caps called");
294 set_caps_1_called = TRUE;
296 caps = gst_caps_new_empty_simple ("foo/x-bar");
298 fail_unless (gst_caps_is_equal (incaps, caps));
299 fail_unless (gst_caps_is_equal (outcaps, caps));
301 gst_caps_unref (caps);
306 /* basic in-place, check if the _ip function is called, buffer should be
307 * writable. we also set a setcaps function and see if it's called. */
308 GST_START_TEST (basetransform_chain_ip2)
310 TestTransData *trans;
315 klass_transform_ip = transform_ip_1;
316 klass_set_caps = set_caps_1;
318 trans = gst_test_trans_new ();
320 caps = gst_caps_new_empty_simple ("foo/x-bar");
321 gst_test_trans_push_segment (trans);
323 /* first try to push a buffer without caps, this should fail */
324 buffer = gst_buffer_new_and_alloc (20);
326 GST_DEBUG_OBJECT (trans, "buffer without caps, size 20");
328 transform_ip_1_called = FALSE;
329 transform_ip_1_writable = FALSE;
330 set_caps_1_called = FALSE;
331 res = gst_test_trans_push (trans, buffer);
332 fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
333 fail_unless (transform_ip_1_called == FALSE);
334 fail_unless (transform_ip_1_writable == FALSE);
335 fail_unless (set_caps_1_called == FALSE);
337 /* try to push a buffer with caps */
338 gst_pad_push_event (trans->srcpad, gst_event_new_flush_start ());
339 gst_pad_push_event (trans->srcpad, gst_event_new_flush_stop (TRUE));
341 set_caps_1_called = FALSE;
342 gst_test_trans_setcaps (trans, caps);
343 gst_test_trans_push_segment (trans);
345 GST_DEBUG_OBJECT (trans, "buffer with caps, size 20");
347 buffer = gst_buffer_new_and_alloc (20);
349 transform_ip_1_called = FALSE;
350 transform_ip_1_writable = FALSE;
351 res = gst_test_trans_push (trans, buffer);
352 fail_unless (res == GST_FLOW_OK);
353 fail_unless (transform_ip_1_called == TRUE);
354 fail_unless (transform_ip_1_writable == TRUE);
355 fail_unless (set_caps_1_called == TRUE);
357 buffer = gst_test_trans_pop (trans);
358 fail_unless (buffer != NULL);
359 fail_unless (gst_buffer_get_size (buffer) == 20);
360 gst_buffer_unref (buffer);
362 GST_DEBUG_OBJECT (trans, "buffer with caps extra ref, size 20");
364 buffer = gst_buffer_new_and_alloc (20);
365 /* take additional ref to make it non-writable */
366 gst_buffer_ref (buffer);
368 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
370 transform_ip_1_called = FALSE;
371 transform_ip_1_writable = FALSE;
372 res = gst_test_trans_push (trans, buffer);
373 fail_unless (res == GST_FLOW_OK);
374 fail_unless (transform_ip_1_called == TRUE);
375 fail_unless (transform_ip_1_writable == TRUE);
376 /* after push, get rid of the final ref we had */
377 gst_buffer_unref (buffer);
379 buffer = gst_test_trans_pop (trans);
380 fail_unless (buffer != NULL);
381 fail_unless (gst_buffer_get_size (buffer) == 20);
383 /* output buffer has refcount 1 */
384 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
385 gst_buffer_unref (buffer);
387 gst_caps_unref (caps);
389 gst_test_trans_free (trans);
394 static GstStaticPadTemplate sink_template_ct1 = GST_STATIC_PAD_TEMPLATE ("sink",
397 GST_STATIC_CAPS ("baz/x-foo")
400 static gboolean set_caps_ct1_called;
403 set_caps_ct1 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
405 GstCaps *caps1, *caps2;
407 GST_DEBUG_OBJECT (trans, "set_caps called");
409 caps1 = gst_caps_new_empty_simple ("baz/x-foo");
410 caps2 = gst_caps_new_empty_simple ("foo/x-bar");
412 fail_unless (gst_caps_is_equal (incaps, caps1));
413 fail_unless (gst_caps_is_equal (outcaps, caps2));
415 set_caps_ct1_called = TRUE;
417 gst_caps_unref (caps1);
418 gst_caps_unref (caps2);
423 static gboolean transform_ct1_called;
424 static gboolean transform_ct1_writable;
427 transform_ct1 (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out)
429 transform_ct1_called = TRUE;
430 transform_ct1_writable = gst_buffer_is_writable (out);
432 GST_DEBUG_OBJECT (trans, "writable: %d", transform_ct1_writable);
438 transform_caps_ct1 (GstBaseTransform * trans, GstPadDirection dir,
439 GstCaps * caps, GstCaps * filter)
443 if (dir == GST_PAD_SINK) {
444 res = gst_caps_new_empty_simple ("foo/x-bar");
446 res = gst_caps_new_empty_simple ("baz/x-foo");
451 gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
452 gst_caps_unref (res);
460 transform_size_ct1 (GstBaseTransform * trans, GstPadDirection direction,
461 GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize)
463 if (direction == GST_PAD_SINK) {
464 *othersize = size * 2;
466 *othersize = size / 2;
472 /* basic copy-transform, check if the transform function is called,
473 * buffer should be writable. we also set a setcaps function and
474 * see if it's called. */
475 GST_START_TEST (basetransform_chain_ct1)
477 TestTransData *trans;
480 GstCaps *incaps, *outcaps;
482 sink_template = &sink_template_ct1;
483 klass_transform = transform_ct1;
484 klass_set_caps = set_caps_ct1;
485 klass_transform_caps = transform_caps_ct1;
486 klass_transform_size = transform_size_ct1;
488 trans = gst_test_trans_new ();
490 incaps = gst_caps_new_empty_simple ("baz/x-foo");
491 outcaps = gst_caps_new_empty_simple ("foo/x-bar");
492 gst_test_trans_push_segment (trans);
494 /* first try to push a buffer without caps, this should fail */
495 buffer = gst_buffer_new_and_alloc (20);
497 GST_DEBUG_OBJECT (trans, "buffer without caps");
499 transform_ct1_called = FALSE;
500 transform_ct1_writable = FALSE;
501 set_caps_ct1_called = FALSE;
502 res = gst_test_trans_push (trans, buffer);
503 fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
504 fail_unless (transform_ct1_called == FALSE);
505 fail_unless (transform_ct1_writable == FALSE);
506 fail_unless (set_caps_ct1_called == FALSE);
508 /* try to push a buffer with caps */
509 gst_pad_push_event (trans->srcpad, gst_event_new_flush_start ());
510 gst_pad_push_event (trans->srcpad, gst_event_new_flush_stop (TRUE));
512 set_caps_ct1_called = FALSE;
513 gst_test_trans_setcaps (trans, incaps);
514 gst_test_trans_push_segment (trans);
516 buffer = gst_buffer_new_and_alloc (20);
518 GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
520 transform_ct1_called = FALSE;
521 transform_ct1_writable = FALSE;
522 res = gst_test_trans_push (trans, buffer);
523 fail_unless (res == GST_FLOW_OK);
524 fail_unless (transform_ct1_called == TRUE);
525 fail_unless (transform_ct1_writable == TRUE);
526 fail_unless (set_caps_ct1_called == TRUE);
528 buffer = gst_test_trans_pop (trans);
529 fail_unless (buffer != NULL);
530 fail_unless (gst_buffer_get_size (buffer) == 40);
531 gst_buffer_unref (buffer);
533 buffer = gst_buffer_new_and_alloc (20);
534 /* take additional ref to make it non-writable */
535 gst_buffer_ref (buffer);
537 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
539 GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
541 transform_ct1_called = FALSE;
542 transform_ct1_writable = FALSE;
543 res = gst_test_trans_push (trans, buffer);
544 fail_unless (res == GST_FLOW_OK);
545 fail_unless (transform_ct1_called == TRUE);
546 fail_unless (transform_ct1_writable == TRUE);
547 /* after push, get rid of the final ref we had */
548 gst_buffer_unref (buffer);
550 buffer = gst_test_trans_pop (trans);
551 fail_unless (buffer != NULL);
552 fail_unless (gst_buffer_get_size (buffer) == 40);
554 /* output buffer has refcount 1 */
555 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
556 gst_buffer_unref (buffer);
558 gst_caps_unref (incaps);
559 gst_caps_unref (outcaps);
561 gst_test_trans_free (trans);
566 static GstStaticPadTemplate src_template_ct2 = GST_STATIC_PAD_TEMPLATE ("src",
569 GST_STATIC_CAPS ("baz/x-foo; foo/x-bar")
572 static gint set_caps_ct2_case;
573 static gboolean set_caps_ct2_called;
576 set_caps_ct2 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
578 GstCaps *caps1, *caps2;
580 GST_DEBUG_OBJECT (trans, "set_caps called");
582 caps1 = gst_caps_new_empty_simple ("foo/x-bar");
584 if (set_caps_ct2_case == 1)
585 caps2 = gst_caps_copy (caps1);
587 caps2 = gst_caps_new_empty_simple ("baz/x-foo");
589 fail_unless (gst_caps_is_equal (incaps, caps1));
590 fail_unless (gst_caps_is_equal (outcaps, caps2));
592 set_caps_ct2_called = TRUE;
594 gst_caps_unref (caps1);
595 gst_caps_unref (caps2);
600 static gboolean transform_ct2_called;
601 static gboolean transform_ct2_writable;
604 transform_ct2 (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out)
606 transform_ct2_called = TRUE;
607 transform_ct2_writable = gst_buffer_is_writable (out);
609 GST_DEBUG_OBJECT (trans, "writable: %d", transform_ct2_writable);
615 transform_caps_ct2 (GstBaseTransform * trans, GstPadDirection dir,
616 GstCaps * caps, GstCaps * filter)
620 if (dir == GST_PAD_SINK) {
621 /* everything on the sinkpad can be transformed to the output formats */
622 if (set_caps_ct2_case == 1)
623 res = gst_caps_new_empty_simple ("foo/x-bar");
625 res = gst_caps_new_empty_simple ("baz/x-foo");
627 /* all on the srcpad can be transformed to the format of the sinkpad */
628 res = gst_caps_new_empty_simple ("foo/x-bar");
633 gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
634 gst_caps_unref (res);
642 transform_size_ct2 (GstBaseTransform * trans, GstPadDirection direction,
643 GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize)
645 if (gst_caps_is_equal (caps, othercaps)) {
648 if (direction == GST_PAD_SINK) {
649 *othersize = size * 2;
651 *othersize = size / 2;
658 /* basic copy-transform, check if the transform function is called,
659 * buffer should be writable. we also set a setcaps function and
660 * see if it's called. */
661 GST_START_TEST (basetransform_chain_ct2)
663 TestTransData *trans;
666 GstCaps *incaps, *outcaps;
668 src_template = &src_template_ct2;
669 klass_transform = transform_ct2;
670 klass_set_caps = set_caps_ct2;
671 klass_transform_caps = transform_caps_ct2;
672 klass_transform_size = transform_size_ct2;
674 trans = gst_test_trans_new ();
676 incaps = gst_caps_new_empty_simple ("foo/x-bar");
677 outcaps = gst_caps_new_empty_simple ("baz/x-foo");
679 gst_test_trans_push_segment (trans);
681 /* first try to push a buffer without caps, this should fail */
682 buffer = gst_buffer_new_and_alloc (20);
684 GST_DEBUG_OBJECT (trans, "buffer without caps");
686 transform_ct2_called = FALSE;
687 transform_ct2_writable = FALSE;
688 set_caps_ct2_called = FALSE;
689 res = gst_test_trans_push (trans, buffer);
690 fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
691 fail_unless (transform_ct2_called == FALSE);
692 fail_unless (transform_ct2_writable == FALSE);
693 fail_unless (set_caps_ct2_called == FALSE);
696 /* try to push a buffer with caps */
697 gst_pad_push_event (trans->srcpad, gst_event_new_flush_start ());
698 gst_pad_push_event (trans->srcpad, gst_event_new_flush_stop (TRUE));
700 set_caps_ct2_case = 1;
701 set_caps_ct2_called = FALSE;
702 gst_test_trans_setcaps (trans, incaps);
703 gst_test_trans_push_segment (trans);
705 buffer = gst_buffer_new_and_alloc (20);
707 GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
709 transform_ct2_called = FALSE;
710 transform_ct2_writable = FALSE;
711 res = gst_test_trans_push (trans, buffer);
712 fail_unless (res == GST_FLOW_OK);
713 fail_unless (transform_ct2_called == TRUE);
714 fail_unless (transform_ct2_writable == TRUE);
715 fail_unless (set_caps_ct2_called == TRUE);
717 buffer = gst_test_trans_pop (trans);
718 fail_unless (buffer != NULL);
719 fail_unless (gst_buffer_get_size (buffer) == 20);
720 gst_buffer_unref (buffer);
722 buffer = gst_buffer_new_and_alloc (20);
723 /* take additional ref to make it non-writable */
724 gst_buffer_ref (buffer);
726 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
728 GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
730 transform_ct2_called = FALSE;
731 transform_ct2_writable = FALSE;
732 res = gst_test_trans_push (trans, buffer);
733 fail_unless (res == GST_FLOW_OK);
734 fail_unless (transform_ct2_called == TRUE);
735 fail_unless (transform_ct2_writable == TRUE);
736 /* after push, get rid of the final ref we had */
737 gst_buffer_unref (buffer);
739 buffer = gst_test_trans_pop (trans);
740 fail_unless (buffer != NULL);
741 fail_unless (gst_buffer_get_size (buffer) == 20);
743 /* output buffer has refcount 1 */
744 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
745 gst_buffer_unref (buffer);
747 gst_caps_unref (incaps);
748 gst_caps_unref (outcaps);
750 gst_test_trans_free (trans);
755 /* basic copy-transform, we work in passthrough here. */
756 GST_START_TEST (basetransform_chain_ct3)
758 TestTransData *trans;
761 GstCaps *incaps, *outcaps;
763 src_template = &src_template_ct2;
764 klass_passthrough_on_same_caps = TRUE;
765 klass_transform = transform_ct2;
766 klass_set_caps = set_caps_ct2;
767 klass_transform_caps = transform_caps_ct2;
768 klass_transform_size = transform_size_ct2;
770 trans = gst_test_trans_new ();
772 incaps = gst_caps_new_empty_simple ("foo/x-bar");
773 outcaps = gst_caps_new_empty_simple ("baz/x-foo");
775 /* with passthrough caps */
776 gst_test_trans_push_segment (trans);
777 GST_DEBUG_OBJECT (trans, "alloc size 20, with passthrough caps %"
778 GST_PTR_FORMAT, incaps);
780 /* first try to push a buffer without caps, this should fail */
781 buffer = gst_buffer_new_and_alloc (20);
783 GST_DEBUG_OBJECT (trans, "buffer without caps");
785 transform_ct2_called = FALSE;
786 transform_ct2_writable = FALSE;
787 set_caps_ct2_called = FALSE;
788 res = gst_test_trans_push (trans, buffer);
789 fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
790 fail_unless (transform_ct2_called == FALSE);
791 fail_unless (transform_ct2_writable == FALSE);
792 fail_unless (set_caps_ct2_called == FALSE);
794 /* try to push a buffer with caps */
795 buffer = gst_buffer_new_and_alloc (20);
797 GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
799 gst_pad_push_event (trans->srcpad, gst_event_new_flush_start ());
800 gst_pad_push_event (trans->srcpad, gst_event_new_flush_stop (TRUE));
802 set_caps_ct2_case = 1;
803 set_caps_ct2_called = FALSE;
804 gst_test_trans_setcaps (trans, incaps);
805 gst_test_trans_push_segment (trans);
807 transform_ct2_called = FALSE;
808 res = gst_test_trans_push (trans, buffer);
809 fail_unless (res == GST_FLOW_OK);
810 fail_unless (transform_ct2_called == FALSE);
811 fail_unless (set_caps_ct2_called == TRUE);
813 buffer = gst_test_trans_pop (trans);
814 fail_unless (buffer != NULL);
815 fail_unless (gst_buffer_get_size (buffer) == 20);
816 gst_buffer_unref (buffer);
818 buffer = gst_buffer_new_and_alloc (20);
819 /* take additional ref to make it non-writable */
820 gst_buffer_ref (buffer);
822 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
824 GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
826 transform_ct2_called = FALSE;
827 res = gst_test_trans_push (trans, buffer);
828 fail_unless (res == GST_FLOW_OK);
829 fail_unless (transform_ct2_called == FALSE);
830 /* after push, get rid of the final ref we had */
831 gst_buffer_unref (buffer);
833 buffer = gst_test_trans_pop (trans);
834 fail_unless (buffer != NULL);
835 fail_unless (gst_buffer_get_size (buffer) == 20);
837 /* output buffer has refcount 1 */
838 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
839 gst_buffer_unref (buffer);
841 /* change the return value of the buffer-alloc function */
842 GST_DEBUG_OBJECT (trans, "switching transform output");
844 GST_DEBUG_OBJECT (trans,
845 "buffer with in passthrough with caps %" GST_PTR_FORMAT, incaps);
846 buffer = gst_buffer_new_and_alloc (10);
848 /* don't suggest anything else */
849 set_caps_ct2_case = 2;
850 gst_pad_push_event (trans->sinkpad, gst_event_new_reconfigure ());
851 transform_ct2_called = FALSE;
852 res = gst_test_trans_push (trans, buffer);
853 fail_unless (res == GST_FLOW_OK);
854 fail_unless (transform_ct2_called == TRUE);
856 buffer = gst_test_trans_pop (trans);
857 fail_unless (buffer != NULL);
858 fail_unless (gst_buffer_get_size (buffer) == 20);
860 /* output buffer has refcount 1 */
861 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
862 gst_buffer_unref (buffer);
864 GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
865 buffer = gst_buffer_new_and_alloc (10);
867 /* don't suggest anything else */
868 transform_ct2_called = FALSE;
869 res = gst_test_trans_push (trans, buffer);
870 fail_unless (res == GST_FLOW_OK);
871 fail_unless (transform_ct2_called == TRUE);
872 /* after push, get rid of the final ref we had */
874 buffer = gst_test_trans_pop (trans);
875 fail_unless (buffer != NULL);
876 fail_unless (gst_buffer_get_size (buffer) == 20);
878 /* output buffer has refcount 1 */
879 fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
880 gst_buffer_unref (buffer);
882 gst_caps_unref (incaps);
883 gst_caps_unref (outcaps);
885 gst_test_trans_free (trans);
891 transform1_setup (void)
893 sink_template = &gst_test_trans_sink_template;
894 src_template = &gst_test_trans_src_template;
898 transform1_teardown (void)
900 /* reset global state */
901 klass_transform_ip = NULL;
902 klass_transform = NULL;
903 klass_transform_caps = NULL;
904 klass_transform_size = NULL;
905 klass_set_caps = NULL;
906 klass_submit_input_buffer = NULL;
907 klass_generate_output = NULL;
911 gst_basetransform_suite (void)
913 Suite *s = suite_create ("GstBaseTransform");
914 TCase *tc = tcase_create ("general");
916 suite_add_tcase (s, tc);
917 tcase_add_checked_fixture (tc, transform1_setup, transform1_teardown);
920 tcase_add_test (tc, basetransform_chain_pt1);
921 tcase_add_test (tc, basetransform_chain_pt2);
923 tcase_add_test (tc, basetransform_chain_ip1);
924 tcase_add_test (tc, basetransform_chain_ip2);
926 tcase_add_test (tc, basetransform_chain_ct1);
927 tcase_add_test (tc, basetransform_chain_ct2);
928 tcase_add_test (tc, basetransform_chain_ct3);
933 GST_CHECK_MAIN (gst_basetransform);