mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 08:11:16 +00:00
45ae36817b
Add a test that check that we handle time ranges (a range of time that maps to the same sample). Also update the other tests to use our check api to compare int64 values to get better output on failure.
739 lines
22 KiB
C
739 lines
22 KiB
C
/* GStreamer
|
|
*
|
|
* unit tests for audio support library
|
|
*
|
|
* Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
|
|
* Copyright (C) 2011 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
|
*
|
|
* 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., 51 Franklin St, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <gst/check/gstcheck.h>
|
|
|
|
#include <gst/audio/audio.h>
|
|
#include <string.h>
|
|
|
|
static GstBuffer *
|
|
make_buffer (guint8 ** _data)
|
|
{
|
|
GstBuffer *buf = gst_buffer_new ();
|
|
guint8 *data = (guint8 *) g_malloc (1000);
|
|
|
|
gst_buffer_append_memory (buf,
|
|
gst_memory_new_wrapped (0, data, 1000, 0, 1000, data, g_free));
|
|
if (_data)
|
|
*_data = data;
|
|
return buf;
|
|
}
|
|
|
|
static void
|
|
setup_segment (GstSegment * s, GstFormat fmt, guint64 start, guint64 stop,
|
|
guint64 stream_time)
|
|
{
|
|
gst_segment_init (s, fmt);
|
|
s->start = start;
|
|
s->stop = stop;
|
|
s->time = stream_time;
|
|
}
|
|
|
|
GST_START_TEST (test_buffer_clip_unsupported_format)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
guint8 *data;
|
|
|
|
/* If the format is not TIME or DEFAULT it should assert()
|
|
* FIXME: check if return value is the same as the input buffer.
|
|
* probably can't be done because the assert() does a SIGABRT.
|
|
*/
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_PERCENT, 0, 10, 0);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 0 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = 0;
|
|
GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
|
|
GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
|
|
|
|
ASSERT_CRITICAL (gst_audio_buffer_clip (buf, &s, 100, 1));
|
|
|
|
gst_buffer_unref (buf);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_time_start_and_stop)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
GstMapInfo map;
|
|
guint8 *data;
|
|
|
|
/* Clip start and end */
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_TIME, 4 * GST_SECOND, 8 * GST_SECOND,
|
|
4 * GST_SECOND);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = 1200;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret != NULL);
|
|
|
|
fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 4 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 800);
|
|
gst_buffer_map (ret, &map, GST_MAP_READ);
|
|
fail_unless (map.data == data + 200);
|
|
fail_unless (map.size == 400);
|
|
gst_buffer_unmap (ret, &map);
|
|
|
|
gst_buffer_unref (ret);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_time_start)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
GstMapInfo map;
|
|
guint8 *data;
|
|
|
|
/* Clip only start */
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_TIME, 4 * GST_SECOND, 12 * GST_SECOND,
|
|
4 * GST_SECOND);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = 1200;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret != NULL);
|
|
|
|
fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1200);
|
|
gst_buffer_map (ret, &map, GST_MAP_READ);
|
|
fail_unless (map.data == data + 200);
|
|
fail_unless (map.size == 800);
|
|
gst_buffer_unmap (ret, &map);
|
|
|
|
gst_buffer_unref (ret);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_time_stop)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
GstMapInfo map;
|
|
guint8 *data;
|
|
|
|
/* Clip only stop */
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_TIME, 2 * GST_SECOND, 10 * GST_SECOND,
|
|
2 * GST_SECOND);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = 1200;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret != NULL);
|
|
|
|
fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 2 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 200);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1000);
|
|
gst_buffer_map (ret, &map, GST_MAP_READ);
|
|
fail_unless (map.data == data);
|
|
fail_unless (map.size == 800);
|
|
gst_buffer_unmap (ret, &map);
|
|
|
|
gst_buffer_unref (ret);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_time_outside)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
|
|
/* Buffer outside segment */
|
|
buf = make_buffer (NULL);
|
|
setup_segment (&s, GST_FORMAT_TIME, 12 * GST_SECOND, 20 * GST_SECOND,
|
|
12 * GST_SECOND);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = 1200;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret == NULL);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_time_start_and_stop_no_meta)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
GstMapInfo map;
|
|
guint8 *data;
|
|
|
|
/* Clip start and end but don't touch duration, offset and offset_end */
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_TIME, 4 * GST_SECOND, 8 * GST_SECOND,
|
|
4 * GST_SECOND);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
|
|
GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
|
|
GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret != NULL);
|
|
|
|
fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), GST_CLOCK_TIME_NONE);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), GST_BUFFER_OFFSET_NONE);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret),
|
|
GST_BUFFER_OFFSET_NONE);
|
|
gst_buffer_map (ret, &map, GST_MAP_READ);
|
|
fail_unless (map.data == data + 200);
|
|
fail_unless (map.size == 400);
|
|
gst_buffer_unmap (ret, &map);
|
|
|
|
gst_buffer_unref (ret);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_time_no_timestamp)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
|
|
/* If the buffer has no timestamp it should assert()
|
|
* FIXME: check if return value is the same as the input buffer.
|
|
* probably can't be done because the assert() does a SIGABRT.
|
|
*/
|
|
buf = make_buffer (NULL);
|
|
setup_segment (&s, GST_FORMAT_TIME, 0 * GST_SECOND, 10 * GST_SECOND,
|
|
0 * GST_SECOND);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
|
|
GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
|
|
GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
|
|
GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret == buf);
|
|
|
|
gst_buffer_unref (buf);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_time_handles_rounding)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
GstMapInfo map;
|
|
guint8 *data;
|
|
GstClockTime time_per_sample = GST_SECOND / 100;
|
|
|
|
/* Clip only stop */
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_TIME, 2 * GST_SECOND, 10 * GST_SECOND,
|
|
2 * GST_SECOND);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
/* the max duration that still converts back to the same size of samples */
|
|
GST_BUFFER_DURATION (buf) = 10 * GST_SECOND + (time_per_sample - 1);
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = 1200;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret != NULL);
|
|
|
|
fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 2 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 200);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1000);
|
|
gst_buffer_map (ret, &map, GST_MAP_READ);
|
|
fail_unless (map.data == data);
|
|
fail_unless (map.size == 800);
|
|
gst_buffer_unmap (ret, &map);
|
|
|
|
gst_buffer_unref (ret);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_samples_start_and_stop)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
GstMapInfo map;
|
|
guint8 *data;
|
|
|
|
/* Clip start and end */
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_DEFAULT, 400, 800, 400);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = 1200;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret != NULL);
|
|
|
|
fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 4 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 800);
|
|
gst_buffer_map (ret, &map, GST_MAP_READ);
|
|
fail_unless (map.data == data + 200);
|
|
fail_unless (map.size == 400);
|
|
gst_buffer_unmap (ret, &map);
|
|
|
|
gst_buffer_unref (ret);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_samples_start)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
GstMapInfo map;
|
|
guint8 *data;
|
|
|
|
/* Clip only start */
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_DEFAULT, 400, 1200, 400);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = 1200;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret != NULL);
|
|
|
|
fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1200);
|
|
gst_buffer_map (ret, &map, GST_MAP_READ);
|
|
fail_unless (map.data == data + 200);
|
|
fail_unless (map.size == 800);
|
|
gst_buffer_unmap (ret, &map);
|
|
|
|
gst_buffer_unref (ret);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_samples_stop)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
GstMapInfo map;
|
|
guint8 *data;
|
|
|
|
/* Clip only stop */
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_DEFAULT, 200, 1000, 200);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = 1200;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret != NULL);
|
|
|
|
fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 2 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), 8 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 200);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret), 1000);
|
|
gst_buffer_map (ret, &map, GST_MAP_READ);
|
|
fail_unless (map.data == data);
|
|
fail_unless (map.size == 800);
|
|
gst_buffer_unmap (ret, &map);
|
|
|
|
gst_buffer_unref (ret);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_samples_outside)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
|
|
/* Buffer outside segment */
|
|
buf = make_buffer (NULL);
|
|
setup_segment (&s, GST_FORMAT_DEFAULT, 1200, 2000, 1200);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = 1200;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret == NULL);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_samples_start_and_stop_no_meta)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
GstBuffer *ret;
|
|
GstMapInfo map;
|
|
guint8 *data;
|
|
|
|
/* Clip start and end but don't touch duration and offset_end */
|
|
buf = make_buffer (&data);
|
|
setup_segment (&s, GST_FORMAT_DEFAULT, 400, 800, 400);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
|
|
GST_BUFFER_OFFSET (buf) = 200;
|
|
GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
|
|
|
|
ret = gst_audio_buffer_clip (buf, &s, 100, 1);
|
|
fail_unless (ret != NULL);
|
|
|
|
fail_unless_equals_int64 (GST_BUFFER_TIMESTAMP (ret), 4 * GST_SECOND);
|
|
fail_unless_equals_int64 (GST_BUFFER_DURATION (ret), GST_CLOCK_TIME_NONE);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET (ret), 400);
|
|
fail_unless_equals_int64 (GST_BUFFER_OFFSET_END (ret),
|
|
GST_BUFFER_OFFSET_NONE);
|
|
gst_buffer_map (ret, &map, GST_MAP_READ);
|
|
fail_unless (map.data == data + 200);
|
|
fail_unless (map.size == 400);
|
|
gst_buffer_unmap (ret, &map);
|
|
|
|
gst_buffer_unref (ret);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_buffer_clip_samples_no_timestamp)
|
|
{
|
|
GstSegment s;
|
|
GstBuffer *buf;
|
|
|
|
/* If the buffer has no offset it should assert()
|
|
* FIXME: check if return value is the same as the input buffer.
|
|
* probably can't be done because the assert() does a SIGABRT.
|
|
*/
|
|
buf = make_buffer (NULL);
|
|
setup_segment (&s, GST_FORMAT_DEFAULT, 0, 10, 0);
|
|
|
|
GST_BUFFER_TIMESTAMP (buf) = 0 * GST_SECOND;
|
|
GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
|
|
GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
|
|
GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
|
|
|
|
ASSERT_CRITICAL (gst_audio_buffer_clip (buf, &s, 100, 1));
|
|
|
|
gst_buffer_unref (buf);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_multichannel_checks)
|
|
{
|
|
GstAudioChannelPosition pos_2_mixed[2] = {
|
|
GST_AUDIO_CHANNEL_POSITION_MONO,
|
|
GST_AUDIO_CHANNEL_POSITION_NONE
|
|
};
|
|
GstAudioChannelPosition pos_2_none[2] = {
|
|
GST_AUDIO_CHANNEL_POSITION_NONE,
|
|
GST_AUDIO_CHANNEL_POSITION_NONE
|
|
};
|
|
GstAudioChannelPosition pos_2_flr[2] = {
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
|
};
|
|
GstAudioChannelPosition pos_2_frl[2] = {
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT
|
|
};
|
|
GstAudioChannelPosition pos_2_frr[2] = {
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
|
};
|
|
GstAudioChannelPosition pos_3_flrc[3] = {
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER
|
|
};
|
|
GstAudioChannelPosition pos_3_frcl[3] = {
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT
|
|
};
|
|
GstAudioInfo info, info2;
|
|
GstCaps *caps;
|
|
|
|
gst_audio_info_init (&info);
|
|
gst_audio_info_init (&info2);
|
|
|
|
gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000, 2, NULL);
|
|
fail_unless (memcmp (&info.position, pos_2_flr, sizeof (pos_2_flr)) == 0);
|
|
|
|
gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000, 2, pos_2_flr);
|
|
fail_unless (memcmp (&info.position, pos_2_flr, sizeof (pos_2_flr)) == 0);
|
|
caps = gst_audio_info_to_caps (&info);
|
|
fail_unless (gst_audio_info_from_caps (&info2, caps));
|
|
fail_unless (memcmp (&info, &info2, sizeof (info)) == 0);
|
|
gst_caps_unref (caps);
|
|
|
|
gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000, 2, pos_2_none);
|
|
fail_unless (memcmp (&info.position, pos_2_none, sizeof (pos_2_none)) == 0);
|
|
caps = gst_audio_info_to_caps (&info);
|
|
fail_unless (gst_audio_info_from_caps (&info2, caps));
|
|
fail_unless (memcmp (&info, &info2, sizeof (info)) == 0);
|
|
gst_caps_unref (caps);
|
|
|
|
gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000, 3, pos_3_flrc);
|
|
fail_unless (memcmp (&info.position, pos_3_flrc, sizeof (pos_3_flrc)) == 0);
|
|
caps = gst_audio_info_to_caps (&info);
|
|
fail_unless (gst_audio_info_from_caps (&info2, caps));
|
|
fail_unless (memcmp (&info, &info2, sizeof (info)) == 0);
|
|
gst_caps_unref (caps);
|
|
|
|
ASSERT_WARNING (gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000,
|
|
2, pos_2_frl));
|
|
ASSERT_WARNING (gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000,
|
|
2, pos_2_mixed));
|
|
ASSERT_WARNING (gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000,
|
|
2, pos_2_frr));
|
|
ASSERT_WARNING (gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_F32, 48000,
|
|
3, pos_3_frcl));
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
typedef struct
|
|
{
|
|
gint channels;
|
|
GstAudioChannelPosition from[32], to[32];
|
|
gint32 in[32], out[32];
|
|
gboolean fail;
|
|
} MultichannelReorderData;
|
|
|
|
GST_START_TEST (test_multichannel_reorder)
|
|
{
|
|
MultichannelReorderData tests[] = {
|
|
{1,
|
|
{GST_AUDIO_CHANNEL_POSITION_MONO},
|
|
{GST_AUDIO_CHANNEL_POSITION_MONO},
|
|
{0, 1, 2, 3},
|
|
{0, 1, 2, 3},
|
|
FALSE},
|
|
{1,
|
|
{GST_AUDIO_CHANNEL_POSITION_MONO},
|
|
{GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER},
|
|
{0, 1, 2, 3},
|
|
{0, 1, 2, 3},
|
|
TRUE},
|
|
{2,
|
|
{GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
|
|
{GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
|
|
{0, 1, 2, 3},
|
|
{0, 1, 2, 3},
|
|
FALSE},
|
|
{2,
|
|
{GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
|
|
{GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT},
|
|
{0, 1, 2, 3},
|
|
{1, 0, 3, 2},
|
|
FALSE},
|
|
{4,
|
|
{GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
|
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER},
|
|
{GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER},
|
|
{0, 1, 2, 3},
|
|
{1, 2, 0, 3},
|
|
FALSE},
|
|
{4,
|
|
{GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
|
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER},
|
|
{GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER},
|
|
{0, 1, 2, 3},
|
|
{3, 0, 1, 2},
|
|
FALSE},
|
|
{4,
|
|
{GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
|
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER},
|
|
{GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
|
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT},
|
|
{0, 1, 2, 3},
|
|
{3, 2, 1, 0},
|
|
FALSE},
|
|
};
|
|
gint i;
|
|
GstBuffer *buf;
|
|
GstMapInfo map;
|
|
|
|
for (i = 0; i < G_N_ELEMENTS (tests); i++) {
|
|
buf =
|
|
gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, tests[i].in,
|
|
sizeof (tests[i].in), 0, sizeof (tests[i].in), NULL, NULL);
|
|
|
|
if (tests[i].fail) {
|
|
fail_if (gst_audio_buffer_reorder_channels (buf, GST_AUDIO_FORMAT_S32,
|
|
tests[i].channels, tests[i].from, tests[i].to));
|
|
} else {
|
|
fail_unless (gst_audio_buffer_reorder_channels (buf, GST_AUDIO_FORMAT_S32,
|
|
tests[i].channels, tests[i].from, tests[i].to));
|
|
|
|
gst_buffer_map (buf, &map, GST_MAP_READ);
|
|
fail_unless_equals_int (map.size, sizeof (tests[i].in));
|
|
fail_unless (memcmp (tests[i].out, map.data, map.size) == 0);
|
|
gst_buffer_unmap (buf, &map);
|
|
}
|
|
gst_buffer_unref (buf);
|
|
}
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_audio_format_s8)
|
|
{
|
|
GstAudioFormat fmt;
|
|
|
|
fmt = gst_audio_format_build_integer (TRUE, G_BYTE_ORDER, 8, 8);
|
|
fail_unless (fmt == GST_AUDIO_FORMAT_S8);
|
|
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_audio_format_u8)
|
|
{
|
|
GstAudioFormat fmt;
|
|
fmt = gst_audio_format_build_integer (FALSE, G_BYTE_ORDER, 8, 8);
|
|
fail_unless (fmt == GST_AUDIO_FORMAT_U8);
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
GST_START_TEST (test_fill_silence)
|
|
{
|
|
GstAudioInfo info;
|
|
GstAudioFormat f;
|
|
gint i;
|
|
guint8 test_silence[32];
|
|
|
|
for (f = GST_AUDIO_FORMAT_S8; f < GST_AUDIO_FORMAT_F64; f++) {
|
|
gst_audio_info_set_format (&info, f, 48000, 1, NULL);
|
|
|
|
gst_audio_format_fill_silence (info.finfo, test_silence,
|
|
GST_AUDIO_INFO_BPF (&info) * 4);
|
|
|
|
for (i = 0; i < 4; i++)
|
|
fail_unless (memcmp (test_silence + i * GST_AUDIO_INFO_BPF (&info),
|
|
info.finfo->silence, GST_AUDIO_INFO_BPF (&info)) == 0);
|
|
}
|
|
}
|
|
|
|
GST_END_TEST;
|
|
|
|
static Suite *
|
|
audio_suite (void)
|
|
{
|
|
Suite *s = suite_create ("audio support library");
|
|
|
|
TCase *tc_chain = tcase_create ("general");
|
|
|
|
suite_add_tcase (s, tc_chain);
|
|
tcase_add_test (tc_chain, test_buffer_clip_unsupported_format);
|
|
tcase_add_test (tc_chain, test_buffer_clip_time_start_and_stop);
|
|
tcase_add_test (tc_chain, test_buffer_clip_time_start);
|
|
tcase_add_test (tc_chain, test_buffer_clip_time_stop);
|
|
tcase_add_test (tc_chain, test_buffer_clip_time_outside);
|
|
tcase_add_test (tc_chain, test_buffer_clip_time_start_and_stop_no_meta);
|
|
tcase_add_test (tc_chain, test_buffer_clip_time_no_timestamp);
|
|
tcase_add_test (tc_chain, test_buffer_clip_time_handles_rounding);
|
|
tcase_add_test (tc_chain, test_buffer_clip_samples_start_and_stop);
|
|
tcase_add_test (tc_chain, test_buffer_clip_samples_start);
|
|
tcase_add_test (tc_chain, test_buffer_clip_samples_stop);
|
|
tcase_add_test (tc_chain, test_buffer_clip_samples_outside);
|
|
tcase_add_test (tc_chain, test_buffer_clip_samples_start_and_stop_no_meta);
|
|
tcase_add_test (tc_chain, test_buffer_clip_samples_no_timestamp);
|
|
tcase_add_test (tc_chain, test_multichannel_checks);
|
|
tcase_add_test (tc_chain, test_multichannel_reorder);
|
|
tcase_add_test (tc_chain, test_audio_format_s8);
|
|
tcase_add_test (tc_chain, test_audio_format_u8);
|
|
tcase_add_test (tc_chain, test_fill_silence);
|
|
|
|
return s;
|
|
}
|
|
|
|
GST_CHECK_MAIN (audio);
|