From: gb Date: Wed, 10 Mar 2010 12:25:19 +0000 (+0000) Subject: Fix GstVaapiDisplay initialization. X-Git-Tag: accepted/trunk/20120822.173359~763 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5fdc1dc9433e0582bf94ba0b1473d5ff874b31c6;p=profile%2Fivi%2Fgstreamer-vaapi.git Fix GstVaapiDisplay initialization. --- diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.c b/gst-libs/gst/vaapi/gstvaapidisplay.c index 160e995..b31e6df 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay.c +++ b/gst-libs/gst/vaapi/gstvaapidisplay.c @@ -54,11 +54,109 @@ static void gst_vaapi_display_set_display(GstVaapiDisplay *display, VADisplay va_display); static void +gst_vaapi_display_destroy(GstVaapiDisplay *display) +{ + GstVaapiDisplayPrivate * const priv = display->priv; + + if (priv->profiles) { + g_free(priv->profiles); + priv->profiles = NULL; + } + + if (priv->image_formats) { + g_free(priv->image_formats); + priv->image_formats = NULL; + priv->num_image_formats = 0; + } + + if (priv->subpicture_formats) { + g_free(priv->subpicture_formats); + priv->subpicture_formats = NULL; + priv->num_subpicture_formats = 0; + } + + if (priv->subpicture_flags) { + g_free(priv->subpicture_flags); + priv->subpicture_flags = NULL; + } + + if (priv->display) { + vaTerminate(priv->display); + priv->display = NULL; + } +} + +static gboolean +gst_vaapi_display_create(GstVaapiDisplay *display) +{ + GstVaapiDisplayPrivate * const priv = display->priv; + VAStatus status; + int major_version, minor_version; + unsigned int i; + + status = vaInitialize(priv->display, &major_version, &minor_version); + if (!vaapi_check_status(status, "vaInitialize()")) + return FALSE; + D(bug("VA-API version %d.%d\n", major_version, minor_version)); + + /* VA profiles */ + priv->num_profiles = vaMaxNumProfiles(priv->display); + priv->profiles = g_new(VAProfile, priv->num_profiles); + if (!priv->profiles) + return FALSE; + status = vaQueryConfigProfiles(priv->display, + priv->profiles, + &priv->num_profiles); + if (!vaapi_check_status(status, "vaQueryConfigProfiles()")) + return FALSE; + + D(bug("%d profiles\n", priv->num_profiles)); + for (i = 0; i < priv->num_profiles; i++) + D(bug(" %s\n", string_of_VAProfile(priv->profiles[i]))); + + /* VA image formats */ + priv->num_image_formats = vaMaxNumImageFormats(priv->display); + priv->image_formats = g_new(VAImageFormat, priv->num_image_formats); + if (!priv->image_formats) + return FALSE; + status = vaQueryImageFormats(priv->display, + priv->image_formats, + &priv->num_image_formats); + if (!vaapi_check_status(status, "vaQueryImageFormats()")) + return FALSE; + + D(bug("%d image formats\n", priv->num_image_formats)); + for (i = 0; i < priv->num_image_formats; i++) + D(bug(" %s\n", string_of_FOURCC(priv->image_formats[i].fourcc))); + + /* VA subpicture formats */ + priv->num_subpicture_formats = vaMaxNumSubpictureFormats(priv->display); + priv->subpicture_formats = g_new(VAImageFormat, priv->num_subpicture_formats); + if (!priv->subpicture_formats) + return FALSE; + priv->subpicture_flags = g_new(unsigned int, priv->num_subpicture_formats); + if (!priv->subpicture_flags) + return FALSE; + status = vaQuerySubpictureFormats(priv->display, + priv->subpicture_formats, + priv->subpicture_flags, + &priv->num_subpicture_formats); + if (!vaapi_check_status(status, "vaQuerySubpictureFormats()")) + return FALSE; + + D(bug("%d subpicture formats\n", priv->num_subpicture_formats)); + for (i = 0; i < priv->num_subpicture_formats; i++) + D(bug(" %s\n", string_of_FOURCC(priv->subpicture_formats[i].fourcc))); + + return TRUE; +} + +static void gst_vaapi_display_finalize(GObject *object) { GstVaapiDisplay * const display = GST_VAAPI_DISPLAY(object); - gst_vaapi_display_set_display(display, NULL); + gst_vaapi_display_destroy(display); G_OBJECT_CLASS(gst_vaapi_display_parent_class)->finalize(object); } @@ -135,129 +233,37 @@ gst_vaapi_display_init(GstVaapiDisplay *display) priv->num_subpicture_formats = 0; } -VADisplay -gst_vaapi_display_get_display(GstVaapiDisplay *display) -{ - GstVaapiDisplayPrivate *priv = display->priv; - - g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), NULL); - - return priv->display; -} - -static void -gst_vaapi_display_destroy_resources(GstVaapiDisplay *display) +GstVaapiDisplay * +gst_vaapi_display_new_with_display(VADisplay va_display) { - GstVaapiDisplayPrivate *priv = display->priv; - - if (priv->profiles) { - g_free(priv->profiles); - priv->profiles = NULL; - } - - if (priv->image_formats) { - g_free(priv->image_formats); - priv->image_formats = NULL; - } - - if (priv->subpicture_formats) { - g_free(priv->subpicture_formats); - priv->subpicture_formats = NULL; - } - - if (priv->subpicture_flags) { - g_free(priv->subpicture_flags); - priv->subpicture_flags = NULL; - } + return g_object_new(GST_VAAPI_TYPE_DISPLAY, + "display", va_display, + NULL); } -static gboolean -gst_vaapi_display_create_resources(GstVaapiDisplay *display) +VADisplay +gst_vaapi_display_get_display(GstVaapiDisplay *display) { - GstVaapiDisplayPrivate *priv = display->priv; - VAStatus status; - unsigned int i; - - /* VA profiles */ - priv->num_profiles = vaMaxNumProfiles(priv->display); - priv->profiles = g_new(VAProfile, priv->num_profiles); - if (!priv->profiles) - return FALSE; - status = vaQueryConfigProfiles(priv->display, - priv->profiles, - &priv->num_profiles); - if (!vaapi_check_status(status, "vaQueryConfigProfiles()")) - return FALSE; - - D(bug("%d profiles\n", priv->num_profiles)); - for (i = 0; i < priv->num_profiles; i++) - D(bug(" %s\n", string_of_VAProfile(priv->profiles[i]))); - - /* VA image formats */ - priv->num_image_formats = vaMaxNumImageFormats(priv->display); - priv->image_formats = g_new(VAImageFormat, priv->num_image_formats); - if (!priv->image_formats) - return FALSE; - status = vaQueryImageFormats(priv->display, - priv->image_formats, - &priv->num_image_formats); - if (!vaapi_check_status(status, "vaQueryImageFormats()")) - return FALSE; - - D(bug("%d image formats\n", priv->num_image_formats)); - for (i = 0; i < priv->num_image_formats; i++) - D(bug(" %s\n", string_of_FOURCC(priv->image_formats[i].fourcc))); - - /* VA subpicture formats */ - priv->num_subpicture_formats = vaMaxNumSubpictureFormats(priv->display); - priv->subpicture_formats = g_new(VAImageFormat, priv->num_subpicture_formats); - if (!priv->subpicture_formats) - return FALSE; - priv->subpicture_flags = g_new(unsigned int, priv->num_subpicture_formats); - if (!priv->subpicture_flags) - return FALSE; - status = vaQuerySubpictureFormats(priv->display, - priv->subpicture_formats, - priv->subpicture_flags, - &priv->num_subpicture_formats); - if (!vaapi_check_status(status, "vaQuerySubpictureFormats()")) - return FALSE; - - D(bug("%d subpicture formats\n", priv->num_subpicture_formats)); - for (i = 0; i < priv->num_subpicture_formats; i++) - D(bug(" %s\n", string_of_FOURCC(priv->subpicture_formats[i].fourcc))); + g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), NULL); - return TRUE; + return display->priv->display; } void gst_vaapi_display_set_display(GstVaapiDisplay *display, VADisplay va_display) { - GstVaapiDisplayPrivate *priv = display->priv; - VAStatus status; - int major_version, minor_version; + GstVaapiDisplayPrivate * const priv = display->priv; g_return_if_fail(GST_VAAPI_IS_DISPLAY(display)); - if (priv->display) { - gst_vaapi_display_destroy_resources(display); - - /* XXX: make sure this VADisplay is really the last occurrence */ - status = vaTerminate(priv->display); - if (!vaapi_check_status(status, "vaTerminate()")) - return; - priv->display = NULL; - } + if (priv->display) + gst_vaapi_display_destroy(display); if (va_display) { - status = vaInitialize(va_display, &major_version, &minor_version); - if (!vaapi_check_status(status, "vaInitialize()")) - return; priv->display = va_display; - D(bug("VA-API version %d.%d\n", major_version, minor_version)); - - if (!gst_vaapi_display_create_resources(display)) { - gst_vaapi_display_destroy_resources(display); + if (!gst_vaapi_display_create(display)) { + printf("FAIL\n"); + gst_vaapi_display_destroy(display); return; } } diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.h b/gst-libs/gst/vaapi/gstvaapidisplay.h index 187261c..a895aaf 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay.h +++ b/gst-libs/gst/vaapi/gstvaapidisplay.h @@ -70,6 +70,9 @@ struct _GstVaapiDisplayClass { GType gst_vaapi_display_get_type(void); +GstVaapiDisplay * +gst_vaapi_display_new_with_display(VADisplay va_display); + VADisplay gst_vaapi_display_get_display(GstVaapiDisplay *display); diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_x11.c b/gst-libs/gst/vaapi/gstvaapidisplay_x11.c index 273db5e..305fadc 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay_x11.c +++ b/gst-libs/gst/vaapi/gstvaapidisplay_x11.c @@ -45,10 +45,6 @@ enum { }; static void -gst_vaapi_display_x11_set_display(GstVaapiDisplayX11 *display, - Display *x11_display); - -static void gst_vaapi_display_x11_finalize(GObject *object) { G_OBJECT_CLASS(gst_vaapi_display_x11_parent_class)->finalize(object); @@ -64,7 +60,7 @@ gst_vaapi_display_x11_set_property(GObject *object, switch (prop_id) { case PROP_X11_DISPLAY: - gst_vaapi_display_x11_set_display(display, g_value_get_pointer(value)); + display->priv->display = g_value_get_pointer(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -122,36 +118,18 @@ gst_vaapi_display_x11_init(GstVaapiDisplayX11 *display) Display * gst_vaapi_display_x11_get_display(GstVaapiDisplayX11 *display) { - GstVaapiDisplayX11Private *priv = display->priv; - g_return_val_if_fail(GST_VAAPI_IS_DISPLAY_X11(display), NULL); - return priv->display; -} - -void -gst_vaapi_display_x11_set_display(GstVaapiDisplayX11 *display, - Display *x11_display) -{ - GstVaapiDisplayX11Private *priv = display->priv; - - g_return_if_fail(GST_VAAPI_IS_DISPLAY_X11(display)); - - if (x11_display) { - VADisplay va_display = vaGetDisplay(x11_display); - if (va_display) - g_object_set(GST_VAAPI_DISPLAY(display), - "display", va_display, - NULL); - } - - priv->display = x11_display; + return display->priv->display; } GstVaapiDisplay * gst_vaapi_display_x11_new(Display *x11_display) { + g_return_val_if_fail(x11_display, NULL); + return g_object_new(GST_VAAPI_TYPE_DISPLAY_X11, "x11-display", x11_display, + "display", vaGetDisplay(x11_display), NULL); }