162074f44bb5944593b65d6203deae6300bead42dYounes Manton/**************************************************************************
2dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König *
362074f44bb5944593b65d6203deae6300bead42dYounes Manton * Copyright 2009 Younes Manton.
462074f44bb5944593b65d6203deae6300bead42dYounes Manton * All Rights Reserved.
5dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König *
662074f44bb5944593b65d6203deae6300bead42dYounes Manton * Permission is hereby granted, free of charge, to any person obtaining a
762074f44bb5944593b65d6203deae6300bead42dYounes Manton * copy of this software and associated documentation files (the
862074f44bb5944593b65d6203deae6300bead42dYounes Manton * "Software"), to deal in the Software without restriction, including
962074f44bb5944593b65d6203deae6300bead42dYounes Manton * without limitation the rights to use, copy, modify, merge, publish,
1062074f44bb5944593b65d6203deae6300bead42dYounes Manton * distribute, sub license, and/or sell copies of the Software, and to
1162074f44bb5944593b65d6203deae6300bead42dYounes Manton * permit persons to whom the Software is furnished to do so, subject to
1262074f44bb5944593b65d6203deae6300bead42dYounes Manton * the following conditions:
13dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König *
1462074f44bb5944593b65d6203deae6300bead42dYounes Manton * The above copyright notice and this permission notice (including the
1562074f44bb5944593b65d6203deae6300bead42dYounes Manton * next paragraph) shall be included in all copies or substantial portions
1662074f44bb5944593b65d6203deae6300bead42dYounes Manton * of the Software.
17dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König *
1862074f44bb5944593b65d6203deae6300bead42dYounes Manton * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1962074f44bb5944593b65d6203deae6300bead42dYounes Manton * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2062074f44bb5944593b65d6203deae6300bead42dYounes Manton * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2162074f44bb5944593b65d6203deae6300bead42dYounes Manton * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2262074f44bb5944593b65d6203deae6300bead42dYounes Manton * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2362074f44bb5944593b65d6203deae6300bead42dYounes Manton * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2462074f44bb5944593b65d6203deae6300bead42dYounes Manton * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König *
2662074f44bb5944593b65d6203deae6300bead42dYounes Manton **************************************************************************/
2762074f44bb5944593b65d6203deae6300bead42dYounes Manton
2862074f44bb5944593b65d6203deae6300bead42dYounes Manton#include "testlib.h"
2962074f44bb5944593b65d6203deae6300bead42dYounes Manton#include <stdio.h>
3062074f44bb5944593b65d6203deae6300bead42dYounes Manton
3162074f44bb5944593b65d6203deae6300bead42dYounes Manton/*
3262074f44bb5944593b65d6203deae6300bead42dYounes Mantonvoid test(int pred, const char *pred_string, const char *doc_string, const char *file, unsigned int line)
3362074f44bb5944593b65d6203deae6300bead42dYounes Manton{
3462074f44bb5944593b65d6203deae6300bead42dYounes Manton	fputs(doc_string, stderr);
3562074f44bb5944593b65d6203deae6300bead42dYounes Manton	if (!pred)
3662074f44bb5944593b65d6203deae6300bead42dYounes Manton		fprintf(stderr, " FAIL!\n\t\"%s\" at %s:%u\n", pred_string, file, line);
3762074f44bb5944593b65d6203deae6300bead42dYounes Manton	else
3862074f44bb5944593b65d6203deae6300bead42dYounes Manton		fputs(" PASS!\n", stderr);
3962074f44bb5944593b65d6203deae6300bead42dYounes Manton}
4062074f44bb5944593b65d6203deae6300bead42dYounes Manton*/
4162074f44bb5944593b65d6203deae6300bead42dYounes Manton
4262074f44bb5944593b65d6203deae6300bead42dYounes Mantonint GetPort
4362074f44bb5944593b65d6203deae6300bead42dYounes Manton(
4462074f44bb5944593b65d6203deae6300bead42dYounes Manton	Display *display,
4562074f44bb5944593b65d6203deae6300bead42dYounes Manton	unsigned int width,
4662074f44bb5944593b65d6203deae6300bead42dYounes Manton	unsigned int height,
4762074f44bb5944593b65d6203deae6300bead42dYounes Manton	unsigned int chroma_format,
4862074f44bb5944593b65d6203deae6300bead42dYounes Manton	const unsigned int *mc_types,
4962074f44bb5944593b65d6203deae6300bead42dYounes Manton	unsigned int num_mc_types,
5062074f44bb5944593b65d6203deae6300bead42dYounes Manton	XvPortID *port_id,
5162074f44bb5944593b65d6203deae6300bead42dYounes Manton	int *surface_type_id,
5262074f44bb5944593b65d6203deae6300bead42dYounes Manton	unsigned int *is_overlay,
5362074f44bb5944593b65d6203deae6300bead42dYounes Manton	unsigned int *intra_unsigned
5462074f44bb5944593b65d6203deae6300bead42dYounes Manton)
5562074f44bb5944593b65d6203deae6300bead42dYounes Manton{
5662074f44bb5944593b65d6203deae6300bead42dYounes Manton	unsigned int	found_port = 0;
5762074f44bb5944593b65d6203deae6300bead42dYounes Manton	XvAdaptorInfo	*adaptor_info;
5862074f44bb5944593b65d6203deae6300bead42dYounes Manton	unsigned int	num_adaptors;
5962074f44bb5944593b65d6203deae6300bead42dYounes Manton	int		num_types;
6062074f44bb5944593b65d6203deae6300bead42dYounes Manton	int		ev_base, err_base;
6162074f44bb5944593b65d6203deae6300bead42dYounes Manton	unsigned int	i, j, k, l;
6262074f44bb5944593b65d6203deae6300bead42dYounes Manton
6362074f44bb5944593b65d6203deae6300bead42dYounes Manton	if (!XvMCQueryExtension(display, &ev_base, &err_base))
6462074f44bb5944593b65d6203deae6300bead42dYounes Manton		return 0;
6562074f44bb5944593b65d6203deae6300bead42dYounes Manton	if (XvQueryAdaptors(display, XDefaultRootWindow(display), &num_adaptors, &adaptor_info) != Success)
6662074f44bb5944593b65d6203deae6300bead42dYounes Manton		return 0;
6762074f44bb5944593b65d6203deae6300bead42dYounes Manton
6862074f44bb5944593b65d6203deae6300bead42dYounes Manton	for (i = 0; i < num_adaptors && !found_port; ++i)
6962074f44bb5944593b65d6203deae6300bead42dYounes Manton	{
7062074f44bb5944593b65d6203deae6300bead42dYounes Manton		if (adaptor_info[i].type & XvImageMask)
7162074f44bb5944593b65d6203deae6300bead42dYounes Manton		{
7262074f44bb5944593b65d6203deae6300bead42dYounes Manton			XvMCSurfaceInfo *surface_info = XvMCListSurfaceTypes(display, adaptor_info[i].base_id, &num_types);
7362074f44bb5944593b65d6203deae6300bead42dYounes Manton
7462074f44bb5944593b65d6203deae6300bead42dYounes Manton			if (surface_info)
7562074f44bb5944593b65d6203deae6300bead42dYounes Manton			{
7662074f44bb5944593b65d6203deae6300bead42dYounes Manton				for (j = 0; j < num_types && !found_port; ++j)
7762074f44bb5944593b65d6203deae6300bead42dYounes Manton				{
7862074f44bb5944593b65d6203deae6300bead42dYounes Manton					if
7962074f44bb5944593b65d6203deae6300bead42dYounes Manton					(
8062074f44bb5944593b65d6203deae6300bead42dYounes Manton						surface_info[j].chroma_format == chroma_format &&
8162074f44bb5944593b65d6203deae6300bead42dYounes Manton						surface_info[j].max_width >= width &&
8262074f44bb5944593b65d6203deae6300bead42dYounes Manton						surface_info[j].max_height >= height
8362074f44bb5944593b65d6203deae6300bead42dYounes Manton					)
8462074f44bb5944593b65d6203deae6300bead42dYounes Manton					{
8562074f44bb5944593b65d6203deae6300bead42dYounes Manton						for (k = 0; k < num_mc_types && !found_port; ++k)
8662074f44bb5944593b65d6203deae6300bead42dYounes Manton						{
8762074f44bb5944593b65d6203deae6300bead42dYounes Manton							if (surface_info[j].mc_type == mc_types[k])
8862074f44bb5944593b65d6203deae6300bead42dYounes Manton							{
8962074f44bb5944593b65d6203deae6300bead42dYounes Manton								for (l = 0; l < adaptor_info[i].num_ports && !found_port; ++l)
9062074f44bb5944593b65d6203deae6300bead42dYounes Manton								{
9162074f44bb5944593b65d6203deae6300bead42dYounes Manton									if (XvGrabPort(display, adaptor_info[i].base_id + l, CurrentTime) == Success)
9262074f44bb5944593b65d6203deae6300bead42dYounes Manton									{
9362074f44bb5944593b65d6203deae6300bead42dYounes Manton										*port_id = adaptor_info[i].base_id + l;
9462074f44bb5944593b65d6203deae6300bead42dYounes Manton										*surface_type_id = surface_info[j].surface_type_id;
9562074f44bb5944593b65d6203deae6300bead42dYounes Manton										*is_overlay = surface_info[j].flags & XVMC_OVERLAID_SURFACE;
9662074f44bb5944593b65d6203deae6300bead42dYounes Manton										*intra_unsigned = surface_info[j].flags & XVMC_INTRA_UNSIGNED;
9762074f44bb5944593b65d6203deae6300bead42dYounes Manton										found_port = 1;
9862074f44bb5944593b65d6203deae6300bead42dYounes Manton									}
9962074f44bb5944593b65d6203deae6300bead42dYounes Manton								}
10062074f44bb5944593b65d6203deae6300bead42dYounes Manton							}
10162074f44bb5944593b65d6203deae6300bead42dYounes Manton						}
10262074f44bb5944593b65d6203deae6300bead42dYounes Manton					}
10362074f44bb5944593b65d6203deae6300bead42dYounes Manton				}
10462074f44bb5944593b65d6203deae6300bead42dYounes Manton
10562074f44bb5944593b65d6203deae6300bead42dYounes Manton				XFree(surface_info);
10662074f44bb5944593b65d6203deae6300bead42dYounes Manton			}
10762074f44bb5944593b65d6203deae6300bead42dYounes Manton		}
10862074f44bb5944593b65d6203deae6300bead42dYounes Manton	}
10962074f44bb5944593b65d6203deae6300bead42dYounes Manton
11062074f44bb5944593b65d6203deae6300bead42dYounes Manton	XvFreeAdaptorInfo(adaptor_info);
11162074f44bb5944593b65d6203deae6300bead42dYounes Manton
11262074f44bb5944593b65d6203deae6300bead42dYounes Manton	return found_port;
11362074f44bb5944593b65d6203deae6300bead42dYounes Manton}
11462074f44bb5944593b65d6203deae6300bead42dYounes Manton
11562074f44bb5944593b65d6203deae6300bead42dYounes Mantonunsigned int align(unsigned int value, unsigned int alignment)
11662074f44bb5944593b65d6203deae6300bead42dYounes Manton{
11762074f44bb5944593b65d6203deae6300bead42dYounes Manton	return (value + alignment - 1) & ~(alignment - 1);
11862074f44bb5944593b65d6203deae6300bead42dYounes Manton}
11962074f44bb5944593b65d6203deae6300bead42dYounes Manton
12062074f44bb5944593b65d6203deae6300bead42dYounes Manton/* From the glibc manual */
12162074f44bb5944593b65d6203deae6300bead42dYounes Mantonint timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y)
12262074f44bb5944593b65d6203deae6300bead42dYounes Manton{
12362074f44bb5944593b65d6203deae6300bead42dYounes Manton	/* Perform the carry for the later subtraction by updating y. */
12462074f44bb5944593b65d6203deae6300bead42dYounes Manton	if (x->tv_usec < y->tv_usec)
12562074f44bb5944593b65d6203deae6300bead42dYounes Manton	{
12662074f44bb5944593b65d6203deae6300bead42dYounes Manton		int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
12762074f44bb5944593b65d6203deae6300bead42dYounes Manton		y->tv_usec -= 1000000 * nsec;
12862074f44bb5944593b65d6203deae6300bead42dYounes Manton		y->tv_sec += nsec;
12962074f44bb5944593b65d6203deae6300bead42dYounes Manton	}
13062074f44bb5944593b65d6203deae6300bead42dYounes Manton	if (x->tv_usec - y->tv_usec > 1000000)
13162074f44bb5944593b65d6203deae6300bead42dYounes Manton	{
13262074f44bb5944593b65d6203deae6300bead42dYounes Manton		int nsec = (x->tv_usec - y->tv_usec) / 1000000;
13362074f44bb5944593b65d6203deae6300bead42dYounes Manton		y->tv_usec += 1000000 * nsec;
13462074f44bb5944593b65d6203deae6300bead42dYounes Manton		y->tv_sec -= nsec;
13562074f44bb5944593b65d6203deae6300bead42dYounes Manton	}
13662074f44bb5944593b65d6203deae6300bead42dYounes Manton
13762074f44bb5944593b65d6203deae6300bead42dYounes Manton	/*
13862074f44bb5944593b65d6203deae6300bead42dYounes Manton	 * Compute the time remaining to wait.
13962074f44bb5944593b65d6203deae6300bead42dYounes Manton	 * tv_usec is certainly positive.
14062074f44bb5944593b65d6203deae6300bead42dYounes Manton	 */
14162074f44bb5944593b65d6203deae6300bead42dYounes Manton	result->tv_sec = x->tv_sec - y->tv_sec;
14262074f44bb5944593b65d6203deae6300bead42dYounes Manton	result->tv_usec = x->tv_usec - y->tv_usec;
14362074f44bb5944593b65d6203deae6300bead42dYounes Manton
14462074f44bb5944593b65d6203deae6300bead42dYounes Manton	/* Return 1 if result is negative. */
14562074f44bb5944593b65d6203deae6300bead42dYounes Manton	return x->tv_sec < y->tv_sec;
14662074f44bb5944593b65d6203deae6300bead42dYounes Manton}
147