From 693277e278e06be502371afd1a56eb8a28c13b0d Mon Sep 17 00:00:00 2001 From: gb Date: Mon, 25 Jan 2010 16:15:01 +0000 Subject: [PATCH] Add initial VA display abstraction. --- configure.ac | 1 + gst-libs/gst/vaapi/Makefile.am | 37 +++- gst-libs/gst/vaapi/gstvaapidisplay.c | 263 +++++++++++++++++++++++ gst-libs/gst/vaapi/gstvaapidisplay.h | 77 +++++++ gst-libs/gst/vaapi/gstvaapidisplay_x11.c | 158 ++++++++++++++ gst-libs/gst/vaapi/gstvaapidisplay_x11.h | 80 +++++++ gst-libs/gst/vaapi/vaapi_debug.h | 33 +++ gst-libs/gst/vaapi/vaapi_utils.c | 98 +++++++++ gst-libs/gst/vaapi/vaapi_utils.h | 48 +++++ tests/examples/generic/Makefile.am | 14 ++ tests/examples/generic/test-display.c | 42 ++++ 11 files changed, 849 insertions(+), 2 deletions(-) create mode 100644 gst-libs/gst/vaapi/gstvaapidisplay.c create mode 100644 gst-libs/gst/vaapi/gstvaapidisplay.h create mode 100644 gst-libs/gst/vaapi/gstvaapidisplay_x11.c create mode 100644 gst-libs/gst/vaapi/gstvaapidisplay_x11.h create mode 100644 gst-libs/gst/vaapi/vaapi_debug.h create mode 100644 gst-libs/gst/vaapi/vaapi_utils.c create mode 100644 gst-libs/gst/vaapi/vaapi_utils.h create mode 100644 tests/examples/generic/test-display.c diff --git a/configure.ac b/configure.ac index 261817c8ca..fee139e6a1 100644 --- a/configure.ac +++ b/configure.ac @@ -93,6 +93,7 @@ AC_SUBST(plugindir) dnl Check for VA-API PKG_CHECK_MODULES(LIBVA, [libva]) +PKG_CHECK_MODULES(X11, [x11]) PKG_CHECK_MODULES(LIBVA_X11, [libva-x11]) dnl Check for SDS extensions to VA-API diff --git a/gst-libs/gst/vaapi/Makefile.am b/gst-libs/gst/vaapi/Makefile.am index 0984d1c51c..3bb898150c 100644 --- a/gst-libs/gst/vaapi/Makefile.am +++ b/gst-libs/gst/vaapi/Makefile.am @@ -1,12 +1,45 @@ lib_LTLIBRARIES = libgstvaapi-@GST_MAJORMINOR@.la -libgstvaapi_@GST_MAJORMINOR@_la_SOURCES = \ +libgstvaapi_@GST_MAJORMINOR@_la_SOURCES = \ + gstvaapidisplay.c \ + vaapi_utils.c \ + $(NULL) + +libgstvaapi_@GST_MAJORMINOR@include_HEADERS = \ + gstvaapidisplay.h \ + vaapi_debug.h \ + vaapi_utils.h \ $(NULL) libgstvaapi_@GST_MAJORMINOR@includedir = \ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/vaapi -libgstvaapi_@GST_MAJORMINOR@include_HEADERS = \ +libgstvaapi_@GST_MAJORMINOR@_la_CFLAGS = \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) \ + $(LIBVA_CFLAGS) \ + $(NULL) + +libgstvaapi_@GST_MAJORMINOR@_la_LIBADD = \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) \ + $(LIBVA_LIBS) \ + $(NULL) + +libgstvaapi_@GST_MAJORMINOR@_la_SOURCES += \ + gstvaapidisplay_x11.c \ + $(NULL) + +libgstvaapi_@GST_MAJORMINOR@include_HEADERS += \ + gstvaapidisplay_x11.h \ + $(NULL) + +libgstvaapi_@GST_MAJORMINOR@_la_CFLAGS += \ + $(LIBVA_X11_CFLAGS) \ + $(NULL) + +libgstvaapi_@GST_MAJORMINOR@_la_LIBADD += \ + $(LIBVA_X11_LIBS) \ $(NULL) # Extra clean files so that maintainer-clean removes *everything* diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.c b/gst-libs/gst/vaapi/gstvaapidisplay.c new file mode 100644 index 0000000000..9a24e5d894 --- /dev/null +++ b/gst-libs/gst/vaapi/gstvaapidisplay.c @@ -0,0 +1,263 @@ +/* + * gstvaapidisplay.c - VA display abstraction + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "vaapi_utils.h" +#include "gstvaapidisplay.h" +#include + +#define DEBUG 1 +#include "vaapi_debug.h" + +G_DEFINE_TYPE(GstVaapiDisplay, gst_vaapi_display, G_TYPE_OBJECT); + +#define GST_VAAPI_DISPLAY_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), \ + GST_VAAPI_TYPE_DISPLAY, \ + GstVaapiDisplayPrivate)) + +struct _GstVaapiDisplayPrivate { + VADisplay display; + VAProfile *profiles; + unsigned int num_profiles; + VAImageFormat *image_formats; + unsigned int num_image_formats; + VAImageFormat *subpicture_formats; + unsigned int *subpicture_flags; + unsigned int num_subpicture_formats; +}; + +enum { + PROP_0, + + PROP_DISPLAY +}; + +static void +gst_vaapi_display_set_display(GstVaapiDisplay *display, VADisplay va_display); + +static void +gst_vaapi_display_finalize(GObject *object) +{ + GstVaapiDisplay *display = GST_VAAPI_DISPLAY(object); + GstVaapiDisplayPrivate *priv = display->priv; + + gst_vaapi_display_set_display(display, NULL); + + G_OBJECT_CLASS(gst_vaapi_display_parent_class)->finalize(object); +} + +static void +gst_vaapi_display_set_property(GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GstVaapiDisplay *display = GST_VAAPI_DISPLAY(object); + GstVaapiDisplayPrivate *priv = display->priv; + + switch (prop_id) { + case PROP_DISPLAY: + gst_vaapi_display_set_display(display, g_value_get_pointer(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void +gst_vaapi_display_get_property(GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GstVaapiDisplay *display = GST_VAAPI_DISPLAY(object); + GstVaapiDisplayPrivate *priv = display->priv; + + switch (prop_id) { + case PROP_DISPLAY: + g_value_set_pointer(value, gst_vaapi_display_get_display(display)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void +gst_vaapi_display_class_init(GstVaapiDisplayClass *klass) +{ + GObjectClass * const object_class = G_OBJECT_CLASS(klass); + + g_type_class_add_private(klass, sizeof(GstVaapiDisplayPrivate)); + + object_class->finalize = gst_vaapi_display_finalize; + object_class->set_property = gst_vaapi_display_set_property; + object_class->get_property = gst_vaapi_display_get_property; + + g_object_class_install_property + (object_class, + PROP_DISPLAY, + g_param_spec_pointer("display", + "VA display", + "VA display", + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); +} + +static void +gst_vaapi_display_init(GstVaapiDisplay *display) +{ + GstVaapiDisplayPrivate *priv = GST_VAAPI_DISPLAY_GET_PRIVATE(display); + + display->priv = priv; + priv->display = NULL; + priv->profiles = 0; + priv->num_profiles = 0; + priv->image_formats = NULL; + priv->num_image_formats = 0; + priv->subpicture_formats = NULL; + priv->subpicture_flags = NULL; + priv->num_subpicture_formats = 0; +} + +VADisplay +gst_vaapi_display_get_display(GstVaapiDisplay *display) +{ + GstVaapiDisplayPrivate *priv = display->priv; + + return priv->display; +} + +static void +gst_vaapi_display_destroy_resources(GstVaapiDisplay *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; + } +} + +static gboolean +gst_vaapi_display_create_resources(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_image_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; +} + +void +gst_vaapi_display_set_display(GstVaapiDisplay *display, VADisplay va_display) +{ + GstVaapiDisplayPrivate *priv = display->priv; + VAStatus status; + int major_version, minor_version; + + 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 (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); + return; + } + } +} diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.h b/gst-libs/gst/vaapi/gstvaapidisplay.h new file mode 100644 index 0000000000..942b6e5e64 --- /dev/null +++ b/gst-libs/gst/vaapi/gstvaapidisplay.h @@ -0,0 +1,77 @@ +/* + * gstvaapidisplay.h - VA display abstraction + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef GST_VAAPI_DISPLAY_H +#define GST_VAAPI_DISPLAY_H + +#include +#include + +G_BEGIN_DECLS + +#define GST_VAAPI_TYPE_DISPLAY \ + (gst_vaapi_display_get_type()) + +#define GST_VAAPI_DISPLAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + GST_VAAPI_TYPE_DISPLAY, \ + GstVaapiDisplay)) + +#define GST_VAAPI_DISPLAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + GST_VAAPI_TYPE_DISPLAY, \ + GstVaapiDisplayClass)) + +#define GST_VAAPI_IS_DISPLAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_DISPLAY)) + +#define GST_VAAPI_IS_DISPLAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_DISPLAY)) + +#define GST_VAAPI_DISPLAY_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + GST_VAAPI_TYPE_DISPLAY, \ + GstVaapiDisplay)) + +typedef struct _GstVaapiDisplay GstVaapiDisplay; +typedef struct _GstVaapiDisplayPrivate GstVaapiDisplayPrivate; +typedef struct _GstVaapiDisplayClass GstVaapiDisplayClass; + +struct _GstVaapiDisplay { + /*< private >*/ + GObject parent_instance; + + GstVaapiDisplayPrivate *priv; +}; + +struct _GstVaapiDisplayClass { + /*< private >*/ + GObjectClass parent_class; +}; + +GType +gst_vaapi_display_get_type(void); + +VADisplay +gst_vaapi_display_get_display(GstVaapiDisplay *display); + +G_END_DECLS + +#endif /* GST_VAAPI_DISPLAY_H */ diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_x11.c b/gst-libs/gst/vaapi/gstvaapidisplay_x11.c new file mode 100644 index 0000000000..d215230fc6 --- /dev/null +++ b/gst-libs/gst/vaapi/gstvaapidisplay_x11.c @@ -0,0 +1,158 @@ +/* + * gstvaapidisplay_x11.c - VA/X11 display abstraction + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "vaapi_utils.h" +#include "gstvaapidisplay_x11.h" + +#define DEBUG 1 +#include "vaapi_debug.h" + +G_DEFINE_TYPE(GstVaapiDisplayX11, + gst_vaapi_display_x11, + GST_VAAPI_TYPE_DISPLAY); + +#define GST_VAAPI_DISPLAY_X11_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), \ + GST_VAAPI_TYPE_DISPLAY_X11, \ + GstVaapiDisplayX11Private)) + +struct _GstVaapiDisplayX11Private { + Display *display; +}; + +enum { + PROP_0, + + PROP_X11_DISPLAY +}; + +static void +gst_vaapi_display_x11_set_display(GstVaapiDisplayX11 *display, + Display *x11_display); + +static void +gst_vaapi_display_x11_finalize(GObject *object) +{ + GstVaapiDisplayX11 *display = GST_VAAPI_DISPLAY_X11(object); + GstVaapiDisplayX11Private *priv = display->priv; + + G_OBJECT_CLASS(gst_vaapi_display_x11_parent_class)->finalize(object); +} + +static void +gst_vaapi_display_x11_set_property(GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GstVaapiDisplayX11 *display = GST_VAAPI_DISPLAY_X11(object); + GstVaapiDisplayX11Private *priv = display->priv; + + switch (prop_id) { + case PROP_X11_DISPLAY: + gst_vaapi_display_x11_set_display(display, g_value_get_pointer(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void +gst_vaapi_display_x11_get_property(GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GstVaapiDisplayX11 *display = GST_VAAPI_DISPLAY_X11(object); + GstVaapiDisplayX11Private *priv = display->priv; + + switch (prop_id) { + case PROP_X11_DISPLAY: + g_value_set_pointer(value, gst_vaapi_display_x11_get_display(display)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void +gst_vaapi_display_x11_class_init(GstVaapiDisplayX11Class *klass) +{ + GObjectClass * const object_class = G_OBJECT_CLASS(klass); + + g_type_class_add_private(klass, sizeof(GstVaapiDisplayX11Private)); + + object_class->finalize = gst_vaapi_display_x11_finalize; + object_class->set_property = gst_vaapi_display_x11_set_property; + object_class->get_property = gst_vaapi_display_x11_get_property; + + g_object_class_install_property + (object_class, + PROP_X11_DISPLAY, + g_param_spec_pointer("x11-display", + "X11 display", + "X11 display", + G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY)); +} + +static void +gst_vaapi_display_x11_init(GstVaapiDisplayX11 *display) +{ + GstVaapiDisplayX11Private *priv = GST_VAAPI_DISPLAY_X11_GET_PRIVATE(display); + + display->priv = priv; + priv->display = NULL; +} + +Display * +gst_vaapi_display_x11_get_display(GstVaapiDisplayX11 *display) +{ + GstVaapiDisplayX11Private *priv = display->priv; + + return priv->display; +} + +void +gst_vaapi_display_x11_set_display(GstVaapiDisplayX11 *display, + Display *x11_display) +{ + GstVaapiDisplayX11Private *priv = display->priv; + + 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; +} + +GstVaapiDisplay * +gst_vaapi_display_x11_new(Display *x11_display) +{ + return g_object_new(GST_VAAPI_TYPE_DISPLAY_X11, + "x11-display", x11_display, + NULL); +} diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_x11.h b/gst-libs/gst/vaapi/gstvaapidisplay_x11.h new file mode 100644 index 0000000000..8633a02186 --- /dev/null +++ b/gst-libs/gst/vaapi/gstvaapidisplay_x11.h @@ -0,0 +1,80 @@ +/* + * gstvaapidisplay_x11.h - VA/X11 display abstraction + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef GST_VAAPI_DISPLAY_X11_H +#define GST_VAAPI_DISPLAY_X11_H + +#include "gstvaapidisplay.h" +#include + +G_BEGIN_DECLS + +#define GST_VAAPI_TYPE_DISPLAY_X11 \ + (gst_vaapi_display_x11_get_type()) + +#define GST_VAAPI_DISPLAY_X11(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), \ + GST_VAAPI_TYPE_DISPLAY_X11, \ + GstVaapiDisplayX11)) + +#define GST_VAAPI_DISPLAY_X11_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + GST_VAAPI_TYPE_DISPLAY_X11, \ + GstVaapiDisplayX11Class)) + +#define GST_VAAPI_IS_DISPLAY_X11(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_VAAPI_TYPE_DISPLAY_X11)) + +#define GST_VAAPI_IS_DISPLAY_X11_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_VAAPI_TYPE_DISPLAY_X11)) + +#define GST_VAAPI_DISPLAY_X11_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), \ + GST_VAAPI_TYPE_DISPLAY_X11, \ + GstVaapiDisplayX11)) + +typedef struct _GstVaapiDisplayX11 GstVaapiDisplayX11; +typedef struct _GstVaapiDisplayX11Private GstVaapiDisplayX11Private; +typedef struct _GstVaapiDisplayX11Class GstVaapiDisplayX11Class; + +struct _GstVaapiDisplayX11 { + /*< private >*/ + GstVaapiDisplay parent_instance; + + GstVaapiDisplayX11Private *priv; +}; + +struct _GstVaapiDisplayX11Class { + /*< private >*/ + GstVaapiDisplayClass parent_class; +}; + +GType +gst_vaapi_display_x11_get_type(void); + +GstVaapiDisplay * +gst_vaapi_display_x11_new(Display *x11_display); + +Display * +gst_vaapi_display_x11_get_display(GstVaapiDisplayX11 *display); + +G_END_DECLS + +#endif /* GST_VAAPI_DISPLAY_X11_H */ diff --git a/gst-libs/gst/vaapi/vaapi_debug.h b/gst-libs/gst/vaapi/vaapi_debug.h new file mode 100644 index 0000000000..edda08fa50 --- /dev/null +++ b/gst-libs/gst/vaapi/vaapi_debug.h @@ -0,0 +1,33 @@ +/* + * vaapi_debug.h - VA-API debugging utilities + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef VAAPI_DEBUG_H +#define VAAPI_DEBUG_H + +#include "vaapi_utils.h" + +#if DEBUG +# define D(x) x +#else +# define D(x) +#endif +#define bug vaapi_dprintf + +#endif /* VAAPI_DEBUG_H */ diff --git a/gst-libs/gst/vaapi/vaapi_utils.c b/gst-libs/gst/vaapi/vaapi_utils.c new file mode 100644 index 0000000000..d271bc3f37 --- /dev/null +++ b/gst-libs/gst/vaapi/vaapi_utils.c @@ -0,0 +1,98 @@ +/* + * vaapi_utils.c - VA-API utilities + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "vaapi_utils.h" +#include +#include + +/* Debug output */ +void vaapi_dprintf(const char *format, ...) +{ + va_list args; + va_start(args, format); + fprintf(stdout, "[GstVaapi] "); + vfprintf(stdout, format, args); + va_end(args); +} + +/* Check VA status for success or print out an error */ +int vaapi_check_status(VAStatus status, const char *msg) +{ + if (status != VA_STATUS_SUCCESS) { + vaapi_dprintf("%s: %s\n", msg, vaErrorStr(status)); + return 0; + } + return 1; +} + +/* Return a string representation of a FOURCC */ +const char *string_of_FOURCC(guint32 fourcc) +{ + static int buf; + static char str[2][5]; // XXX: 2 buffers should be enough for most purposes + + buf ^= 1; + str[buf][0] = fourcc; + str[buf][1] = fourcc >> 8; + str[buf][2] = fourcc >> 16; + str[buf][3] = fourcc >> 24; + str[buf][4] = '\0'; + return str[buf]; +} + +/* Return a string representation of a VAProfile */ +const char *string_of_VAProfile(VAProfile profile) +{ + switch (profile) { +#define PROFILE(profile) \ + case VAProfile##profile: return "VAProfile" #profile + PROFILE(MPEG2Simple); + PROFILE(MPEG2Main); + PROFILE(MPEG4Simple); + PROFILE(MPEG4AdvancedSimple); + PROFILE(MPEG4Main); + PROFILE(H264Baseline); + PROFILE(H264Main); + PROFILE(H264High); + PROFILE(VC1Simple); + PROFILE(VC1Main); + PROFILE(VC1Advanced); +#undef PROFILE + default: break; + } + return ""; +} + +/* Return a string representation of a VAEntrypoint */ +const char *string_of_VAEntrypoint(VAEntrypoint entrypoint) +{ + switch (entrypoint) { +#define ENTRYPOINT(entrypoint) \ + case VAEntrypoint##entrypoint: return "VAEntrypoint" #entrypoint + ENTRYPOINT(VLD); + ENTRYPOINT(IZZ); + ENTRYPOINT(IDCT); + ENTRYPOINT(MoComp); + ENTRYPOINT(Deblocking); +#undef ENTRYPOINT + default: break; + } + return ""; +} diff --git a/gst-libs/gst/vaapi/vaapi_utils.h b/gst-libs/gst/vaapi/vaapi_utils.h new file mode 100644 index 0000000000..f44fe42cf9 --- /dev/null +++ b/gst-libs/gst/vaapi/vaapi_utils.h @@ -0,0 +1,48 @@ +/* + * vaapi_utils.h - VA-API utilities + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef VAAPI_UTILS_H +#define VAAPI_UTILS_H + +#include "config.h" +#include +#include + +/** Debug output */ +void vaapi_dprintf(const char *format, ...) + attribute_hidden; + +/** Check VA status for success or print out an error */ +int vaapi_check_status(VAStatus status, const char *msg) + attribute_hidden; + +/** Return a string representation of a FOURCC */ +const char *string_of_FOURCC(guint32 fourcc) + attribute_hidden; + +/** Return a string representation of a VAProfile */ +const char *string_of_VAProfile(VAProfile profile) + attribute_hidden; + +/** Return a string representation of a VAEntrypoint */ +const char *string_of_VAEntrypoint(VAEntrypoint entrypoint) + attribute_hidden; + +#endif /* VAAPI_UTILS_H */ diff --git a/tests/examples/generic/Makefile.am b/tests/examples/generic/Makefile.am index 12a3966ea0..96bddd9cd0 100644 --- a/tests/examples/generic/Makefile.am +++ b/tests/examples/generic/Makefile.am @@ -1,5 +1,19 @@ noinst_PROGRAMS = \ + test-display \ $(NULL) +TEST_CFLAGS = \ + $(GST_CFLAGS) \ + -I$(top_srcdir)/gst-libs \ + $(X11_CFLAGS) + +TEST_LIBS = \ + $(top_builddir)/gst-libs/gst/vaapi/libgstvaapi-@GST_MAJORMINOR@.la \ + $(X11_LIBS) + +test_display_SOURCES = test-display.c +test_display_CFLAGS = $(TEST_CFLAGS) +test_display_LDADD = $(TEST_LIBS) + # Extra clean files so that maintainer-clean removes *everything* MAINTAINERCLEANFILES = Makefile.in diff --git a/tests/examples/generic/test-display.c b/tests/examples/generic/test-display.c new file mode 100644 index 0000000000..5c05511ab9 --- /dev/null +++ b/tests/examples/generic/test-display.c @@ -0,0 +1,42 @@ +/* + * test-display.c - Test GstVaapiDisplayX11 + * + * gstreamer-vaapi (C) 2010 Splitted-Desktop Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include + +int +main(int argc, char *argv[]) +{ + Display *x11_display; + GstVaapiDisplay *display; + + gst_init(&argc, &argv); + + x11_display = XOpenDisplay(NULL); + if (!x11_display) + g_error("could not create X11 display"); + + display = gst_vaapi_display_x11_new(x11_display); + if (!display) + g_error("could not create VA-API display"); + + g_object_unref(G_OBJECT(display)); + return 0; +}