summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>2015-10-14 20:30:30 +0200
committerVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>2015-10-20 12:32:44 +0200
commit6d9f31e305d2c395bafd11c07d5a015f92bcd1b8 (patch)
tree0e5e3fb34e37b2c400034525e361c3e65d6c8eed
parent45487fe87cc4dcc0c319701af0516ef6973794ec (diff)
downloadgstreamer-vaapi-6d9f31e305d2c395bafd11c07d5a015f92bcd1b8.tar.gz
vaapidecode: use caps to check the features
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
-rw-r--r--gst/vaapi/gstvaapidecode.c13
-rw-r--r--gst/vaapi/gstvaapipluginutil.c46
-rw-r--r--gst/vaapi/gstvaapipluginutil.h5
3 files changed, 38 insertions, 26 deletions
diff --git a/gst/vaapi/gstvaapidecode.c b/gst/vaapi/gstvaapidecode.c
index 28302777..9835fbee 100644
--- a/gst/vaapi/gstvaapidecode.c
+++ b/gst/vaapi/gstvaapidecode.c
@@ -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
diff --git a/gst/vaapi/gstvaapipluginutil.c b/gst/vaapi/gstvaapipluginutil.c
index 997e8e0c..2071adc2 100644
--- a/gst/vaapi/gstvaapipluginutil.c
+++ b/gst/vaapi/gstvaapipluginutil.c
@@ -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
diff --git a/gst/vaapi/gstvaapipluginutil.h b/gst/vaapi/gstvaapipluginutil.h
index 94050fb0..4ca82253 100644
--- a/gst/vaapi/gstvaapipluginutil.h
+++ b/gst/vaapi/gstvaapipluginutil.h
@@ -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 }"