glfilter: advertise resize in the caps negotiation properly
authorMatthew Waters <matthew@centricular.com>
Thu, 12 Mar 2015 10:14:50 +0000 (10:14 +0000)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:56 +0000 (19:31 +0000)
gst-libs/gst/gl/gstglfilter.c

index 8a0a498..cf1c8ff 100644 (file)
@@ -707,6 +707,36 @@ done:
   return othercaps;
 }
 
+/* copies the given caps */
+static GstCaps *
+gst_gl_filter_caps_remove_size (GstCaps * caps)
+{
+  GstStructure *st;
+  GstCapsFeatures *f;
+  gint i, n;
+  GstCaps *res;
+
+  res = gst_caps_new_empty ();
+
+  n = gst_caps_get_size (caps);
+  for (i = 0; i < n; i++) {
+    st = gst_caps_get_structure (caps, i);
+    f = gst_caps_get_features (caps, i);
+
+    /* If this is already expressed by the existing caps
+     * skip this structure */
+    if (i > 0 && gst_caps_is_subset_structure_full (res, st, f))
+      continue;
+
+    st = gst_structure_copy (st);
+    gst_structure_remove_fields (st, "width", "height", NULL);
+
+    gst_caps_append_structure_full (res, st, gst_caps_features_copy (f));
+  }
+
+  return res;
+}
+
 static GstCaps *
 gst_gl_filter_set_caps_features (const GstCaps * caps,
     const gchar * feature_name)
@@ -751,9 +781,13 @@ gst_gl_filter_transform_caps (GstBaseTransform * bt,
 
     result = gst_caps_merge (gl_caps, result);
   }
-  tmp = result;
   GST_DEBUG_OBJECT (bt, "transfer returned caps %" GST_PTR_FORMAT, tmp);
 
+  tmp = gst_gl_filter_caps_remove_size (result);
+  gst_caps_unref (result);
+  result = tmp;
+  GST_DEBUG_OBJECT (bt, "size removal returned caps %" GST_PTR_FORMAT, tmp);
+
   if (direction == GST_PAD_SRC) {
     result =
         gst_gl_color_convert_transform_caps (filter->context, direction, tmp,