Generate R/G/B rects.
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Mon, 15 Mar 2010 16:57:01 +0000 (16:57 +0000)
committergb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Mon, 15 Mar 2010 16:57:01 +0000 (16:57 +0000)
tests/examples/generic/test-windows.c

index bd3f106..07db884 100644 (file)
@@ -29,6 +29,145 @@ 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_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[])
 {
@@ -57,6 +196,13 @@ main(int argc, char *argv[])
     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");
@@ -86,7 +232,8 @@ main(int argc, char *argv[])
         rootwin     = RootWindow(dpy, screen);
         white_pixel = WhitePixel(dpy, screen);
         black_pixel = BlackPixel(dpy, screen);
-        win     = XCreateSimpleWindow(
+
+        win = XCreateSimpleWindow(
             dpy,
             rootwin,
             0, 0, win_width, win_height,