summaryrefslogtreecommitdiffstats
path: root/gst/debug/testplugin.c
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2005-10-05 11:38:29 +0000
committerTim-Philipp Müller <tim@centricular.net>2005-10-05 11:38:29 +0000
commit2fa12d1a6de6b985723e271585ea8dfb50a2d04a (patch)
tree5a6530c5c0c9bff3af328a9e21ad98616f43b662 /gst/debug/testplugin.c
parent76620459d5eff33e3408f61b8cecfa365f1e45bf (diff)
gst/debug/: Port progressreport, navseek, navigationtest, testsink and breakmydata.
Original commit message from CVS: * gst/debug/Makefile.am: * gst/debug/breakmydata.c: * gst/debug/gstdebug.c: * gst/debug/gstnavigationtest.c: * gst/debug/gstnavseek.c: * gst/debug/gstnavseek.h: * gst/debug/progressreport.c: * gst/debug/testplugin.c: Port progressreport, navseek, navigationtest, testsink and breakmydata.
Diffstat (limited to 'gst/debug/testplugin.c')
-rw-r--r--gst/debug/testplugin.c188
1 files changed, 117 insertions, 71 deletions
diff --git a/gst/debug/testplugin.c b/gst/debug/testplugin.c
index 2936a5e4..e5ad0db1 100644
--- a/gst/debug/testplugin.c
+++ b/gst/debug/testplugin.c
@@ -22,6 +22,7 @@
#endif
#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
#include "tests.h"
GST_DEBUG_CATEGORY_STATIC (gst_test_debug);
@@ -48,9 +49,7 @@ typedef struct _GstTestClass GstTestClass;
struct _GstTest
{
- GstElement element;
-
- GstPad *sinkpad;
+ GstBaseSink basesink;
gpointer tests[TESTS_COUNT];
GValue values[TESTS_COUNT];
@@ -58,50 +57,71 @@ struct _GstTest
struct _GstTestClass
{
- GstElementClass parent_class;
+ GstBaseSinkClass parent_class;
gchar *param_names[2 * TESTS_COUNT];
};
-GST_BOILERPLATE (GstTest, gst_test, GstElement, GST_TYPE_ELEMENT)
+static gboolean gst_test_start (GstBaseSink * trans);
+static gboolean gst_test_stop (GstBaseSink * trans);
+static gboolean gst_test_sink_event (GstBaseSink * basesink, GstEvent * event);
+static GstFlowReturn gst_test_render_buffer (GstBaseSink * basesink,
+ GstBuffer * buf);
+
+static void gst_test_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_test_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
- static void gst_test_set_property (GObject * object,
- guint prop_id, const GValue * value, GParamSpec * pspec);
- static void gst_test_get_property (GObject * object,
- guint prop_id, GValue * value, GParamSpec * pspec);
+static GstElementDetails details = GST_ELEMENT_DETAILS ("gsttestsink",
+ "Testing",
+ "perform a number of tests",
+ "Benjamin Otte <otte@gnome>");
- static void gst_test_chain (GstPad * pad, GstData * _data);
+GST_BOILERPLATE (GstTest, gst_test, GstBaseSink, GST_TYPE_BASE_SINK)
static void gst_test_base_init (gpointer g_class)
{
- static GstElementDetails details = GST_ELEMENT_DETAILS ("gsttestsink",
- "Testing",
- "perform a number of tests",
- "Benjamin Otte <otte@gnome>");
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+
gst_element_class_set_details (gstelement_class, &details);
}
static void
gst_test_class_init (GstTestClass * klass)
{
- GObjectClass *object = G_OBJECT_CLASS (klass);
+ GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
guint i;
- object->set_property = GST_DEBUG_FUNCPTR (gst_test_set_property);
- object->get_property = GST_DEBUG_FUNCPTR (gst_test_get_property);
+ object_class->set_property = GST_DEBUG_FUNCPTR (gst_test_set_property);
+ object_class->get_property = GST_DEBUG_FUNCPTR (gst_test_get_property);
for (i = 0; i < TESTS_COUNT; i++) {
GParamSpec *spec;
spec = tests[i].get_spec (&tests[i], FALSE);
klass->param_names[2 * i] = g_strdup (g_param_spec_get_name (spec));
- g_object_class_install_property (object, 2 * i + 1, spec);
+ g_object_class_install_property (object_class, 2 * i + 1, spec);
spec = tests[i].get_spec (&tests[i], TRUE);
klass->param_names[2 * i + 1] = g_strdup (g_param_spec_get_name (spec));
- g_object_class_install_property (object, 2 * i + 2, spec);
+ g_object_class_install_property (object_class, 2 * i + 2, spec);
}
+
+ basesink_class->preroll = GST_DEBUG_FUNCPTR (gst_test_render_buffer);
+ basesink_class->render = GST_DEBUG_FUNCPTR (gst_test_render_buffer);
+ basesink_class->event = GST_DEBUG_FUNCPTR (gst_test_sink_event);
+ basesink_class->start = GST_DEBUG_FUNCPTR (gst_test_start);
+ basesink_class->stop = GST_DEBUG_FUNCPTR (gst_test_stop);
}
static void
@@ -110,13 +130,6 @@ gst_test_init (GstTest * test, GstTestClass * g_class)
GstTestClass *klass;
guint i;
- GST_FLAG_SET (test, GST_ELEMENT_EVENT_AWARE);
-
- test->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
- gst_element_add_pad (GST_ELEMENT (test), test->sinkpad);
- gst_pad_set_chain_function (test->sinkpad,
- GST_DEBUG_FUNCPTR (gst_test_chain));
-
klass = GST_TEST_GET_CLASS (test);
for (i = 0; i < TESTS_COUNT; i++) {
GParamSpec *spec = g_object_class_find_property (G_OBJECT_CLASS (klass),
@@ -150,61 +163,88 @@ tests_set (GstTest * test)
}
}
-static void
-gst_test_chain (GstPad * pad, GstData * data)
+static gboolean
+gst_test_sink_event (GstBaseSink * basesink, GstEvent * event)
{
- guint i;
- GstTest *test = GST_TEST (gst_pad_get_parent (pad));
- GstTestClass *klass = GST_TEST_GET_CLASS (test);
-
- if (GST_IS_EVENT (data)) {
- GstEvent *event = GST_EVENT (data);
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_DISCONTINUOUS:
- if (GST_EVENT_DISCONT_NEW_MEDIA (event)) {
- tests_unset (test);
- tests_set (test);
- }
- break;
- case GST_EVENT_EOS:
- g_object_freeze_notify (G_OBJECT (test));
- for (i = 0; i < TESTS_COUNT; i++) {
- if (test->tests[i]) {
- if (!tests[i].finish (test->tests[i], &test->values[i])) {
- GValue v = { 0, };
- gchar *real, *expected;
-
- expected = gst_value_serialize (&test->values[i]);
- g_value_init (&v, G_VALUE_TYPE (&test->values[i]));
- g_object_get_property (G_OBJECT (test), klass->param_names[2 * i],
- &v);
- real = gst_value_serialize (&v);
- g_value_unset (&v);
- GST_ELEMENT_ERROR (test, STREAM, FORMAT, (NULL),
- ("test %s returned value \"%s\" and not expected value \"%s\"",
- klass->param_names[2 * i], real, expected));
- g_free (real);
- g_free (expected);
- }
- g_object_notify (G_OBJECT (test), klass->param_names[2 * i]);
+ GstTestClass *klass = GST_TEST_GET_CLASS (basesink);
+ GstTest *test = GST_TEST (basesink);
+ gboolean ret = FALSE;
+
+ switch (GST_EVENT_TYPE (event)) {
+/*
+ case GST_EVENT_NEWSEGMENT:
+ if (GST_EVENT_DISCONT_NEW_MEDIA (event)) {
+ tests_unset (test);
+ tests_set (test);
+ }
+ break;
+*/
+ case GST_EVENT_EOS:{
+ gint i;
+
+ g_object_freeze_notify (G_OBJECT (test));
+ for (i = 0; i < TESTS_COUNT; i++) {
+ if (test->tests[i]) {
+ if (!tests[i].finish (test->tests[i], &test->values[i])) {
+ GValue v = { 0, };
+ gchar *real, *expected;
+
+ expected = gst_value_serialize (&test->values[i]);
+ g_value_init (&v, G_VALUE_TYPE (&test->values[i]));
+ g_object_get_property (G_OBJECT (test), klass->param_names[2 * i],
+ &v);
+ real = gst_value_serialize (&v);
+ g_value_unset (&v);
+ GST_ELEMENT_ERROR (test, STREAM, FORMAT, (NULL),
+ ("test %s returned value \"%s\" and not expected value \"%s\"",
+ klass->param_names[2 * i], real, expected));
+ g_free (real);
+ g_free (expected);
}
+ g_object_notify (G_OBJECT (test), klass->param_names[2 * i]);
}
- g_object_thaw_notify (G_OBJECT (test));
- break;
- default:
- break;
+ }
+ g_object_thaw_notify (G_OBJECT (test));
+ ret = TRUE;
+ break;
}
- gst_pad_event_default (pad, event);
- return;
+ default:
+ break;
}
+ return ret;
+}
+
+static GstFlowReturn
+gst_test_render_buffer (GstBaseSink * basesink, GstBuffer * buf)
+{
+ GstTest *test = GST_TEST (basesink);
+ guint i;
+
for (i = 0; i < TESTS_COUNT; i++) {
if (test->tests[i]) {
- tests[i].add (test->tests[i], GST_BUFFER (data));
+ tests[i].add (test->tests[i], buf);
}
}
- gst_data_unref (data);
+ return GST_FLOW_OK;
+}
+
+static gboolean
+gst_test_start (GstBaseSink * sink)
+{
+ GstTest *test = GST_TEST (sink);
+
+ tests_set (test);
+ return TRUE;
+}
+
+static gboolean
+gst_test_stop (GstBaseSink * sink)
+{
+ GstTest *test = GST_TEST (sink);
+
+ tests_unset (test);
+ return TRUE;
}
static void
@@ -223,7 +263,9 @@ gst_test_set_property (GObject * object, guint prop_id,
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} else {
/* expected values */
+ GST_LOCK (test);
g_value_copy (value, &test->values[prop_id / 2 - 1]);
+ GST_UNLOCK (test);
}
}
@@ -239,6 +281,8 @@ gst_test_get_property (GObject * object, guint prop_id, GValue * value,
return;
}
+ GST_LOCK (test);
+
if (prop_id % 2) {
/* real values */
tests[id].get_value (test->tests[id], value);
@@ -246,6 +290,8 @@ gst_test_get_property (GObject * object, guint prop_id, GValue * value,
/* expected values */
g_value_copy (&test->values[id], value);
}
+
+ GST_UNLOCK (test);
}
gboolean