summaryrefslogtreecommitdiff
path: root/tests/internal/test-display.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/internal/test-display.c')
-rw-r--r--tests/internal/test-display.c426
1 files changed, 426 insertions, 0 deletions
diff --git a/tests/internal/test-display.c b/tests/internal/test-display.c
new file mode 100644
index 00000000..068c155a
--- /dev/null
+++ b/tests/internal/test-display.c
@@ -0,0 +1,426 @@
+/*
+ * test-display.c - Test GstVaapiDisplayX11
+ *
+ * Copyright (C) 2010-2011 Splitted-Desktop Systems
+ * Author: Gwenole Beauchesne <gwenole.beauchesne@splitted-desktop.com>
+ * Copyright (C) 2012-2013 Intel Corporation
+ * Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#define _GNU_SOURCE
+#include "gst/vaapi/sysdeps.h"
+#include <gst/video/video.h>
+#if USE_DRM
+# include <gst/vaapi/gstvaapidisplay_drm.h>
+# include <va/va_drm.h>
+# include <fcntl.h>
+# include <unistd.h>
+# ifndef DRM_DEVICE_PATH
+# define DRM_DEVICE_PATH "/dev/dri/card0"
+# endif
+#endif
+#if USE_X11
+# include <gst/vaapi/gstvaapidisplay_x11.h>
+#endif
+#if USE_GLX
+# include <gst/vaapi/gstvaapidisplay_glx.h>
+#endif
+#if USE_WAYLAND
+# include <gst/vaapi/gstvaapidisplay_wayland.h>
+#endif
+#if USE_EGL
+# include <gst/vaapi/gstvaapidisplay_egl.h>
+#endif
+
+#ifdef HAVE_VA_VA_GLX_H
+# include <va/va_glx.h>
+#endif
+
+static void
+print_value (const GValue * value, const gchar * name)
+{
+ gchar *value_string;
+
+ value_string = g_strdup_value_contents (value);
+ if (!value_string)
+ return;
+ g_print (" %s: %s\n", name, value_string);
+ g_free (value_string);
+}
+
+static void
+print_profiles (GArray * profiles, const gchar * name)
+{
+ GstVaapiCodec codec;
+ const gchar *codec_name, *profile_name;
+ guint i;
+
+ g_print ("%u %s caps\n", profiles->len, name);
+
+ for (i = 0; i < profiles->len; i++) {
+ const GstVaapiProfile profile =
+ g_array_index (profiles, GstVaapiProfile, i);
+
+ codec = gst_vaapi_profile_get_codec (profile);
+ if (!codec)
+ continue;
+
+ codec_name = gst_vaapi_codec_get_name (codec);
+ if (!codec_name)
+ continue;
+
+ profile_name = gst_vaapi_profile_get_va_name (profile);
+ if (!profile_name)
+ continue;
+
+ g_print (" %s: %s profile\n", codec_name, profile_name);
+ }
+}
+
+static void
+print_format_yuv (const VAImageFormat * va_format)
+{
+ const guint32 fourcc = va_format->fourcc;
+
+ g_print (" fourcc '%c%c%c%c'",
+ fourcc & 0xff,
+ (fourcc >> 8) & 0xff, (fourcc >> 16) & 0xff, (fourcc >> 24) & 0xff);
+}
+
+static void
+print_format_rgb (const VAImageFormat * va_format)
+{
+ g_print (" %d bits per pixel, %s endian,",
+ va_format->bits_per_pixel,
+ va_format->byte_order == VA_MSB_FIRST ? "big" : "little");
+ g_print (" %s masks", va_format->alpha_mask ? "rgba" : "rgb");
+ g_print (" 0x%08x 0x%08x 0x%08x",
+ va_format->red_mask, va_format->green_mask, va_format->blue_mask);
+ if (va_format->alpha_mask)
+ g_print (" 0x%08x", va_format->alpha_mask);
+}
+
+static void
+print_formats (GArray * formats, const gchar * name)
+{
+ guint i;
+
+ g_print ("%u %s caps\n", formats->len, name);
+
+ for (i = 0; i < formats->len; i++) {
+ const GstVideoFormat format = g_array_index (formats, GstVideoFormat, i);
+ const VAImageFormat *va_format;
+
+ g_print (" %s:", gst_vaapi_video_format_to_string (format));
+
+ va_format = gst_vaapi_video_format_to_va_format (format);
+ if (!va_format)
+ g_error ("could not determine VA format");
+
+ if (gst_vaapi_video_format_is_yuv (format))
+ print_format_yuv (va_format);
+ else
+ print_format_rgb (va_format);
+ g_print ("\n");
+ }
+}
+
+static void
+dump_properties (GstVaapiDisplay * display)
+{
+ GParamSpec **properties;
+ guint i, n_properties;
+
+ properties =
+ g_object_class_list_properties (G_OBJECT_GET_CLASS (display),
+ &n_properties);
+
+ for (i = 0; i < n_properties; i++) {
+ const gchar *const name = g_param_spec_get_nick (properties[i]);
+ GValue value = G_VALUE_INIT;
+
+ if (!gst_vaapi_display_has_property (display, name))
+ continue;
+
+ g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (properties[i]));
+ g_object_get_property (G_OBJECT (display), name, &value);
+ print_value (&value, name);
+ }
+
+ g_free (properties);
+}
+
+static void
+dump_info (GstVaapiDisplay * display)
+{
+ GArray *profiles, *formats;
+
+ profiles = gst_vaapi_display_get_decode_profiles (display);
+ if (!profiles)
+ g_error ("could not get VA decode profiles");
+
+ print_profiles (profiles, "decoders");
+ g_array_unref (profiles);
+
+ profiles = gst_vaapi_display_get_encode_profiles (display);
+ if (!profiles)
+ g_error ("could not get VA encode profiles");
+
+ print_profiles (profiles, "encoders");
+ g_array_unref (profiles);
+
+ formats = gst_vaapi_display_get_image_formats (display);
+ if (!formats)
+ g_error ("could not get VA image formats");
+
+ print_formats (formats, "image");
+ g_array_unref (formats);
+
+ formats = gst_vaapi_display_get_subpicture_formats (display);
+ if (!formats)
+ g_error ("could not get VA subpicture formats");
+
+ print_formats (formats, "subpicture");
+ g_array_unref (formats);
+
+ dump_properties (display);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstVaapiDisplay *display;
+#if USE_X11 || USE_WAYLAND
+ guint width, height;
+ guint par_n, par_d;
+#endif
+
+ gst_init (&argc, &argv);
+
+#if USE_DRM
+ g_print ("#\n");
+ g_print ("# Create display with gst_vaapi_display_drm_new()\n");
+ g_print ("#\n");
+ {
+ display = gst_vaapi_display_drm_new (NULL);
+ if (!display)
+ g_error ("could not create Gst/VA display");
+
+ dump_info (display);
+ gst_object_unref (display);
+ }
+ g_print ("\n");
+
+ g_print ("#\n");
+ g_print ("# Create display with gst_vaapi_display_drm_new_with_device()\n");
+ g_print ("#\n");
+ {
+ int drm_device;
+
+ drm_device = open (DRM_DEVICE_PATH, O_RDWR | O_CLOEXEC);
+ if (drm_device < 0)
+ g_error ("could not open DRM device");
+
+ display = gst_vaapi_display_drm_new_with_device (drm_device);
+ if (!display)
+ g_error ("could not create Gst/VA display");
+
+ dump_info (display);
+ gst_object_unref (display);
+ close (drm_device);
+ }
+ g_print ("\n");
+
+ g_print ("#\n");
+ g_print
+ ("# Create display with gst_vaapi_display_new_with_display() [vaGetDisplayDRM()]\n");
+ g_print ("#\n");
+ {
+ int drm_device;
+ VADisplay va_display;
+
+ drm_device = open (DRM_DEVICE_PATH, O_RDWR | O_CLOEXEC);
+ if (drm_device < 0)
+ g_error ("could not open DRM device");
+
+ va_display = vaGetDisplayDRM (drm_device);
+ if (!va_display)
+ g_error ("could not create VA display");
+
+ display = gst_vaapi_display_new_with_display (va_display);
+ if (!display)
+ g_error ("could not create Gst/VA display");
+
+ dump_info (display);
+ gst_object_unref (display);
+ close (drm_device);
+ }
+ g_print ("\n");
+#endif
+
+#if USE_X11
+ g_print ("#\n");
+ g_print ("# Create display with gst_vaapi_display_x11_new()\n");
+ g_print ("#\n");
+ {
+ display = gst_vaapi_display_x11_new (NULL);
+ if (!display)
+ g_error ("could not create Gst/VA display");
+ }
+ g_print ("\n");
+
+ g_print ("#\n");
+ g_print ("# Create display with gst_vaapi_display_x11_new_with_display()\n");
+ g_print ("#\n");
+ {
+ Display *x11_display;
+
+ x11_display = XOpenDisplay (NULL);
+ if (!x11_display)
+ g_error ("could not create X11 display");
+
+ display = gst_vaapi_display_x11_new_with_display (x11_display);
+ if (!display)
+ g_error ("could not create Gst/VA display");
+
+ dump_info (display);
+ gst_object_unref (display);
+ XCloseDisplay (x11_display);
+ }
+ g_print ("\n");
+
+ g_print ("#\n");
+ g_print
+ ("# Create display with gst_vaapi_display_new_with_display() [vaGetDisplay()]\n");
+ g_print ("#\n");
+ {
+ Display *x11_display;
+ VADisplay va_display;
+
+ x11_display = XOpenDisplay (NULL);
+ if (!x11_display)
+ g_error ("could not create X11 display");
+
+ va_display = vaGetDisplay (x11_display);
+ if (!va_display)
+ g_error ("could not create VA display");
+
+ display = gst_vaapi_display_new_with_display (va_display);
+ if (!display)
+ g_error ("could not create Gst/VA display");
+
+ dump_info (display);
+ gst_object_unref (display);
+ XCloseDisplay (x11_display);
+ }
+ g_print ("\n");
+#endif
+
+#if USE_GLX
+ g_print ("#\n");
+ g_print ("# Create display with gst_vaapi_display_glx_new()\n");
+ g_print ("#\n");
+ {
+ display = gst_vaapi_display_glx_new (NULL);
+ 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);
+
+ gst_vaapi_display_get_pixel_aspect_ratio (display, &par_n, &par_d);
+ g_print ("Pixel aspect ratio: %u/%u\n", par_n, par_d);
+
+ dump_info (display);
+ gst_object_unref (display);
+ }
+ g_print ("\n");
+
+ g_print ("#\n");
+ g_print ("# Create display with gst_vaapi_display_glx_new_with_display()\n");
+ g_print ("#\n");
+ {
+ Display *x11_display;
+
+ x11_display = XOpenDisplay (NULL);
+ if (!x11_display)
+ g_error ("could not create X11 display");
+
+ display = gst_vaapi_display_glx_new_with_display (x11_display);
+ if (!display)
+ g_error ("could not create Gst/VA display");
+
+ dump_info (display);
+ gst_object_unref (display);
+ XCloseDisplay (x11_display);
+ }
+ g_print ("\n");
+
+#ifdef HAVE_VA_VA_GLX_H
+ g_print ("#\n");
+ g_print
+ ("# Create display with gst_vaapi_display_new_with_display() [vaGetDisplayGLX()]\n");
+ g_print ("#\n");
+ {
+ Display *x11_display;
+ VADisplay va_display;
+
+ x11_display = XOpenDisplay (NULL);
+ if (!x11_display)
+ g_error ("could not create X11 display");
+
+ va_display = vaGetDisplayGLX (x11_display);
+ if (!va_display)
+ g_error ("could not create VA display");
+
+ display = gst_vaapi_display_new_with_display (va_display);
+ if (!display)
+ g_error ("could not create Gst/VA display");
+
+ dump_info (display);
+ gst_object_unref (display);
+ XCloseDisplay (x11_display);
+ }
+ g_print ("\n");
+#endif
+#endif
+
+#if USE_WAYLAND
+ g_print ("#\n");
+ g_print ("# Create display with gst_vaapi_display_wayland_new()\n");
+ g_print ("#\n");
+ {
+ display = gst_vaapi_display_wayland_new (NULL);
+ 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);
+
+ gst_vaapi_display_get_pixel_aspect_ratio (display, &par_n, &par_d);
+ g_print ("Pixel aspect ratio: %u/%u\n", par_n, par_d);
+
+ dump_info (display);
+ gst_object_unref (display);
+ }
+ g_print ("\n");
+#endif
+
+ gst_deinit ();
+ return 0;
+}