diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-06-08 10:26:02 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-06-08 11:16:31 +0200 |
commit | d5633790856496e4abc0b96ad7559b3ba29a8a32 (patch) | |
tree | 088dc195dac3b66d848b3456cae3b275f8b195e9 | |
parent | 6cdc41627311c199a7d7acd43d439ba9cd036c3c (diff) | |
download | gstreamer-d5633790856496e4abc0b96ad7559b3ba29a8a32.tar.gz |
ghostpad: Don't change the ghostpad caps immediately when the peer caps change
This should only happen during data-flow.
-rw-r--r-- | gst/gstghostpad.c | 73 | ||||
-rw-r--r-- | tests/check/gst/gstghostpad.c | 104 |
2 files changed, 0 insertions, 177 deletions
diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index 1031f5bcfb..4233dc699b 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -74,9 +74,6 @@ static xmlNodePtr gst_proxy_pad_save_thyself (GstObject * object, xmlNodePtr parent); #endif -static void on_src_target_notify (GstPad * target, - GParamSpec * unused, gpointer user_data); - static GParamSpec *pspec_caps = NULL; /** @@ -678,8 +675,6 @@ struct _GstGhostPadPrivate { /* with PROXY_LOCK */ gulong notify_id; - gulong target_caps_notify_id; - gulong target_unlinked_id; gboolean constructed; }; @@ -903,65 +898,6 @@ on_int_notify (GstPad * internal, GParamSpec * unused, GstGhostPad * pad) gst_caps_unref (caps); } -static void -on_src_target_notify (GstPad * target, GParamSpec * unused, gpointer user_data) -{ - GstProxyPad *proxypad; - GstGhostPad *gpad; - GstCaps *caps; - - g_object_get (target, "caps", &caps, NULL); - - GST_OBJECT_LOCK (target); - /* First check if the peer is still available and our proxy pad */ - if (!GST_PAD_PEER (target) || !GST_IS_PROXY_PAD (GST_PAD_PEER (target))) { - GST_OBJECT_UNLOCK (target); - goto done; - } - - proxypad = GST_PROXY_PAD (GST_PAD_PEER (target)); - GST_OBJECT_LOCK (proxypad); - /* Now check if the proxypad's internal pad is still there and - * a ghostpad */ - if (!GST_PROXY_PAD_INTERNAL (proxypad) || - !GST_IS_GHOST_PAD (GST_PROXY_PAD_INTERNAL (proxypad))) { - GST_OBJECT_UNLOCK (proxypad); - GST_OBJECT_UNLOCK (target); - goto done; - } - gpad = GST_GHOST_PAD (GST_PROXY_PAD_INTERNAL (proxypad)); - g_object_ref (gpad); - GST_OBJECT_UNLOCK (proxypad); - GST_OBJECT_UNLOCK (target); - - gst_pad_set_caps (GST_PAD_CAST (gpad), caps); - - g_object_unref (gpad); - -done: - if (caps) - gst_caps_unref (caps); -} - -static void -on_src_target_unlinked (GstPad * pad, GstPad * peer, GstGhostPad * gpad) -{ - GST_DEBUG_OBJECT (pad, "unlinked"); - GST_DEBUG_OBJECT (gpad, "unlinked"); - - if (GST_GHOST_PAD_PRIVATE (gpad)->target_caps_notify_id) { - g_signal_handler_disconnect (pad, - GST_GHOST_PAD_PRIVATE (gpad)->target_caps_notify_id); - GST_GHOST_PAD_PRIVATE (gpad)->target_caps_notify_id = 0; - } - /* And remove our signal */ - if (GST_GHOST_PAD_PRIVATE (gpad)->target_unlinked_id) { - g_signal_handler_disconnect (pad, - GST_GHOST_PAD_PRIVATE (gpad)->target_unlinked_id); - GST_GHOST_PAD_PRIVATE (gpad)->target_unlinked_id = 0; - } -} - /** * gst_ghost_pad_setcaps_default: * @pad: the #GstPad to link. @@ -1428,15 +1364,6 @@ gst_ghost_pad_set_target (GstGhostPad * gpad, GstPad * newtarget) } if (newtarget) { - if (GST_PAD_IS_SRC (newtarget)) { - GST_GHOST_PAD_PRIVATE (gpad)->target_caps_notify_id = - g_signal_connect (newtarget, "notify::caps", - G_CALLBACK (on_src_target_notify), NULL); - GST_GHOST_PAD_PRIVATE (gpad)->target_unlinked_id = - g_signal_connect (newtarget, "unlinked", - G_CALLBACK (on_src_target_unlinked), gpad); - } - /* and link to internal pad without any checks */ GST_DEBUG_OBJECT (gpad, "connecting internal pad to target"); diff --git a/tests/check/gst/gstghostpad.c b/tests/check/gst/gstghostpad.c index 8ba15d614d..b73f1d20ee 100644 --- a/tests/check/gst/gstghostpad.c +++ b/tests/check/gst/gstghostpad.c @@ -670,109 +670,6 @@ GST_START_TEST (test_ghost_pads_new_no_target_from_template) GST_END_TEST; -static void -ghost_notify_caps (GObject * object, GParamSpec * pspec, gpointer * user_data) -{ - GST_DEBUG ("caps notify called"); - (*(gint *) user_data)++; -} - -GST_START_TEST (test_ghost_pads_forward_setcaps) -{ - GstCaps *templ_caps, *caps1, *caps2; - GstPadTemplate *src_template, *sink_template; - GstPad *src, *ghost, *sink; - gint notify_counter = 0; - - templ_caps = gst_caps_from_string ("meh; muh"); - src_template = gst_pad_template_new ("src", GST_PAD_SRC, - GST_PAD_ALWAYS, templ_caps); - - templ_caps = gst_caps_from_string ("muh; meh"); - sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, - GST_PAD_ALWAYS, templ_caps); - - src = gst_pad_new_from_template (src_template, "src"); - sink = gst_pad_new_from_template (sink_template, "sink"); - - /* ghost source pad, setting caps on the source influences the caps of the - * ghostpad. */ - ghost = gst_ghost_pad_new ("ghostsrc", src); - g_signal_connect (ghost, "notify::caps", - G_CALLBACK (ghost_notify_caps), ¬ify_counter); - fail_unless (gst_pad_link (ghost, sink) == GST_PAD_LINK_OK); - - caps1 = gst_caps_from_string ("meh"); - fail_unless (gst_pad_set_caps (src, caps1)); - caps2 = GST_PAD_CAPS (ghost); - fail_unless (gst_caps_is_equal (caps1, caps2)); - fail_unless_equals_int (notify_counter, 1); - - gst_object_unref (ghost); - gst_caps_unref (caps1); - - fail_unless (gst_pad_set_caps (src, NULL)); - - /* source 2, setting the caps on the ghostpad does not influence the caps of - * the target */ - notify_counter = 0; - ghost = gst_ghost_pad_new ("ghostsrc", src); - g_signal_connect (ghost, "notify::caps", - G_CALLBACK (ghost_notify_caps), ¬ify_counter); - fail_unless (gst_pad_link (ghost, sink) == GST_PAD_LINK_OK); - - caps1 = gst_caps_from_string ("meh"); - fail_unless (gst_pad_set_caps (ghost, caps1)); - caps2 = GST_PAD_CAPS (src); - fail_unless (caps2 == NULL); - fail_unless_equals_int (notify_counter, 1); - - gst_object_unref (ghost); - gst_caps_unref (caps1); - - - /* ghost sink pad. Setting caps on the ghostpad will also set those caps on - * the target pad. */ - notify_counter = 0; - ghost = gst_ghost_pad_new ("ghostsink", sink); - g_signal_connect (ghost, "notify::caps", - G_CALLBACK (ghost_notify_caps), ¬ify_counter); - fail_unless (gst_pad_link (src, ghost) == GST_PAD_LINK_OK); - - caps1 = gst_caps_from_string ("muh"); - fail_unless (gst_pad_set_caps (ghost, caps1)); - caps2 = GST_PAD_CAPS (sink); - fail_unless (gst_caps_is_equal (caps1, caps2)); - fail_unless_equals_int (notify_counter, 1); - - gst_object_unref (ghost); - gst_caps_unref (caps1); - - /* sink pad 2, setting caps just on the target pad should not influence the caps - * on the ghostpad. */ - notify_counter = 0; - ghost = gst_ghost_pad_new ("ghostsink", sink); - g_signal_connect (ghost, "notify::caps", - G_CALLBACK (ghost_notify_caps), ¬ify_counter); - fail_unless (gst_pad_link (src, ghost) == GST_PAD_LINK_OK); - - caps1 = gst_caps_from_string ("muh"); - fail_unless (gst_pad_set_caps (sink, caps1)); - caps2 = GST_PAD_CAPS (ghost); - fail_unless (caps2 == NULL); - fail_unless_equals_int (notify_counter, 0); - - gst_object_unref (ghost); - gst_caps_unref (caps1); - - gst_object_unref (src); - gst_object_unref (sink); - gst_object_unref (src_template); - gst_object_unref (sink_template); -} - -GST_END_TEST; - static gint linked_count1; static gint unlinked_count1; static gint linked_count2; @@ -1099,7 +996,6 @@ gst_ghost_pad_suite (void) tcase_add_test (tc_chain, test_ghost_pads_probes); tcase_add_test (tc_chain, test_ghost_pads_new_from_template); tcase_add_test (tc_chain, test_ghost_pads_new_no_target_from_template); - tcase_add_test (tc_chain, test_ghost_pads_forward_setcaps); tcase_add_test (tc_chain, test_ghost_pads_sink_link_unlink); tcase_add_test (tc_chain, test_ghost_pads_src_link_unlink); tcase_add_test (tc_chain, test_ghost_pads_change_when_linked); |