1 /* GStreamer unit tests for decodebin2
3 * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
4 * Copyright (C) 2011 Hewlett-Packard Development Company, L.P.
5 * Author: Tim-Philipp Müller <tim.muller@collabora.co.uk>, Collabora Ltd.
6 * Sebastian Dröge <sebastian.droege@collabora.co.uk>, Collabora Ltd.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
28 #include <gst/check/gstcheck.h>
29 #include <gst/base/gstbaseparse.h>
32 static const gchar dummytext[] =
33 "Quick Brown Fox Jumps over a Lazy Frog Quick Brown "
34 "Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick "
35 "Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog "
36 "Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy "
37 "Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a "
38 "Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps "
39 "over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox "
40 "jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown "
41 "Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick "
42 "Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog "
43 "Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a Lazy "
44 "Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps over a "
45 "Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox Jumps "
46 "over a Lazy Frog Quick Brown Fox Jumps over a Lazy Frog Quick Brown Fox ";
49 src_handoff_cb (GstElement * src, GstBuffer * buf, GstPad * pad, gpointer data)
51 GST_BUFFER_DATA (buf) = (guint8 *) dummytext;
52 GST_BUFFER_SIZE (buf) = sizeof (dummytext);
53 GST_BUFFER_OFFSET (buf) = 0;
54 GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_READONLY);
58 decodebin_new_decoded_pad_cb (GstElement * decodebin, GstPad * pad,
59 gboolean last, gboolean * p_flag)
61 /* we should not be reached */
62 fail_unless (decodebin == NULL, "new-decoded-pad should not be emitted");
65 /* make sure that decodebin errors out instead of creating a new decoded pad
66 * if the entire stream is a plain text file */
67 GST_START_TEST (test_text_plain_streams)
69 GstElement *pipe, *src, *decodebin;
72 pipe = gst_pipeline_new (NULL);
73 fail_unless (pipe != NULL, "failed to create pipeline");
75 src = gst_element_factory_make ("fakesrc", "src");
76 fail_unless (src != NULL, "Failed to create fakesrc element");
78 g_object_set (src, "signal-handoffs", TRUE, NULL);
79 g_object_set (src, "num-buffers", 1, NULL);
80 g_object_set (src, "can-activate-pull", FALSE, NULL);
81 g_signal_connect (src, "handoff", G_CALLBACK (src_handoff_cb), NULL);
83 decodebin = gst_element_factory_make ("decodebin2", "decodebin");
84 fail_unless (decodebin != NULL, "Failed to create decodebin element");
86 g_signal_connect (decodebin, "new-decoded-pad",
87 G_CALLBACK (decodebin_new_decoded_pad_cb), NULL);
89 fail_unless (gst_bin_add (GST_BIN (pipe), src));
90 fail_unless (gst_bin_add (GST_BIN (pipe), decodebin));
91 fail_unless (gst_element_link (src, decodebin), "can't link src<->decodebin");
93 fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_READY),
94 GST_STATE_CHANGE_SUCCESS);
95 /* it's push-based, so should be async */
96 fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_PAUSED),
97 GST_STATE_CHANGE_ASYNC);
99 /* it should error out at some point */
100 msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, -1);
101 fail_unless (msg != NULL);
102 fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR);
103 gst_message_unref (msg);
105 gst_element_set_state (pipe, GST_STATE_NULL);
106 gst_object_unref (pipe);
112 new_decoded_pad_plug_fakesink_cb (GstElement * decodebin, GstPad * srcpad,
113 gboolean last, GstElement * pipeline)
118 GST_LOG ("Linking fakesink");
120 sink = gst_element_factory_make ("fakesink", "sink");
121 fail_unless (sink != NULL, "Failed to create fakesink element");
123 gst_bin_add (GST_BIN (pipeline), sink);
125 sinkpad = gst_element_get_static_pad (sink, "sink");
126 fail_unless_equals_int (gst_pad_link (srcpad, sinkpad), GST_PAD_LINK_OK);
127 gst_object_unref (sinkpad);
129 gst_element_set_state (sink, GST_STATE_PLAYING);
132 GST_START_TEST (test_reuse_without_decoders)
134 GstElement *pipe, *src, *decodebin, *sink;
136 pipe = gst_pipeline_new (NULL);
137 fail_unless (pipe != NULL, "failed to create pipeline");
139 src = gst_element_factory_make ("audiotestsrc", "src");
140 fail_unless (src != NULL, "Failed to create audiotestsrc element");
142 decodebin = gst_element_factory_make ("decodebin2", "decodebin");
143 fail_unless (decodebin != NULL, "Failed to create decodebin element");
145 g_signal_connect (decodebin, "new-decoded-pad",
146 G_CALLBACK (new_decoded_pad_plug_fakesink_cb), pipe);
148 fail_unless (gst_bin_add (GST_BIN (pipe), src));
149 fail_unless (gst_bin_add (GST_BIN (pipe), decodebin));
150 fail_unless (gst_element_link (src, decodebin), "can't link src<->decodebin");
152 fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_READY),
153 GST_STATE_CHANGE_SUCCESS);
154 /* it's push-based, so should be async */
155 fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_PAUSED),
156 GST_STATE_CHANGE_ASYNC);
158 /* wait for state change to complete */
159 fail_unless_equals_int (gst_element_get_state (pipe, NULL, NULL, -1),
160 GST_STATE_CHANGE_SUCCESS);
162 /* there shouldn't be any errors */
163 fail_if (gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, 0) != NULL);
166 gst_element_set_state (pipe, GST_STATE_READY);
168 sink = gst_bin_get_by_name (GST_BIN (pipe), "sink");
169 gst_bin_remove (GST_BIN (pipe), sink);
170 gst_element_set_state (sink, GST_STATE_NULL);
171 gst_object_unref (sink);
173 GST_LOG ("second try");
175 fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_READY),
176 GST_STATE_CHANGE_SUCCESS);
177 /* it's push-based, so should be async */
178 fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_PAUSED),
179 GST_STATE_CHANGE_ASYNC);
181 /* wait for state change to complete */
182 fail_unless_equals_int (gst_element_get_state (pipe, NULL, NULL, -1),
183 GST_STATE_CHANGE_SUCCESS);
185 /* there shouldn't be any errors */
186 fail_if (gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, 0) != NULL);
188 gst_element_set_state (pipe, GST_STATE_NULL);
189 gst_object_unref (pipe);
194 /* Fake mp3 parser for test */
195 typedef GstBaseParse TestMpegAudioParse;
196 typedef GstBaseParseClass TestMpegAudioParseClass;
198 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
201 GST_STATIC_CAPS ("audio/mpeg, mpegversion=1, layer=[1,3], parsed=(b)true")
204 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
207 GST_STATIC_CAPS ("audio/mpeg, mpegversion=1, parsed=(bool) { false, true }")
210 static GType test_mpeg_audio_parse_get_type (void);
211 static gboolean test_mpeg_audio_parse_start (GstBaseParse * parse);
212 static gboolean test_mpeg_audio_parse_stop (GstBaseParse * parse);
213 static gboolean test_mpeg_audio_parse_check_valid_frame (GstBaseParse * parse,
214 GstBaseParseFrame * frame, guint * size, gint * skipsize);
215 static GstFlowReturn test_mpeg_audio_parse_parse_frame (GstBaseParse * parse,
216 GstBaseParseFrame * frame);
218 GST_BOILERPLATE (TestMpegAudioParse, test_mpeg_audio_parse, GstBaseParse,
219 GST_TYPE_BASE_PARSE);
222 test_mpeg_audio_parse_base_init (gpointer klass)
224 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
226 gst_element_class_add_pad_template (element_class,
227 gst_static_pad_template_get (&sink_template));
228 gst_element_class_add_pad_template (element_class,
229 gst_static_pad_template_get (&src_template));
231 gst_element_class_set_details_simple (element_class, "MPEG1 Audio Parser",
232 "Codec/Parser/Audio", "Pretends to parse mpeg1 audio stream",
233 "Foo Bar <foo@bar.com>");
237 test_mpeg_audio_parse_class_init (TestMpegAudioParseClass * klass)
239 GstBaseParseClass *parse_class = GST_BASE_PARSE_CLASS (klass);
241 parse_class->start = test_mpeg_audio_parse_start;
242 parse_class->stop = test_mpeg_audio_parse_stop;
243 parse_class->check_valid_frame = test_mpeg_audio_parse_check_valid_frame;
244 parse_class->parse_frame = test_mpeg_audio_parse_parse_frame;
247 static gint num_parse_instances = 0;
250 test_mpeg_audio_parse_init (TestMpegAudioParse * mp3parse,
251 TestMpegAudioParseClass * klass)
253 /* catch decodebin plugging parsers in a loop early */
254 fail_unless (++num_parse_instances < 10);
258 test_mpeg_audio_parse_start (GstBaseParse * parse)
260 gst_base_parse_set_min_frame_size (parse, 6);
265 test_mpeg_audio_parse_stop (GstBaseParse * parse)
271 test_mpeg_audio_parse_check_valid_frame (GstBaseParse * parse,
272 GstBaseParseFrame * frame, guint * framesize, gint * skipsize)
274 const guint8 *data = GST_BUFFER_DATA (frame->buffer);
276 if ((GST_READ_UINT16_BE (data) & 0xffe0) == 0xffe0) {
277 /* this framesize is hard-coded for ../test.mp3 */
287 test_mpeg_audio_parse_parse_frame (GstBaseParse * parse,
288 GstBaseParseFrame * frame)
290 if (GST_BUFFER_OFFSET (frame->buffer) == 0) {
293 caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1,
294 "mpegaudioversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, 3,
295 "rate", G_TYPE_INT, 44100, "channels", G_TYPE_INT, 2, NULL);
296 gst_buffer_set_caps (frame->buffer, caps);
297 gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps);
298 gst_caps_unref (caps);
304 plugin_init (GstPlugin * plugin)
306 return gst_element_register (plugin, "testmpegaudioparse", GST_RANK_NONE,
307 test_mpeg_audio_parse_get_type ());
310 GST_START_TEST (test_mp3_parser_loop)
312 GstStateChangeReturn sret;
313 GstPluginFeature *feature;
315 GstElement *pipe, *src, *dec;
318 num_parse_instances = 0;
320 gst_plugin_register_static (GST_VERSION_MAJOR, GST_VERSION_MINOR,
321 "fakemp3parse", "fakemp3parse", plugin_init, VERSION, "LGPL",
322 "gst-plugins-base", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
324 feature = gst_default_registry_find_feature ("testmpegaudioparse",
325 GST_TYPE_ELEMENT_FACTORY);
327 gst_plugin_feature_set_rank (feature, GST_RANK_PRIMARY + 100);
329 pipe = gst_pipeline_new (NULL);
331 src = gst_element_factory_make ("filesrc", NULL);
332 fail_unless (src != NULL);
334 path = g_build_filename (GST_TEST_FILES_PATH, "test.mp3", NULL);
335 g_object_set (src, "location", path, NULL);
338 dec = gst_element_factory_make ("decodebin2", NULL);
339 fail_unless (dec != NULL);
341 gst_bin_add_many (GST_BIN (pipe), src, dec, NULL);
342 gst_element_link_many (src, dec, NULL);
344 sret = gst_element_set_state (pipe, GST_STATE_PLAYING);
345 fail_unless_equals_int (sret, GST_STATE_CHANGE_ASYNC);
347 /* wait for unlinked error */
348 msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipe),
349 GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR);
350 gst_message_unref (msg);
352 gst_element_set_state (pipe, GST_STATE_NULL);
353 gst_object_unref (pipe);
355 /* make sure out parser got plugged at all though */
356 fail_unless_equals_int (num_parse_instances, 1);
358 /* don't want to interfere with any other of the other tests */
359 gst_plugin_feature_set_rank (feature, GST_RANK_NONE);
360 gst_object_unref (feature);
365 /* Fake parser/decoder for parser_negotiation test */
366 static GType gst_fake_h264_parser_get_type (void);
367 static GType gst_fake_h264_decoder_get_type (void);
370 #define parent_class fake_h264_parser_parent_class
371 typedef struct _GstFakeH264Parser GstFakeH264Parser;
372 typedef GstElementClass GstFakeH264ParserClass;
374 struct _GstFakeH264Parser
379 GST_BOILERPLATE (GstFakeH264Parser, gst_fake_h264_parser, GstElement,
383 gst_fake_h264_parser_base_init (gpointer klass)
385 static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink",
386 GST_PAD_SINK, GST_PAD_ALWAYS,
387 GST_STATIC_CAPS ("video/x-h264"));
388 static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src",
389 GST_PAD_SRC, GST_PAD_ALWAYS,
390 GST_STATIC_CAPS ("video/x-h264, "
391 "stream-format=(string) { avc, byte-stream }"));
392 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
394 gst_element_class_add_pad_template (element_class,
395 gst_static_pad_template_get (&sink_templ));
396 gst_element_class_add_pad_template (element_class,
397 gst_static_pad_template_get (&src_templ));
398 gst_element_class_set_details_simple (element_class,
399 "FakeH264Parser", "Codec/Parser/Converter/Video", "yep", "me");
403 gst_fake_h264_parser_class_init (GstFakeH264ParserClass * klass)
408 gst_fake_h264_parser_sink_setcaps (GstPad * pad, GstCaps * caps)
410 GstElement *self = GST_ELEMENT (gst_pad_get_parent (pad));
411 GstPad *otherpad = gst_element_get_static_pad (self, "src");
412 GstCaps *accepted_caps;
414 const gchar *stream_format;
416 accepted_caps = gst_pad_get_allowed_caps (otherpad);
417 accepted_caps = gst_caps_truncate (accepted_caps);
419 s = gst_caps_get_structure (accepted_caps, 0);
420 stream_format = gst_structure_get_string (s, "stream-format");
422 gst_structure_set (s, "stream-format", G_TYPE_STRING, "avc", NULL);
424 gst_pad_set_caps (otherpad, accepted_caps);
425 gst_caps_unref (accepted_caps);
427 gst_object_unref (otherpad);
428 gst_object_unref (self);
434 gst_fake_h264_parser_sink_chain (GstPad * pad, GstBuffer * buf)
436 GstElement *self = GST_ELEMENT (gst_pad_get_parent (pad));
437 GstPad *otherpad = gst_element_get_static_pad (self, "src");
438 GstFlowReturn ret = GST_FLOW_OK;
440 buf = gst_buffer_make_metadata_writable (buf);
441 gst_buffer_set_caps (buf, GST_PAD_CAPS (otherpad));
443 ret = gst_pad_push (otherpad, buf);
445 gst_object_unref (otherpad);
446 gst_object_unref (self);
452 gst_fake_h264_parser_init (GstFakeH264Parser * self,
453 GstFakeH264ParserClass * klass)
458 gst_pad_new_from_template (gst_element_class_get_pad_template
459 (GST_ELEMENT_GET_CLASS (self), "sink"), "sink");
460 gst_pad_set_setcaps_function (pad, gst_fake_h264_parser_sink_setcaps);
461 gst_pad_set_chain_function (pad, gst_fake_h264_parser_sink_chain);
462 gst_element_add_pad (GST_ELEMENT (self), pad);
465 gst_pad_new_from_template (gst_element_class_get_pad_template
466 (GST_ELEMENT_GET_CLASS (self), "src"), "src");
467 gst_element_add_pad (GST_ELEMENT (self), pad);
471 #define parent_class fake_h264_decoder_parent_class
472 typedef struct _GstFakeH264Decoder GstFakeH264Decoder;
473 typedef GstElementClass GstFakeH264DecoderClass;
475 struct _GstFakeH264Decoder
480 GST_BOILERPLATE (GstFakeH264Decoder, gst_fake_h264_decoder, GstElement,
484 gst_fake_h264_decoder_base_init (gpointer klass)
486 static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink",
487 GST_PAD_SINK, GST_PAD_ALWAYS,
488 GST_STATIC_CAPS ("video/x-h264, " "stream-format=(string) byte-stream"));
489 static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src",
490 GST_PAD_SRC, GST_PAD_ALWAYS,
491 GST_STATIC_CAPS ("video/x-raw"));
492 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
494 gst_element_class_add_pad_template (element_class,
495 gst_static_pad_template_get (&sink_templ));
496 gst_element_class_add_pad_template (element_class,
497 gst_static_pad_template_get (&src_templ));
498 gst_element_class_set_details_simple (element_class,
499 "FakeH264Decoder", "Codec/Decoder/Video", "yep", "me");
503 gst_fake_h264_decoder_class_init (GstFakeH264DecoderClass * klass)
508 gst_fake_h264_decoder_sink_setcaps (GstPad * pad, GstCaps * caps)
510 GstElement *self = GST_ELEMENT (gst_pad_get_parent (pad));
511 GstPad *otherpad = gst_element_get_static_pad (self, "src");
513 caps = gst_caps_new_simple ("video/x-raw", NULL);
514 gst_pad_set_caps (otherpad, caps);
515 gst_caps_unref (caps);
517 gst_object_unref (otherpad);
518 gst_object_unref (self);
524 gst_fake_h264_decoder_sink_chain (GstPad * pad, GstBuffer * buf)
526 GstElement *self = GST_ELEMENT (gst_pad_get_parent (pad));
527 GstPad *otherpad = gst_element_get_static_pad (self, "src");
528 GstFlowReturn ret = GST_FLOW_OK;
530 buf = gst_buffer_make_metadata_writable (buf);
531 gst_buffer_set_caps (buf, GST_PAD_CAPS (otherpad));
533 ret = gst_pad_push (otherpad, buf);
535 gst_object_unref (otherpad);
536 gst_object_unref (self);
542 gst_fake_h264_decoder_init (GstFakeH264Decoder * self,
543 GstFakeH264DecoderClass * klass)
548 gst_pad_new_from_template (gst_element_class_get_pad_template
549 (GST_ELEMENT_GET_CLASS (self), "sink"), "sink");
550 gst_pad_set_setcaps_function (pad, gst_fake_h264_decoder_sink_setcaps);
551 gst_pad_set_chain_function (pad, gst_fake_h264_decoder_sink_chain);
552 gst_element_add_pad (GST_ELEMENT (self), pad);
555 gst_pad_new_from_template (gst_element_class_get_pad_template
556 (GST_ELEMENT_GET_CLASS (self), "src"), "src");
557 gst_element_add_pad (GST_ELEMENT (self), pad);
561 parser_negotiation_pad_added_cb (GstElement * dec, GstPad * pad,
564 GstBin *pipe = user_data;
568 sink = gst_element_factory_make ("fakesink", NULL);
569 gst_bin_add (pipe, sink);
570 gst_element_sync_state_with_parent (sink);
571 sinkpad = gst_element_get_static_pad (sink, "sink");
572 gst_pad_link (pad, sinkpad);
573 gst_object_unref (sinkpad);
576 GST_START_TEST (test_parser_negotiation)
578 GstStateChangeReturn sret;
581 GstElement *pipe, *src, *filter, *dec;
583 gst_element_register (NULL, "fakeh264parse", GST_RANK_PRIMARY + 101,
584 gst_fake_h264_parser_get_type ());
585 gst_element_register (NULL, "fakeh264dec", GST_RANK_PRIMARY + 100,
586 gst_fake_h264_decoder_get_type ());
588 pipe = gst_pipeline_new (NULL);
590 src = gst_element_factory_make ("fakesrc", NULL);
591 fail_unless (src != NULL);
592 g_object_set (G_OBJECT (src), "num-buffers", 5, "sizetype", 2, "filltype", 2,
593 "can-activate-pull", FALSE, NULL);
595 filter = gst_element_factory_make ("capsfilter", NULL);
596 fail_unless (filter != NULL);
597 caps = gst_caps_from_string ("video/x-h264");
598 g_object_set (G_OBJECT (filter), "caps", caps, NULL);
599 gst_caps_unref (caps);
601 dec = gst_element_factory_make ("decodebin2", NULL);
602 fail_unless (dec != NULL);
604 g_signal_connect (dec, "pad-added",
605 G_CALLBACK (parser_negotiation_pad_added_cb), pipe);
607 gst_bin_add_many (GST_BIN (pipe), src, filter, dec, NULL);
608 gst_element_link_many (src, filter, dec, NULL);
610 sret = gst_element_set_state (pipe, GST_STATE_PLAYING);
611 fail_unless_equals_int (sret, GST_STATE_CHANGE_ASYNC);
613 /* wait for EOS or error */
614 msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipe),
615 GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
616 fail_unless (msg != NULL);
617 fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
618 gst_message_unref (msg);
620 gst_element_set_state (pipe, GST_STATE_NULL);
621 gst_object_unref (pipe);
627 decodebin2_suite (void)
629 Suite *s = suite_create ("decodebin2");
630 TCase *tc_chain = tcase_create ("general");
632 suite_add_tcase (s, tc_chain);
633 tcase_add_test (tc_chain, test_text_plain_streams);
634 tcase_add_test (tc_chain, test_reuse_without_decoders);
635 tcase_add_test (tc_chain, test_mp3_parser_loop);
636 tcase_add_test (tc_chain, test_parser_negotiation);
641 GST_CHECK_MAIN (decodebin2);