summaryrefslogtreecommitdiffstats
path: root/tests/check
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2009-01-13 19:23:57 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2009-01-13 19:23:57 +0000
commit75c1c9f3789568b69678cd3babb4d29e0ebdd87b (patch)
treebb759b104c30805065449add82d2cd40efc10a22 /tests/check
parent5f5ae768b88671df1e5d3e55e5df41d832f7c008 (diff)
Add audioiirfilter and audiofirfilter elements which allow generic IIR/FIR filters to be implemented by providing the...
Original commit message from CVS: * configure.ac: * gst/audiofx/Makefile.am: * gst/audiofx/audiofirfilter.c: (gst_audio_fir_filter_base_init), (gst_audio_fir_filter_class_init), (gst_audio_fir_filter_update_kernel), (gst_audio_fir_filter_init), (gst_audio_fir_filter_setup), (gst_audio_fir_filter_finalize), (gst_audio_fir_filter_set_property), (gst_audio_fir_filter_get_property): * gst/audiofx/audiofirfilter.h: * gst/audiofx/audiofx.c: (plugin_init): * gst/audiofx/audioiirfilter.c: (gst_audio_iir_filter_base_init), (gst_audio_iir_filter_class_init), (gst_audio_iir_filter_update_coefficients), (gst_audio_iir_filter_init), (gst_audio_iir_filter_setup), (gst_audio_iir_filter_finalize), (gst_audio_iir_filter_set_property), (gst_audio_iir_filter_get_property): * gst/audiofx/audioiirfilter.h: Add audioiirfilter and audiofirfilter elements which allow generic IIR/FIR filters to be implemented by providing the filter coefficients. Fixes bug #567577. * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-good-plugins-docs.sgml: * docs/plugins/gst-plugins-good-plugins-sections.txt: * docs/plugins/gst-plugins-good-plugins.args: * docs/plugins/gst-plugins-good-plugins.hierarchy: * docs/plugins/gst-plugins-good-plugins.signals: * docs/plugins/inspect/plugin-alaw.xml: * docs/plugins/inspect/plugin-audiofx.xml: * docs/plugins/inspect/plugin-avi.xml: * docs/plugins/inspect/plugin-flac.xml: * docs/plugins/inspect/plugin-mulaw.xml: * docs/plugins/inspect/plugin-video4linux2.xml: * docs/plugins/inspect/plugin-wavparse.xml: Add documentation for the audioiirfilter and audiofirfilter elements. * tests/check/Makefile.am: * tests/check/elements/audiofirfilter.c: (on_message), (on_rate_changed), (on_handoff), (GST_START_TEST), (audiofirfilter_suite): * tests/check/elements/audioiirfilter.c: (on_message), (on_rate_changed), (on_handoff), (GST_START_TEST), (audioiirfilter_suite): * tests/examples/Makefile.am: * tests/examples/audiofx/Makefile.am: * tests/examples/audiofx/firfilter-example.c: (on_message), (on_rate_changed), (main): * tests/examples/audiofx/iirfilter-example.c: (on_message), (on_rate_changed), (main): Add unit tests and example applications for the two filter elements.
Diffstat (limited to 'tests/check')
-rw-r--r--tests/check/Makefile.am2
-rw-r--r--tests/check/elements/audiofirfilter.c169
-rw-r--r--tests/check/elements/audioiirfilter.c179
3 files changed, 350 insertions, 0 deletions
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index d1a55197..5cc63dbb 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -72,10 +72,12 @@ check_PROGRAMS = \
elements/audioinvert \
elements/audiochebband \
elements/audiocheblimit \
+ elements/audioiirfilter \
elements/audioamplify \
elements/audiodynamic \
elements/audiowsincband \
elements/audiowsinclimit \
+ elements/audiofirfilter \
elements/avimux \
elements/avisubtitle \
elements/deinterleave \
diff --git a/tests/check/elements/audiofirfilter.c b/tests/check/elements/audiofirfilter.c
new file mode 100644
index 00000000..c4eb7238
--- /dev/null
+++ b/tests/check/elements/audiofirfilter.c
@@ -0,0 +1,169 @@
+/* GStreamer
+ *
+ * Copyright (C) 2009 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 Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <gst/gst.h>
+#include <gst/check/gstcheck.h>
+
+static gboolean have_eos = FALSE;
+
+static gboolean
+on_message (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+ GMainLoop *loop = (GMainLoop *) user_data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ case GST_MESSAGE_WARNING:
+ g_assert_not_reached ();
+ g_main_loop_quit (loop);
+ break;
+
+ case GST_MESSAGE_EOS:
+ have_eos = TRUE;
+ g_main_loop_quit (loop);
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+static void
+on_rate_changed (GstElement * element, gint rate, gpointer user_data)
+{
+ GValueArray *va;
+ GValue v = { 0, };
+
+ fail_unless (rate > 0);
+
+ va = g_value_array_new (6);
+
+ g_value_init (&v, G_TYPE_DOUBLE);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 1.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+
+ g_object_set (G_OBJECT (element), "kernel", va, NULL);
+
+ g_value_array_free (va);
+}
+
+static gboolean have_data = FALSE;
+
+static void
+on_handoff (GstElement * object, GstBuffer * buffer, GstPad * pad,
+ gpointer user_data)
+{
+ if (!have_data) {
+ gdouble *data = (gdouble *) GST_BUFFER_DATA (buffer);
+
+ fail_unless (GST_BUFFER_SIZE (buffer) > 5 * sizeof (gdouble));
+ fail_unless (data[0] == 0.0);
+ fail_unless (data[1] == 0.0);
+ fail_unless (data[2] == 0.0);
+ fail_unless (data[3] == 0.0);
+ fail_unless (data[4] == 0.0);
+ fail_unless (data[5] != 0.0);
+ have_data = TRUE;
+ }
+}
+
+GST_START_TEST (test_pipeline)
+{
+ GstElement *pipeline, *src, *filter, *sink;
+ GstBus *bus;
+ GMainLoop *loop;
+
+ have_data = FALSE;
+ have_eos = FALSE;
+
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+ fail_unless (pipeline != NULL);
+
+ src = gst_element_factory_make ("audiotestsrc", NULL);
+ fail_unless (src != NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 1000, NULL);
+
+ filter = gst_element_factory_make ("audiofirfilter", NULL);
+ fail_unless (filter != NULL);
+ g_signal_connect (G_OBJECT (filter), "rate-changed",
+ G_CALLBACK (on_rate_changed), NULL);
+
+ sink = gst_element_factory_make ("fakesink", NULL);
+ fail_unless (sink != NULL);
+ g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
+ g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (on_handoff), NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL);
+ fail_unless (gst_element_link_many (src, filter, sink, NULL));
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop);
+ gst_object_unref (GST_OBJECT (bus));
+
+ fail_if (gst_element_set_state (pipeline,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
+
+ g_main_loop_run (loop);
+
+ fail_unless (have_data);
+ fail_unless (have_eos);
+
+ fail_unless (gst_element_set_state (pipeline,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);
+
+ g_main_loop_unref (loop);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+audiofirfilter_suite (void)
+{
+ Suite *s = suite_create ("audiofirfilter");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_pipeline);
+
+ return s;
+}
+
+GST_CHECK_MAIN (audiofirfilter);
diff --git a/tests/check/elements/audioiirfilter.c b/tests/check/elements/audioiirfilter.c
new file mode 100644
index 00000000..d144792b
--- /dev/null
+++ b/tests/check/elements/audioiirfilter.c
@@ -0,0 +1,179 @@
+/* GStreamer
+ *
+ * Copyright (C) 2009 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 Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <gst/gst.h>
+#include <gst/check/gstcheck.h>
+
+static gboolean have_eos = FALSE;
+
+static gboolean
+on_message (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+ GMainLoop *loop = (GMainLoop *) user_data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ case GST_MESSAGE_WARNING:
+ g_assert_not_reached ();
+ g_main_loop_quit (loop);
+ break;
+
+ case GST_MESSAGE_EOS:
+ have_eos = TRUE;
+ g_main_loop_quit (loop);
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+static void
+on_rate_changed (GstElement * element, gint rate, gpointer user_data)
+{
+ GValueArray *va;
+ GValue v = { 0, };
+
+ fail_unless (rate > 0);
+
+ va = g_value_array_new (6);
+
+ g_value_init (&v, G_TYPE_DOUBLE);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+ g_value_set_double (&v, 1.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+
+ g_object_set (G_OBJECT (element), "a", va, NULL);
+
+ g_value_array_free (va);
+
+ va = g_value_array_new (6);
+
+ g_value_set_double (&v, 0.0);
+ g_value_array_append (va, &v);
+ g_value_reset (&v);
+
+ g_object_set (G_OBJECT (element), "b", va, NULL);
+
+ g_value_array_free (va);
+}
+
+static gboolean have_data = FALSE;
+
+static void
+on_handoff (GstElement * object, GstBuffer * buffer, GstPad * pad,
+ gpointer user_data)
+{
+ if (!have_data) {
+ gdouble *data = (gdouble *) GST_BUFFER_DATA (buffer);
+
+ fail_unless (GST_BUFFER_SIZE (buffer) > 5 * sizeof (gdouble));
+ fail_unless (data[0] == 0.0);
+ fail_unless (data[1] == 0.0);
+ fail_unless (data[2] == 0.0);
+ fail_unless (data[3] == 0.0);
+ fail_unless (data[4] == 0.0);
+ fail_unless (data[5] != 0.0);
+ have_data = TRUE;
+ }
+}
+
+GST_START_TEST (test_pipeline)
+{
+ GstElement *pipeline, *src, *filter, *sink;
+ GstBus *bus;
+ GMainLoop *loop;
+
+ have_data = FALSE;
+ have_eos = FALSE;
+
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+ fail_unless (pipeline != NULL);
+
+ src = gst_element_factory_make ("audiotestsrc", NULL);
+ fail_unless (src != NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 1000, NULL);
+
+ filter = gst_element_factory_make ("audioiirfilter", NULL);
+ fail_unless (filter != NULL);
+ g_signal_connect (G_OBJECT (filter), "rate-changed",
+ G_CALLBACK (on_rate_changed), NULL);
+
+ sink = gst_element_factory_make ("fakesink", NULL);
+ fail_unless (sink != NULL);
+ g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
+ g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (on_handoff), NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL);
+ fail_unless (gst_element_link_many (src, filter, sink, NULL));
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop);
+ gst_object_unref (GST_OBJECT (bus));
+
+ fail_if (gst_element_set_state (pipeline,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE);
+
+ g_main_loop_run (loop);
+
+ fail_unless (have_data);
+ fail_unless (have_eos);
+
+ fail_unless (gst_element_set_state (pipeline,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);
+
+ g_main_loop_unref (loop);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+audioiirfilter_suite (void)
+{
+ Suite *s = suite_create ("audioiirfilter");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_pipeline);
+
+ return s;
+}
+
+GST_CHECK_MAIN (audioiirfilter);