From: gb Date: Mon, 22 Mar 2010 08:44:38 +0000 (+0000) Subject: Add display size accessors. X-Git-Tag: accepted/trunk/20120822.173359~669 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=01cc10fe5147c39a12185efa560aa40814d4cebd;p=profile%2Fivi%2Fgstreamer-vaapi.git Add display size accessors. --- diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.c b/gst-libs/gst/vaapi/gstvaapidisplay.c index a6c0f76..fde9043 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay.c +++ b/gst-libs/gst/vaapi/gstvaapidisplay.c @@ -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 diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.h b/gst-libs/gst/vaapi/gstvaapidisplay.h index 95fa54d..e1f9f86 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay.h +++ b/gst-libs/gst/vaapi/gstvaapidisplay.h @@ -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); diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_x11.c b/gst-libs/gst/vaapi/gstvaapidisplay_x11.c index bfd6589..133c808 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay_x11.c +++ b/gst-libs/gst/vaapi/gstvaapidisplay_x11.c @@ -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; } diff --git a/tests/test-display.c b/tests/test-display.c index 4a510d5..388abbf 100644 --- a/tests/test-display.c +++ b/tests/test-display.c @@ -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); }