xvinfo.c revision 405c8079
1405c8079Smrg#ifdef HAVE_CONFIG_H 2405c8079Smrg# include "config.h" 3405c8079Smrg#endif 4405c8079Smrg 58ae04fa6Smrg#include <X11/X.h> 68ae04fa6Smrg#include <X11/Xlib.h> 78ae04fa6Smrg#include <X11/extensions/Xvlib.h> 88ae04fa6Smrg#include <stdio.h> 98ae04fa6Smrg#include <stdlib.h> 108ae04fa6Smrg#include <string.h> 118ae04fa6Smrg#include <ctype.h> 128ae04fa6Smrg 13405c8079Smrgstatic void _X_NORETURN 148ae04fa6SmrgPrintUsage(void) 158ae04fa6Smrg{ 16405c8079Smrg fprintf(stderr, "Usage: xvinfo [-display host:dpy] [-short] [-version]\n"); 17405c8079Smrg exit(0); 188ae04fa6Smrg} 198ae04fa6Smrg 20405c8079Smrgint 21405c8079Smrgmain(int argc, char *argv[]) 228ae04fa6Smrg{ 238ae04fa6Smrg Display *dpy; 24405c8079Smrg unsigned int ver, rev, eventB, reqB, errorB; 25405c8079Smrg int i, j, k, n; 268ae04fa6Smrg unsigned int nencode, nadaptors; 278ae04fa6Smrg int nscreens, nattr, numImages; 288ae04fa6Smrg XvAdaptorInfo *ainfo; 298ae04fa6Smrg XvAttribute *attributes; 308ae04fa6Smrg XvEncodingInfo *encodings; 318ae04fa6Smrg XvFormat *format; 328ae04fa6Smrg XvImageFormatValues *formats; 33405c8079Smrg char *disname = NULL; 3444af7230Smrg char shortmode = 0; 358ae04fa6Smrg 36405c8079Smrg if ((argc > 4)) 37405c8079Smrg PrintUsage(); 38405c8079Smrg 39405c8079Smrg if (argc != 1) { 40405c8079Smrg for (i = 1; i < argc; i++) { 41405c8079Smrg if (!strcmp(argv[i], "-display")) { 42405c8079Smrg disname = argv[i + 1]; 43405c8079Smrg i++; 44405c8079Smrg } 45405c8079Smrg else if (!strcmp(argv[i], "-short")) 46405c8079Smrg shortmode = 1; 47405c8079Smrg else if (!strcmp(argv[i], "-version")) { 48405c8079Smrg printf("%s\n", PACKAGE_STRING); 49405c8079Smrg exit(0); 50405c8079Smrg } 51405c8079Smrg else { 52405c8079Smrg PrintUsage(); 53405c8079Smrg } 54405c8079Smrg } 558ae04fa6Smrg } 568ae04fa6Smrg 57405c8079Smrg if (!(dpy = XOpenDisplay(disname))) { 58405c8079Smrg fprintf(stderr, "xvinfo: Unable to open display %s\n", 59405c8079Smrg (disname != NULL) ? disname : XDisplayName(NULL)); 60405c8079Smrg exit(-1); 618ae04fa6Smrg } 628ae04fa6Smrg 63405c8079Smrg if ((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB))) { 64405c8079Smrg fprintf(stderr, "xvinfo: No X-Video Extension on %s\n", 65405c8079Smrg (disname != NULL) ? disname : XDisplayName(NULL)); 66405c8079Smrg exit(0); 67405c8079Smrg } 68405c8079Smrg else { 69405c8079Smrg fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev); 708ae04fa6Smrg } 718ae04fa6Smrg 728ae04fa6Smrg nscreens = ScreenCount(dpy); 738ae04fa6Smrg 74405c8079Smrg for (i = 0; i < nscreens; i++) { 75405c8079Smrg fprintf(stdout, "screen #%i\n", i); 76405c8079Smrg XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo); 77405c8079Smrg 78405c8079Smrg if (!nadaptors) { 79405c8079Smrg fprintf(stdout, " no adaptors present\n"); 80405c8079Smrg continue; 81405c8079Smrg } 82405c8079Smrg 83405c8079Smrg for (j = 0; j < nadaptors; j++) { 84405c8079Smrg fprintf(stdout, " Adaptor #%i: \"%s\"\n", j, ainfo[j].name); 85405c8079Smrg fprintf(stdout, " number of ports: %li\n", ainfo[j].num_ports); 86405c8079Smrg fprintf(stdout, " port base: %li\n", ainfo[j].base_id); 87405c8079Smrg fprintf(stdout, " operations supported: "); 88405c8079Smrg switch (ainfo[j].type & (XvInputMask | XvOutputMask)) { 89405c8079Smrg case XvInputMask: 90405c8079Smrg if (ainfo[j].type & XvVideoMask) 91405c8079Smrg fprintf(stdout, "PutVideo "); 92405c8079Smrg if (ainfo[j].type & XvStillMask) 93405c8079Smrg fprintf(stdout, "PutStill "); 94405c8079Smrg if (ainfo[j].type & XvImageMask) 95405c8079Smrg fprintf(stdout, "PutImage "); 96405c8079Smrg break; 97405c8079Smrg case XvOutputMask: 98405c8079Smrg if (ainfo[j].type & XvVideoMask) 99405c8079Smrg fprintf(stdout, "GetVideo "); 100405c8079Smrg if (ainfo[j].type & XvStillMask) 101405c8079Smrg fprintf(stdout, "GetStill "); 102405c8079Smrg break; 103405c8079Smrg default: 104405c8079Smrg fprintf(stdout, "none "); 105405c8079Smrg break; 106405c8079Smrg } 107405c8079Smrg fprintf(stdout, "\n"); 108405c8079Smrg 109405c8079Smrg format = ainfo[j].formats; 110405c8079Smrg 111405c8079Smrg if (!shortmode) { 112405c8079Smrg fprintf(stdout, " supported visuals:\n"); 113405c8079Smrg for (k = 0; k < ainfo[j].num_formats; k++, format++) { 114405c8079Smrg fprintf(stdout, " depth %i, visualID 0x%2lx\n", 115405c8079Smrg format->depth, format->visual_id); 116405c8079Smrg } 117405c8079Smrg } 118405c8079Smrg 119405c8079Smrg attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr); 120405c8079Smrg 121405c8079Smrg if (attributes && nattr) { 122405c8079Smrg fprintf(stdout, " number of attributes: %i\n", nattr); 123405c8079Smrg 124405c8079Smrg for (k = 0; k < nattr; k++) { 125405c8079Smrg fprintf(stdout, " \"%s\" (range %i to %i)\n", 126405c8079Smrg attributes[k].name, 127405c8079Smrg attributes[k].min_value, attributes[k].max_value); 128405c8079Smrg 129405c8079Smrg if (attributes[k].flags & XvSettable) { 130405c8079Smrg if (!shortmode) 131405c8079Smrg fprintf(stdout, 132405c8079Smrg " client settable attribute\n"); 133405c8079Smrg else 134405c8079Smrg fprintf(stdout, " settable"); 135405c8079Smrg } 136405c8079Smrg 137405c8079Smrg if (attributes[k].flags & XvGettable) { 138405c8079Smrg Atom the_atom; 139405c8079Smrg 140405c8079Smrg int value; 141405c8079Smrg 142405c8079Smrg if (!shortmode) 143405c8079Smrg fprintf(stdout, 144405c8079Smrg " client gettable attribute"); 145405c8079Smrg else 146405c8079Smrg fprintf(stdout, ", gettable"); 147405c8079Smrg 148405c8079Smrg the_atom = XInternAtom(dpy, attributes[k].name, True); 149405c8079Smrg 150405c8079Smrg if (the_atom != None) { 151405c8079Smrg if ((Success == XvGetPortAttribute(dpy, 152405c8079Smrg ainfo[j].base_id, 153405c8079Smrg the_atom, 154405c8079Smrg &value))) 155405c8079Smrg fprintf(stdout, " (current value is %i)", 156405c8079Smrg value); 157405c8079Smrg } 158405c8079Smrg fprintf(stdout, "\n"); 159405c8079Smrg } 160405c8079Smrg else if (shortmode) 161405c8079Smrg fprintf(stdout, "\n"); 162405c8079Smrg 163405c8079Smrg } 164405c8079Smrg XFree(attributes); 165405c8079Smrg } 166405c8079Smrg else { 167405c8079Smrg fprintf(stdout, " no port attributes defined\n"); 168405c8079Smrg } 169405c8079Smrg 170405c8079Smrg XvQueryEncodings(dpy, ainfo[j].base_id, &nencode, &encodings); 171405c8079Smrg 172405c8079Smrg if (encodings && nencode) { 173405c8079Smrg int ImageEncodings = 0; 174405c8079Smrg 175405c8079Smrg for (n = 0; n < nencode; n++) { 176405c8079Smrg if (!strcmp(encodings[n].name, "XV_IMAGE")) 177405c8079Smrg ImageEncodings++; 178405c8079Smrg } 179405c8079Smrg 180405c8079Smrg if (nencode - ImageEncodings) { 181405c8079Smrg fprintf(stdout, " number of encodings: %i\n", 182405c8079Smrg nencode - ImageEncodings); 183405c8079Smrg 184405c8079Smrg for (n = 0; n < nencode; n++) { 185405c8079Smrg if (strcmp(encodings[n].name, "XV_IMAGE")) { 186405c8079Smrg fprintf(stdout, " encoding ID #%li: \"%s\"\n", 187405c8079Smrg encodings[n].encoding_id, 188405c8079Smrg encodings[n].name); 189405c8079Smrg fprintf(stdout, " size: %li x %li\n", 190405c8079Smrg encodings[n].width, encodings[n].height); 191405c8079Smrg fprintf(stdout, " rate: %f\n", 192405c8079Smrg (float) encodings[n].rate.numerator / 193405c8079Smrg (float) encodings[n].rate.denominator); 194405c8079Smrg } 195405c8079Smrg } 196405c8079Smrg } 197405c8079Smrg 198405c8079Smrg if (ImageEncodings && (ainfo[j].type & XvImageMask)) { 199405c8079Smrg char imageName[5]; 200405c8079Smrg 201405c8079Smrg for (n = 0; n < nencode; n++) { 202405c8079Smrg if (!strcmp(encodings[n].name, "XV_IMAGE")) { 203405c8079Smrg fprintf(stdout, 204405c8079Smrg " maximum XvImage size: %li x %li\n", 205405c8079Smrg encodings[n].width, encodings[n].height); 206405c8079Smrg break; 207405c8079Smrg } 208405c8079Smrg } 209405c8079Smrg 210405c8079Smrg formats = 211405c8079Smrg XvListImageFormats(dpy, ainfo[j].base_id, &numImages); 212405c8079Smrg 213405c8079Smrg fprintf(stdout, " Number of image formats: %i\n", 214405c8079Smrg numImages); 215405c8079Smrg 216405c8079Smrg for (n = 0; n < numImages; n++) { 217405c8079Smrg sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff, 218405c8079Smrg (formats[n].id >> 8) & 0xff, 219405c8079Smrg (formats[n].id >> 16) & 0xff, 220405c8079Smrg (formats[n].id >> 24) & 0xff); 221405c8079Smrg fprintf(stdout, " id: 0x%x", formats[n].id); 222405c8079Smrg if (isprint(imageName[0]) && isprint(imageName[1]) && 223405c8079Smrg isprint(imageName[2]) && isprint(imageName[3])) { 224405c8079Smrg fprintf(stdout, " (%s)\n", imageName); 225405c8079Smrg } 226405c8079Smrg else { 227405c8079Smrg fprintf(stdout, "\n"); 228405c8079Smrg } 229405c8079Smrg if (!shortmode) { 230405c8079Smrg fprintf(stdout, " guid: "); 231405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 232405c8079Smrg formats[n].guid[0]); 233405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 234405c8079Smrg formats[n].guid[1]); 235405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 236405c8079Smrg formats[n].guid[2]); 237405c8079Smrg fprintf(stdout, "%02x-", (unsigned char) 238405c8079Smrg formats[n].guid[3]); 239405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 240405c8079Smrg formats[n].guid[4]); 241405c8079Smrg fprintf(stdout, "%02x-", (unsigned char) 242405c8079Smrg formats[n].guid[5]); 243405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 244405c8079Smrg formats[n].guid[6]); 245405c8079Smrg fprintf(stdout, "%02x-", (unsigned char) 246405c8079Smrg formats[n].guid[7]); 247405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 248405c8079Smrg formats[n].guid[8]); 249405c8079Smrg fprintf(stdout, "%02x-", (unsigned char) 250405c8079Smrg formats[n].guid[9]); 251405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 252405c8079Smrg formats[n].guid[10]); 253405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 254405c8079Smrg formats[n].guid[11]); 255405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 256405c8079Smrg formats[n].guid[12]); 257405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 258405c8079Smrg formats[n].guid[13]); 259405c8079Smrg fprintf(stdout, "%02x", (unsigned char) 260405c8079Smrg formats[n].guid[14]); 261405c8079Smrg fprintf(stdout, "%02x\n", (unsigned char) 262405c8079Smrg formats[n].guid[15]); 263405c8079Smrg 264405c8079Smrg fprintf(stdout, " bits per pixel: %i\n", 265405c8079Smrg formats[n].bits_per_pixel); 266405c8079Smrg fprintf(stdout, " number of planes: %i\n", 267405c8079Smrg formats[n].num_planes); 268405c8079Smrg fprintf(stdout, " type: %s (%s)\n", 269405c8079Smrg (formats[n].type == XvRGB) ? "RGB" : "YUV", 270405c8079Smrg (formats[n].format == 271405c8079Smrg XvPacked) ? "packed" : "planar"); 272405c8079Smrg 273405c8079Smrg if (formats[n].type == XvRGB) { 274405c8079Smrg fprintf(stdout, " depth: %i\n", 2758ae04fa6Smrg formats[n].depth); 2768ae04fa6Smrg 277405c8079Smrg fprintf(stdout, 278405c8079Smrg " red, green, blue masks: " 279405c8079Smrg "0x%x, 0x%x, 0x%x\n", 280405c8079Smrg formats[n].red_mask, 281405c8079Smrg formats[n].green_mask, 282405c8079Smrg formats[n].blue_mask); 283405c8079Smrg } 284405c8079Smrg else { 285405c8079Smrg 286405c8079Smrg } 287405c8079Smrg } 288405c8079Smrg 289405c8079Smrg } 290405c8079Smrg if (formats) 291405c8079Smrg XFree(formats); 292405c8079Smrg } 293405c8079Smrg 294405c8079Smrg XvFreeEncodingInfo(encodings); 295405c8079Smrg } 296405c8079Smrg 297405c8079Smrg } 298405c8079Smrg 299405c8079Smrg XvFreeAdaptorInfo(ainfo); 3008ae04fa6Smrg } 3018ae04fa6Smrg return 1; 3028ae04fa6Smrg} 303