Factor out image utilities.
[profile/ivi/gstreamer-vaapi.git] / tests / test-windows.c
index 3aa4a50..7292bba 100644 (file)
@@ -22,6 +22,7 @@
 #include <gst/vaapi/gstvaapiwindow_x11.h>
 #include <gst/vaapi/gstvaapisurface.h>
 #include <gst/vaapi/gstvaapiimage.h>
+#include "image.h"
 
 static inline void pause(void)
 {
@@ -29,261 +30,6 @@ static inline void pause(void)
     getchar();
 }
 
-typedef void (*DrawRectFunc)(
-    guchar *pixels[3],
-    guint   stride[3],
-    gint    x,
-    gint    y,
-    guint   width,
-    guint   height,
-    guint32 color
-);
-
-static void draw_rect_ARGB(
-    guchar *pixels[3],
-    guint   stride[3],
-    gint    x,
-    gint    y,
-    guint   width,
-    guint   height,
-    guint32 color
-)
-{
-    guint i, j;
-
-    color = GUINT32_TO_BE(color);
-
-    for (j = 0; j < height; j++) {
-        guint32 *p = (guint32 *)(pixels[0] + (y + j) * stride[0] + x * 4);
-        for (i = 0; i < width; i++)
-            p[i] = color;
-    }
-}
-
-static void draw_rect_BGRA(
-    guchar *pixels[3],
-    guint   stride[3],
-    gint    x,
-    gint    y,
-    guint   width,
-    guint   height,
-    guint32 color
-)
-{
-    // Converts ARGB color to BGRA
-    color = GUINT32_SWAP_LE_BE(color);
-
-    draw_rect_ARGB(pixels, stride, x, y, width, height, color);
-}
-
-static void draw_rect_RGBA(
-    guchar *pixels[3],
-    guint   stride[3],
-    gint    x,
-    gint    y,
-    guint   width,
-    guint   height,
-    guint32 color
-)
-{
-    // Converts ARGB color to RGBA
-    color = ((color >> 24) & 0xff) | ((color & 0xffffff) << 8);
-
-    draw_rect_ARGB(pixels, stride, x, y, width, height, color);
-}
-
-static void draw_rect_ABGR(
-    guchar *pixels[3],
-    guint   stride[3],
-    gint    x,
-    gint    y,
-    guint   width,
-    guint   height,
-    guint32 color
-)
-{
-    // Converts ARGB color to ABGR
-    color = ((color & 0xff00ff00)   |
-             ((color >> 16) & 0xff) |
-             ((color & 0xff) << 16));
-
-    draw_rect_ARGB(pixels, stride, x, y, width, height, 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 void draw_rect_AYUV(
-    guchar *pixels[3],
-    guint   stride[3],
-    gint    x,
-    gint    y,
-    guint   width,
-    guint   height,
-    guint32 color
-)
-{
-    guint i, j;
-
-    color = color | 0xff000000;
-
-    for (j = 0; j < height; j++) {
-        guint32 *p = (guint32 *)(pixels[0] + (y + j) * stride[0] + x * 4);
-        for (i = 0; i < width; i++)
-            p[i] = color;
-    }
-}
-
-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_ARGB:
-        draw_rect   = draw_rect_ARGB;
-        goto RGB_colors;
-    case GST_VAAPI_IMAGE_BGRA:
-        draw_rect   = draw_rect_BGRA;
-        goto RGB_colors;
-    case GST_VAAPI_IMAGE_RGBA:
-        draw_rect   = draw_rect_RGBA;
-        goto RGB_colors;
-    case GST_VAAPI_IMAGE_ABGR:
-        draw_rect   = draw_rect_ABGR;
-    RGB_colors:
-        pixels[0]   = gst_vaapi_image_get_plane(image, 0);
-        stride[0]   = gst_vaapi_image_get_pitch(image, 0);
-        red_color   = 0xffff0000;
-        green_color = 0xff00ff00;
-        blue_color  = 0xff0000ff;
-        black_color = 0xff000000;
-        break;
-    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);
-        goto YUV_colors;
-    case GST_VAAPI_IMAGE_AYUV:
-        draw_rect   = draw_rect_AYUV;
-        pixels[0]   = gst_vaapi_image_get_plane(image, 0);
-        stride[0]   = gst_vaapi_image_get_pitch(image, 0);
-    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;
-}
-
 static gboolean
 upload_image(GstVaapiSurface *surface, GstVaapiImage *image)
 {
@@ -364,15 +110,12 @@ main(int argc, char *argv[])
     for (i = 0; image_formats[i]; i++) {
         const GstVaapiImageFormat format = image_formats[i];
 
-        image = gst_vaapi_image_new(display, format, width, height);
-        if (!image)
-            continue;
-
-        if (!draw_rgb_rects(image))
-            g_error("could not draw RGB rectangles");
-
-        if (upload_image(surface, image))
-            break;
+        image = image_generate(display, format, width, height);
+        if (image) {
+            if (upload_image(surface, image))
+                break;
+            g_object_unref(image);
+        }
     }
     if (!image)
         g_error("could not create Gst/VA image");