mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 14:56:36 +00:00
gst/adder/gstadder.*: Implement release_request_pad.
Original commit message from CVS: * gst/adder/gstadder.c: (gst_adder_class_init), (gst_adder_init), (gst_adder_request_new_pad), (gst_adder_release_pad): * gst/adder/gstadder.h: Implement release_request_pad. Make padcounter atomic. * tests/check/elements/adder.c: (GST_START_TEST), (adder_suite): Added check for release_pad in adder.
This commit is contained in:
parent
81286de66f
commit
28cbbee0fb
4 changed files with 118 additions and 8 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2006-05-30 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/adder/gstadder.c: (gst_adder_class_init), (gst_adder_init),
|
||||||
|
(gst_adder_request_new_pad), (gst_adder_release_pad):
|
||||||
|
* gst/adder/gstadder.h:
|
||||||
|
Implement release_request_pad.
|
||||||
|
Make padcounter atomic.
|
||||||
|
|
||||||
|
* tests/check/elements/adder.c: (GST_START_TEST), (adder_suite):
|
||||||
|
Added check for release_pad in adder.
|
||||||
|
|
||||||
2006-05-30 Wim Taymans <wim@fluendo.com>
|
2006-05-30 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* ext/ogg/gstoggdemux.c: (gst_ogg_chain_new_stream):
|
* ext/ogg/gstoggdemux.c: (gst_ogg_chain_new_stream):
|
||||||
|
|
|
@ -101,6 +101,8 @@ static gboolean gst_adder_sink_event (GstPad * pad, GstEvent * event);
|
||||||
|
|
||||||
static GstPad *gst_adder_request_new_pad (GstElement * element,
|
static GstPad *gst_adder_request_new_pad (GstElement * element,
|
||||||
GstPadTemplate * temp, const gchar * unused);
|
GstPadTemplate * temp, const gchar * unused);
|
||||||
|
static void gst_adder_release_pad (GstElement * element, GstPad * pad);
|
||||||
|
|
||||||
static GstStateChangeReturn gst_adder_change_state (GstElement * element,
|
static GstStateChangeReturn gst_adder_change_state (GstElement * element,
|
||||||
GstStateChange transition);
|
GstStateChange transition);
|
||||||
|
|
||||||
|
@ -510,6 +512,7 @@ gst_adder_class_init (GstAdderClass * klass)
|
||||||
parent_class = g_type_class_peek_parent (klass);
|
parent_class = g_type_class_peek_parent (klass);
|
||||||
|
|
||||||
gstelement_class->request_new_pad = gst_adder_request_new_pad;
|
gstelement_class->request_new_pad = gst_adder_request_new_pad;
|
||||||
|
gstelement_class->release_pad = gst_adder_release_pad;
|
||||||
gstelement_class->change_state = gst_adder_change_state;
|
gstelement_class->change_state = gst_adder_change_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -532,7 +535,7 @@ gst_adder_init (GstAdder * adder)
|
||||||
gst_element_add_pad (GST_ELEMENT (adder), adder->srcpad);
|
gst_element_add_pad (GST_ELEMENT (adder), adder->srcpad);
|
||||||
|
|
||||||
adder->format = GST_ADDER_FORMAT_UNSET;
|
adder->format = GST_ADDER_FORMAT_UNSET;
|
||||||
adder->numpads = 0;
|
adder->padcount = 0;
|
||||||
adder->func = NULL;
|
adder->func = NULL;
|
||||||
|
|
||||||
/* keep track of the sinkpads requested */
|
/* keep track of the sinkpads requested */
|
||||||
|
@ -559,16 +562,19 @@ gst_adder_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
||||||
gchar *name;
|
gchar *name;
|
||||||
GstAdder *adder;
|
GstAdder *adder;
|
||||||
GstPad *newpad;
|
GstPad *newpad;
|
||||||
|
gint padcount;
|
||||||
g_return_val_if_fail (GST_IS_ADDER (element), NULL);
|
|
||||||
|
|
||||||
if (templ->direction != GST_PAD_SINK)
|
if (templ->direction != GST_PAD_SINK)
|
||||||
goto not_sink;
|
goto not_sink;
|
||||||
|
|
||||||
adder = GST_ADDER (element);
|
adder = GST_ADDER (element);
|
||||||
|
|
||||||
name = g_strdup_printf ("sink%d", adder->numpads);
|
/* increment pad counter */
|
||||||
|
padcount = g_atomic_int_exchange_and_add (&adder->padcount, 1);
|
||||||
|
|
||||||
|
name = g_strdup_printf ("sink%d", padcount);
|
||||||
newpad = gst_pad_new_from_template (templ, name);
|
newpad = gst_pad_new_from_template (templ, name);
|
||||||
|
GST_DEBUG_OBJECT (adder, "request new pad %s", name);
|
||||||
g_free (name);
|
g_free (name);
|
||||||
|
|
||||||
gst_pad_set_getcaps_function (newpad,
|
gst_pad_set_getcaps_function (newpad,
|
||||||
|
@ -582,11 +588,10 @@ gst_adder_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
||||||
adder->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad);
|
adder->collect_event = (GstPadEventFunction) GST_PAD_EVENTFUNC (newpad);
|
||||||
gst_pad_set_event_function (newpad, GST_DEBUG_FUNCPTR (gst_adder_sink_event));
|
gst_pad_set_event_function (newpad, GST_DEBUG_FUNCPTR (gst_adder_sink_event));
|
||||||
|
|
||||||
|
/* takes ownership of the pad */
|
||||||
if (!gst_element_add_pad (GST_ELEMENT (adder), newpad))
|
if (!gst_element_add_pad (GST_ELEMENT (adder), newpad))
|
||||||
goto could_not_add;
|
goto could_not_add;
|
||||||
|
|
||||||
adder->numpads++;
|
|
||||||
|
|
||||||
return newpad;
|
return newpad;
|
||||||
|
|
||||||
/* errors */
|
/* errors */
|
||||||
|
@ -597,12 +602,26 @@ not_sink:
|
||||||
}
|
}
|
||||||
could_not_add:
|
could_not_add:
|
||||||
{
|
{
|
||||||
|
GST_DEBUG_OBJECT (adder, "could not add pad");
|
||||||
gst_collect_pads_remove_pad (adder->collect, newpad);
|
gst_collect_pads_remove_pad (adder->collect, newpad);
|
||||||
gst_object_unref (newpad);
|
gst_object_unref (newpad);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_adder_release_pad (GstElement * element, GstPad * pad)
|
||||||
|
{
|
||||||
|
GstAdder *adder;
|
||||||
|
|
||||||
|
adder = GST_ADDER (element);
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (adder, "release pad %s:%s", GST_DEBUG_PAD_NAME (pad));
|
||||||
|
|
||||||
|
gst_collect_pads_remove_pad (adder->collect, pad);
|
||||||
|
gst_element_remove_pad (element, pad);
|
||||||
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_adder_collected (GstCollectPads * pads, gpointer user_data)
|
gst_adder_collected (GstCollectPads * pads, gpointer user_data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,7 +52,8 @@ struct _GstAdder {
|
||||||
|
|
||||||
GstPad *srcpad;
|
GstPad *srcpad;
|
||||||
GstCollectPads *collect;
|
GstCollectPads *collect;
|
||||||
gint numpads;
|
/* pad counter, used for creating unique request pads */
|
||||||
|
gint padcount;
|
||||||
|
|
||||||
/* the next are valid for both int and float */
|
/* the next are valid for both int and float */
|
||||||
GstAdderFormat format;
|
GstAdderFormat format;
|
||||||
|
|
|
@ -287,7 +287,7 @@ GST_START_TEST (test_play_twice)
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
/* check if adding and removing pads work as expected */
|
/* check if adding pads work as expected */
|
||||||
GST_START_TEST (test_add_pad)
|
GST_START_TEST (test_add_pad)
|
||||||
{
|
{
|
||||||
GstElement *bin, *src1, *src2, *adder, *sink;
|
GstElement *bin, *src1, *src2, *adder, *sink;
|
||||||
|
@ -363,6 +363,84 @@ GST_START_TEST (test_add_pad)
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
|
/* check if removing pads work as expected */
|
||||||
|
GST_START_TEST (test_remove_pad)
|
||||||
|
{
|
||||||
|
GstElement *bin, *src, *adder, *sink;
|
||||||
|
GstBus *bus;
|
||||||
|
GstPad *pad;
|
||||||
|
gboolean res;
|
||||||
|
|
||||||
|
GST_INFO ("preparing test");
|
||||||
|
|
||||||
|
/* build pipeline */
|
||||||
|
bin = gst_pipeline_new ("pipeline");
|
||||||
|
bus = gst_element_get_bus (bin);
|
||||||
|
gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
|
||||||
|
|
||||||
|
src = gst_element_factory_make ("audiotestsrc", "src");
|
||||||
|
g_object_set (src, "num-buffers", 4, NULL);
|
||||||
|
g_object_set (src, "wave", 4, NULL);
|
||||||
|
adder = gst_element_factory_make ("adder", "adder");
|
||||||
|
sink = gst_element_factory_make ("fakesink", "sink");
|
||||||
|
gst_bin_add_many (GST_BIN (bin), src, adder, sink, NULL);
|
||||||
|
|
||||||
|
res = gst_element_link (src, adder);
|
||||||
|
fail_unless (res == TRUE, NULL);
|
||||||
|
res = gst_element_link (adder, sink);
|
||||||
|
fail_unless (res == TRUE, NULL);
|
||||||
|
|
||||||
|
/* create an unconnected sinkpad in adder */
|
||||||
|
pad = gst_element_get_request_pad (adder, "sink%d");
|
||||||
|
fail_if (pad == NULL, NULL);
|
||||||
|
|
||||||
|
main_loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
g_signal_connect (bus, "message::segment-done", (GCallback) message_received,
|
||||||
|
bin);
|
||||||
|
g_signal_connect (bus, "message::error", (GCallback) message_received, bin);
|
||||||
|
g_signal_connect (bus, "message::warning", (GCallback) message_received, bin);
|
||||||
|
g_signal_connect (bus, "message::eos", (GCallback) message_received, bin);
|
||||||
|
|
||||||
|
GST_INFO ("starting test");
|
||||||
|
|
||||||
|
/* prepare playing, this will not preroll as adder is waiting
|
||||||
|
* on the unconnected sinkpad. */
|
||||||
|
res = gst_element_set_state (bin, GST_STATE_PAUSED);
|
||||||
|
fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
|
||||||
|
|
||||||
|
/* wait for completion for one second, will return ASYNC */
|
||||||
|
res = gst_element_get_state (GST_ELEMENT (bin), NULL, NULL, GST_SECOND);
|
||||||
|
fail_unless (res == GST_STATE_CHANGE_ASYNC, NULL);
|
||||||
|
|
||||||
|
/* get rid of the pad now, adder should stop waiting on it and
|
||||||
|
* continue the preroll */
|
||||||
|
gst_element_release_request_pad (adder, pad);
|
||||||
|
gst_object_unref (pad);
|
||||||
|
|
||||||
|
/* wait for completion, should work now */
|
||||||
|
res =
|
||||||
|
gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
|
||||||
|
GST_CLOCK_TIME_NONE);
|
||||||
|
fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
|
||||||
|
|
||||||
|
/* now play all */
|
||||||
|
res = gst_element_set_state (bin, GST_STATE_PLAYING);
|
||||||
|
fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
|
||||||
|
|
||||||
|
g_main_loop_run (main_loop);
|
||||||
|
|
||||||
|
res = gst_element_set_state (bin, GST_STATE_NULL);
|
||||||
|
fail_unless (res != GST_STATE_CHANGE_FAILURE, NULL);
|
||||||
|
|
||||||
|
/* cleanup */
|
||||||
|
g_main_loop_unref (main_loop);
|
||||||
|
gst_object_unref (G_OBJECT (bus));
|
||||||
|
gst_object_unref (G_OBJECT (bin));
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_END_TEST;
|
||||||
|
|
||||||
|
|
||||||
Suite *
|
Suite *
|
||||||
adder_suite (void)
|
adder_suite (void)
|
||||||
{
|
{
|
||||||
|
@ -373,6 +451,7 @@ adder_suite (void)
|
||||||
tcase_add_test (tc_chain, test_event);
|
tcase_add_test (tc_chain, test_event);
|
||||||
tcase_add_test (tc_chain, test_play_twice);
|
tcase_add_test (tc_chain, test_play_twice);
|
||||||
tcase_add_test (tc_chain, test_add_pad);
|
tcase_add_test (tc_chain, test_add_pad);
|
||||||
|
tcase_add_test (tc_chain, test_remove_pad);
|
||||||
|
|
||||||
/* Use a longer timeout */
|
/* Use a longer timeout */
|
||||||
tcase_set_timeout (tc_chain, 6);
|
tcase_set_timeout (tc_chain, 6);
|
||||||
|
|
Loading…
Reference in a new issue