diff --git a/subprojects/gst-plugins-bad/sys/va/gstvavpp.c b/subprojects/gst-plugins-bad/sys/va/gstvavpp.c
index 9e7a226efd..0b79d410f8 100644
--- a/subprojects/gst-plugins-bad/sys/va/gstvavpp.c
+++ b/subprojects/gst-plugins-bad/sys/va/gstvavpp.c
@@ -934,7 +934,12 @@ gst_va_vpp_caps_remove_fields (GstCaps * caps)
   GstCaps *ret;
   GstStructure *structure;
   GstCapsFeatures *features;
-  gint i, j, n, m;
+  gint i, n;
+  guint sysmem, dmabuf, va;
+
+  sysmem = g_quark_from_static_string (GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY);
+  dmabuf = g_quark_from_static_string (GST_CAPS_FEATURE_MEMORY_DMABUF);
+  va = g_quark_from_static_string (GST_CAPS_FEATURE_MEMORY_VA);
 
   ret = gst_caps_new_empty ();
 
@@ -950,30 +955,22 @@ gst_va_vpp_caps_remove_fields (GstCaps * caps)
 
     structure = gst_structure_copy (structure);
 
-    m = gst_caps_features_get_size (features);
-    for (j = 0; j < m; j++) {
-      const gchar *feature = gst_caps_features_get_nth (features, j);
+    if (gst_caps_features_contains_id (features, sysmem)
+        || gst_caps_features_contains_id (features, dmabuf)
+        || gst_caps_features_contains_id (features, va)) {
+      /* rangify frame size */
+      gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
+          "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
 
-      if (g_strcmp0 (feature, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY) == 0
-          || g_strcmp0 (feature, GST_CAPS_FEATURE_MEMORY_DMABUF) == 0
-          || g_strcmp0 (feature, GST_CAPS_FEATURE_MEMORY_VA) == 0) {
-
-        /* rangify frame size */
-        gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
-            "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
-
-        /* if pixel aspect ratio, make a range of it */
-        if (gst_structure_has_field (structure, "pixel-aspect-ratio")) {
-          gst_structure_set (structure, "pixel-aspect-ratio",
-              GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, NULL);
-        }
-
-        /* remove format-related fields */
-        gst_structure_remove_fields (structure, "format", "drm-format",
-            "colorimetry", "chroma-site", NULL);
-
-        break;
+      /* if pixel aspect ratio, make a range of it */
+      if (gst_structure_has_field (structure, "pixel-aspect-ratio")) {
+        gst_structure_set (structure, "pixel-aspect-ratio",
+            GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, NULL);
       }
+
+      /* remove format-related fields */
+      gst_structure_remove_fields (structure, "format", "drm-format",
+          "colorimetry", "chroma-site", NULL);
     }
 
     gst_caps_append_structure_full (ret, structure,
@@ -989,7 +986,7 @@ static GstCaps *
 gst_va_vpp_complete_caps_features (const GstCaps * caps,
     const gchar * feature_name)
 {
-  guint i, j, m, n;
+  guint i, n;
   GstCaps *tmp;
 
   tmp = gst_caps_new_empty ();
@@ -997,24 +994,19 @@ gst_va_vpp_complete_caps_features (const GstCaps * caps,
   n = gst_caps_get_size (caps);
   for (i = 0; i < n; i++) {
     GstCapsFeatures *features, *orig_features;
-    GstStructure *s = gst_caps_get_structure (caps, i);
-    gboolean contained = FALSE;
+    GstStructure *s;
 
+    s = gst_caps_get_structure (caps, i);
     orig_features = gst_caps_get_features (caps, i);
-    features = gst_caps_features_new (feature_name, NULL);
 
-    m = gst_caps_features_get_size (orig_features);
-    for (j = 0; j < m; j++) {
-      const gchar *feature = gst_caps_features_get_nth (orig_features, j);
-
-      /* if we already have the features */
-      if (gst_caps_features_contains (features, feature)) {
-        contained = TRUE;
-        break;
-      }
+    if (gst_caps_features_contains (orig_features, feature_name)) {
+      gst_caps_append_structure_full (tmp, gst_structure_copy (s),
+          gst_caps_features_copy (orig_features));
+      continue;
     }
 
-    if (!contained && !gst_caps_is_subset_structure_full (tmp, s, features))
+    features = gst_caps_features_new (feature_name, NULL);
+    if (!gst_caps_is_subset_structure_full (tmp, s, features))
       gst_caps_append_structure_full (tmp, gst_structure_copy (s), features);
     else
       gst_caps_features_free (features);
@@ -1028,41 +1020,34 @@ gst_va_vpp_transform_caps (GstBaseTransform * trans, GstPadDirection direction,
     GstCaps * caps, GstCaps * filter)
 {
   GstVaVpp *self = GST_VA_VPP (trans);
-  GstVaBaseTransform *btrans = GST_VA_BASE_TRANSFORM (trans);
-  GstCaps *ret, *tmp, *filter_caps;
+  GstCaps *ret;
+  GstPadTemplate *pad_tmpl;
+  static const gchar *caps_features[] = { GST_CAPS_FEATURE_MEMORY_VA,
+    GST_CAPS_FEATURE_MEMORY_DMABUF, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY
+  };
+  guint i;
 
   GST_DEBUG_OBJECT (self,
       "Transforming caps %" GST_PTR_FORMAT " in direction %s", caps,
       (direction == GST_PAD_SINK) ? "sink" : "src");
 
-  filter_caps = gst_va_base_transform_get_filter_caps (btrans);
-  if (filter_caps && !gst_caps_can_intersect (caps, filter_caps)) {
+  pad_tmpl = gst_element_get_pad_template (GST_ELEMENT (self),
+      (direction == GST_PAD_SINK) ? "sink" : "src");
+  if (pad_tmpl->caps == caps) {
     ret = gst_caps_ref (caps);
     goto bail;
   }
 
   ret = gst_va_vpp_caps_remove_fields (caps);
 
-  tmp = gst_va_vpp_complete_caps_features (ret, GST_CAPS_FEATURE_MEMORY_VA);
-  if (!gst_caps_is_subset (tmp, ret)) {
-    gst_caps_append (ret, tmp);
-  } else {
-    gst_caps_unref (tmp);
-  }
+  for (i = 0; i < G_N_ELEMENTS (caps_features); i++) {
+    GstCaps *tmp;
 
-  tmp = gst_va_vpp_complete_caps_features (ret, GST_CAPS_FEATURE_MEMORY_DMABUF);
-  if (!gst_caps_is_subset (tmp, ret)) {
-    gst_caps_append (ret, tmp);
-  } else {
-    gst_caps_unref (tmp);
-  }
-
-  tmp = gst_va_vpp_complete_caps_features (ret,
-      GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY);
-  if (!gst_caps_is_subset (tmp, ret)) {
-    gst_caps_append (ret, tmp);
-  } else {
-    gst_caps_unref (tmp);
+    tmp = gst_va_vpp_complete_caps_features (ret, caps_features[i]);
+    if (!gst_caps_is_subset (tmp, ret))
+      gst_caps_append (ret, tmp);
+    else
+      gst_caps_unref (tmp);
   }
 
 bail: