summaryrefslogtreecommitdiff
path: root/tests/test-windows.c
diff options
context:
space:
mode:
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>2010-03-16 08:49:16 +0000
committergb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>2010-03-16 08:49:16 +0000
commit148d104c1ab634d634a2131d3d1c33357dd1a795 (patch)
tree0373b3d18103928cbfc1faf3a01db0f62b795ab5 /tests/test-windows.c
parent69d58a0857f1a4c3483cf91224185199290d82ef (diff)
downloadgst-vaapi-148d104c1ab634d634a2131d3d1c33357dd1a795.tar.gz
Move tests to top-level tests/ directory.
Diffstat (limited to 'tests/test-windows.c')
-rw-r--r--tests/test-windows.c267
1 files changed, 267 insertions, 0 deletions
diff --git a/tests/test-windows.c b/tests/test-windows.c
new file mode 100644
index 00000000..07db884d
--- /dev/null
+++ b/tests/test-windows.c
@@ -0,0 +1,267 @@
+/*
+ * test-windows.c - Test GstVaapiWindow
+ *
+ * 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 <gst/vaapi/gstvaapidisplay_x11.h>
+#include <gst/vaapi/gstvaapiwindow_x11.h>
+#include <gst/vaapi/gstvaapisurface.h>
+#include <gst/vaapi/gstvaapiimage.h>
+
+static inline void pause(void)
+{
+ g_print("Press any key to continue...\n");
+ getchar();
+}
+
+typedef void (*DrawRectFunc)(
+ guchar *pixels[3],
+ guint stride[3],
+ gint x,
+ gint y,
+ guint width,
+ guint height,
+ guint32 color
+);
+
+static void draw_rect_NV12( // Y, UV planes
+ guchar *pixels[3],
+ guint stride[3],
+ gint x,
+ gint y,
+ guint width,
+ guint height,
+ guint32 color
+)
+{
+ const guchar Y = color >> 16;
+ const guchar Cb = color >> 8;
+ const guchar Cr = color;
+ guchar *dst;
+ guint i, j;
+
+ dst = pixels[0] + y * stride[0] + x;
+ for (j = 0; j < height; j++, dst += stride[0])
+ for (i = 0; i < width; i++)
+ dst[i] = Y;
+
+ x /= 2;
+ y /= 2;
+ width /= 2;
+ height /= 2;
+
+ dst = pixels[1] + y * stride[1] + x * 2;
+ for (j = 0; j < height; j++, dst += stride[1])
+ for (i = 0; i < width; i++) {
+ dst[2*i + 0] = Cb;
+ dst[2*i + 1] = Cr;
+ }
+}
+
+static void draw_rect_YV12( // Y, U, V planes
+ guchar *pixels[3],
+ guint stride[3],
+ gint x,
+ gint y,
+ guint width,
+ guint height,
+ guint32 color
+)
+{
+ const guchar Y = color >> 16;
+ const guchar Cb = color >> 8;
+ const guchar Cr = color;
+ guchar *pY, *pU, *pV;
+ guint i, j;
+
+ pY = pixels[0] + y * stride[0] + x;
+ for (j = 0; j < height; j++, pY += stride[0])
+ for (i = 0; i < width; i++)
+ pY[i] = Y;
+
+ x /= 2;
+ y /= 2;
+ width /= 2;
+ height /= 2;
+
+ pU = pixels[1] + y * stride[1] + x;
+ pV = pixels[2] + y * stride[2] + x;
+ for (j = 0; j < height; j++, pU += stride[1], pV += stride[2])
+ for (i = 0; i < width; i++) {
+ pU[i] = Cb;
+ pV[i] = Cr;
+ }
+}
+
+static gboolean draw_rgb_rects(GstVaapiImage *image)
+{
+ GstVaapiImageFormat format = GST_VAAPI_IMAGE_FORMAT(image);
+ guint w = GST_VAAPI_IMAGE_WIDTH(image);
+ guint h = GST_VAAPI_IMAGE_HEIGHT(image);
+ guchar *pixels[3];
+ guint stride[3];
+ guint32 red_color, green_color, blue_color, black_color;
+ DrawRectFunc draw_rect;
+
+ if (!gst_vaapi_image_map(image))
+ return FALSE;
+
+ switch (format) {
+ case GST_VAAPI_IMAGE_NV12:
+ draw_rect = draw_rect_NV12;
+ pixels[0] = gst_vaapi_image_get_plane(image, 0);
+ stride[0] = gst_vaapi_image_get_pitch(image, 0);
+ pixels[1] = gst_vaapi_image_get_plane(image, 1);
+ stride[1] = gst_vaapi_image_get_pitch(image, 1);
+ goto YUV_colors;
+ case GST_VAAPI_IMAGE_YV12:
+ draw_rect = draw_rect_YV12;
+ pixels[0] = gst_vaapi_image_get_plane(image, 0);
+ stride[0] = gst_vaapi_image_get_pitch(image, 0);
+ pixels[1] = gst_vaapi_image_get_plane(image, 2);
+ stride[1] = gst_vaapi_image_get_pitch(image, 2);
+ pixels[2] = gst_vaapi_image_get_plane(image, 1);
+ stride[2] = gst_vaapi_image_get_pitch(image, 1);
+ goto YUV_colors;
+ case GST_VAAPI_IMAGE_I420:
+ draw_rect = draw_rect_YV12;
+ pixels[0] = gst_vaapi_image_get_plane(image, 0);
+ stride[0] = gst_vaapi_image_get_pitch(image, 0);
+ pixels[1] = gst_vaapi_image_get_plane(image, 1);
+ stride[1] = gst_vaapi_image_get_pitch(image, 1);
+ pixels[2] = gst_vaapi_image_get_plane(image, 2);
+ stride[2] = gst_vaapi_image_get_pitch(image, 2);
+ YUV_colors:
+ red_color = 0x515af0;
+ green_color = 0x913622;
+ blue_color = 0x29f06e;
+ black_color = 0x108080;
+ break;
+ default:
+ gst_vaapi_image_unmap(image);
+ return FALSE;
+ }
+
+ draw_rect(pixels, stride, 0, 0, w/2, h/2, red_color);
+ draw_rect(pixels, stride, w/2, 0, w/2, h/2, green_color);
+ draw_rect(pixels, stride, 0, h/2, w/2, h/2, blue_color);
+ draw_rect(pixels, stride, w/2, h/2, w/2, h/2, black_color);
+
+ if (!gst_vaapi_image_unmap(image))
+ return FALSE;
+
+ return TRUE;
+}
+
+int
+main(int argc, char *argv[])
+{
+ GstVaapiDisplay *display;
+ GstVaapiWindow *window;
+ GstVaapiSurface *surface;
+ GstVaapiImage *image;
+ guint flags = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
+
+ static const GstVaapiChromaType chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420;
+ static const guint width = 320;
+ static const guint height = 240;
+ static const guint win_width = 640;
+ static const guint win_height = 480;
+
+ gst_init(&argc, &argv);
+
+ display = gst_vaapi_display_x11_new(NULL);
+ if (!display)
+ g_error("could not create Gst/VA display");
+
+ surface = gst_vaapi_surface_new(display, chroma_type, width, height);
+ if (!surface)
+ g_error("could not create Gst/VA surface");
+
+ image = gst_vaapi_image_new(display, GST_VAAPI_IMAGE_NV12, width, height);
+ if (!image)
+ g_error("could not create Gst/VA image");
+ if (!draw_rgb_rects(image))
+ g_error("could not draw RGB rectangels");
+
+ if (!gst_vaapi_surface_put_image(surface, image))
+ g_error("could not upload image");
+ if (!gst_vaapi_surface_sync(surface))
+ g_error("could not complete image upload");
+
+ g_print("#\n");
+ g_print("# Create window with gst_vaapi_window_x11_new()\n");
+ g_print("#\n");
+ {
+ window = gst_vaapi_window_x11_new(display, win_width, win_height);
+ if (!window)
+ g_error("could not create window");
+
+ if (!gst_vaapi_window_put_surface(window, surface, flags))
+ g_error("could not render surface");
+
+ pause();
+ g_object_unref(window);
+ }
+
+ g_print("#\n");
+ g_print("# Create window with gst_vaapi_window_x11_new_with_xid()\n");
+ g_print("#\n");
+ {
+ Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(display);
+ Window rootwin, win;
+ int screen;
+ unsigned long white_pixel, black_pixel;
+
+ screen = DefaultScreen(dpy);
+ rootwin = RootWindow(dpy, screen);
+ white_pixel = WhitePixel(dpy, screen);
+ black_pixel = BlackPixel(dpy, screen);
+
+ win = XCreateSimpleWindow(
+ dpy,
+ rootwin,
+ 0, 0, win_width, win_height,
+ 0, black_pixel,
+ white_pixel
+ );
+ if (!win)
+ g_error("could not create X window");
+
+ XMapRaised(dpy, win);
+ XSync(dpy, False);
+
+ window = gst_vaapi_window_x11_new_with_xid(display, win);
+ if (!window)
+ g_error("could not create window");
+
+ if (!gst_vaapi_window_put_surface(window, surface, flags))
+ g_error("could not render surface");
+
+ pause();
+ g_object_unref(window);
+ XUnmapWindow(dpy, win);
+ XDestroyWindow(dpy, win);
+ }
+
+ g_object_unref(image);
+ g_object_unref(surface);
+ g_object_unref(display);
+ gst_deinit();
+ return 0;
+}