deinterleave.c 16.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/* GStreamer unit tests for the interleave element
 * Copyright (C) 2008 Sebastian Dröge <slomo@circular-chaos.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

24
#include <stdio.h>
25
#include <gst/check/gstcheck.h>
26
#include <gst/audio/audio.h>
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

GST_START_TEST (test_create_and_unref)
{
  GstElement *deinterleave;

  deinterleave = gst_element_factory_make ("deinterleave", NULL);
  fail_unless (deinterleave != NULL);

  gst_element_set_state (deinterleave, GST_STATE_NULL);
  gst_object_unref (deinterleave);
}

GST_END_TEST;

static GstPad *mysrcpad, **mysinkpads;
static gint nsinkpads;
static GstBus *bus;
static GstElement *deinterleave;

static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
    GST_PAD_SINK,
    GST_PAD_ALWAYS,
Wim Taymans's avatar
Wim Taymans committed
49 50 51
    GST_STATIC_CAPS ("audio/x-raw, "
        "format = (string) " GST_AUDIO_NE (F32) ", "
        "channels = (int) 1, " "rate = (int) {32000, 48000}"));
52 53 54 55

static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
    GST_PAD_SRC,
    GST_PAD_ALWAYS,
Wim Taymans's avatar
Wim Taymans committed
56 57 58
    GST_STATIC_CAPS ("audio/x-raw, "
        "format = (string) " GST_AUDIO_NE (F32) ", "
        "channels = (int) { 2, 3 }, " "rate = (int) {32000, 48000}"));
59 60

#define CAPS_32khz \
Wim Taymans's avatar
Wim Taymans committed
61 62
        "audio/x-raw, " \
        "format = (string) "GST_AUDIO_NE (F32) ", " \
63
        "channels = (int) 2, " \
Wim Taymans's avatar
Wim Taymans committed
64
        "rate = (int) 32000"
65 66

#define CAPS_48khz \
Wim Taymans's avatar
Wim Taymans committed
67 68
        "audio/x-raw, " \
        "format = (string) "GST_AUDIO_NE (F32) ", " \
69
        "channels = (int) 2, " \
Wim Taymans's avatar
Wim Taymans committed
70
        "rate = (int) 48000"
71 72

#define CAPS_48khz_3CH \
Wim Taymans's avatar
Wim Taymans committed
73 74
        "audio/x-raw, " \
        "format = (string) "GST_AUDIO_NE (F32) ", " \
75
        "channels = (int) 3, " \
Wim Taymans's avatar
Wim Taymans committed
76
        "rate = (int) 48000"
77 78

static GstFlowReturn
Wim Taymans's avatar
Wim Taymans committed
79
deinterleave_chain_func (GstPad * pad, GstObject * parent, GstBuffer * buffer)
80 81
{
  gint i;
82
  GstMapInfo map;
83 84 85
  gfloat *indata;

  fail_unless (GST_IS_BUFFER (buffer));
86 87 88
  gst_buffer_map (buffer, &map, GST_MAP_READ);
  indata = (gfloat *) map.data;
  fail_unless_equals_int (map.size, 48000 * sizeof (gfloat));
Wim Taymans's avatar
Wim Taymans committed
89
  fail_unless (indata != NULL);
90 91 92 93 94 95 96 97 98 99

  if (strcmp (GST_PAD_NAME (pad), "sink0") == 0) {
    for (i = 0; i < 48000; i++)
      fail_unless_equals_float (indata[i], -1.0);
  } else if (strcmp (GST_PAD_NAME (pad), "sink1") == 0) {
    for (i = 0; i < 48000; i++)
      fail_unless_equals_float (indata[i], 1.0);
  } else {
    g_assert_not_reached ();
  }
100
  gst_buffer_unmap (buffer, &map);
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
  gst_buffer_unref (buffer);

  return GST_FLOW_OK;
}

static void
deinterleave_pad_added (GstElement * src, GstPad * pad, gpointer data)
{
  gchar *name;
  gint link = GPOINTER_TO_INT (data);

  if (nsinkpads >= link)
    return;

  name = g_strdup_printf ("sink%d", nsinkpads);

  mysinkpads[nsinkpads] =
      gst_pad_new_from_static_template (&sinktemplate, name);
  g_free (name);
  fail_if (mysinkpads[nsinkpads] == NULL);

  gst_pad_set_chain_function (mysinkpads[nsinkpads], deinterleave_chain_func);
  fail_unless (gst_pad_link (pad, mysinkpads[nsinkpads]) == GST_PAD_LINK_OK);
  gst_pad_set_active (mysinkpads[nsinkpads], TRUE);
  nsinkpads++;
}

GST_START_TEST (test_2_channels)
{
  GstPad *sinkpad;
  gint i;
  GstBuffer *inbuf;
  GstCaps *caps;
  gfloat *indata;
135
  GstMapInfo map;
136 137 138 139 140 141 142 143 144 145 146 147 148 149

  mysinkpads = g_new0 (GstPad *, 2);
  nsinkpads = 0;

  deinterleave = gst_element_factory_make ("deinterleave", NULL);
  fail_unless (deinterleave != NULL);

  mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src");
  fail_unless (mysrcpad != NULL);

  caps = gst_caps_from_string (CAPS_48khz);
  fail_unless (gst_pad_set_caps (mysrcpad, caps));
  gst_pad_use_fixed_caps (mysrcpad);

Wim Taymans's avatar
Wim Taymans committed
150
  sinkpad = gst_element_get_static_pad (deinterleave, "sink");
151 152 153 154 155 156 157 158 159 160 161 162 163 164
  fail_unless (sinkpad != NULL);
  fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK);
  g_object_unref (sinkpad);

  g_signal_connect (deinterleave, "pad-added",
      G_CALLBACK (deinterleave_pad_added), GINT_TO_POINTER (2));

  bus = gst_bus_new ();
  gst_element_set_bus (deinterleave, bus);

  fail_unless (gst_element_set_state (deinterleave,
          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS);

  inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat));
165 166
  gst_buffer_map (inbuf, &map, GST_MAP_WRITE);
  indata = (gfloat *) map.data;
167 168 169 170
  for (i = 0; i < 2 * 48000; i += 2) {
    indata[i] = -1.0;
    indata[i + 1] = 1.0;
  }
171
  gst_buffer_unmap (inbuf, &map);
Wim Taymans's avatar
Wim Taymans committed
172
  gst_pad_set_caps (mysrcpad, caps);
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197

  fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK);

  fail_unless (gst_element_set_state (deinterleave,
          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);

  for (i = 0; i < nsinkpads; i++)
    g_object_unref (mysinkpads[i]);
  g_free (mysinkpads);
  mysinkpads = NULL;

  g_object_unref (deinterleave);
  g_object_unref (bus);
  gst_caps_unref (caps);
}

GST_END_TEST;

GST_START_TEST (test_2_channels_1_linked)
{
  GstPad *sinkpad;
  gint i;
  GstBuffer *inbuf;
  GstCaps *caps;
  gfloat *indata;
198
  GstMapInfo map;
199 200 201 202 203 204 205 206 207 208 209 210 211 212

  nsinkpads = 0;
  mysinkpads = g_new0 (GstPad *, 2);

  deinterleave = gst_element_factory_make ("deinterleave", NULL);
  fail_unless (deinterleave != NULL);

  mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src");
  fail_unless (mysrcpad != NULL);

  caps = gst_caps_from_string (CAPS_48khz);
  fail_unless (gst_pad_set_caps (mysrcpad, caps));
  gst_pad_use_fixed_caps (mysrcpad);

Wim Taymans's avatar
Wim Taymans committed
213
  sinkpad = gst_element_get_static_pad (deinterleave, "sink");
214 215 216 217 218 219 220 221 222 223 224 225 226 227
  fail_unless (sinkpad != NULL);
  fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK);
  g_object_unref (sinkpad);

  g_signal_connect (deinterleave, "pad-added",
      G_CALLBACK (deinterleave_pad_added), GINT_TO_POINTER (1));

  bus = gst_bus_new ();
  gst_element_set_bus (deinterleave, bus);

  fail_unless (gst_element_set_state (deinterleave,
          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS);

  inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat));
228 229
  gst_buffer_map (inbuf, &map, GST_MAP_WRITE);
  indata = (gfloat *) map.data;
230 231 232 233
  for (i = 0; i < 2 * 48000; i += 2) {
    indata[i] = -1.0;
    indata[i + 1] = 1.0;
  }
234
  gst_buffer_unmap (inbuf, &map);
Wim Taymans's avatar
Wim Taymans committed
235
  gst_pad_set_caps (mysrcpad, caps);
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260

  fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK);

  fail_unless (gst_element_set_state (deinterleave,
          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);

  for (i = 0; i < nsinkpads; i++)
    g_object_unref (mysinkpads[i]);
  g_free (mysinkpads);
  mysinkpads = NULL;

  g_object_unref (deinterleave);
  g_object_unref (bus);
  gst_caps_unref (caps);
}

GST_END_TEST;

GST_START_TEST (test_2_channels_caps_change)
{
  GstPad *sinkpad;
  GstCaps *caps, *caps2;
  gint i;
  GstBuffer *inbuf;
  gfloat *indata;
261
  GstMapInfo map;
262 263 264 265 266 267 268 269 270 271 272 273 274 275

  nsinkpads = 0;
  mysinkpads = g_new0 (GstPad *, 2);

  deinterleave = gst_element_factory_make ("deinterleave", NULL);
  fail_unless (deinterleave != NULL);

  mysrcpad = gst_pad_new_from_static_template (&srctemplate, "src");
  fail_unless (mysrcpad != NULL);

  caps = gst_caps_from_string (CAPS_48khz);
  fail_unless (gst_pad_set_caps (mysrcpad, caps));
  gst_pad_use_fixed_caps (mysrcpad);

Wim Taymans's avatar
Wim Taymans committed
276
  sinkpad = gst_element_get_static_pad (deinterleave, "sink");
277 278 279 280 281 282 283 284 285 286 287 288 289 290
  fail_unless (sinkpad != NULL);
  fail_unless (gst_pad_link (mysrcpad, sinkpad) == GST_PAD_LINK_OK);
  g_object_unref (sinkpad);

  g_signal_connect (deinterleave, "pad-added",
      G_CALLBACK (deinterleave_pad_added), GINT_TO_POINTER (2));

  bus = gst_bus_new ();
  gst_element_set_bus (deinterleave, bus);

  fail_unless (gst_element_set_state (deinterleave,
          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS);

  inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat));
291 292
  gst_buffer_map (inbuf, &map, GST_MAP_WRITE);
  indata = (gfloat *) map.data;
293 294 295 296
  for (i = 0; i < 2 * 48000; i += 2) {
    indata[i] = -1.0;
    indata[i + 1] = 1.0;
  }
297
  gst_buffer_unmap (inbuf, &map);
Wim Taymans's avatar
Wim Taymans committed
298
  gst_pad_set_caps (mysrcpad, caps);
299 300 301 302 303 304 305

  fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK);

  caps2 = gst_caps_from_string (CAPS_32khz);
  gst_pad_set_caps (mysrcpad, caps2);

  inbuf = gst_buffer_new_and_alloc (2 * 48000 * sizeof (gfloat));
306 307
  gst_buffer_map (inbuf, &map, GST_MAP_WRITE);
  indata = (gfloat *) map.data;
308 309 310 311
  for (i = 0; i < 2 * 48000; i += 2) {
    indata[i] = -1.0;
    indata[i + 1] = 1.0;
  }
312
  gst_buffer_unmap (inbuf, &map);
Wim Taymans's avatar
Wim Taymans committed
313
  gst_pad_set_caps (mysrcpad, caps2);
314 315 316 317 318 319 320 321 322 323

  /* Should work fine because the caps changed in a compatible way */
  fail_unless (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK);

  gst_caps_unref (caps2);

  caps2 = gst_caps_from_string (CAPS_48khz_3CH);
  gst_pad_set_caps (mysrcpad, caps2);

  inbuf = gst_buffer_new_and_alloc (3 * 48000 * sizeof (gfloat));
324 325
  gst_buffer_map (inbuf, &map, GST_MAP_WRITE);
  indata = (gfloat *) map.data;
326 327 328 329 330
  for (i = 0; i < 3 * 48000; i += 3) {
    indata[i] = -1.0;
    indata[i + 1] = 1.0;
    indata[i + 2] = 0.0;
  }
331
  gst_buffer_unmap (inbuf, &map);
Wim Taymans's avatar
Wim Taymans committed
332
  gst_pad_set_caps (mysrcpad, caps2);
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353

  /* Should break because the caps changed in an incompatible way */
  fail_if (gst_pad_push (mysrcpad, inbuf) == GST_FLOW_OK);

  fail_unless (gst_element_set_state (deinterleave,
          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);

  for (i = 0; i < nsinkpads; i++)
    g_object_unref (mysinkpads[i]);
  g_free (mysinkpads);
  mysinkpads = NULL;

  g_object_unref (deinterleave);
  g_object_unref (bus);
  gst_caps_unref (caps);
  gst_caps_unref (caps2);
}

GST_END_TEST;


354 355 356 357 358 359 360 361 362 363
#define SAMPLES_PER_BUFFER  10
#define NUM_CHANNELS        8
#define SAMPLE_RATE         44100

static guint pads_created;

static void
set_channel_positions (GstCaps * caps, int channels,
    GstAudioChannelPosition * channelpositions)
{
364
#if 0
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
  GValue chanpos = { 0 };
  GValue pos = { 0 };
  GstStructure *structure = gst_caps_get_structure (caps, 0);
  int c;

  g_value_init (&chanpos, GST_TYPE_ARRAY);
  g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION);

  for (c = 0; c < channels; c++) {
    g_value_set_enum (&pos, channelpositions[c]);
    gst_value_array_append_value (&chanpos, &pos);
  }
  g_value_unset (&pos);

  gst_structure_set_value (structure, "channel-positions", &chanpos);
  g_value_unset (&chanpos);
381
#endif
382 383 384 385 386 387 388 389
}

static void
src_handoff_float32_8ch (GstElement * src, GstBuffer * buf, GstPad * pad,
    gpointer user_data)
{
  GstAudioChannelPosition layout[NUM_CHANNELS];
  GstCaps *caps;
Wim Taymans's avatar
Wim Taymans committed
390
  gfloat *data, *p;
391 392
  guint size, i, c;

Wim Taymans's avatar
Wim Taymans committed
393 394
  caps = gst_caps_new_simple ("audio/x-raw",
      "format", G_TYPE_STRING, GST_AUDIO_NE (F32),
395
      "channels", G_TYPE_INT, NUM_CHANNELS,
Wim Taymans's avatar
Wim Taymans committed
396
      "rate", G_TYPE_INT, SAMPLE_RATE, NULL);
397 398 399 400 401 402 403

  for (i = 0; i < NUM_CHANNELS; ++i)
    layout[i] = GST_AUDIO_CHANNEL_POSITION_NONE;

  set_channel_positions (caps, NUM_CHANNELS, layout);

  size = sizeof (gfloat) * SAMPLES_PER_BUFFER * NUM_CHANNELS;
Wim Taymans's avatar
Wim Taymans committed
404
  data = p = (gfloat *) g_malloc (size);
405

406 407
  for (i = 0; i < SAMPLES_PER_BUFFER; ++i) {
    for (c = 0; c < NUM_CHANNELS; ++c) {
Wim Taymans's avatar
Wim Taymans committed
408 409
      *p = (gfloat) ((i * NUM_CHANNELS) + c);
      ++p;
410 411
    }
  }
Wim Taymans's avatar
Wim Taymans committed
412 413 414 415 416 417 418
  gst_buffer_take_memory (buf, -1, gst_memory_new_wrapped (0, data, g_free,
          size, 0, size));

  GST_BUFFER_OFFSET (buf) = 0;
  GST_BUFFER_TIMESTAMP (buf) = 0;

  /* FIXME, caps */
419 420
}

Wim Taymans's avatar
Wim Taymans committed
421 422 423
static GstPadProbeReturn
float_buffer_check_probe (GstPad * pad, GstPadProbeInfo * info,
    gpointer userdata)
424
{
425
  GstMapInfo map;
426 427 428
  gfloat *data;
  guint padnum, numpads;
  guint num, i;
429 430
  GstCaps *caps;
  GstStructure *s;
431
#if 0
432
  GstAudioChannelPosition *pos;
433
#endif
434
  gint channels;
Wim Taymans's avatar
Wim Taymans committed
435
  GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info);
436 437 438 439 440

  fail_unless_equals_int (sscanf (GST_PAD_NAME (pad), "src%u", &padnum), 1);

  numpads = pads_created;

441
  /* Check caps */
Wim Taymans's avatar
Wim Taymans committed
442
  caps = gst_pad_get_current_caps (pad);
443 444 445 446 447
  fail_unless (caps != NULL);
  s = gst_caps_get_structure (caps, 0);
  fail_unless (gst_structure_get_int (s, "channels", &channels));
  fail_unless_equals_int (channels, 1);
  fail_unless (gst_structure_has_field (s, "channel-positions"));
448
#if 0
449 450 451
  pos = gst_audio_get_channel_positions (s);
  fail_unless (pos != NULL && pos[0] == GST_AUDIO_CHANNEL_POSITION_NONE);
  g_free (pos);
452
#endif
Wim Taymans's avatar
Wim Taymans committed
453
  gst_caps_unref (caps);
454

455 456 457
  gst_buffer_map (buffer, &map, GST_MAP_READ);
  data = (gfloat *) map.data;
  num = map.size / sizeof (gfloat);
458

459
  /* Check buffer content */
460 461 462 463 464 465 466 467 468 469 470 471
  for (i = 0; i < num; ++i) {
    guint val, rest;

    val = (guint) data[i];
    GST_LOG ("%s[%u]: %8f", GST_PAD_NAME (pad), i, data[i]);
    /* can't use the modulo operator in the assertion statement, since due to
     * the way it gets expanded it would be interpreted as a printf operator
     * in the failure case, which will result in segfaults */
    rest = val % numpads;
    /* check that the first channel is on pad src0, the second on src1 etc. */
    fail_unless_equals_int (rest, padnum);
  }
472
  gst_buffer_unmap (buffer, &map);
473

Wim Taymans's avatar
Wim Taymans committed
474
  return GST_PAD_PROBE_OK;      /* don't drop data */
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492
}

static void
pad_added_setup_data_check_float32_8ch_cb (GstElement * deinterleave,
    GstPad * pad, GstElement * pipeline)
{
  GstElement *queue, *sink;
  GstPad *sinkpad;

  queue = gst_element_factory_make ("queue", NULL);
  fail_unless (queue != NULL);

  sink = gst_element_factory_make ("fakesink", NULL);
  fail_unless (sink != NULL);

  gst_bin_add_many (GST_BIN (pipeline), queue, sink, NULL);
  fail_unless (gst_element_link_many (queue, sink, NULL));

Wim Taymans's avatar
Wim Taymans committed
493
  sinkpad = gst_element_get_static_pad (queue, "sink");
494 495 496
  fail_unless_equals_int (gst_pad_link (pad, sinkpad), GST_PAD_LINK_OK);
  gst_object_unref (sinkpad);

Wim Taymans's avatar
Wim Taymans committed
497 498
  gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, float_buffer_check_probe,
      NULL, NULL);
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534

  gst_element_set_state (sink, GST_STATE_PLAYING);
  gst_element_set_state (queue, GST_STATE_PLAYING);

  GST_LOG ("new pad: %s", GST_PAD_NAME (pad));
  ++pads_created;
}

static GstElement *
make_fake_src_8chans_float32 (void)
{
  GstElement *src;

  src = gst_element_factory_make ("fakesrc", "src");
  fail_unless (src != NULL, "failed to create fakesrc element");

  g_object_set (src, "num-buffers", 1, NULL);
  g_object_set (src, "signal-handoffs", TRUE, NULL);

  g_signal_connect (src, "handoff", G_CALLBACK (src_handoff_float32_8ch), NULL);

  return src;
}

GST_START_TEST (test_8_channels_float32)
{
  GstElement *pipeline, *src, *deinterleave;
  GstMessage *msg;

  pipeline = (GstElement *) gst_pipeline_new ("pipeline");
  fail_unless (pipeline != NULL, "failed to create pipeline");

  src = make_fake_src_8chans_float32 ();

  deinterleave = gst_element_factory_make ("deinterleave", "deinterleave");
  fail_unless (deinterleave != NULL, "failed to create deinterleave element");
535
  g_object_set (deinterleave, "keep-positions", TRUE, NULL);
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559

  gst_bin_add_many (GST_BIN (pipeline), src, deinterleave, NULL);

  fail_unless (gst_element_link (src, deinterleave),
      "failed to link src <=> deinterleave");

  g_signal_connect (deinterleave, "pad-added",
      G_CALLBACK (pad_added_setup_data_check_float32_8ch_cb), pipeline);

  pads_created = 0;

  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_EOS, -1);
  gst_message_unref (msg);

  fail_unless_equals_int (pads_created, NUM_CHANNELS);

  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
}

GST_END_TEST;

560 561 562 563 564 565 566
static Suite *
deinterleave_suite (void)
{
  Suite *s = suite_create ("deinterleave");
  TCase *tc_chain = tcase_create ("general");

  suite_add_tcase (s, tc_chain);
567
  tcase_set_timeout (tc_chain, 180);
568 569 570 571
  tcase_add_test (tc_chain, test_create_and_unref);
  tcase_add_test (tc_chain, test_2_channels);
  tcase_add_test (tc_chain, test_2_channels_1_linked);
  tcase_add_test (tc_chain, test_2_channels_caps_change);
572
  tcase_add_test (tc_chain, test_8_channels_float32);
573 574 575 576 577

  return s;
}

GST_CHECK_MAIN (deinterleave);