xvinfo.c revision 8ae04fa6
18ae04fa6Smrg/* $XFree86: xc/programs/xvinfo/xvinfo.c,v 1.7 2001/10/28 03:34:43 tsi Exp $ */ 28ae04fa6Smrg 38ae04fa6Smrg#include <X11/X.h> 48ae04fa6Smrg#include <X11/Xlib.h> 58ae04fa6Smrg#include <X11/extensions/Xvlib.h> 68ae04fa6Smrg#include <stdio.h> 78ae04fa6Smrg#include <stdlib.h> 88ae04fa6Smrg#include <string.h> 98ae04fa6Smrg#include <ctype.h> 108ae04fa6Smrg 118ae04fa6Smrgstatic void 128ae04fa6SmrgPrintUsage(void) 138ae04fa6Smrg{ 148ae04fa6Smrg fprintf(stderr, "Usage: xvinfo [-display host:dpy]\n"); 158ae04fa6Smrg exit(0); 168ae04fa6Smrg} 178ae04fa6Smrg 188ae04fa6Smrgint main(int argc, char *argv[]) 198ae04fa6Smrg{ 208ae04fa6Smrg Display *dpy; 218ae04fa6Smrg unsigned int ver, rev, eventB, reqB, errorB; 228ae04fa6Smrg int i, j, k, n; 238ae04fa6Smrg unsigned int nencode, nadaptors; 248ae04fa6Smrg int nscreens, nattr, numImages; 258ae04fa6Smrg XvAdaptorInfo *ainfo; 268ae04fa6Smrg XvAttribute *attributes; 278ae04fa6Smrg XvEncodingInfo *encodings; 288ae04fa6Smrg XvFormat *format; 298ae04fa6Smrg XvImageFormatValues *formats; 308ae04fa6Smrg char * disname = NULL; 318ae04fa6Smrg 328ae04fa6Smrg if((argc != 1) && (argc != 3)) 338ae04fa6Smrg PrintUsage(); 348ae04fa6Smrg 358ae04fa6Smrg if(argc != 1) { 368ae04fa6Smrg if(strcmp(argv[1], "-display")) 378ae04fa6Smrg PrintUsage(); 388ae04fa6Smrg disname = argv[2]; 398ae04fa6Smrg } 408ae04fa6Smrg 418ae04fa6Smrg 428ae04fa6Smrg if(!(dpy = XOpenDisplay(disname))) 438ae04fa6Smrg { 448ae04fa6Smrg fprintf(stderr, "xvinfo: Unable to open display %s\n", 458ae04fa6Smrg (disname != NULL) ? disname : XDisplayName(NULL)); 468ae04fa6Smrg exit(-1); 478ae04fa6Smrg } 488ae04fa6Smrg 498ae04fa6Smrg if((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB))) 508ae04fa6Smrg { 518ae04fa6Smrg fprintf(stderr, "xvinfo: No X-Video Extension on %s\n", 528ae04fa6Smrg (disname != NULL) ? disname : XDisplayName(NULL)); 538ae04fa6Smrg exit(0); 548ae04fa6Smrg } 558ae04fa6Smrg else 568ae04fa6Smrg { 578ae04fa6Smrg fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev); 588ae04fa6Smrg } 598ae04fa6Smrg 608ae04fa6Smrg nscreens = ScreenCount(dpy); 618ae04fa6Smrg 628ae04fa6Smrg for(i = 0; i < nscreens; i++) { 638ae04fa6Smrg fprintf(stdout, "screen #%i\n", i); 648ae04fa6Smrg XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo); 658ae04fa6Smrg 668ae04fa6Smrg if(!nadaptors) { 678ae04fa6Smrg fprintf(stdout, " no adaptors present\n"); 688ae04fa6Smrg continue; 698ae04fa6Smrg } 708ae04fa6Smrg 718ae04fa6Smrg for(j = 0; j < nadaptors; j++) { 728ae04fa6Smrg fprintf(stdout, " Adaptor #%i: \"%s\"\n", j, ainfo[j].name); 738ae04fa6Smrg fprintf(stdout, " number of ports: %li\n", ainfo[j].num_ports); 748ae04fa6Smrg fprintf(stdout, " port base: %li\n", ainfo[j].base_id); 758ae04fa6Smrg fprintf(stdout, " operations supported: "); 768ae04fa6Smrg switch(ainfo[j].type & (XvInputMask | XvOutputMask)) { 778ae04fa6Smrg case XvInputMask: 788ae04fa6Smrg if(ainfo[j].type & XvVideoMask) 798ae04fa6Smrg fprintf(stdout, "PutVideo "); 808ae04fa6Smrg if(ainfo[j].type & XvStillMask) 818ae04fa6Smrg fprintf(stdout, "PutStill "); 828ae04fa6Smrg if(ainfo[j].type & XvImageMask) 838ae04fa6Smrg fprintf(stdout, "PutImage "); 848ae04fa6Smrg break; 858ae04fa6Smrg case XvOutputMask: 868ae04fa6Smrg if(ainfo[j].type & XvVideoMask) 878ae04fa6Smrg fprintf(stdout, "GetVideo "); 888ae04fa6Smrg if(ainfo[j].type & XvStillMask) 898ae04fa6Smrg fprintf(stdout, "GetStill "); 908ae04fa6Smrg break; 918ae04fa6Smrg default: 928ae04fa6Smrg fprintf(stdout, "none "); 938ae04fa6Smrg break; 948ae04fa6Smrg } 958ae04fa6Smrg fprintf(stdout, "\n"); 968ae04fa6Smrg 978ae04fa6Smrg format = ainfo[j].formats; 988ae04fa6Smrg 998ae04fa6Smrg fprintf(stdout, " supported visuals:\n"); 1008ae04fa6Smrg for(k = 0; k < ainfo[j].num_formats; k++, format++) { 1018ae04fa6Smrg fprintf(stdout, " depth %i, visualID 0x%2lx\n", 1028ae04fa6Smrg format->depth, format->visual_id); 1038ae04fa6Smrg } 1048ae04fa6Smrg 1058ae04fa6Smrg attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr); 1068ae04fa6Smrg 1078ae04fa6Smrg if(attributes && nattr) { 1088ae04fa6Smrg fprintf(stdout, " number of attributes: %i\n", nattr); 1098ae04fa6Smrg 1108ae04fa6Smrg for(k = 0; k < nattr; k++) { 1118ae04fa6Smrg fprintf(stdout, " \"%s\" (range %i to %i)\n", 1128ae04fa6Smrg attributes[k].name, 1138ae04fa6Smrg attributes[k].min_value, 1148ae04fa6Smrg attributes[k].max_value); 1158ae04fa6Smrg 1168ae04fa6Smrg if(attributes[k].flags & XvSettable) 1178ae04fa6Smrg fprintf(stdout, " client settable attribute\n"); 1188ae04fa6Smrg 1198ae04fa6Smrg if(attributes[k].flags & XvGettable) { 1208ae04fa6Smrg Atom the_atom; 1218ae04fa6Smrg int value; 1228ae04fa6Smrg 1238ae04fa6Smrg fprintf(stdout, " client gettable attribute"); 1248ae04fa6Smrg the_atom = XInternAtom(dpy, attributes[k].name, True); 1258ae04fa6Smrg 1268ae04fa6Smrg if(the_atom != None){ 1278ae04fa6Smrg if((Success == XvGetPortAttribute(dpy, 1288ae04fa6Smrg ainfo[j].base_id, the_atom, &value))) 1298ae04fa6Smrg fprintf(stdout, " (current value is %i)", value); 1308ae04fa6Smrg } 1318ae04fa6Smrg fprintf(stdout, "\n"); 1328ae04fa6Smrg } 1338ae04fa6Smrg 1348ae04fa6Smrg } 1358ae04fa6Smrg XFree(attributes); 1368ae04fa6Smrg } else { 1378ae04fa6Smrg fprintf(stdout, " no port attributes defined\n"); 1388ae04fa6Smrg } 1398ae04fa6Smrg 1408ae04fa6Smrg XvQueryEncodings(dpy, ainfo[j].base_id, 1418ae04fa6Smrg &nencode, &encodings); 1428ae04fa6Smrg 1438ae04fa6Smrg if(encodings && nencode) { 1448ae04fa6Smrg int ImageEncodings = 0; 1458ae04fa6Smrg 1468ae04fa6Smrg for(n = 0; n < nencode; n++) { 1478ae04fa6Smrg if(!strcmp(encodings[n].name, "XV_IMAGE")) 1488ae04fa6Smrg ImageEncodings++; 1498ae04fa6Smrg } 1508ae04fa6Smrg 1518ae04fa6Smrg if(nencode - ImageEncodings) { 1528ae04fa6Smrg fprintf(stdout, " number of encodings: %i\n", 1538ae04fa6Smrg nencode - ImageEncodings); 1548ae04fa6Smrg 1558ae04fa6Smrg for(n = 0; n < nencode; n++) { 1568ae04fa6Smrg if(strcmp(encodings[n].name, "XV_IMAGE")) { 1578ae04fa6Smrg fprintf(stdout, " encoding ID #%li: \"%s\"\n", 1588ae04fa6Smrg encodings[n].encoding_id, 1598ae04fa6Smrg encodings[n].name); 1608ae04fa6Smrg fprintf(stdout, " size: %li x %li\n", 1618ae04fa6Smrg encodings[n].width, 1628ae04fa6Smrg encodings[n].height); 1638ae04fa6Smrg fprintf(stdout, " rate: %f\n", 1648ae04fa6Smrg (float)encodings[n].rate.numerator/ 1658ae04fa6Smrg (float)encodings[n].rate.denominator); 1668ae04fa6Smrg } 1678ae04fa6Smrg } 1688ae04fa6Smrg } 1698ae04fa6Smrg 1708ae04fa6Smrg if(ImageEncodings && (ainfo[j].type & XvImageMask)) { 1718ae04fa6Smrg char imageName[5]; 1728ae04fa6Smrg 1738ae04fa6Smrg for(n = 0; n < nencode; n++) { 1748ae04fa6Smrg if(!strcmp(encodings[n].name, "XV_IMAGE")) { 1758ae04fa6Smrg fprintf(stdout, 1768ae04fa6Smrg " maximum XvImage size: %li x %li\n", 1778ae04fa6Smrg encodings[n].width, encodings[n].height); 1788ae04fa6Smrg break; 1798ae04fa6Smrg } 1808ae04fa6Smrg } 1818ae04fa6Smrg 1828ae04fa6Smrg formats = XvListImageFormats( 1838ae04fa6Smrg dpy, ainfo[j].base_id, &numImages); 1848ae04fa6Smrg 1858ae04fa6Smrg fprintf(stdout, " Number of image formats: %i\n", 1868ae04fa6Smrg numImages); 1878ae04fa6Smrg 1888ae04fa6Smrg for(n = 0; n < numImages; n++) { 1898ae04fa6Smrg sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff, 1908ae04fa6Smrg (formats[n].id >> 8) & 0xff, 1918ae04fa6Smrg (formats[n].id >> 16) & 0xff, 1928ae04fa6Smrg (formats[n].id >> 24) & 0xff); 1938ae04fa6Smrg fprintf(stdout, " id: 0x%x", formats[n].id); 1948ae04fa6Smrg if(isprint(imageName[0]) && isprint(imageName[1]) && 1958ae04fa6Smrg isprint(imageName[2]) && isprint(imageName[3])) 1968ae04fa6Smrg { 1978ae04fa6Smrg fprintf(stdout, " (%s)\n", imageName); 1988ae04fa6Smrg } else { 1998ae04fa6Smrg fprintf(stdout, "\n"); 2008ae04fa6Smrg } 2018ae04fa6Smrg fprintf(stdout, " guid: "); 2028ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2038ae04fa6Smrg formats[n].guid[0]); 2048ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2058ae04fa6Smrg formats[n].guid[1]); 2068ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2078ae04fa6Smrg formats[n].guid[2]); 2088ae04fa6Smrg fprintf(stdout, "%02x-", (unsigned char) 2098ae04fa6Smrg formats[n].guid[3]); 2108ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2118ae04fa6Smrg formats[n].guid[4]); 2128ae04fa6Smrg fprintf(stdout, "%02x-", (unsigned char) 2138ae04fa6Smrg formats[n].guid[5]); 2148ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2158ae04fa6Smrg formats[n].guid[6]); 2168ae04fa6Smrg fprintf(stdout, "%02x-", (unsigned char) 2178ae04fa6Smrg formats[n].guid[7]); 2188ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2198ae04fa6Smrg formats[n].guid[8]); 2208ae04fa6Smrg fprintf(stdout, "%02x-", (unsigned char) 2218ae04fa6Smrg formats[n].guid[9]); 2228ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2238ae04fa6Smrg formats[n].guid[10]); 2248ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2258ae04fa6Smrg formats[n].guid[11]); 2268ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2278ae04fa6Smrg formats[n].guid[12]); 2288ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2298ae04fa6Smrg formats[n].guid[13]); 2308ae04fa6Smrg fprintf(stdout, "%02x", (unsigned char) 2318ae04fa6Smrg formats[n].guid[14]); 2328ae04fa6Smrg fprintf(stdout, "%02x\n", (unsigned char) 2338ae04fa6Smrg formats[n].guid[15]); 2348ae04fa6Smrg 2358ae04fa6Smrg fprintf(stdout, " bits per pixel: %i\n", 2368ae04fa6Smrg formats[n].bits_per_pixel); 2378ae04fa6Smrg fprintf(stdout, " number of planes: %i\n", 2388ae04fa6Smrg formats[n].num_planes); 2398ae04fa6Smrg fprintf(stdout, " type: %s (%s)\n", 2408ae04fa6Smrg (formats[n].type == XvRGB) ? "RGB" : "YUV", 2418ae04fa6Smrg (formats[n].format == XvPacked) ? "packed" : "planar"); 2428ae04fa6Smrg 2438ae04fa6Smrg if(formats[n].type == XvRGB) { 2448ae04fa6Smrg fprintf(stdout, " depth: %i\n", 2458ae04fa6Smrg formats[n].depth); 2468ae04fa6Smrg 2478ae04fa6Smrg fprintf(stdout, " red, green, blue masks: " 2488ae04fa6Smrg "0x%x, 0x%x, 0x%x\n", 2498ae04fa6Smrg formats[n].red_mask, 2508ae04fa6Smrg formats[n].green_mask, 2518ae04fa6Smrg formats[n].blue_mask); 2528ae04fa6Smrg } else { 2538ae04fa6Smrg 2548ae04fa6Smrg } 2558ae04fa6Smrg 2568ae04fa6Smrg 2578ae04fa6Smrg } 2588ae04fa6Smrg if(formats) XFree(formats); 2598ae04fa6Smrg } 2608ae04fa6Smrg 2618ae04fa6Smrg XvFreeEncodingInfo(encodings); 2628ae04fa6Smrg } 2638ae04fa6Smrg 2648ae04fa6Smrg } 2658ae04fa6Smrg 2668ae04fa6Smrg XvFreeAdaptorInfo(ainfo); 2678ae04fa6Smrg } 2688ae04fa6Smrg return 1; 2698ae04fa6Smrg} 270