pad: get_allowed_caps() should go through both pads
authorEdward Hervey <edward@centricular.com>
Sat, 8 Aug 2015 12:42:52 +0000 (14:42 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Sat, 8 Aug 2015 12:51:59 +0000 (14:51 +0200)
The previous implementation was doing a direct call to the peer pad,
which resulted in query probes never being called on the original pad.

Instead of that, get the peer pad caps by using gst_pad_peer_query()
which will call probes in the expected fashion.

gst/gstpad.c

index d041a83..2402778 100644 (file)
@@ -2645,26 +2645,25 @@ GstCaps *
 gst_pad_get_allowed_caps (GstPad * pad)
 {
   GstCaps *mycaps;
-  GstCaps *caps;
-  GstPad *peer;
+  GstCaps *caps = NULL;
+  GstQuery *query;
 
   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
 
   GST_OBJECT_LOCK (pad);
-  peer = GST_PAD_PEER (pad);
-  if (G_UNLIKELY (peer == NULL))
+  if (G_UNLIKELY (GST_PAD_PEER (pad) == NULL))
     goto no_peer;
+  GST_OBJECT_UNLOCK (pad);
 
   GST_CAT_DEBUG_OBJECT (GST_CAT_PROPERTIES, pad, "getting allowed caps");
 
-  gst_object_ref (peer);
-  GST_OBJECT_UNLOCK (pad);
   mycaps = gst_pad_query_caps (pad, NULL);
 
-  caps = gst_pad_query_caps (peer, mycaps);
-  gst_object_unref (peer);
-
-  gst_caps_unref (mycaps);
+  /* Query peer caps */
+  query = gst_query_new_caps (mycaps);
+  gst_pad_peer_query (pad, query);
+  gst_query_parse_caps (query, &caps);
+  gst_query_unref (query);
 
   GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "allowed caps %" GST_PTR_FORMAT,
       caps);