Add display size accessors.
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Mon, 22 Mar 2010 08:44:38 +0000 (08:44 +0000)
committergb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Mon, 22 Mar 2010 08:44:38 +0000 (08:44 +0000)
gst-libs/gst/vaapi/gstvaapidisplay.c
gst-libs/gst/vaapi/gstvaapidisplay.h
gst-libs/gst/vaapi/gstvaapidisplay_x11.c
tests/test-display.c

index a6c0f76..fde9043 100644 (file)
@@ -43,6 +43,8 @@ G_DEFINE_TYPE(GstVaapiDisplay, gst_vaapi_display, G_TYPE_OBJECT);
 struct _GstVaapiDisplayPrivate {
     GStaticMutex        mutex;
     VADisplay           display;
+    guint               width;
+    guint               height;
     gboolean            create_display;
     GArray             *profiles;
     GArray             *image_formats;
@@ -52,7 +54,9 @@ struct _GstVaapiDisplayPrivate {
 enum {
     PROP_0,
 
-    PROP_DISPLAY
+    PROP_DISPLAY,
+    PROP_WIDTH,
+    PROP_HEIGHT
 };
 
 /* Append GstVaapiImageFormat to formats array */
@@ -230,6 +234,8 @@ gst_vaapi_display_create(GstVaapiDisplay *display)
             return FALSE;
         if (klass->get_display)
             priv->display = klass->get_display(display);
+        if (klass->get_size)
+            klass->get_size(display, &priv->width, &priv->height);
     }
     if (!priv->display)
         return FALSE;
@@ -360,6 +366,12 @@ gst_vaapi_display_get_property(
     case PROP_DISPLAY:
         g_value_set_pointer(value, gst_vaapi_display_get_display(display));
         break;
+    case PROP_WIDTH:
+        g_value_set_uint(value, gst_vaapi_display_get_width(display));
+        break;
+    case PROP_HEIGHT:
+        g_value_set_uint(value, gst_vaapi_display_get_height(display));
+        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
         break;
@@ -405,6 +417,24 @@ gst_vaapi_display_class_init(GstVaapiDisplayClass *klass)
                               "VA display",
                               "VA display",
                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
+
+    g_object_class_install_property
+        (object_class,
+         PROP_WIDTH,
+         g_param_spec_uint("width",
+                           "Width",
+                           "The display width",
+                           1, G_MAXUINT32, 1,
+                           G_PARAM_READABLE));
+
+    g_object_class_install_property
+        (object_class,
+         PROP_HEIGHT,
+         g_param_spec_uint("height",
+                           "height",
+                           "The display height",
+                           1, G_MAXUINT32, 1,
+                           G_PARAM_READABLE));
 }
 
 static void
@@ -414,6 +444,8 @@ gst_vaapi_display_init(GstVaapiDisplay *display)
 
     display->priv               = priv;
     priv->display               = NULL;
+    priv->width                 = 0;
+    priv->height                = 0;
     priv->create_display        = TRUE;
     priv->profiles              = NULL;
     priv->image_formats         = NULL;
@@ -496,6 +528,58 @@ gst_vaapi_display_get_display(GstVaapiDisplay *display)
 }
 
 /**
+ * gst_vaapi_display_get_width:
+ * @display: a #GstVaapiDisplay
+ *
+ * Retrieves the width of a #GstVaapiDisplay.
+ *
+ * Return value: the width of the @display, in pixels
+ */
+guint
+gst_vaapi_display_get_width(GstVaapiDisplay *display)
+{
+    g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), 0);
+
+    return display->priv->width;
+}
+
+/**
+ * gst_vaapi_display_get_height:
+ * @display: a #GstVaapiDisplay
+ *
+ * Retrieves the height of a #GstVaapiDisplay
+ *
+ * Return value: the height of the @display, in pixels
+ */
+guint
+gst_vaapi_display_get_height(GstVaapiDisplay *display)
+{
+    g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), 0);
+
+    return display->priv->height;
+}
+
+/**
+ * gst_vaapi_display_get_size:
+ * @display: a #GstVaapiDisplay
+ * @pwidth: (out) (allow-none): return location for the width, or %NULL
+ * @pheight: (out) (allow-none): return location for the height, or %NULL
+ *
+ * Retrieves the dimensions of a #GstVaapiDisplay.
+ */
+void
+gst_vaapi_display_get_size(GstVaapiDisplay *display, guint *pwidth, guint *pheight)
+{
+    g_return_if_fail(GST_VAAPI_DISPLAY(display));
+
+    if (pwidth)
+        *pwidth = display->priv->width;
+
+    if (pheight)
+        *pheight = display->priv->height;
+}
+
+/**
  * gst_vaapi_display_has_profile:
  * @display: a #GstVaapiDisplay
  * @profile: a #VAProfile
index 95fa54d..e1f9f86 100644 (file)
@@ -101,6 +101,7 @@ struct _GstVaapiDisplay {
  * @lock_display: virtual function to lock a display
  * @unlock_display: virtual function to unlock a display
  * @get_display: virtual function to retrieve the #VADisplay
+ * @get_size: virtual function to retrieve the display dimensions
  *
  * Base class for VA displays.
  */
@@ -114,6 +115,7 @@ struct _GstVaapiDisplayClass {
     void       (*lock_display)  (GstVaapiDisplay *display);
     void       (*unlock_display)(GstVaapiDisplay *display);
     VADisplay  (*get_display)   (GstVaapiDisplay *display);
+    void       (*get_size)      (GstVaapiDisplay *display, guint *pw, guint *ph);
 };
 
 GType
@@ -131,6 +133,15 @@ gst_vaapi_display_unlock(GstVaapiDisplay *display);
 VADisplay
 gst_vaapi_display_get_display(GstVaapiDisplay *display);
 
+guint
+gst_vaapi_display_get_width(GstVaapiDisplay *display);
+
+guint
+gst_vaapi_display_get_height(GstVaapiDisplay *display);
+
+void
+gst_vaapi_display_get_size(GstVaapiDisplay *display, guint *pwidth, guint *pheight);
+
 gboolean
 gst_vaapi_display_has_profile(GstVaapiDisplay *display, VAProfile profile);
 
index bfd6589..133c808 100644 (file)
@@ -43,6 +43,7 @@ struct _GstVaapiDisplayX11Private {
     gboolean    create_display;
     gchar      *display_name;
     Display    *x11_display;
+    int         x11_screen;
     VADisplay  *va_display;
 };
 
@@ -147,6 +148,7 @@ gst_vaapi_display_x11_open_display(GstVaapiDisplay *display)
     if (!priv->x11_display)
         return FALSE;
 
+    priv->x11_screen = DefaultScreen(priv->x11_display);
     priv->va_display = vaGetDisplay(priv->x11_display);
     return priv->va_display != NULL;
 }
@@ -178,6 +180,25 @@ gst_vaapi_display_x11_get_va_display(GstVaapiDisplay *display)
 }
 
 static void
+gst_vaapi_display_x11_get_size(
+    GstVaapiDisplay *display,
+    guint           *pwidth,
+    guint           *pheight
+)
+{
+    GstVaapiDisplayX11Private * const priv = GST_VAAPI_DISPLAY_X11(display)->priv;
+
+    if (!priv->x11_display)
+        return;
+
+    if (pwidth)
+        *pwidth = DisplayWidth(priv->x11_display, priv->x11_screen);
+
+    if (pheight)
+        *pheight = DisplayHeight(priv->x11_display, priv->x11_screen);
+}
+
+static void
 gst_vaapi_display_x11_class_init(GstVaapiDisplayX11Class *klass)
 {
     GObjectClass * const object_class = G_OBJECT_CLASS(klass);
@@ -193,6 +214,7 @@ gst_vaapi_display_x11_class_init(GstVaapiDisplayX11Class *klass)
     dpy_class->open_display     = gst_vaapi_display_x11_open_display;
     dpy_class->close_display    = gst_vaapi_display_x11_close_display;
     dpy_class->get_display      = gst_vaapi_display_x11_get_va_display;
+    dpy_class->get_size         = gst_vaapi_display_x11_get_size;
 
     /**
      * GstVaapiDisplayX11:x11-display:
@@ -231,6 +253,7 @@ gst_vaapi_display_x11_init(GstVaapiDisplayX11 *display)
     display->priv        = priv;
     priv->create_display = TRUE;
     priv->x11_display    = NULL;
+    priv->x11_screen     = 0;
     priv->display_name   = NULL;
 }
 
index 4a510d5..388abbf 100644 (file)
@@ -94,6 +94,7 @@ main(int argc, char *argv[])
     Display *x11_display;
     VADisplay va_display;
     GstVaapiDisplay *display;
+    guint width, height;
 
     gst_init(&argc, &argv);
 
@@ -105,6 +106,9 @@ main(int argc, char *argv[])
         if (!display)
             g_error("could not create Gst/VA display");
 
+        gst_vaapi_display_get_size(display, &width, &height);
+        g_print("Display size: %ux%u\n", width, height);
+
         dump_caps(display);
         g_object_unref(display);
     }