xvinfo.c revision 44af7230
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{ 1444af7230Smrg fprintf(stderr, "Usage: xvinfo [-display host:dpy] [-short]\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; 3144af7230Smrg char shortmode = 0; 328ae04fa6Smrg 3344af7230Smrg if((argc > 4)) 348ae04fa6Smrg PrintUsage(); 358ae04fa6Smrg 368ae04fa6Smrg if(argc != 1) { 3744af7230Smrg for ( i = 1; i < argc; i ++ ) { 3844af7230Smrg if(! strcmp(argv[i], "-display")) { 3944af7230Smrg disname = argv[i + 1]; 4044af7230Smrg i ++; 4144af7230Smrg } else if(! strcmp(argv[i], "-short") ) 4244af7230Smrg shortmode = 1; 4344af7230Smrg else { 4444af7230Smrg PrintUsage(); 4544af7230Smrg } 4644af7230Smrg } 478ae04fa6Smrg } 488ae04fa6Smrg 498ae04fa6Smrg 508ae04fa6Smrg if(!(dpy = XOpenDisplay(disname))) 518ae04fa6Smrg { 528ae04fa6Smrg fprintf(stderr, "xvinfo: Unable to open display %s\n", 538ae04fa6Smrg (disname != NULL) ? disname : XDisplayName(NULL)); 548ae04fa6Smrg exit(-1); 558ae04fa6Smrg } 568ae04fa6Smrg 578ae04fa6Smrg if((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB))) 588ae04fa6Smrg { 598ae04fa6Smrg fprintf(stderr, "xvinfo: No X-Video Extension on %s\n", 608ae04fa6Smrg (disname != NULL) ? disname : XDisplayName(NULL)); 618ae04fa6Smrg exit(0); 628ae04fa6Smrg } 638ae04fa6Smrg else 648ae04fa6Smrg { 658ae04fa6Smrg fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev); 668ae04fa6Smrg } 678ae04fa6Smrg 688ae04fa6Smrg nscreens = ScreenCount(dpy); 698ae04fa6Smrg 708ae04fa6Smrg for(i = 0; i < nscreens; i++) { 718ae04fa6Smrg fprintf(stdout, "screen #%i\n", i); 728ae04fa6Smrg XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo); 738ae04fa6Smrg 748ae04fa6Smrg if(!nadaptors) { 758ae04fa6Smrg fprintf(stdout, " no adaptors present\n"); 768ae04fa6Smrg continue; 778ae04fa6Smrg } 788ae04fa6Smrg 798ae04fa6Smrg for(j = 0; j < nadaptors; j++) { 808ae04fa6Smrg fprintf(stdout, " Adaptor #%i: \"%s\"\n", j, ainfo[j].name); 818ae04fa6Smrg fprintf(stdout, " number of ports: %li\n", ainfo[j].num_ports); 828ae04fa6Smrg fprintf(stdout, " port base: %li\n", ainfo[j].base_id); 838ae04fa6Smrg fprintf(stdout, " operations supported: "); 848ae04fa6Smrg switch(ainfo[j].type & (XvInputMask | XvOutputMask)) { 858ae04fa6Smrg case XvInputMask: 868ae04fa6Smrg if(ainfo[j].type & XvVideoMask) 878ae04fa6Smrg fprintf(stdout, "PutVideo "); 888ae04fa6Smrg if(ainfo[j].type & XvStillMask) 898ae04fa6Smrg fprintf(stdout, "PutStill "); 908ae04fa6Smrg if(ainfo[j].type & XvImageMask) 918ae04fa6Smrg fprintf(stdout, "PutImage "); 928ae04fa6Smrg break; 938ae04fa6Smrg case XvOutputMask: 948ae04fa6Smrg if(ainfo[j].type & XvVideoMask) 958ae04fa6Smrg fprintf(stdout, "GetVideo "); 968ae04fa6Smrg if(ainfo[j].type & XvStillMask) 978ae04fa6Smrg fprintf(stdout, "GetStill "); 988ae04fa6Smrg break; 998ae04fa6Smrg default: 1008ae04fa6Smrg fprintf(stdout, "none "); 1018ae04fa6Smrg break; 1028ae04fa6Smrg } 1038ae04fa6Smrg fprintf(stdout, "\n"); 1048ae04fa6Smrg 1058ae04fa6Smrg format = ainfo[j].formats; 1068ae04fa6Smrg 10744af7230Smrg if ( ! shortmode ) { 10844af7230Smrg fprintf(stdout, " supported visuals:\n"); 10944af7230Smrg for(k = 0; k < ainfo[j].num_formats; k++, format++) { 11044af7230Smrg fprintf(stdout, " depth %i, visualID 0x%2lx\n", 1118ae04fa6Smrg format->depth, format->visual_id); 11244af7230Smrg } 1138ae04fa6Smrg } 1148ae04fa6Smrg 1158ae04fa6Smrg attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr); 1168ae04fa6Smrg 1178ae04fa6Smrg if(attributes && nattr) { 1188ae04fa6Smrg fprintf(stdout, " number of attributes: %i\n", nattr); 1198ae04fa6Smrg 1208ae04fa6Smrg for(k = 0; k < nattr; k++) { 1218ae04fa6Smrg fprintf(stdout, " \"%s\" (range %i to %i)\n", 1228ae04fa6Smrg attributes[k].name, 1238ae04fa6Smrg attributes[k].min_value, 1248ae04fa6Smrg attributes[k].max_value); 1258ae04fa6Smrg 1268ae04fa6Smrg if(attributes[k].flags & XvSettable) 12744af7230Smrg if ( ! shortmode ) 12844af7230Smrg fprintf(stdout, " client settable attribute\n"); 12944af7230Smrg else fprintf(stdout, " settable"); 1308ae04fa6Smrg 1318ae04fa6Smrg if(attributes[k].flags & XvGettable) { 1328ae04fa6Smrg Atom the_atom; 1338ae04fa6Smrg int value; 13444af7230Smrg 13544af7230Smrg if ( ! shortmode ) 13644af7230Smrg fprintf(stdout, " client gettable attribute"); 13744af7230Smrg else fprintf(stdout, ", gettable"); 1388ae04fa6Smrg 1398ae04fa6Smrg the_atom = XInternAtom(dpy, attributes[k].name, True); 1408ae04fa6Smrg 1418ae04fa6Smrg if(the_atom != None){ 1428ae04fa6Smrg if((Success == XvGetPortAttribute(dpy, 1438ae04fa6Smrg ainfo[j].base_id, the_atom, &value))) 1448ae04fa6Smrg fprintf(stdout, " (current value is %i)", value); 1458ae04fa6Smrg } 14644af7230Smrg fprintf(stdout, "\n"); 1478ae04fa6Smrg } 14844af7230Smrg else if (shortmode) 14944af7230Smrg fprintf(stdout, "\n"); 1508ae04fa6Smrg 1518ae04fa6Smrg } 1528ae04fa6Smrg XFree(attributes); 1538ae04fa6Smrg } else { 1548ae04fa6Smrg fprintf(stdout, " no port attributes defined\n"); 1558ae04fa6Smrg } 1568ae04fa6Smrg 1578ae04fa6Smrg XvQueryEncodings(dpy, ainfo[j].base_id, 1588ae04fa6Smrg &nencode, &encodings); 1598ae04fa6Smrg 1608ae04fa6Smrg if(encodings && nencode) { 1618ae04fa6Smrg int ImageEncodings = 0; 1628ae04fa6Smrg 1638ae04fa6Smrg for(n = 0; n < nencode; n++) { 1648ae04fa6Smrg if(!strcmp(encodings[n].name, "XV_IMAGE")) 1658ae04fa6Smrg ImageEncodings++; 1668ae04fa6Smrg } 1678ae04fa6Smrg 1688ae04fa6Smrg if(nencode - ImageEncodings) { 1698ae04fa6Smrg fprintf(stdout, " number of encodings: %i\n", 1708ae04fa6Smrg nencode - ImageEncodings); 1718ae04fa6Smrg 1728ae04fa6Smrg for(n = 0; n < nencode; n++) { 1738ae04fa6Smrg if(strcmp(encodings[n].name, "XV_IMAGE")) { 1748ae04fa6Smrg fprintf(stdout, " encoding ID #%li: \"%s\"\n", 1758ae04fa6Smrg encodings[n].encoding_id, 1768ae04fa6Smrg encodings[n].name); 1778ae04fa6Smrg fprintf(stdout, " size: %li x %li\n", 1788ae04fa6Smrg encodings[n].width, 1798ae04fa6Smrg encodings[n].height); 1808ae04fa6Smrg fprintf(stdout, " rate: %f\n", 1818ae04fa6Smrg (float)encodings[n].rate.numerator/ 1828ae04fa6Smrg (float)encodings[n].rate.denominator); 1838ae04fa6Smrg } 1848ae04fa6Smrg } 1858ae04fa6Smrg } 1868ae04fa6Smrg 1878ae04fa6Smrg if(ImageEncodings && (ainfo[j].type & XvImageMask)) { 1888ae04fa6Smrg char imageName[5]; 1898ae04fa6Smrg 1908ae04fa6Smrg for(n = 0; n < nencode; n++) { 1918ae04fa6Smrg if(!strcmp(encodings[n].name, "XV_IMAGE")) { 1928ae04fa6Smrg fprintf(stdout, 1938ae04fa6Smrg " maximum XvImage size: %li x %li\n", 1948ae04fa6Smrg encodings[n].width, encodings[n].height); 1958ae04fa6Smrg break; 1968ae04fa6Smrg } 1978ae04fa6Smrg } 1988ae04fa6Smrg 1998ae04fa6Smrg formats = XvListImageFormats( 2008ae04fa6Smrg dpy, ainfo[j].base_id, &numImages); 2018ae04fa6Smrg 2028ae04fa6Smrg fprintf(stdout, " Number of image formats: %i\n", 2038ae04fa6Smrg numImages); 2048ae04fa6Smrg 2058ae04fa6Smrg for(n = 0; n < numImages; n++) { 2068ae04fa6Smrg sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff, 2078ae04fa6Smrg (formats[n].id >> 8) & 0xff, 2088ae04fa6Smrg (formats[n].id >> 16) & 0xff, 2098ae04fa6Smrg (formats[n].id >> 24) & 0xff); 2108ae04fa6Smrg fprintf(stdout, " id: 0x%x", formats[n].id); 2118ae04fa6Smrg if(isprint(imageName[0]) && isprint(imageName[1]) && 2128ae04fa6Smrg isprint(imageName[2]) && isprint(imageName[3])) 2138ae04fa6Smrg { 2148ae04fa6Smrg fprintf(stdout, " (%s)\n", imageName); 2158ae04fa6Smrg } else { 2168ae04fa6Smrg fprintf(stdout, "\n"); 2178ae04fa6Smrg } 21844af7230Smrg if ( ! shortmode ) { 21944af7230Smrg fprintf(stdout, " guid: "); 22044af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2218ae04fa6Smrg formats[n].guid[0]); 22244af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2238ae04fa6Smrg formats[n].guid[1]); 22444af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2258ae04fa6Smrg formats[n].guid[2]); 22644af7230Smrg fprintf(stdout, "%02x-", (unsigned char) 2278ae04fa6Smrg formats[n].guid[3]); 22844af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2298ae04fa6Smrg formats[n].guid[4]); 23044af7230Smrg fprintf(stdout, "%02x-", (unsigned char) 2318ae04fa6Smrg formats[n].guid[5]); 23244af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2338ae04fa6Smrg formats[n].guid[6]); 23444af7230Smrg fprintf(stdout, "%02x-", (unsigned char) 2358ae04fa6Smrg formats[n].guid[7]); 23644af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2378ae04fa6Smrg formats[n].guid[8]); 23844af7230Smrg fprintf(stdout, "%02x-", (unsigned char) 2398ae04fa6Smrg formats[n].guid[9]); 24044af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2418ae04fa6Smrg formats[n].guid[10]); 24244af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2438ae04fa6Smrg formats[n].guid[11]); 24444af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2458ae04fa6Smrg formats[n].guid[12]); 24644af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2478ae04fa6Smrg formats[n].guid[13]); 24844af7230Smrg fprintf(stdout, "%02x", (unsigned char) 2498ae04fa6Smrg formats[n].guid[14]); 25044af7230Smrg fprintf(stdout, "%02x\n", (unsigned char) 2518ae04fa6Smrg formats[n].guid[15]); 2528ae04fa6Smrg 25344af7230Smrg fprintf(stdout, " bits per pixel: %i\n", 2548ae04fa6Smrg formats[n].bits_per_pixel); 25544af7230Smrg fprintf(stdout, " number of planes: %i\n", 2568ae04fa6Smrg formats[n].num_planes); 25744af7230Smrg fprintf(stdout, " type: %s (%s)\n", 25844af7230Smrg (formats[n].type == XvRGB) ? "RGB" : "YUV", 25944af7230Smrg (formats[n].format == XvPacked) ? "packed" : "planar"); 2608ae04fa6Smrg 26144af7230Smrg if(formats[n].type == XvRGB) { 26244af7230Smrg fprintf(stdout, " depth: %i\n", 2638ae04fa6Smrg formats[n].depth); 2648ae04fa6Smrg 26544af7230Smrg fprintf(stdout, " red, green, blue masks: " 2668ae04fa6Smrg "0x%x, 0x%x, 0x%x\n", 2678ae04fa6Smrg formats[n].red_mask, 2688ae04fa6Smrg formats[n].green_mask, 2698ae04fa6Smrg formats[n].blue_mask); 27044af7230Smrg } else { 2718ae04fa6Smrg 27244af7230Smrg } 2738ae04fa6Smrg } 2748ae04fa6Smrg 2758ae04fa6Smrg 2768ae04fa6Smrg } 2778ae04fa6Smrg if(formats) XFree(formats); 2788ae04fa6Smrg } 2798ae04fa6Smrg 2808ae04fa6Smrg XvFreeEncodingInfo(encodings); 2818ae04fa6Smrg } 2828ae04fa6Smrg 2838ae04fa6Smrg } 2848ae04fa6Smrg 2858ae04fa6Smrg XvFreeAdaptorInfo(ainfo); 2868ae04fa6Smrg } 2878ae04fa6Smrg return 1; 2888ae04fa6Smrg} 289