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