basetransform: respect accept-caps intersect flag
authorThiago Santos <thiagoss@osg.samsung.com>
Tue, 11 Aug 2015 11:07:53 +0000 (08:07 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Thu, 13 Aug 2015 09:01:36 +0000 (06:01 -0300)
GstPad has a flag for suggesting if the accept-caps
query should use intersect instead of the default
subset caps operation to verify if the caps would be
acceptable.

basetransform currently always uses the subset check and
this patch makes it honor the flag for using intersect
if it is set.

https://bugzilla.gnome.org/show_bug.cgi?id=748635

libs/gst/base/gstbasetransform.c

index 41b0fba..f6e0c0c 100644 (file)
@@ -1289,8 +1289,13 @@ gst_base_transform_acceptcaps_default (GstBaseTransform * trans,
   GstPad *otherpad;
   GstCaps *othercaps = NULL;
 #endif
+  GstPad *pad;
   gboolean ret = TRUE;
 
+  pad =
+      (direction ==
+      GST_PAD_SINK) ? GST_BASE_TRANSFORM_SINK_PAD (trans) :
+      GST_BASE_TRANSFORM_SRC_PAD (trans);
 #if 0
   otherpad = (pad == trans->srcpad) ? trans->sinkpad : trans->srcpad;
 
@@ -1304,11 +1309,7 @@ gst_base_transform_acceptcaps_default (GstBaseTransform * trans,
     GST_DEBUG_OBJECT (trans, "accept caps %" GST_PTR_FORMAT, caps);
 
     /* get all the formats we can handle on this pad */
-    if (direction == GST_PAD_SRC)
-      allowed = gst_pad_query_caps (trans->srcpad, caps);
-    else
-      allowed = gst_pad_query_caps (trans->sinkpad, caps);
-
+    allowed = gst_pad_query_caps (pad, caps);
     if (!allowed) {
       GST_DEBUG_OBJECT (trans, "gst_pad_query_caps() failed");
       goto no_transform_possible;
@@ -1317,7 +1318,16 @@ gst_base_transform_acceptcaps_default (GstBaseTransform * trans,
     GST_DEBUG_OBJECT (trans, "allowed caps %" GST_PTR_FORMAT, allowed);
 
     /* intersect with the requested format */
-    ret = gst_caps_is_subset (caps, allowed);
+    if (GST_PAD_IS_ACCEPT_INTERSECT (pad)) {
+      GST_DEBUG_OBJECT (pad,
+          "allowed caps intersect %" GST_PTR_FORMAT ", caps %" GST_PTR_FORMAT,
+          allowed, caps);
+      ret = gst_caps_can_intersect (caps, allowed);
+    } else {
+      GST_DEBUG_OBJECT (pad, "allowed caps subset %" GST_PTR_FORMAT ", caps %"
+          GST_PTR_FORMAT, allowed, caps);
+      ret = gst_caps_is_subset (caps, allowed);
+    }
     gst_caps_unref (allowed);
 
     if (!ret)