diff options
-rw-r--r-- | xvinfo.c | 505 |
1 files changed, 256 insertions, 249 deletions
@@ -9,15 +9,16 @@ static void _X_NORETURN PrintUsage(void) { - fprintf(stderr, "Usage: xvinfo [-display host:dpy] [-short]\n"); - exit(0); + fprintf(stderr, "Usage: xvinfo [-display host:dpy] [-short]\n"); + exit(0); } -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { Display *dpy; - unsigned int ver, rev, eventB, reqB, errorB; - int i, j, k, n; + unsigned int ver, rev, eventB, reqB, errorB; + int i, j, k, n; unsigned int nencode, nadaptors; int nscreens, nattr, numImages; XvAdaptorInfo *ainfo; @@ -25,262 +26,268 @@ int main(int argc, char *argv[]) XvEncodingInfo *encodings; XvFormat *format; XvImageFormatValues *formats; - char * disname = NULL; + char *disname = NULL; char shortmode = 0; - if((argc > 4)) - PrintUsage(); - - if(argc != 1) { - for ( i = 1; i < argc; i ++ ) { - if(! strcmp(argv[i], "-display")) { - disname = argv[i + 1]; - i ++; - } else if(! strcmp(argv[i], "-short") ) - shortmode = 1; - else { - PrintUsage(); - } - } + if ((argc > 4)) + PrintUsage(); + + if (argc != 1) { + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-display")) { + disname = argv[i + 1]; + i++; + } + else if (!strcmp(argv[i], "-short")) + shortmode = 1; + else { + PrintUsage(); + } + } } - - if(!(dpy = XOpenDisplay(disname))) - { - fprintf(stderr, "xvinfo: Unable to open display %s\n", - (disname != NULL) ? disname : XDisplayName(NULL)); - exit(-1); + if (!(dpy = XOpenDisplay(disname))) { + fprintf(stderr, "xvinfo: Unable to open display %s\n", + (disname != NULL) ? disname : XDisplayName(NULL)); + exit(-1); } - if((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB))) - { - fprintf(stderr, "xvinfo: No X-Video Extension on %s\n", - (disname != NULL) ? disname : XDisplayName(NULL)); - exit(0); - } - else - { - fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev); + if ((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB))) { + fprintf(stderr, "xvinfo: No X-Video Extension on %s\n", + (disname != NULL) ? disname : XDisplayName(NULL)); + exit(0); + } + else { + fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev); } nscreens = ScreenCount(dpy); - for(i = 0; i < nscreens; i++) { - fprintf(stdout, "screen #%i\n", i); - XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo); - - if(!nadaptors) { - fprintf(stdout, " no adaptors present\n"); - continue; - } - - for(j = 0; j < nadaptors; j++) { - fprintf(stdout, " Adaptor #%i: \"%s\"\n", j, ainfo[j].name); - fprintf(stdout, " number of ports: %li\n", ainfo[j].num_ports); - fprintf(stdout, " port base: %li\n", ainfo[j].base_id); - fprintf(stdout, " operations supported: "); - switch(ainfo[j].type & (XvInputMask | XvOutputMask)) { - case XvInputMask: - if(ainfo[j].type & XvVideoMask) - fprintf(stdout, "PutVideo "); - if(ainfo[j].type & XvStillMask) - fprintf(stdout, "PutStill "); - if(ainfo[j].type & XvImageMask) - fprintf(stdout, "PutImage "); - break; - case XvOutputMask: - if(ainfo[j].type & XvVideoMask) - fprintf(stdout, "GetVideo "); - if(ainfo[j].type & XvStillMask) - fprintf(stdout, "GetStill "); - break; - default: - fprintf(stdout, "none "); - break; - } - fprintf(stdout, "\n"); - - format = ainfo[j].formats; - - if ( ! shortmode ) { - fprintf(stdout, " supported visuals:\n"); - for(k = 0; k < ainfo[j].num_formats; k++, format++) { - fprintf(stdout, " depth %i, visualID 0x%2lx\n", - format->depth, format->visual_id); - } - } - - attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr); - - if(attributes && nattr) { - fprintf(stdout, " number of attributes: %i\n", nattr); - - for(k = 0; k < nattr; k++) { - fprintf(stdout, " \"%s\" (range %i to %i)\n", - attributes[k].name, - attributes[k].min_value, - attributes[k].max_value); - - if(attributes[k].flags & XvSettable) - if ( ! shortmode ) - fprintf(stdout, " client settable attribute\n"); - else fprintf(stdout, " settable"); - - if(attributes[k].flags & XvGettable) { - Atom the_atom; - int value; - - if ( ! shortmode ) - fprintf(stdout, " client gettable attribute"); - else fprintf(stdout, ", gettable"); - - the_atom = XInternAtom(dpy, attributes[k].name, True); - - if(the_atom != None){ - if((Success == XvGetPortAttribute(dpy, - ainfo[j].base_id, the_atom, &value))) - fprintf(stdout, " (current value is %i)", value); - } - fprintf(stdout, "\n"); - } - else if (shortmode) - fprintf(stdout, "\n"); - - } - XFree(attributes); - } else { - fprintf(stdout, " no port attributes defined\n"); - } - - XvQueryEncodings(dpy, ainfo[j].base_id, - &nencode, &encodings); - - if(encodings && nencode) { - int ImageEncodings = 0; - - for(n = 0; n < nencode; n++) { - if(!strcmp(encodings[n].name, "XV_IMAGE")) - ImageEncodings++; - } - - if(nencode - ImageEncodings) { - fprintf(stdout, " number of encodings: %i\n", - nencode - ImageEncodings); - - for(n = 0; n < nencode; n++) { - if(strcmp(encodings[n].name, "XV_IMAGE")) { - fprintf(stdout, " encoding ID #%li: \"%s\"\n", - encodings[n].encoding_id, - encodings[n].name); - fprintf(stdout, " size: %li x %li\n", - encodings[n].width, - encodings[n].height); - fprintf(stdout, " rate: %f\n", - (float)encodings[n].rate.numerator/ - (float)encodings[n].rate.denominator); - } - } - } - - if(ImageEncodings && (ainfo[j].type & XvImageMask)) { - char imageName[5]; - - for(n = 0; n < nencode; n++) { - if(!strcmp(encodings[n].name, "XV_IMAGE")) { - fprintf(stdout, - " maximum XvImage size: %li x %li\n", - encodings[n].width, encodings[n].height); - break; - } - } - - formats = XvListImageFormats( - dpy, ainfo[j].base_id, &numImages); - - fprintf(stdout, " Number of image formats: %i\n", - numImages); - - for(n = 0; n < numImages; n++) { - sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff, - (formats[n].id >> 8) & 0xff, - (formats[n].id >> 16) & 0xff, - (formats[n].id >> 24) & 0xff); - fprintf(stdout, " id: 0x%x", formats[n].id); - if(isprint(imageName[0]) && isprint(imageName[1]) && - isprint(imageName[2]) && isprint(imageName[3])) - { - fprintf(stdout, " (%s)\n", imageName); - } else { - fprintf(stdout, "\n"); - } - if ( ! shortmode ) { - fprintf(stdout, " guid: "); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[0]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[1]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[2]); - fprintf(stdout, "%02x-", (unsigned char) - formats[n].guid[3]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[4]); - fprintf(stdout, "%02x-", (unsigned char) - formats[n].guid[5]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[6]); - fprintf(stdout, "%02x-", (unsigned char) - formats[n].guid[7]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[8]); - fprintf(stdout, "%02x-", (unsigned char) - formats[n].guid[9]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[10]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[11]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[12]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[13]); - fprintf(stdout, "%02x", (unsigned char) - formats[n].guid[14]); - fprintf(stdout, "%02x\n", (unsigned char) - formats[n].guid[15]); - - fprintf(stdout, " bits per pixel: %i\n", - formats[n].bits_per_pixel); - fprintf(stdout, " number of planes: %i\n", - formats[n].num_planes); - fprintf(stdout, " type: %s (%s)\n", - (formats[n].type == XvRGB) ? "RGB" : "YUV", - (formats[n].format == XvPacked) ? "packed" : "planar"); - - if(formats[n].type == XvRGB) { - fprintf(stdout, " depth: %i\n", + for (i = 0; i < nscreens; i++) { + fprintf(stdout, "screen #%i\n", i); + XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo); + + if (!nadaptors) { + fprintf(stdout, " no adaptors present\n"); + continue; + } + + for (j = 0; j < nadaptors; j++) { + fprintf(stdout, " Adaptor #%i: \"%s\"\n", j, ainfo[j].name); + fprintf(stdout, " number of ports: %li\n", ainfo[j].num_ports); + fprintf(stdout, " port base: %li\n", ainfo[j].base_id); + fprintf(stdout, " operations supported: "); + switch (ainfo[j].type & (XvInputMask | XvOutputMask)) { + case XvInputMask: + if (ainfo[j].type & XvVideoMask) + fprintf(stdout, "PutVideo "); + if (ainfo[j].type & XvStillMask) + fprintf(stdout, "PutStill "); + if (ainfo[j].type & XvImageMask) + fprintf(stdout, "PutImage "); + break; + case XvOutputMask: + if (ainfo[j].type & XvVideoMask) + fprintf(stdout, "GetVideo "); + if (ainfo[j].type & XvStillMask) + fprintf(stdout, "GetStill "); + break; + default: + fprintf(stdout, "none "); + break; + } + fprintf(stdout, "\n"); + + format = ainfo[j].formats; + + if (!shortmode) { + fprintf(stdout, " supported visuals:\n"); + for (k = 0; k < ainfo[j].num_formats; k++, format++) { + fprintf(stdout, " depth %i, visualID 0x%2lx\n", + format->depth, format->visual_id); + } + } + + attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr); + + if (attributes && nattr) { + fprintf(stdout, " number of attributes: %i\n", nattr); + + for (k = 0; k < nattr; k++) { + fprintf(stdout, " \"%s\" (range %i to %i)\n", + attributes[k].name, + attributes[k].min_value, attributes[k].max_value); + + if (attributes[k].flags & XvSettable) + if (!shortmode) + fprintf(stdout, + " client settable attribute\n"); + else + fprintf(stdout, " settable"); + + if (attributes[k].flags & XvGettable) { + Atom the_atom; + + int value; + + if (!shortmode) + fprintf(stdout, + " client gettable attribute"); + else + fprintf(stdout, ", gettable"); + + the_atom = XInternAtom(dpy, attributes[k].name, True); + + if (the_atom != None) { + if ((Success == XvGetPortAttribute(dpy, + ainfo[j].base_id, + the_atom, + &value))) + fprintf(stdout, " (current value is %i)", + value); + } + fprintf(stdout, "\n"); + } + else if (shortmode) + fprintf(stdout, "\n"); + + } + XFree(attributes); + } + else { + fprintf(stdout, " no port attributes defined\n"); + } + + XvQueryEncodings(dpy, ainfo[j].base_id, &nencode, &encodings); + + if (encodings && nencode) { + int ImageEncodings = 0; + + for (n = 0; n < nencode; n++) { + if (!strcmp(encodings[n].name, "XV_IMAGE")) + ImageEncodings++; + } + + if (nencode - ImageEncodings) { + fprintf(stdout, " number of encodings: %i\n", + nencode - ImageEncodings); + + for (n = 0; n < nencode; n++) { + if (strcmp(encodings[n].name, "XV_IMAGE")) { + fprintf(stdout, " encoding ID #%li: \"%s\"\n", + encodings[n].encoding_id, + encodings[n].name); + fprintf(stdout, " size: %li x %li\n", + encodings[n].width, encodings[n].height); + fprintf(stdout, " rate: %f\n", + (float) encodings[n].rate.numerator / + (float) encodings[n].rate.denominator); + } + } + } + + if (ImageEncodings && (ainfo[j].type & XvImageMask)) { + char imageName[5]; + + for (n = 0; n < nencode; n++) { + if (!strcmp(encodings[n].name, "XV_IMAGE")) { + fprintf(stdout, + " maximum XvImage size: %li x %li\n", + encodings[n].width, encodings[n].height); + break; + } + } + + formats = + XvListImageFormats(dpy, ainfo[j].base_id, &numImages); + + fprintf(stdout, " Number of image formats: %i\n", + numImages); + + for (n = 0; n < numImages; n++) { + sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff, + (formats[n].id >> 8) & 0xff, + (formats[n].id >> 16) & 0xff, + (formats[n].id >> 24) & 0xff); + fprintf(stdout, " id: 0x%x", formats[n].id); + if (isprint(imageName[0]) && isprint(imageName[1]) && + isprint(imageName[2]) && isprint(imageName[3])) { + fprintf(stdout, " (%s)\n", imageName); + } + else { + fprintf(stdout, "\n"); + } + if (!shortmode) { + fprintf(stdout, " guid: "); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[0]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[1]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[2]); + fprintf(stdout, "%02x-", (unsigned char) + formats[n].guid[3]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[4]); + fprintf(stdout, "%02x-", (unsigned char) + formats[n].guid[5]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[6]); + fprintf(stdout, "%02x-", (unsigned char) + formats[n].guid[7]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[8]); + fprintf(stdout, "%02x-", (unsigned char) + formats[n].guid[9]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[10]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[11]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[12]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[13]); + fprintf(stdout, "%02x", (unsigned char) + formats[n].guid[14]); + fprintf(stdout, "%02x\n", (unsigned char) + formats[n].guid[15]); + + fprintf(stdout, " bits per pixel: %i\n", + formats[n].bits_per_pixel); + fprintf(stdout, " number of planes: %i\n", + formats[n].num_planes); + fprintf(stdout, " type: %s (%s)\n", + (formats[n].type == XvRGB) ? "RGB" : "YUV", + (formats[n].format == + XvPacked) ? "packed" : "planar"); + + if (formats[n].type == XvRGB) { + fprintf(stdout, " depth: %i\n", formats[n].depth); - fprintf(stdout, " red, green, blue masks: " - "0x%x, 0x%x, 0x%x\n", - formats[n].red_mask, - formats[n].green_mask, - formats[n].blue_mask); - } else { - - } - } - - - } - if(formats) XFree(formats); - } - - XvFreeEncodingInfo(encodings); - } - - } - - XvFreeAdaptorInfo(ainfo); + fprintf(stdout, + " red, green, blue masks: " + "0x%x, 0x%x, 0x%x\n", + formats[n].red_mask, + formats[n].green_mask, + formats[n].blue_mask); + } + else { + + } + } + + } + if (formats) + XFree(formats); + } + + XvFreeEncodingInfo(encodings); + } + + } + + XvFreeAdaptorInfo(ainfo); } return 1; } |