#include <gst/vaapi/gstvaapiwindow_x11.h>
#include <gst/vaapi/gstvaapisurface.h>
#include <gst/vaapi/gstvaapiimage.h>
+#include "image.h"
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)
{
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");