plugins: check if display is set in sync
authorVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
Fri, 30 Oct 2015 11:27:16 +0000 (12:27 +0100)
committerVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
Mon, 9 Nov 2015 15:18:19 +0000 (16:18 +0100)
Since the context messages are sync'ed, the display assignation happens in the
same thread, hence we can know if the display was found or not as soon we call
for it.

In order to take advantage of it, gst_vaapi_video_context_prepare() receives,
as a new parameter, the address of the plugin's display, and reports back if
the display was found and set.

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

gst/vaapi/gstvaapipluginutil.c
gst/vaapi/gstvaapivideocontext.c
gst/vaapi/gstvaapivideocontext.h

index f5d3fe6da0b4203980dddd6b0072d574e1fbcc6c..135d109c5988abdaebd032d16acc7dca05b50330 100644 (file)
@@ -235,11 +235,11 @@ gst_vaapi_ensure_display (GstElement * element, GstVaapiDisplayType type)
 
   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
 
-  gst_vaapi_video_context_prepare (element);
-
-  /* Neighbour found and it updated the display */
-  if (gst_vaapi_plugin_base_has_display_type (plugin, type))
-    return TRUE;
+  if (gst_vaapi_video_context_prepare (element, &plugin->display)) {
+    /* Neighbour found and it updated the display */
+    if (gst_vaapi_plugin_base_has_display_type (plugin, type))
+      return TRUE;
+  }
 
   /* If no neighboor, or application not interested, use system default */
   if (plugin->gl_context)
index 62bd9d43f275b6446b9b96131bcd303d9da4906e..f049273efed744a402a2bc074eafd30b30ddb899 100644 (file)
@@ -178,21 +178,27 @@ found:
   gst_query_unref (query);
 }
 
-void
-gst_vaapi_video_context_prepare (GstElement * element)
+gboolean
+gst_vaapi_video_context_prepare (GstElement * element,
+    GstVaapiDisplay ** display_ptr)
 {
-  g_return_if_fail (element != NULL);
+  g_return_val_if_fail (element != NULL, FALSE);
+  g_return_val_if_fail (display_ptr != NULL, FALSE);
 
   /*  1) Check if the element already has a context of the specific
-   *     type, i.e. it was previously set via
-   *     gst_element_set_context(). */
-  /* This was already done by the caller of this function:
-   * gst_vaapi_ensure_display() */
+   *     type.
+   */
+  if (*display_ptr) {
+    GST_LOG_OBJECT (element, "already have a display (%p)", *display_ptr);
+    return TRUE;
+  }
 
   _gst_context_query (element, GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME);
 
-  /* The check of an usable context is done by the caller:
-     gst_vaapi_ensure_display() */
+  if (*display_ptr)
+    GST_LOG_OBJECT (element, "found a display (%p)", *display_ptr);
+
+  return *display_ptr != NULL;
 }
 
 /* 5) Create a context by itself and post a GST_MESSAGE_HAVE_CONTEXT message
index b3d955bf7ec2dba738df9adba5ac5e19672f8c77..95e134b627b3c0e1cfa978bb84bd950d7b9e5115 100644 (file)
@@ -42,8 +42,9 @@ gst_vaapi_video_context_get_display (GstContext * context,
     GstVaapiDisplay ** display_ptr);
 
 G_GNUC_INTERNAL
-void
-gst_vaapi_video_context_prepare (GstElement * element);
+gboolean
+gst_vaapi_video_context_prepare (GstElement * element,
+    GstVaapiDisplay ** display_ptr);
 
 G_GNUC_INTERNAL
 void