check/gst/gstghostpad.c: Added check for bug #317341
authorWim Taymans <wim.taymans@gmail.com>
Thu, 10 Nov 2005 09:19:12 +0000 (09:19 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Thu, 10 Nov 2005 09:19:12 +0000 (09:19 +0000)
Original commit message from CVS:
* check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
Added check for bug #317341

* gst/gstbuffer.c:
* gst/gstbuffer.h:
Some more spiffifying.

* gst/gstghostpad.c: (gst_ghost_pad_do_link):
Call peer linkfunction if we are a source pad. Totally fixes
#317341

* gst/gstpad.c:
Update docs, source pads should call the peer linkfunction
so they can atomically perform the pad link.

ChangeLog
check/gst/gstghostpad.c
gst/gstbuffer.c
gst/gstbuffer.h
gst/gstghostpad.c
gst/gstpad.c
tests/check/gst/gstghostpad.c

index 9abb13240e2ce389ce9b90117baf04943538041c..dea19bc91abbfc1f52a325a5bcdddc19abca7283 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2005-11-10  Wim Taymans  <wim@fluendo.com>
+
+       * check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
+       Added check for bug #317341
+
+       * gst/gstbuffer.c:
+       * gst/gstbuffer.h:
+       Some more spiffifying.
+
+       * gst/gstghostpad.c: (gst_ghost_pad_do_link):
+       Call peer linkfunction if we are a source pad. Totally fixes
+       #317341
+
+       * gst/gstpad.c:
+       Update docs, source pads should call the peer linkfunction
+       so they can atomically perform the pad link.
+
 2005-11-09  Wim Taymans  <wim@fluendo.com>
 
        * gst/gstbuffer.c:
index c410b529a26f33f9cb9ce5966e78f6e309c77ee3..1dce9d4f065a88e8778789e24ab556bd00f1ce8e 100644 (file)
@@ -104,7 +104,7 @@ GST_END_TEST;
 
 #if 0
 /* test if a ghost pad without a target can be linked
- *
+ * It can't because it has incompatible caps...
  */
 GST_START_TEST (test_ghost_pad_notarget)
 {
@@ -287,6 +287,46 @@ GST_START_TEST (test_ghost_pads)
 
 GST_END_TEST;
 
+GST_START_TEST (test_ghost_pads_bin)
+{
+  GstBin *pipeline;
+  GstBin *srcbin;
+  GstBin *sinkbin;
+  GstElement *src;
+  GstElement *sink;
+  GstPad *srcghost;
+  GstPad *sinkghost;
+
+  pipeline = GST_BIN (gst_pipeline_new ("pipe"));
+
+  srcbin = GST_BIN (gst_bin_new ("srcbin"));
+  gst_bin_add (pipeline, GST_ELEMENT (srcbin));
+
+  sinkbin = GST_BIN (gst_bin_new ("sinkbin"));
+  gst_bin_add (pipeline, GST_ELEMENT (sinkbin));
+
+  src = gst_element_factory_make ("fakesrc", "src");
+  gst_bin_add (srcbin, src);
+  srcghost = gst_ghost_pad_new ("src", gst_element_get_pad (src, "src"));
+  gst_element_add_pad (GST_ELEMENT (srcbin), srcghost);
+
+  sink = gst_element_factory_make ("fakesink", "sink");
+  gst_bin_add (sinkbin, sink);
+  sinkghost = gst_ghost_pad_new ("sink", gst_element_get_pad (sink, "sink"));
+  gst_element_add_pad (GST_ELEMENT (sinkbin), sinkghost);
+
+  gst_element_link (GST_ELEMENT (srcbin), GST_ELEMENT (sinkbin));
+
+  fail_unless (GST_PAD_PEER (srcghost) != NULL);
+  fail_unless (GST_PAD_PEER (sinkghost) != NULL);
+  fail_unless (GST_PAD_PEER (gst_ghost_pad_get_target (GST_GHOST_PAD
+              (srcghost))) != NULL);
+  fail_unless (GST_PAD_PEER (gst_ghost_pad_get_target (GST_GHOST_PAD
+              (sinkghost))) != NULL);
+}
+
+GST_END_TEST;
+
 Suite *
 gst_ghost_pad_suite (void)
 {
@@ -298,6 +338,7 @@ gst_ghost_pad_suite (void)
   tcase_add_test (tc_chain, test_remove2);
   tcase_add_test (tc_chain, test_link);
   tcase_add_test (tc_chain, test_ghost_pads);
+  tcase_add_test (tc_chain, test_ghost_pads_bin);
 /*  tcase_add_test (tc_chain, test_ghost_pad_notarget); */
 
   return s;
index 3a164cae2ff9646a15a72f158cc068182c7e930a..3a84ea29107dd53d7dc7473a8e0ed93c57147b90 100644 (file)
@@ -25,7 +25,7 @@
  * @short_description: Data-passing buffer type, supporting sub-buffers.
  * @see_also: #GstPad, #GstMiniObject
  *
- * Buffers are the basic unit of data transfer in GStreamer.  The GstBuffer type
+ * Buffers are the basic unit of data transfer in GStreamer.  The #GstBuffer type
  * provides all the state necessary to define a region of memory as part of a
  * stream.  Sub-buffers are also supported, allowing a smaller region of a
  * buffer to become its own buffer, with mechanisms in place to ensure that
index 14f518c7672d7ce8f10431b27cec4fd82f925ace..21538d78a7795ccbe518adea98e91664c61fcbe9 100644 (file)
@@ -209,9 +209,9 @@ typedef enum {
  * @mini_object: the parent structure
  * @data: pointer to the buffer data
  * @size: size of buffer data
- * @timestamp: timestamp of the buffer, can be GST_CLOCK_TIME_NONE when the
+ * @timestamp: timestamp of the buffer, can be #GST_CLOCK_TIME_NONE when the
  *     timestamp is not known or relevant.
- * @duration: duration in time of the buffer data, can be GST_CLOCK_TIME_NONE
+ * @duration: duration in time of the buffer data, can be #GST_CLOCK_TIME_NONE
  *     when the duration is not known or relevant.
  * @caps: the #GstCaps describing the data format in this buffer
  * @offset: a media specific offset for the buffer data. 
index a93c59b0f4d32e82e11550b2e3b8ceaa7abb4f46..4c9b18bd404ddfcf88027a3839020201bee0369d 100644 (file)
@@ -615,6 +615,13 @@ gst_ghost_pad_do_link (GstPad * pad, GstPad * peer)
   else
     ret = gst_pad_link (target, internal);
 
+  /* if we are a source pad, we should call the peer link function
+   * if the peer has one */
+  if (GST_PAD_IS_SRC (pad)) {
+    if (GST_PAD_LINKFUNC (peer) && ret == GST_PAD_LINK_OK)
+      ret = GST_PAD_LINKFUNC (peer) (peer, pad);
+  }
+
   gst_object_unref (target);
 
   if (ret == GST_PAD_LINK_OK)
index 0abd97e29f927b4f011c12718b6e0bf1ef56ae62..de6fbf45f81ee85f817419e654b646edd63229dc 100644 (file)
@@ -1208,11 +1208,14 @@ gst_pad_set_internal_link_function (GstPad * pad, GstPadIntLinkFunction intlink)
  * Sets the given link function for the pad. It will be called when
  * the pad is linked with another pad.
  *
- * The return value GST_PAD_LINK_OK should be used when the connection can be
+ * The return value #GST_PAD_LINK_OK should be used when the connection can be
  * made.
  *
- * The return value GST_PAD_LINK_REFUSED should be used when the connection
+ * The return value #GST_PAD_LINK_REFUSED should be used when the connection
  * cannot be made for some reason.
+ *
+ * If @link is installed on a source pad, it should call the #GstPadLinkFunction
+ * of the peer sink pad, if present.
  */
 void
 gst_pad_set_link_function (GstPad * pad, GstPadLinkFunction link)
index c410b529a26f33f9cb9ce5966e78f6e309c77ee3..1dce9d4f065a88e8778789e24ab556bd00f1ce8e 100644 (file)
@@ -104,7 +104,7 @@ GST_END_TEST;
 
 #if 0
 /* test if a ghost pad without a target can be linked
- *
+ * It can't because it has incompatible caps...
  */
 GST_START_TEST (test_ghost_pad_notarget)
 {
@@ -287,6 +287,46 @@ GST_START_TEST (test_ghost_pads)
 
 GST_END_TEST;
 
+GST_START_TEST (test_ghost_pads_bin)
+{
+  GstBin *pipeline;
+  GstBin *srcbin;
+  GstBin *sinkbin;
+  GstElement *src;
+  GstElement *sink;
+  GstPad *srcghost;
+  GstPad *sinkghost;
+
+  pipeline = GST_BIN (gst_pipeline_new ("pipe"));
+
+  srcbin = GST_BIN (gst_bin_new ("srcbin"));
+  gst_bin_add (pipeline, GST_ELEMENT (srcbin));
+
+  sinkbin = GST_BIN (gst_bin_new ("sinkbin"));
+  gst_bin_add (pipeline, GST_ELEMENT (sinkbin));
+
+  src = gst_element_factory_make ("fakesrc", "src");
+  gst_bin_add (srcbin, src);
+  srcghost = gst_ghost_pad_new ("src", gst_element_get_pad (src, "src"));
+  gst_element_add_pad (GST_ELEMENT (srcbin), srcghost);
+
+  sink = gst_element_factory_make ("fakesink", "sink");
+  gst_bin_add (sinkbin, sink);
+  sinkghost = gst_ghost_pad_new ("sink", gst_element_get_pad (sink, "sink"));
+  gst_element_add_pad (GST_ELEMENT (sinkbin), sinkghost);
+
+  gst_element_link (GST_ELEMENT (srcbin), GST_ELEMENT (sinkbin));
+
+  fail_unless (GST_PAD_PEER (srcghost) != NULL);
+  fail_unless (GST_PAD_PEER (sinkghost) != NULL);
+  fail_unless (GST_PAD_PEER (gst_ghost_pad_get_target (GST_GHOST_PAD
+              (srcghost))) != NULL);
+  fail_unless (GST_PAD_PEER (gst_ghost_pad_get_target (GST_GHOST_PAD
+              (sinkghost))) != NULL);
+}
+
+GST_END_TEST;
+
 Suite *
 gst_ghost_pad_suite (void)
 {
@@ -298,6 +338,7 @@ gst_ghost_pad_suite (void)
   tcase_add_test (tc_chain, test_remove2);
   tcase_add_test (tc_chain, test_link);
   tcase_add_test (tc_chain, test_ghost_pads);
+  tcase_add_test (tc_chain, test_ghost_pads_bin);
 /*  tcase_add_test (tc_chain, test_ghost_pad_notarget); */
 
   return s;