gstpad: Return pad template in get_caps if pad is not negotiable
authorEdward Hervey <bilboed@bilboed.com>
Mon, 17 May 2010 13:06:37 +0000 (15:06 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Mon, 14 Jun 2010 15:08:14 +0000 (17:08 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=618644

gst/gstpad.c
tests/check/gst/gstghostpad.c

index 5cd434f..e376857 100644 (file)
@@ -2181,6 +2181,14 @@ gst_pad_get_caps_unlocked (GstPad * pad)
 
   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get pad caps");
 
+  /* If the parent element is in GST_STATE_NULL, return the template caps */
+  if (G_UNLIKELY (!GST_PAD_IS_NEGOTIABLE (pad) && GST_PAD_PAD_TEMPLATE (pad))) {
+    GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
+        "parent element is in GST_STATE_NULL, using pad templates");
+    result = gst_caps_ref (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad)));
+    goto done;
+  }
+
   if (GST_PAD_GETCAPSFUNC (pad)) {
     GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
         "dispatching to pad getcaps function");
index b78538a..a752550 100644 (file)
@@ -591,6 +591,9 @@ GST_START_TEST (test_ghost_pads_new_from_template)
   /* check template is properly set */
   fail_unless (GST_PAD_PAD_TEMPLATE (ghostpad) == ghosttempl);
 
+  /* Set pad negotiable so the getcaps call goes through */
+  gst_pad_set_negotiable (ghostpad, TRUE);
+
   /* check ghostpad caps are from the sinkpad */
   newcaps = gst_pad_get_caps (ghostpad);
   fail_unless (newcaps != NULL);
@@ -645,6 +648,9 @@ GST_START_TEST (test_ghost_pads_new_no_target_from_template)
 
   fail_unless (gst_ghost_pad_set_target ((GstGhostPad *) ghostpad, sinkpad));
 
+  /* set pad negotiable so the getcaps call goes through */
+  gst_pad_set_negotiable (ghostpad, TRUE);
+
   /* check ghostpad caps are now from the target pad */
   newcaps = gst_pad_get_caps (ghostpad);
   fail_unless (newcaps != NULL);