From: <tp...@ke...> - 2007-03-28 18:38:28
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: tpm Date: Wed Mar 28 2007 18:38:23 UTC Log message: * plugins/elements/gstmultiqueue.c: (gst_single_queue_free): Don't leak GCond. * tests/check/Makefile.am: * tests/check/elements/.cvsignore: * tests/check/elements/multiqueue.c: (setup_multiqueue), (GST_START_TEST), (multiqueue_suite): Add some dead simple unit tests for the 'multiqueue' element (some bits don't work yet and are disabled for now). Modified files: . : ChangeLog plugins/elements: gstmultiqueue.c tests/check : Makefile.am tests/check/elements: .cvsignore Added files: tests/check/elements: multiqueue.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/ChangeLog.diff?r1=1.3138&r2=1.3139 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/plugins/elements/gstmultiqueue.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/tests/check/Makefile.am.diff?r1=1.120&r2=1.121 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/tests/check/elements/.cvsignore.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/tests/check/elements/multiqueue.c?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gstreamer/ChangeLog,v retrieving revision 1.3138 retrieving revision 1.3139 diff -u -d -r1.3138 -r1.3139 --- ChangeLog 28 Mar 2007 18:25:15 -0000 1.3138 +++ ChangeLog 28 Mar 2007 18:38:11 -0000 1.3139 @@ -1,5 +1,17 @@ 2007-03-28 Tim-Philipp Müller <tim at centricular dot net> + * plugins/elements/gstmultiqueue.c: (gst_single_queue_free): + Don't leak GCond. + + * tests/check/Makefile.am: + * tests/check/elements/.cvsignore: + * tests/check/elements/multiqueue.c: (setup_multiqueue), + (GST_START_TEST), (multiqueue_suite): + Add some dead simple unit tests for the 'multiqueue' element + (some bits don't work yet and are disabled for now). +2007-03-28 Tim-Philipp Müller <tim at centricular dot net> * gst/gstelement.c: (gst_element_get_request_pad), (gst_element_class_get_request_pad_template): Make gst_element_get_request_pad() create request pads only for Index: gstmultiqueue.c RCS file: /cvs/gstreamer/gstreamer/plugins/elements/gstmultiqueue.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstmultiqueue.c 12 Mar 2007 14:23:16 -0000 1.5 +++ gstmultiqueue.c 28 Mar 2007 18:38:11 -0000 1.6 @@ -998,6 +998,7 @@ /* DRAIN QUEUE */ gst_data_queue_flush (sq->queue); g_object_unref (sq->queue); + g_cond_free (sq->turn); g_free (sq); } Index: Makefile.am RCS file: /cvs/gstreamer/gstreamer/tests/check/Makefile.am,v retrieving revision 1.120 retrieving revision 1.121 diff -u -d -r1.120 -r1.121 --- Makefile.am 28 Feb 2007 12:43:57 -0000 1.120 +++ Makefile.am 28 Mar 2007 18:38:11 -0000 1.121 @@ -59,6 +59,7 @@ elements/fdsrc \ elements/filesrc \ elements/identity \ + elements/multiqueue \ libs/basesrc \ libs/controller \ libs/typefindhelper \ Index: .cvsignore RCS file: /cvs/gstreamer/gstreamer/tests/check/elements/.cvsignore,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- .cvsignore 21 Dec 2006 09:58:25 -0000 1.7 +++ .cvsignore 28 Mar 2007 18:38:11 -0000 1.8 @@ -4,5 +4,6 @@ fdsrc filesrc identity +multiqueue queue *.check.xml --- NEW FILE: multiqueue.c --- /* GStreamer unit tests for multiqueue * * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net> * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include <unistd.h> #include <gst/check/gstcheck.h> static GstElement * setup_multiqueue (GstElement * pipe, GstElement * inputs[], GstElement * outputs[], guint num) { GstElement *mq; guint i; mq = gst_element_factory_make ("multiqueue", NULL); fail_unless (mq != NULL, "failed to create 'multiqueue' element"); gst_bin_add (GST_BIN (pipe), mq); for (i = 0; i < num; ++i) { GstPad *sinkpad = NULL; GstPad *srcpad = NULL; /* create multiqueue sink (and source) pad */ sinkpad = gst_element_get_request_pad (mq, "sink%d"); fail_unless (sinkpad != NULL, "failed to create multiqueue request pad #%u", i); /* link input element N to the N-th multiqueue sink pad we just created */ if (inputs != NULL && inputs[i] != NULL) { gst_bin_add (GST_BIN (pipe), inputs[i]); srcpad = gst_element_get_pad (inputs[i], "src"); if (srcpad == NULL) srcpad = gst_element_get_pad (inputs[i], "src%d"); srcpad = gst_element_get_pad (inputs[i], "src_%d"); fail_unless (srcpad != NULL, "failed to find src pad for input #%u", i); fail_unless_equals_int (GST_PAD_LINK_OK, gst_pad_link (srcpad, sinkpad)); gst_object_unref (srcpad); srcpad = NULL; } gst_object_unref (sinkpad); sinkpad = NULL; /* link output element N to the N-th multiqueue src pad */ if (outputs != NULL && outputs[i] != NULL) { gchar padname[10]; /* only the sink pads are by request, the source pads are sometimes pads, * so this should return NULL */ srcpad = gst_element_get_request_pad (mq, "src%d"); fail_unless (srcpad == NULL); g_snprintf (padname, sizeof (padname), "src%d", i); srcpad = gst_element_get_pad (mq, padname); fail_unless (srcpad != NULL, "failed to get multiqueue src pad #%u", i); fail_unless (GST_PAD_IS_SRC (srcpad), "%s:%s is not a source pad?!", GST_DEBUG_PAD_NAME (srcpad)); gst_bin_add (GST_BIN (pipe), outputs[i]); sinkpad = gst_element_get_pad (outputs[i], "sink"); if (sinkpad == NULL) sinkpad = gst_element_get_pad (outputs[i], "sink%d"); sinkpad = gst_element_get_pad (outputs[i], "sink_%d"); fail_unless (sinkpad != NULL, "failed to find sink pad of output #%u", i); fail_unless (GST_PAD_IS_SINK (sinkpad)); gst_object_unref (sinkpad); } return mq; } GST_START_TEST (test_simple_pipeline) GstElement *pipe, *mq; GstElement *inputs[1]; GstElement *outputs[1]; GstMessage *msg; pipe = gst_pipeline_new ("pipeline"); inputs[0] = gst_element_factory_make ("fakesrc", NULL); fail_unless (inputs[0] != NULL, "failed to create 'fakesrc' element"); g_object_set (inputs[0], "num-buffers", 256, NULL); outputs[0] = gst_element_factory_make ("fakesink", NULL); fail_unless (outputs[0] != NULL, "failed to create 'fakesink' element"); mq = setup_multiqueue (pipe, inputs, outputs, 1); gst_element_set_state (pipe, GST_STATE_PLAYING); msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1); fail_if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR, "Expected EOS message, got ERROR message"); gst_message_unref (msg); GST_LOG ("Got EOS, cleaning up"); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref (pipe); GST_END_TEST; GST_START_TEST (test_simple_shutdown_while_running) gst_element_set_state (pipe, GST_STATE_PAUSED); /* wait until pipeline is up and running */ GST_MESSAGE_ERROR | GST_MESSAGE_ASYNC_DONE, -1); fail_if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR, "Got ERROR message"); GST_LOG ("pipeline is running now"); /* wait a bit to accumulate some buffers in the queue (while it's blocking * in the sink) */ msg = gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, GST_SECOND / 4); if (msg) g_error ("Got ERROR message"); /* now shut down only the sink, so the queue gets a wrong-state flow return */ gst_element_set_state (outputs[0], GST_STATE_NULL); gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, GST_SECOND / 2); GST_LOG ("Cleaning up"); GST_START_TEST (test_simple_create_destroy) gst_object_unref (mq); GST_START_TEST (test_request_pads) gboolean change_state_before_cleanup = TRUE; GstPad *sink1, *sink2; again: sink1 = gst_element_get_request_pad (mq, "foo%d"); fail_unless (sink1 == NULL, "Expected NULL pad, as there is no request pad template for 'foo%%d'"); sink1 = gst_element_get_request_pad (mq, "src%d"); "Expected NULL pad, as there is no request pad template for 'src%%d'"); sink1 = gst_element_get_request_pad (mq, "sink%d"); fail_unless (sink1 != NULL); fail_unless (GST_IS_PAD (sink1)); fail_unless (GST_PAD_IS_SINK (sink1)); GST_LOG ("Got pad %s:%s", GST_DEBUG_PAD_NAME (sink1)); sink2 = gst_element_get_request_pad (mq, "sink%d"); fail_unless (sink2 != NULL); fail_unless (GST_IS_PAD (sink2)); fail_unless (GST_PAD_IS_SINK (sink2)); GST_LOG ("Got pad %s:%s", GST_DEBUG_PAD_NAME (sink2)); fail_unless (sink1 != sink2); if (change_state_before_cleanup) { /* FIXME: if we don't change state, it will deadlock forever when unref'ing * the queue (waiting for pad tasks to join) */ GST_LOG ("Changing state to PLAYING"); gst_element_set_state (mq, GST_STATE_PLAYING); g_usleep (G_USEC_PER_SEC); GST_LOG ("Changing state to NULL"); gst_element_set_state (mq, GST_STATE_NULL); gst_object_unref (sink1); gst_object_unref (sink2); /* FIXME: this should work without state change before cleanup as well, * but currently doesn't, see above, so disable this for now */ if (change_state_before_cleanup && 0) { change_state_before_cleanup = FALSE; goto again; static Suite * multiqueue_suite (void) Suite *s = suite_create ("multiqueue"); TCase *tc_chain = tcase_create ("general"); suite_add_tcase (s, tc_chain); tcase_add_test (tc_chain, test_simple_create_destroy); tcase_add_test (tc_chain, test_simple_pipeline); if (0) { /* FIXME: this leaks buffers, disabled for now */ tcase_add_test (tc_chain, test_simple_shutdown_while_running); /* FIXME: test_request_pads() needs some more fixes, see comments there */ tcase_add_test (tc_chain, test_request_pads); return s; GST_CHECK_MAIN (multiqueue) |