Blame tests/check/libs/audio.c

Packit 0652a1
/* GStreamer
Packit 0652a1
 *
Packit 0652a1
 * unit tests for audio support library
Packit 0652a1
 *
Packit 0652a1
 * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
Packit 0652a1
 * Copyright (C) 2011 Sebastian Dröge <sebastian.droege@collabora.co.uk>
Packit 0652a1
 *
Packit 0652a1
 * This library is free software; you can redistribute it and/or
Packit 0652a1
 * modify it under the terms of the GNU Library General Public
Packit 0652a1
 * License as published by the Free Software Foundation; either
Packit 0652a1
 * version 2 of the License, or (at your option) any later version.
Packit 0652a1
 *
Packit 0652a1
 * This library is distributed in the hope that it will be useful,
Packit 0652a1
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 0652a1
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 0652a1
 * Library General Public License for more details.
Packit 0652a1
 *
Packit 0652a1
 * You should have received a copy of the GNU Library General Public
Packit 0652a1
 * License along with this library; if not, write to the
Packit 0652a1
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 0652a1
 * Boston, MA 02110-1301, USA.
Packit 0652a1
 */
Packit 0652a1
Packit 0652a1
#ifdef HAVE_CONFIG_H
Packit 0652a1
#include "config.h"
Packit 0652a1
#endif
Packit 0652a1
Packit 0652a1
#include <gst/check/gstcheck.h>
Packit 0652a1
Packit 0652a1
#include <gst/audio/audio.h>
Packit 0652a1
#include <string.h>
Packit 0652a1
Packit 0652a1
static GstBuffer *
Packit 0652a1
make_buffer (guint8 ** _data)
Packit 0652a1
{
Packit 0652a1
  GstBuffer *buf = gst_buffer_new ();
Packit 0652a1
  guint8 *data = (guint8 *) g_malloc (1000);
Packit 0652a1
Packit 0652a1
  gst_buffer_append_memory (buf,
Packit 0652a1
      gst_memory_new_wrapped (0, data, 1000, 0, 1000, data, g_free));
Packit 0652a1
  if (_data)
Packit 0652a1
    *_data = data;
Packit 0652a1
  return buf;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
static void
Packit 0652a1
setup_segment (GstSegment * s, GstFormat fmt, guint64 start, guint64 stop,
Packit 0652a1
    guint64 stream_time)
Packit 0652a1
{
Packit 0652a1
  gst_segment_init (s, fmt);
Packit 0652a1
  s->start = start;
Packit 0652a1
  s->stop = stop;
Packit 0652a1
  s->time = stream_time;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_unsupported_format)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* If the format is not TIME or DEFAULT it should assert()
Packit 0652a1
   * FIXME: check if return value is the same as the input buffer.
Packit 0652a1
   *        probably can't be done because the assert() does a SIGABRT.
Packit 0652a1
   */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_PERCENT, 0, 10, 0);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 0 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 0;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
Packit 0652a1
Packit 0652a1
  ASSERT_CRITICAL (gst_audio_buffer_clip (buf, &s, 100, 1));
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (buf);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_start_and_stop)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip start and end */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 4 * GST_SECOND, 8 * GST_SECOND,
Packit 0652a1
      4 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 800);
Packit 0652a1
  gst_buffer_map (ret, &map, GST_MAP_READ);
Packit 0652a1
  fail_unless (map.data == data + 200);
Packit 0652a1
  fail_unless (map.size == 400);
Packit 0652a1
  gst_buffer_unmap (ret, &map);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_start_and_stop_planar)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstAudioInfo info;
Packit 0652a1
  GstAudioBuffer abuf;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip start and end */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
Packit 0652a1
  gst_audio_info_init (&info;;
Packit 0652a1
  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S8, 44100, 1, NULL);
Packit 0652a1
  info.layout = GST_AUDIO_LAYOUT_NON_INTERLEAVED;
Packit 0652a1
  gst_buffer_add_audio_meta (buf, &info, 1000, NULL);
Packit 0652a1
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 4 * GST_SECOND, 8 * GST_SECOND,
Packit 0652a1
      4 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 800);
Packit 0652a1
  gst_audio_buffer_map (&abuf, &info, ret, GST_MAP_READ);
Packit 0652a1
  fail_unless_equals_int (abuf.n_planes, 1);
Packit 0652a1
  fail_unless_equals_int (GST_AUDIO_BUFFER_PLANE_SIZE (&abuf), 400);
Packit 0652a1
  fail_unless_equals_pointer (abuf.planes[0], data + 200);
Packit 0652a1
  gst_audio_buffer_unmap (&abuf);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_start)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip only start */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 4 * GST_SECOND, 12 * GST_SECOND,
Packit 0652a1
      4 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1200);
Packit 0652a1
  gst_buffer_map (ret, &map, GST_MAP_READ);
Packit 0652a1
  fail_unless (map.data == data + 200);
Packit 0652a1
  fail_unless (map.size == 800);
Packit 0652a1
  gst_buffer_unmap (ret, &map);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_start_planar)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstAudioInfo info;
Packit 0652a1
  GstAudioMeta *meta;
Packit 0652a1
  GstAudioBuffer abuf;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip only start */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
Packit 0652a1
  gst_audio_info_init (&info;;
Packit 0652a1
  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S8, 44100, 2, NULL);
Packit 0652a1
  info.layout = GST_AUDIO_LAYOUT_NON_INTERLEAVED;
Packit 0652a1
  gst_buffer_add_audio_meta (buf, &info, 500, NULL);
Packit 0652a1
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 4 * GST_SECOND, 12 * GST_SECOND,
Packit 0652a1
      4 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 5 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 700;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 2);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 3 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 700);
Packit 0652a1
Packit 0652a1
  meta = gst_buffer_get_audio_meta (ret);
Packit 0652a1
  fail_unless (meta);
Packit 0652a1
  fail_unless_equals_int (meta->info.channels, 2);
Packit 0652a1
  fail_unless_equals_int (meta->samples, 300);
Packit 0652a1
Packit 0652a1
  gst_audio_buffer_map (&abuf, &info, ret, GST_MAP_READ);
Packit 0652a1
  fail_unless_equals_int (abuf.n_planes, 2);
Packit 0652a1
  fail_unless_equals_int (GST_AUDIO_BUFFER_PLANE_SIZE (&abuf), 300);
Packit 0652a1
  fail_unless_equals_pointer (abuf.planes[0], data + 200);
Packit 0652a1
  fail_unless_equals_pointer (abuf.planes[1], data + 700);
Packit 0652a1
  gst_audio_buffer_unmap (&abuf);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_stop)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip only stop */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 2 * GST_SECOND, 10 * GST_SECOND,
Packit 0652a1
      2 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 2 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 200);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1000);
Packit 0652a1
  gst_buffer_map (ret, &map, GST_MAP_READ);
Packit 0652a1
  fail_unless (map.data == data);
Packit 0652a1
  fail_unless (map.size == 800);
Packit 0652a1
  gst_buffer_unmap (ret, &map);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_stop_planar)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstAudioInfo info;
Packit 0652a1
  GstAudioMeta *meta;
Packit 0652a1
  GstAudioBuffer abuf;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip only stop */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
Packit 0652a1
  gst_audio_info_init (&info;;
Packit 0652a1
  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S8, 44100, 2, NULL);
Packit 0652a1
  info.layout = GST_AUDIO_LAYOUT_NON_INTERLEAVED;
Packit 0652a1
  gst_buffer_add_audio_meta (buf, &info, 500, NULL);
Packit 0652a1
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 2 * GST_SECOND, 6 * GST_SECOND,
Packit 0652a1
      2 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 5 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 700;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 2);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 2 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 200);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 600);
Packit 0652a1
Packit 0652a1
  meta = gst_buffer_get_audio_meta (ret);
Packit 0652a1
  fail_unless (meta);
Packit 0652a1
  fail_unless_equals_int (meta->info.channels, 2);
Packit 0652a1
  fail_unless_equals_int (meta->samples, 400);
Packit 0652a1
Packit 0652a1
  gst_audio_buffer_map (&abuf, &info, ret, GST_MAP_READ);
Packit 0652a1
  fail_unless_equals_int (abuf.n_planes, 2);
Packit 0652a1
  fail_unless_equals_int (GST_AUDIO_BUFFER_PLANE_SIZE (&abuf), 400);
Packit 0652a1
  fail_unless_equals_pointer (abuf.planes[0], data);
Packit 0652a1
  fail_unless_equals_pointer (abuf.planes[1], data + 500);
Packit 0652a1
  gst_audio_buffer_unmap (&abuf);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_outside)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
Packit 0652a1
  /* Buffer outside segment */
Packit 0652a1
  buf = make_buffer (NULL);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 12 * GST_SECOND, 20 * GST_SECOND,
Packit 0652a1
      12 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret == NULL);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_start_and_stop_no_meta)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip start and end but don't touch duration, offset and offset_end */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 4 * GST_SECOND, 8 * GST_SECOND,
Packit 0652a1
      4 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), GST_CLOCK_TIME_NONE);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), GST_BUFFER_OFFSET_NONE);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret),
Packit 0652a1
      GST_BUFFER_OFFSET_NONE);
Packit 0652a1
  gst_buffer_map (ret, &map, GST_MAP_READ);
Packit 0652a1
  fail_unless (map.data == data + 200);
Packit 0652a1
  fail_unless (map.size == 400);
Packit 0652a1
  gst_buffer_unmap (ret, &map);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_no_timestamp)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
Packit 0652a1
  /* If the buffer has no timestamp it should assert()
Packit 0652a1
   * FIXME: check if return value is the same as the input buffer.
Packit 0652a1
   *        probably can't be done because the assert() does a SIGABRT.
Packit 0652a1
   */
Packit 0652a1
  buf = make_buffer (NULL);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 0 * GST_SECOND, 10 * GST_SECOND,
Packit 0652a1
      0 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret == buf);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (buf);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_time_handles_rounding)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  guint8 *data;
Packit 0652a1
  GstClockTime time_per_sample = GST_SECOND / 100;
Packit 0652a1
Packit 0652a1
  /* Clip only stop */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_TIME, 2 * GST_SECOND, 10 * GST_SECOND,
Packit 0652a1
      2 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  /* the max duration that still converts back to the same size of samples */
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND + (time_per_sample - 1);
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 2 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 200);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1000);
Packit 0652a1
  gst_buffer_map (ret, &map, GST_MAP_READ);
Packit 0652a1
  fail_unless (map.data == data);
Packit 0652a1
  fail_unless (map.size == 800);
Packit 0652a1
  gst_buffer_unmap (ret, &map);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_samples_start_and_stop)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip start and end */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_DEFAULT, 400, 800, 400);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 800);
Packit 0652a1
  gst_buffer_map (ret, &map, GST_MAP_READ);
Packit 0652a1
  fail_unless (map.data == data + 200);
Packit 0652a1
  fail_unless (map.size == 400);
Packit 0652a1
  gst_buffer_unmap (ret, &map);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_samples_start_and_stop_planar)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstAudioInfo info;
Packit 0652a1
  GstAudioMeta *meta;
Packit 0652a1
  GstAudioBuffer abuf;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip start and end */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
Packit 0652a1
  gst_audio_info_init (&info;;
Packit 0652a1
  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S8, 44100, 2, NULL);
Packit 0652a1
  info.layout = GST_AUDIO_LAYOUT_NON_INTERLEAVED;
Packit 0652a1
  gst_buffer_add_audio_meta (buf, &info, 500, NULL);
Packit 0652a1
Packit 0652a1
Packit 0652a1
  setup_segment (&s, GST_FORMAT_DEFAULT, 400, 600, 400);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 5 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 700;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 2);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 2 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 600);
Packit 0652a1
Packit 0652a1
  meta = gst_buffer_get_audio_meta (ret);
Packit 0652a1
  fail_unless (meta);
Packit 0652a1
  fail_unless_equals_int (meta->info.channels, 2);
Packit 0652a1
  fail_unless_equals_int (meta->samples, 200);
Packit 0652a1
Packit 0652a1
  gst_audio_buffer_map (&abuf, &info, ret, GST_MAP_READ);
Packit 0652a1
  fail_unless_equals_int (abuf.n_planes, 2);
Packit 0652a1
  fail_unless_equals_int (GST_AUDIO_BUFFER_PLANE_SIZE (&abuf), 200);
Packit 0652a1
  fail_unless_equals_pointer (abuf.planes[0], data + 200);
Packit 0652a1
  fail_unless_equals_pointer (abuf.planes[1], data + 700);
Packit 0652a1
  gst_audio_buffer_unmap (&abuf);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_samples_start)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip only start */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_DEFAULT, 400, 1200, 400);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1200);
Packit 0652a1
  gst_buffer_map (ret, &map, GST_MAP_READ);
Packit 0652a1
  fail_unless (map.data == data + 200);
Packit 0652a1
  fail_unless (map.size == 800);
Packit 0652a1
  gst_buffer_unmap (ret, &map);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_samples_stop)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip only stop */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_DEFAULT, 200, 1000, 200);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 2 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 200);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1000);
Packit 0652a1
  gst_buffer_map (ret, &map, GST_MAP_READ);
Packit 0652a1
  fail_unless (map.data == data);
Packit 0652a1
  fail_unless (map.size == 800);
Packit 0652a1
  gst_buffer_unmap (ret, &map);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_samples_outside)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
Packit 0652a1
  /* Buffer outside segment */
Packit 0652a1
  buf = make_buffer (NULL);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_DEFAULT, 1200, 2000, 1200);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = 1200;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret == NULL);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_samples_start_and_stop_no_meta)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstBuffer *ret;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  guint8 *data;
Packit 0652a1
Packit 0652a1
  /* Clip start and end but don't touch duration and offset_end */
Packit 0652a1
  buf = make_buffer (&data);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_DEFAULT, 400, 800, 400);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = 200;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
Packit 0652a1
Packit 0652a1
  ret = gst_audio_buffer_clip (buf, &s, 100, 1);
Packit 0652a1
  fail_unless (ret != NULL);
Packit 0652a1
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), GST_CLOCK_TIME_NONE);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
Packit 0652a1
  fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret),
Packit 0652a1
      GST_BUFFER_OFFSET_NONE);
Packit 0652a1
  gst_buffer_map (ret, &map, GST_MAP_READ);
Packit 0652a1
  fail_unless (map.data == data + 200);
Packit 0652a1
  fail_unless (map.size == 400);
Packit 0652a1
  gst_buffer_unmap (ret, &map);
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (ret);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_buffer_clip_samples_no_timestamp)
Packit 0652a1
{
Packit 0652a1
  GstSegment s;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
Packit 0652a1
  /* If the buffer has no offset it should assert()
Packit 0652a1
   * FIXME: check if return value is the same as the input buffer.
Packit 0652a1
   *        probably can't be done because the assert() does a SIGABRT.
Packit 0652a1
   */
Packit 0652a1
  buf = make_buffer (NULL);
Packit 0652a1
  setup_segment (&s, GST_FORMAT_DEFAULT, 0, 10, 0);
Packit 0652a1
Packit 0652a1
  GST_BUFFER_TIMESTAMP (buf) = 0 * GST_SECOND;
Packit 0652a1
  GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
Packit 0652a1
  GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
Packit 0652a1
  GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
Packit 0652a1
Packit 0652a1
  ASSERT_CRITICAL (gst_audio_buffer_clip (buf, &s, 100, 1));
Packit 0652a1
Packit 0652a1
  gst_buffer_unref (buf);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_multichannel_checks)
Packit 0652a1
{
Packit 0652a1
  GstAudioChannelPosition pos_2_mixed[2] = {
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_MONO,
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_NONE
Packit 0652a1
  };
Packit 0652a1
  GstAudioChannelPosition pos_2_none[2] = {
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_NONE,
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_NONE
Packit 0652a1
  };
Packit 0652a1
  GstAudioChannelPosition pos_2_flr[2] = {
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
Packit 0652a1
  };
Packit 0652a1
  GstAudioChannelPosition pos_2_frl[2] = {
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT
Packit 0652a1
  };
Packit 0652a1
  GstAudioChannelPosition pos_2_frr[2] = {
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
Packit 0652a1
  };
Packit 0652a1
  GstAudioChannelPosition pos_3_flrc[3] = {
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER
Packit 0652a1
  };
Packit 0652a1
  GstAudioChannelPosition pos_3_frcl[3] = {
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
Packit 0652a1
    GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT
Packit 0652a1
  };
Packit 0652a1
  GstAudioInfo info, info2;
Packit 0652a1
  GstCaps *caps;
Packit 0652a1
Packit 0652a1
  gst_audio_info_init (&info;;
Packit 0652a1
  gst_audio_info_init (&info2);
Packit 0652a1
Packit 0652a1
  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000, 2, NULL);
Packit 0652a1
  fail_unless (memcmp (&info.position, pos_2_flr, sizeof (pos_2_flr)) == 0);
Packit 0652a1
Packit 0652a1
  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000, 2, pos_2_flr);
Packit 0652a1
  fail_unless (memcmp (&info.position, pos_2_flr, sizeof (pos_2_flr)) == 0);
Packit 0652a1
  caps = gst_audio_info_to_caps (&info;;
Packit 0652a1
  fail_unless (gst_audio_info_from_caps (&info2, caps));
Packit 0652a1
  fail_unless (memcmp (&info, &info2, sizeof (info)) == 0);
Packit 0652a1
  gst_caps_unref (caps);
Packit 0652a1
Packit 0652a1
  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000, 2, pos_2_none);
Packit 0652a1
  fail_unless (memcmp (&info.position, pos_2_none, sizeof (pos_2_none)) == 0);
Packit 0652a1
  caps = gst_audio_info_to_caps (&info;;
Packit 0652a1
  fail_unless (gst_audio_info_from_caps (&info2, caps));
Packit 0652a1
  fail_unless (memcmp (&info, &info2, sizeof (info)) == 0);
Packit 0652a1
  gst_caps_unref (caps);
Packit 0652a1
Packit 0652a1
  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000, 3, pos_3_flrc);
Packit 0652a1
  fail_unless (memcmp (&info.position, pos_3_flrc, sizeof (pos_3_flrc)) == 0);
Packit 0652a1
  caps = gst_audio_info_to_caps (&info;;
Packit 0652a1
  fail_unless (gst_audio_info_from_caps (&info2, caps));
Packit 0652a1
  fail_unless (memcmp (&info, &info2, sizeof (info)) == 0);
Packit 0652a1
  gst_caps_unref (caps);
Packit 0652a1
Packit 0652a1
  ASSERT_WARNING (gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000,
Packit 0652a1
          2, pos_2_frl));
Packit 0652a1
  ASSERT_WARNING (gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000,
Packit 0652a1
          2, pos_2_mixed));
Packit 0652a1
  ASSERT_WARNING (gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000,
Packit 0652a1
          2, pos_2_frr));
Packit 0652a1
  ASSERT_WARNING (gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000,
Packit 0652a1
          3, pos_3_frcl));
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
typedef struct
Packit 0652a1
{
Packit 0652a1
  gint channels;
Packit 0652a1
  GstAudioChannelPosition from[32], to[32];
Packit 0652a1
  gint32 in[32], out[32];
Packit 0652a1
  gint32 plane_offsets[32];
Packit 0652a1
  gboolean fail;
Packit 0652a1
} MultichannelReorderData;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_multichannel_reorder)
Packit 0652a1
{
Packit 0652a1
  MultichannelReorderData tests[] = {
Packit 0652a1
    {1,
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_MONO},
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_MONO},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {0},
Packit 0652a1
        FALSE},
Packit 0652a1
    {1,
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_MONO},
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {0},
Packit 0652a1
        TRUE},
Packit 0652a1
    {2,
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {0, 1},
Packit 0652a1
        FALSE},
Packit 0652a1
    {2,
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {1, 0, 3, 2},
Packit 0652a1
          {1, 0},
Packit 0652a1
        FALSE},
Packit 0652a1
    {4,
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_REAR_CENTER},
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_REAR_CENTER},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {1, 2, 0, 3},
Packit 0652a1
          {1, 2, 0, 3},
Packit 0652a1
        FALSE},
Packit 0652a1
    {4,
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_REAR_CENTER},
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {3, 0, 1, 2},
Packit 0652a1
          {3, 0, 1, 2},
Packit 0652a1
        FALSE},
Packit 0652a1
    {4,
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_REAR_CENTER},
Packit 0652a1
          {GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
Packit 0652a1
                GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
Packit 0652a1
              GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT},
Packit 0652a1
          {0, 1, 2, 3},
Packit 0652a1
          {3, 2, 1, 0},
Packit 0652a1
          {3, 2, 1, 0},
Packit 0652a1
        FALSE},
Packit 0652a1
  };
Packit 0652a1
  gint i, j;
Packit 0652a1
  GstBuffer *buf;
Packit 0652a1
  GstMapInfo map;
Packit 0652a1
  GstAudioInfo info;
Packit 0652a1
  GstAudioBuffer abuf;
Packit 0652a1
Packit 0652a1
  for (i = 0; i < G_N_ELEMENTS (tests); i++) {
Packit 0652a1
    buf =
Packit 0652a1
        gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, tests[i].in,
Packit 0652a1
        sizeof (tests[i].in), 0, sizeof (tests[i].in), NULL, NULL);
Packit 0652a1
Packit 0652a1
    if (tests[i].fail) {
Packit 0652a1
      fail_if (gst_audio_buffer_reorder_channels (buf, GST_AUDIO_FORMAT_S32,
Packit 0652a1
              tests[i].channels, tests[i].from, tests[i].to));
Packit 0652a1
    } else {
Packit 0652a1
      /* first interpret as interleaved */
Packit 0652a1
Packit 0652a1
      fail_unless (gst_audio_buffer_reorder_channels (buf, GST_AUDIO_FORMAT_S32,
Packit 0652a1
              tests[i].channels, tests[i].from, tests[i].to));
Packit 0652a1
Packit 0652a1
      gst_buffer_map (buf, &map, GST_MAP_READ);
Packit 0652a1
      fail_unless_equals_int (map.size, sizeof (tests[i].in));
Packit 0652a1
      fail_unless (memcmp (tests[i].out, map.data, map.size) == 0);
Packit 0652a1
      gst_buffer_unmap (buf, &map);
Packit 0652a1
Packit 0652a1
      /* now interpret as planar */
Packit 0652a1
Packit 0652a1
      gst_audio_info_init (&info;;
Packit 0652a1
      gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S32, 44100,
Packit 0652a1
          tests[i].channels, NULL);
Packit 0652a1
      info.layout = GST_AUDIO_LAYOUT_NON_INTERLEAVED;
Packit 0652a1
Packit 0652a1
      gst_buffer_add_audio_meta (buf, &info,
Packit 0652a1
          sizeof (tests[i].in) / (tests[i].channels * sizeof (gint32)), NULL);
Packit 0652a1
Packit 0652a1
      fail_unless (gst_audio_buffer_reorder_channels (buf, GST_AUDIO_FORMAT_S32,
Packit 0652a1
              tests[i].channels, tests[i].from, tests[i].to));
Packit 0652a1
Packit 0652a1
      fail_unless (gst_audio_buffer_map (&abuf, &info, buf, GST_MAP_READ));
Packit 0652a1
      fail_unless_equals_int (abuf.n_planes, tests[i].channels);
Packit 0652a1
      fail_unless_equals_int (GST_AUDIO_BUFFER_PLANE_SIZE (&abuf),
Packit 0652a1
          sizeof (tests[i].in) / tests[i].channels);
Packit 0652a1
      for (j = 0; j < abuf.n_planes; j++) {
Packit 0652a1
        fail_unless_equals_pointer (abuf.planes[j],
Packit 0652a1
            abuf.map_infos[0].data +
Packit 0652a1
            tests[i].plane_offsets[j] * GST_AUDIO_BUFFER_PLANE_SIZE (&abuf));
Packit 0652a1
      }
Packit 0652a1
      gst_audio_buffer_unmap (&abuf);
Packit 0652a1
    }
Packit 0652a1
    gst_buffer_unref (buf);
Packit 0652a1
  }
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_audio_format_s8)
Packit 0652a1
{
Packit 0652a1
  GstAudioFormat fmt;
Packit 0652a1
Packit 0652a1
  fmt = gst_audio_format_build_integer (TRUE, G_BYTE_ORDER, 8, 8);
Packit 0652a1
  fail_unless (fmt == GST_AUDIO_FORMAT_S8);
Packit 0652a1
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_audio_format_u8)
Packit 0652a1
{
Packit 0652a1
  GstAudioFormat fmt;
Packit 0652a1
  fmt = gst_audio_format_build_integer (FALSE, G_BYTE_ORDER, 8, 8);
Packit 0652a1
  fail_unless (fmt == GST_AUDIO_FORMAT_U8);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_fill_silence)
Packit 0652a1
{
Packit 0652a1
  GstAudioInfo info;
Packit 0652a1
  GstAudioFormat f;
Packit 0652a1
  gint i;
Packit 0652a1
  guint8 test_silence[32];
Packit 0652a1
Packit 0652a1
  for (f = GST_AUDIO_FORMAT_S8; f < GST_AUDIO_FORMAT_F64; f++) {
Packit 0652a1
    gst_audio_info_set_format (&info, f, 48000, 1, NULL);
Packit 0652a1
Packit 0652a1
    gst_audio_format_fill_silence (info.finfo, test_silence,
Packit 0652a1
        GST_AUDIO_INFO_BPF (&info) * 4);
Packit 0652a1
Packit 0652a1
    for (i = 0; i < 4; i++)
Packit 0652a1
      fail_unless (memcmp (test_silence + i * GST_AUDIO_INFO_BPF (&info),
Packit 0652a1
              info.finfo->silence, GST_AUDIO_INFO_BPF (&info)) == 0);
Packit 0652a1
  }
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_stream_align)
Packit 0652a1
{
Packit 0652a1
  GstAudioStreamAlign *align;
Packit 0652a1
  guint i;
Packit 0652a1
  GstClockTime timestamp;
Packit 0652a1
  GstClockTime out_timestamp, out_duration;
Packit 0652a1
  gboolean discont;
Packit 0652a1
Packit 0652a1
  align = gst_audio_stream_align_new (1000, 40 * GST_MSECOND, 1 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  for (i = 0; i < 500; i++) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 0;
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
    fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    if (i == 0)
Packit 0652a1
      fail_unless (discont);
Packit 0652a1
    else
Packit 0652a1
      fail_unless (!discont);
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Drift forwards by 1ms per 10ms buffer for the first 40 buffers.
Packit 0652a1
   * - after 40 buffers we're above alignment threshold
Packit 0652a1
   * - after 40 + 100 buffers we're at discont wait
Packit 0652a1
   */
Packit 0652a1
  for (i = 0; i < 500; i++) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 0;
Packit 0652a1
    if (i > 0)
Packit 0652a1
      timestamp += 1 * GST_MSECOND * MIN (i, 40);
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    if (i < 140) {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 0)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    } else {
Packit 0652a1
      if (i == 140)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp,
Packit 0652a1
          10 * GST_MSECOND * i + 40 * GST_MSECOND);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Drift backwards by 1ms per 10ms buffer for the first 40 buffers.
Packit 0652a1
   * - after 40 buffers we're above alignment threshold
Packit 0652a1
   * - after 40 + 100 buffers we're at discont wait
Packit 0652a1
   */
Packit 0652a1
  for (i = 0; i < 500; i++) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 0;
Packit 0652a1
    if (i > 0)
Packit 0652a1
      timestamp -= 1 * GST_MSECOND * MIN (i, 40);
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    if (i < 140) {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 0)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    } else {
Packit 0652a1
      if (i == 140)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp,
Packit 0652a1
          10 * GST_MSECOND * i - 40 * GST_MSECOND);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Shift all buffers but the first by 40ms
Packit 0652a1
   * - after 1 buffers we're above alignment threshold
Packit 0652a1
   * - after 101 buffers we're at discont wait
Packit 0652a1
   */
Packit 0652a1
  for (i = 0; i < 500; i++) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 0;
Packit 0652a1
    if (i > 0)
Packit 0652a1
      timestamp += 40 * GST_MSECOND;
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    if (i < 101) {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 0)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    } else {
Packit 0652a1
      if (i == 101)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp,
Packit 0652a1
          10 * GST_MSECOND * i + 40 * GST_MSECOND);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Shift every second buffer by 40ms:
Packit 0652a1
   * - never discont!
Packit 0652a1
   */
Packit 0652a1
  for (i = 0; i < 500; i++) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 0;
Packit 0652a1
Packit 0652a1
    if (i % 2 == 0 && i > 0)
Packit 0652a1
      timestamp += 40 * GST_MSECOND;
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
    fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    if (i == 0)
Packit 0652a1
      fail_unless (discont);
Packit 0652a1
    else
Packit 0652a1
      fail_unless (!discont);
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Shift every buffer 100 by 2: discont at buffer 200
Packit 0652a1
   */
Packit 0652a1
  for (i = 0; i < 500; i++) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 0;
Packit 0652a1
    if (i >= 100)
Packit 0652a1
      timestamp += 2 * GST_SECOND;
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    if (i < 200) {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 0)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    } else {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp,
Packit 0652a1
          10 * GST_MSECOND * i + 2 * GST_SECOND);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 200)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  gst_audio_stream_align_free (align);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_stream_align_reverse)
Packit 0652a1
{
Packit 0652a1
  GstAudioStreamAlign *align;
Packit 0652a1
  gint i;
Packit 0652a1
  GstClockTime timestamp;
Packit 0652a1
  GstClockTime out_timestamp, out_duration;
Packit 0652a1
  gboolean discont;
Packit 0652a1
Packit 0652a1
  align = gst_audio_stream_align_new (-1000, 40 * GST_MSECOND, 1 * GST_SECOND);
Packit 0652a1
Packit 0652a1
  for (i = 499; i >= 0; i--) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 499;
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
    fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    if (i == 499)
Packit 0652a1
      fail_unless (discont);
Packit 0652a1
    else
Packit 0652a1
      fail_unless (!discont);
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Drift forwards by 1ms per 10ms buffer for the first 40 buffers.
Packit 0652a1
   * - after 40 buffers we're above alignment threshold
Packit 0652a1
   * - after 40 + 100 buffers we're at discont wait
Packit 0652a1
   */
Packit 0652a1
  for (i = 499; i >= 0; i--) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 499;
Packit 0652a1
    if (i < 499)
Packit 0652a1
      timestamp += 1 * GST_MSECOND * MIN (499 - i, 40);
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    if (i >= 500 - 140) {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 499)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    } else {
Packit 0652a1
      if (i == 499 - 140)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp,
Packit 0652a1
          10 * GST_MSECOND * i + 40 * GST_MSECOND);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Drift backwards by 1ms per 10ms buffer for the first 40 buffers.
Packit 0652a1
   * - after 40 buffers we're above alignment threshold
Packit 0652a1
   * - after 40 + 100 buffers we're at discont wait
Packit 0652a1
   */
Packit 0652a1
  for (i = 499; i >= 4; i--) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 499;
Packit 0652a1
    if (i < 499)
Packit 0652a1
      timestamp -= 1 * GST_MSECOND * MIN (499 - i, 40);
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    if (i >= 500 - 140) {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 499)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    } else {
Packit 0652a1
      if (i == 499 - 140)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp,
Packit 0652a1
          10 * GST_MSECOND * i - 40 * GST_MSECOND);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Shift all buffers but the first by 40ms
Packit 0652a1
   * - after 1 buffers we're above alignment threshold
Packit 0652a1
   * - after 101 buffers we're at discont wait
Packit 0652a1
   */
Packit 0652a1
  for (i = 499; i >= 0; i--) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 499;
Packit 0652a1
    if (i < 499)
Packit 0652a1
      timestamp += 40 * GST_MSECOND;
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    if (i >= 500 - 101) {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 499)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    } else {
Packit 0652a1
      if (i == 499 - 101)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp,
Packit 0652a1
          10 * GST_MSECOND * i + 40 * GST_MSECOND);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Shift every second buffer by 40ms:
Packit 0652a1
   * - never discont!
Packit 0652a1
   */
Packit 0652a1
  for (i = 499; i >= 0; i--) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 499;
Packit 0652a1
Packit 0652a1
    if (i % 2 == 0 && i < 499)
Packit 0652a1
      timestamp += 40 * GST_MSECOND;
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
    fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
    if (i == 499)
Packit 0652a1
      fail_unless (discont);
Packit 0652a1
    else
Packit 0652a1
      fail_unless (!discont);
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  /* Shift buffer 100 by 2: discont at buffer 200
Packit 0652a1
   */
Packit 0652a1
  for (i = 499; i >= 0; i--) {
Packit 0652a1
    timestamp = 10 * GST_MSECOND * i;
Packit 0652a1
    discont = i == 499;
Packit 0652a1
    if (i < 500 - 100)
Packit 0652a1
      timestamp += 2 * GST_SECOND;
Packit 0652a1
Packit 0652a1
    discont =
Packit 0652a1
        gst_audio_stream_align_process (align, discont, timestamp, 10,
Packit 0652a1
        &out_timestamp, &out_duration, NULL);
Packit 0652a1
Packit 0652a1
    if (i >= 500 - 200) {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp, 10 * GST_MSECOND * i);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 499)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    } else {
Packit 0652a1
      fail_unless_equals_uint64 (out_timestamp,
Packit 0652a1
          10 * GST_MSECOND * i + 2 * GST_SECOND);
Packit 0652a1
      fail_unless_equals_uint64 (out_duration, 10 * GST_MSECOND);
Packit 0652a1
      if (i == 499 - 200)
Packit 0652a1
        fail_unless (discont);
Packit 0652a1
      else
Packit 0652a1
        fail_unless (!discont);
Packit 0652a1
    }
Packit 0652a1
  }
Packit 0652a1
Packit 0652a1
  gst_audio_stream_align_free (align);
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
typedef struct
Packit 0652a1
{
Packit 0652a1
  GstAudioFormat format;
Packit 0652a1
  GstAudioLayout layout;
Packit 0652a1
  gint channels;
Packit 0652a1
  gsize samples;
Packit 0652a1
  gsize plane_size;
Packit 0652a1
  gsize offsets[10];
Packit 0652a1
  gboolean add_meta;
Packit 0652a1
  gboolean use_offsets;
Packit 0652a1
} AudioBufferTestData;
Packit 0652a1
Packit 0652a1
GST_START_TEST (test_audio_buffer_and_audio_meta)
Packit 0652a1
{
Packit 0652a1
  AudioBufferTestData td[] = {
Packit 0652a1
    {GST_AUDIO_FORMAT_S24_32, GST_AUDIO_LAYOUT_NON_INTERLEAVED,
Packit 0652a1
        4, 60, 240, {10, 760, 510, 260}, TRUE, TRUE},
Packit 0652a1
    {GST_AUDIO_FORMAT_F32, GST_AUDIO_LAYOUT_NON_INTERLEAVED,
Packit 0652a1
        4, 60, 240, {0, 240, 480, 720}, TRUE, FALSE},
Packit 0652a1
    {GST_AUDIO_FORMAT_S16, GST_AUDIO_LAYOUT_INTERLEAVED,
Packit 0652a1
        4, 125, 1000, {0}, TRUE, FALSE},
Packit 0652a1
    {GST_AUDIO_FORMAT_S16, GST_AUDIO_LAYOUT_INTERLEAVED,
Packit 0652a1
        4, 125, 1000, {0}, FALSE, FALSE},
Packit 0652a1
    {GST_AUDIO_FORMAT_S8, GST_AUDIO_LAYOUT_INTERLEAVED,
Packit 0652a1
        8, 125, 1000, {0}, FALSE, FALSE},
Packit 0652a1
    {GST_AUDIO_FORMAT_U8, GST_AUDIO_LAYOUT_NON_INTERLEAVED,
Packit 0652a1
        8, 125, 125, {0, 125, 250, 375, 500, 625, 750, 875}, TRUE, FALSE},
Packit 0652a1
    {GST_AUDIO_FORMAT_U32, GST_AUDIO_LAYOUT_NON_INTERLEAVED,
Packit 0652a1
          10, 25, 100, {0, 100, 200, 300, 400, 500, 600, 700, 800, 900}, TRUE,
Packit 0652a1
        FALSE},
Packit 0652a1
    {GST_AUDIO_FORMAT_U32, GST_AUDIO_LAYOUT_INTERLEAVED,
Packit 0652a1
        10, 25, 1000, {0}, FALSE, FALSE},
Packit 0652a1
  };
Packit 0652a1
  gint i;
Packit 0652a1
Packit 0652a1
  for (i = 0; i < G_N_ELEMENTS (td); i++) {
Packit 0652a1
    GstBuffer *buf;
Packit 0652a1
    guint8 *data;
Packit 0652a1
    GstAudioInfo info;
Packit 0652a1
    GstAudioMeta *meta;
Packit 0652a1
    GstAudioBuffer buffer;
Packit 0652a1
    gint j;
Packit 0652a1
Packit 0652a1
    gst_audio_info_init (&info;;
Packit 0652a1
    gst_audio_info_set_format (&info, td[i].format, 44100, td[i].channels,
Packit 0652a1
        NULL);
Packit 0652a1
    info.layout = td[i].layout;
Packit 0652a1
Packit 0652a1
    buf = make_buffer (&data);
Packit 0652a1
    if (td[i].add_meta) {
Packit 0652a1
      meta = gst_buffer_add_audio_meta (buf, &info, td[i].samples,
Packit 0652a1
          td[i].use_offsets ? td[i].offsets : NULL);
Packit 0652a1
Packit 0652a1
      fail_unless (meta);
Packit 0652a1
      fail_unless (GST_AUDIO_INFO_IS_VALID (&meta->info));
Packit 0652a1
      fail_unless (gst_audio_info_is_equal (&meta->info, &info));
Packit 0652a1
      fail_unless_equals_int (meta->info.finfo->format, td[i].format);
Packit 0652a1
      fail_unless_equals_int (meta->info.layout, td[i].layout);
Packit 0652a1
      fail_unless_equals_int (meta->info.channels, td[i].channels);
Packit 0652a1
      fail_unless_equals_int (meta->samples, td[i].samples);
Packit 0652a1
Packit 0652a1
      if (td[i].layout == GST_AUDIO_LAYOUT_NON_INTERLEAVED) {
Packit 0652a1
        fail_unless (meta->offsets);
Packit 0652a1
        for (j = 0; j < td[i].channels; j++) {
Packit 0652a1
          fail_unless_equals_int (meta->offsets[j], td[i].offsets[j]);
Packit 0652a1
        }
Packit 0652a1
      } else {
Packit 0652a1
        fail_if (meta->offsets);
Packit 0652a1
      }
Packit 0652a1
    }
Packit 0652a1
Packit 0652a1
    fail_unless (gst_audio_buffer_map (&buffer, &info, buf, GST_MAP_READ));
Packit 0652a1
    fail_unless_equals_pointer (buffer.buffer, buf);
Packit 0652a1
    fail_unless (GST_AUDIO_INFO_IS_VALID (&buffer.info));
Packit 0652a1
    fail_unless (gst_audio_info_is_equal (&buffer.info, &info));
Packit 0652a1
    fail_unless_equals_int (buffer.n_samples, td[i].samples);
Packit 0652a1
Packit 0652a1
    if (td[i].layout == GST_AUDIO_LAYOUT_NON_INTERLEAVED) {
Packit 0652a1
      fail_unless_equals_int (buffer.n_planes, td[i].channels);
Packit 0652a1
      for (j = 0; j < td[i].channels; j++) {
Packit 0652a1
        fail_unless_equals_pointer (buffer.planes[j], data + td[i].offsets[j]);
Packit 0652a1
      }
Packit 0652a1
    } else {
Packit 0652a1
      fail_unless_equals_int (buffer.n_planes, 1);
Packit 0652a1
      fail_unless_equals_pointer (buffer.planes[0], data);
Packit 0652a1
    }
Packit 0652a1
Packit 0652a1
    fail_unless_equals_int (GST_AUDIO_BUFFER_PLANE_SIZE (&buffer),
Packit 0652a1
        td[i].plane_size);
Packit 0652a1
Packit 0652a1
    if (buffer.n_planes <= 8) {
Packit 0652a1
      fail_unless_equals_pointer (buffer.map_infos, buffer.priv_map_infos_arr);
Packit 0652a1
      fail_unless_equals_pointer (buffer.planes, buffer.priv_planes_arr);
Packit 0652a1
    } else {
Packit 0652a1
      fail_if (buffer.map_infos == buffer.priv_map_infos_arr);
Packit 0652a1
      fail_if (buffer.planes == buffer.priv_planes_arr);
Packit 0652a1
    }
Packit 0652a1
Packit 0652a1
    gst_audio_buffer_unmap (&buffer);
Packit 0652a1
    gst_buffer_unref (buf);
Packit 0652a1
  }
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_END_TEST;
Packit 0652a1
Packit 0652a1
static Suite *
Packit 0652a1
audio_suite (void)
Packit 0652a1
{
Packit 0652a1
  Suite *s = suite_create ("audio support library");
Packit 0652a1
Packit 0652a1
  TCase *tc_chain = tcase_create ("general");
Packit 0652a1
Packit 0652a1
  suite_add_tcase (s, tc_chain);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_unsupported_format);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_start_and_stop);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_start_and_stop_planar);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_start);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_start_planar);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_stop);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_stop_planar);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_outside);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_start_and_stop_no_meta);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_no_timestamp);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_time_handles_rounding);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_samples_start_and_stop);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_samples_start_and_stop_planar);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_samples_start);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_samples_stop);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_samples_outside);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_samples_start_and_stop_no_meta);
Packit 0652a1
  tcase_add_test (tc_chain, test_buffer_clip_samples_no_timestamp);
Packit 0652a1
  tcase_add_test (tc_chain, test_multichannel_checks);
Packit 0652a1
  tcase_add_test (tc_chain, test_multichannel_reorder);
Packit 0652a1
  tcase_add_test (tc_chain, test_audio_format_s8);
Packit 0652a1
  tcase_add_test (tc_chain, test_audio_format_u8);
Packit 0652a1
  tcase_add_test (tc_chain, test_fill_silence);
Packit 0652a1
  tcase_add_test (tc_chain, test_stream_align);
Packit 0652a1
  tcase_add_test (tc_chain, test_stream_align_reverse);
Packit 0652a1
  tcase_add_test (tc_chain, test_audio_buffer_and_audio_meta);
Packit 0652a1
Packit 0652a1
  return s;
Packit 0652a1
}
Packit 0652a1
Packit 0652a1
GST_CHECK_MAIN (audio);