window: add toplevel display indirection for visualid and colormap.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Wed, 10 Dec 2014 19:13:21 +0000 (20:13 +0100)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 27 Jan 2015 17:11:45 +0000 (18:11 +0100)
Add GstVaapiDisplay::get_{visual_id,colormap}() helpers to help determine
the best suitable window visual id and colormap. This is an indirection in
view to supporting EGL and custom/generic replacements.

gst-libs/gst/vaapi/gstvaapidisplay_priv.h
gst-libs/gst/vaapi/gstvaapiwindow_x11.c

index c9b0e00449184b9b70c17aaa239a136a7f498ecd..fd50fe79e2c11726525da1166bb597ed4f6e75b3 100644 (file)
@@ -74,6 +74,11 @@ typedef GstVaapiTexture *(*GstVaapiDisplayCreateTextureFunc) (
     GstVaapiDisplay * display, GstVaapiID id, guint target, guint format,
     guint width, guint height);
 
+typedef guintptr (*GstVaapiDisplayGetVisualIdFunc) (GstVaapiDisplay * display,
+    GstVaapiWindow * window);
+typedef guintptr (*GstVaapiDisplayGetColormapFunc) (GstVaapiDisplay * display,
+    GstVaapiWindow * window);
+
 /**
  * GST_VAAPI_DISPLAY_GET_CLASS_TYPE:
  * @display: a #GstVaapiDisplay
@@ -190,6 +195,8 @@ struct _GstVaapiDisplay
  * @get_display: virtual function to retrieve the #GstVaapiDisplayInfo
  * @get_size: virtual function to retrieve the display dimensions, in pixels
  * @get_size_mm: virtual function to retrieve the display dimensions, in millimeters
+ * @get_visual_id: (optional) virtual function to retrieve the window visual id
+ * @get_colormap: (optional) virtual function to retrieve the window colormap
  * @create_window: (optional) virtual function to create a window
  * @create_texture: (optional) virtual function to create a texture
  *
@@ -215,7 +222,8 @@ struct _GstVaapiDisplayClass
   GstVaapiDisplayGetInfoFunc get_display;
   GstVaapiDisplayGetSizeFunc get_size;
   GstVaapiDisplayGetSizeMFunc get_size_mm;
-
+  GstVaapiDisplayGetVisualIdFunc get_visual_id;
+  GstVaapiDisplayGetColormapFunc get_colormap;
   GstVaapiDisplayCreateWindowFunc create_window;
   GstVaapiDisplayCreateTextureFunc create_texture;
 };
index 67b358006ab1552e11dbac737dc4a60c33f90f18..10ff1d42fabeb1eb8b1c8c5e48e3ab6380d18cfd 100644 (file)
@@ -212,10 +212,12 @@ gst_vaapi_window_x11_create (GstVaapiWindow * window, guint * width,
 {
   GstVaapiWindowX11Private *const priv =
       GST_VAAPI_WINDOW_X11_GET_PRIVATE (window);
+  GstVaapiDisplay *const display = GST_VAAPI_OBJECT_DISPLAY (window);
   Display *const dpy = GST_VAAPI_OBJECT_NATIVE_DISPLAY (window);
   Window xid = GST_VAAPI_OBJECT_ID (window);
   guint vid = 0;
   Colormap cmap = None;
+  const GstVaapiDisplayClass *display_class;
   const GstVaapiWindowClass *window_class;
   XWindowAttributes wattr;
   Atom atoms[2];
@@ -238,11 +240,19 @@ gst_vaapi_window_x11_create (GstVaapiWindow * window, guint * width,
     return ok;
   }
 
+  display_class = GST_VAAPI_DISPLAY_GET_CLASS (display);
+  if (display_class) {
+    if (display_class->get_visual_id)
+      vid = display_class->get_visual_id (display, window);
+    if (display_class->get_colormap)
+      cmap = display_class->get_colormap (display, window);
+  }
+
   window_class = GST_VAAPI_WINDOW_GET_CLASS (window);
   if (window_class) {
-    if (window_class->get_visual_id)
+    if (window_class->get_visual_id && !vid)
       vid = window_class->get_visual_id (window);
-    if (window_class->get_colormap)
+    if (window_class->get_colormap && !cmap)
       cmap = window_class->get_colormap (window);
   }