vaapidecode: use caps to check the features
authorVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
Wed, 14 Oct 2015 18:30:30 +0000 (20:30 +0200)
committerVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
Tue, 20 Oct 2015 10:32:44 +0000 (12:32 +0200)
Instead of calling gst_vaapi_find_preferred_caps_feature(), which is
expensive, we check the caps from the allocation query, to check the
negotiated feature.

In order to do this verification a new utility function has been implemented:
gst_vaapi_caps_feature_contains().

As this new function shared its logic with gst_caps_has_vaapi_surface(), both
have been refactorized.

Signed-off-by: Víctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
https://bugzilla.gnome.org/show_bug.cgi?id=756686

gst/vaapi/gstvaapidecode.c
gst/vaapi/gstvaapipluginutil.c
gst/vaapi/gstvaapipluginutil.h

index 2830277..9835fbe 100644 (file)
@@ -576,20 +576,15 @@ gst_vaapidecode_decide_allocation (GstVideoDecoder * vdec, GstQuery * query)
   GstVaapiDecode *const decode = GST_VAAPIDECODE (vdec);
   GstCaps *caps = NULL;
   GstVideoCodecState *state;
-  GstVaapiCapsFeature feature;
-  GstVideoFormat out_format;
 
   gst_query_parse_allocation (query, &caps, NULL);
-
-  feature =
-      gst_vaapi_find_preferred_caps_feature (GST_VIDEO_DECODER_SRC_PAD (vdec),
-      GST_VIDEO_FORMAT_ENCODED, &out_format);
   decode->has_texture_upload_meta = FALSE;
 #if (USE_GLX || USE_EGL)
   decode->has_texture_upload_meta =
-      (feature == GST_VAAPI_CAPS_FEATURE_GL_TEXTURE_UPLOAD_META) &&
       gst_query_find_allocation_meta (query,
-      GST_VIDEO_GL_TEXTURE_UPLOAD_META_API_TYPE, NULL);
+          GST_VIDEO_GL_TEXTURE_UPLOAD_META_API_TYPE, NULL) &&
+      gst_vaapi_caps_feature_contains (caps,
+          GST_VAAPI_CAPS_FEATURE_GL_TEXTURE_UPLOAD_META);
 #endif
 
   /* Update src caps if feature is not handled downstream */
@@ -599,7 +594,7 @@ gst_vaapidecode_decide_allocation (GstVideoDecoder * vdec, GstQuery * query)
   gst_video_codec_state_unref (state);
 
   return gst_vaapi_plugin_base_decide_allocation (GST_VAAPI_PLUGIN_BASE (vdec),
-      query, feature);
+      query, 0);
 }
 
 static inline gboolean
index 997e8e0..2071adc 100644 (file)
@@ -590,32 +590,44 @@ gst_caps_set_interlaced (GstCaps * caps, GstVideoInfo * vip)
   return TRUE;
 }
 
-/* Checks whether the supplied caps contain VA surfaces */
+static gboolean
+_gst_caps_has_feature (const GstCaps * caps, const gchar * feature)
+{
+  guint i;
+
+  for (i = 0; i < gst_caps_get_size (caps); i++) {
+    GstCapsFeatures *const features = gst_caps_get_features (caps, i);
+    /* Skip ANY features, we need an exact match for correct evaluation */
+    if (gst_caps_features_is_any (features))
+      continue;
+    if (gst_caps_features_contains (features, feature))
+      return TRUE;
+  }
+
+  return FALSE;
+}
+
 gboolean
-gst_caps_has_vaapi_surface (GstCaps * caps)
+gst_vaapi_caps_feature_contains (const GstCaps * caps, GstVaapiCapsFeature feature)
 {
-  gboolean found_caps = FALSE;
-  guint i, num_structures;
+  const gchar *feature_str;
 
   g_return_val_if_fail (caps != NULL, FALSE);
 
-  num_structures = gst_caps_get_size (caps);
-  if (num_structures < 1)
+  feature_str = gst_vaapi_caps_feature_to_string (feature);
+  if (!feature_str)
     return FALSE;
 
-  for (i = 0; i < num_structures && !found_caps; i++) {
-    GstCapsFeatures *const features = gst_caps_get_features (caps, i);
+  return _gst_caps_has_feature (caps, feature_str);
+}
 
-#if GST_CHECK_VERSION(1,3,0)
-    /* Skip ANY features, we need an exact match for correct evaluation */
-    if (gst_caps_features_is_any (features))
-      continue;
-#endif
+/* Checks whether the supplied caps contain VA surfaces */
+gboolean
+gst_caps_has_vaapi_surface (GstCaps * caps)
+{
+  g_return_val_if_fail (caps != NULL, FALSE);
 
-    found_caps = gst_caps_features_contains (features,
-        GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE);
-  }
-  return found_caps;
+  return _gst_caps_has_feature (caps, GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE);
 }
 
 void
index 94050fb..4ca8225 100644 (file)
@@ -91,6 +91,11 @@ G_GNUC_INTERNAL
 const gchar *
 gst_vaapi_caps_feature_to_string (GstVaapiCapsFeature feature);
 
+G_GNUC_INTERNAL
+gboolean
+gst_vaapi_caps_feature_contains (const GstCaps * caps,
+    GstVaapiCapsFeature feature);
+
 /* Helpers to handle interlaced contents */
 # define GST_CAPS_INTERLACED_MODES \
     "interlace-mode = (string){ progressive, interleaved, mixed }"