tests: fix subpicture test.

This commit is contained in:
Gwenole Beauchesne 2011-10-17 18:43:15 +02:00
parent bb72c55555
commit b4ca838fb0

View file

@ -70,6 +70,19 @@ static GOptionEntry g_options[] = {
{ NULL, } { NULL, }
}; };
static void
upload_image (guint8 *dst, const guint32 *src, guint size)
{
guint i;
for (i = 0; i < size; i += 4) {
dst[i ] = *src >> 24;
dst[i + 1] = *src >> 16;
dst[i + 2] = *src >> 8;
dst[i + 3] = *src++;
}
}
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
@ -83,12 +96,14 @@ main(int argc, char *argv[])
const CodecDefs *codec; const CodecDefs *codec;
GstBuffer *buffer; GstBuffer *buffer;
GstVaapiSurfaceProxy *proxy; GstVaapiSurfaceProxy *proxy;
GstVaapiSurface *surface;
VideoDecodeInfo info; VideoDecodeInfo info;
VideoSubpictureInfo subinfo; VideoSubpictureInfo subinfo;
GstVaapiImage *subtitle_image; GstVaapiImage *subtitle_image;
GstVaapiSubpicture *subpicture; GstVaapiSubpicture *subpicture;
GstCaps *argbcaps; GstCaps *argbcaps;
GstVaapiRectangle sub_rect; GstVaapiRectangle sub_rect;
guint surf_width, surf_height;
static const guint win_width = 640; static const guint win_width = 640;
static const guint win_height = 480; static const guint win_height = 480;
@ -151,35 +166,47 @@ main(int argc, char *argv[])
if (!proxy) if (!proxy)
g_error("could not get decoded surface (decoder status %d)", status); g_error("could not get decoded surface (decoder status %d)", status);
surface = gst_vaapi_surface_proxy_get_surface(proxy);
if (!surface)
g_error("could not get underlying surface");
gst_vaapi_surface_get_size(surface, &surf_width, &surf_height);
printf("surface size %dx%d\n", surf_width, surf_height);
subpicture_get_info (&subinfo); subpicture_get_info (&subinfo);
/* Adding subpicture */ /* Adding subpicture */
argbcaps = gst_caps_new_simple ("video/x-raw-rgb", argbcaps = gst_caps_new_simple ("video/x-raw-rgb",
"endianness", G_TYPE_INT, 1, "endianness", G_TYPE_INT, G_BIG_ENDIAN,
"bpp", G_TYPE_INT, 32, "bpp", G_TYPE_INT, 32,
"red_mask", G_TYPE_INT, 0xff000000,
"green_mask", G_TYPE_INT, 0x00ff0000,
"blue_mask", G_TYPE_INT, 0x0000ff00,
"alpha_mask", G_TYPE_INT, 0x000000ff,
"width", G_TYPE_INT, subinfo.width, "width", G_TYPE_INT, subinfo.width,
"height", G_TYPE_INT, subinfo.height, "height", G_TYPE_INT, subinfo.height,
NULL); NULL);
buffer = gst_buffer_new (); buffer = gst_buffer_new_and_alloc (subinfo.data_size);
gst_buffer_set_data(buffer, (guchar *)subinfo.data, subinfo.data_size); upload_image (GST_BUFFER_DATA (buffer), subinfo.data, subinfo.data_size);
gst_buffer_set_caps (buffer, argbcaps); gst_buffer_set_caps (buffer, argbcaps);
subtitle_image = gst_vaapi_image_new (display, subtitle_image = gst_vaapi_image_new (display,
GST_VAAPI_IMAGE_RGBA, subinfo.width, subinfo.height); GST_VAAPI_IMAGE_RGBA, subinfo.width, subinfo.height);
gst_vaapi_image_update_from_buffer (subtitle_image, buffer); if (!gst_vaapi_image_update_from_buffer (subtitle_image, buffer))
g_error ("could not update VA image with subtitle data");
subpicture = gst_vaapi_subpicture_new (subtitle_image); subpicture = gst_vaapi_subpicture_new (subtitle_image);
/* We position it as a subtitle, centered at the bottom. */ /* We position it as a subtitle, centered at the bottom. */
sub_rect.x = (win_width - subinfo.width) / 2; sub_rect.x = (surf_width - subinfo.width) / 2;
sub_rect.y = win_height - subinfo.height - 10; sub_rect.y = surf_height - subinfo.height - 10;
sub_rect.height = subinfo.height; sub_rect.height = subinfo.height;
sub_rect.width = subinfo.height; sub_rect.width = subinfo.width;
if (!gst_vaapi_surface_associate_subpicture ( if (!gst_vaapi_surface_associate_subpicture (
GST_VAAPI_SURFACE_PROXY_SURFACE(proxy), surface,
subpicture, subpicture,
NULL, NULL,
&sub_rect)) &sub_rect))