xvinfo.c revision 2d1d20fc
1#include <X11/X.h> 2#include <X11/Xlib.h> 3#include <X11/extensions/Xvlib.h> 4#include <stdio.h> 5#include <stdlib.h> 6#include <string.h> 7#include <ctype.h> 8 9static void 10PrintUsage(void) 11{ 12 fprintf(stderr, "Usage: xvinfo [-display host:dpy] [-short]\n"); 13 exit(0); 14} 15 16int main(int argc, char *argv[]) 17{ 18 Display *dpy; 19 unsigned int ver, rev, eventB, reqB, errorB; 20 int i, j, k, n; 21 unsigned int nencode, nadaptors; 22 int nscreens, nattr, numImages; 23 XvAdaptorInfo *ainfo; 24 XvAttribute *attributes; 25 XvEncodingInfo *encodings; 26 XvFormat *format; 27 XvImageFormatValues *formats; 28 char * disname = NULL; 29 char shortmode = 0; 30 31 if((argc > 4)) 32 PrintUsage(); 33 34 if(argc != 1) { 35 for ( i = 1; i < argc; i ++ ) { 36 if(! strcmp(argv[i], "-display")) { 37 disname = argv[i + 1]; 38 i ++; 39 } else if(! strcmp(argv[i], "-short") ) 40 shortmode = 1; 41 else { 42 PrintUsage(); 43 } 44 } 45 } 46 47 48 if(!(dpy = XOpenDisplay(disname))) 49 { 50 fprintf(stderr, "xvinfo: Unable to open display %s\n", 51 (disname != NULL) ? disname : XDisplayName(NULL)); 52 exit(-1); 53 } 54 55 if((Success != XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB))) 56 { 57 fprintf(stderr, "xvinfo: No X-Video Extension on %s\n", 58 (disname != NULL) ? disname : XDisplayName(NULL)); 59 exit(0); 60 } 61 else 62 { 63 fprintf(stdout, "X-Video Extension version %i.%i\n", ver, rev); 64 } 65 66 nscreens = ScreenCount(dpy); 67 68 for(i = 0; i < nscreens; i++) { 69 fprintf(stdout, "screen #%i\n", i); 70 XvQueryAdaptors(dpy, RootWindow(dpy, i), &nadaptors, &ainfo); 71 72 if(!nadaptors) { 73 fprintf(stdout, " no adaptors present\n"); 74 continue; 75 } 76 77 for(j = 0; j < nadaptors; j++) { 78 fprintf(stdout, " Adaptor #%i: \"%s\"\n", j, ainfo[j].name); 79 fprintf(stdout, " number of ports: %li\n", ainfo[j].num_ports); 80 fprintf(stdout, " port base: %li\n", ainfo[j].base_id); 81 fprintf(stdout, " operations supported: "); 82 switch(ainfo[j].type & (XvInputMask | XvOutputMask)) { 83 case XvInputMask: 84 if(ainfo[j].type & XvVideoMask) 85 fprintf(stdout, "PutVideo "); 86 if(ainfo[j].type & XvStillMask) 87 fprintf(stdout, "PutStill "); 88 if(ainfo[j].type & XvImageMask) 89 fprintf(stdout, "PutImage "); 90 break; 91 case XvOutputMask: 92 if(ainfo[j].type & XvVideoMask) 93 fprintf(stdout, "GetVideo "); 94 if(ainfo[j].type & XvStillMask) 95 fprintf(stdout, "GetStill "); 96 break; 97 default: 98 fprintf(stdout, "none "); 99 break; 100 } 101 fprintf(stdout, "\n"); 102 103 format = ainfo[j].formats; 104 105 if ( ! shortmode ) { 106 fprintf(stdout, " supported visuals:\n"); 107 for(k = 0; k < ainfo[j].num_formats; k++, format++) { 108 fprintf(stdout, " depth %i, visualID 0x%2lx\n", 109 format->depth, format->visual_id); 110 } 111 } 112 113 attributes = XvQueryPortAttributes(dpy, ainfo[j].base_id, &nattr); 114 115 if(attributes && nattr) { 116 fprintf(stdout, " number of attributes: %i\n", nattr); 117 118 for(k = 0; k < nattr; k++) { 119 fprintf(stdout, " \"%s\" (range %i to %i)\n", 120 attributes[k].name, 121 attributes[k].min_value, 122 attributes[k].max_value); 123 124 if(attributes[k].flags & XvSettable) 125 if ( ! shortmode ) 126 fprintf(stdout, " client settable attribute\n"); 127 else fprintf(stdout, " settable"); 128 129 if(attributes[k].flags & XvGettable) { 130 Atom the_atom; 131 int value; 132 133 if ( ! shortmode ) 134 fprintf(stdout, " client gettable attribute"); 135 else fprintf(stdout, ", gettable"); 136 137 the_atom = XInternAtom(dpy, attributes[k].name, True); 138 139 if(the_atom != None){ 140 if((Success == XvGetPortAttribute(dpy, 141 ainfo[j].base_id, the_atom, &value))) 142 fprintf(stdout, " (current value is %i)", value); 143 } 144 fprintf(stdout, "\n"); 145 } 146 else if (shortmode) 147 fprintf(stdout, "\n"); 148 149 } 150 XFree(attributes); 151 } else { 152 fprintf(stdout, " no port attributes defined\n"); 153 } 154 155 XvQueryEncodings(dpy, ainfo[j].base_id, 156 &nencode, &encodings); 157 158 if(encodings && nencode) { 159 int ImageEncodings = 0; 160 161 for(n = 0; n < nencode; n++) { 162 if(!strcmp(encodings[n].name, "XV_IMAGE")) 163 ImageEncodings++; 164 } 165 166 if(nencode - ImageEncodings) { 167 fprintf(stdout, " number of encodings: %i\n", 168 nencode - ImageEncodings); 169 170 for(n = 0; n < nencode; n++) { 171 if(strcmp(encodings[n].name, "XV_IMAGE")) { 172 fprintf(stdout, " encoding ID #%li: \"%s\"\n", 173 encodings[n].encoding_id, 174 encodings[n].name); 175 fprintf(stdout, " size: %li x %li\n", 176 encodings[n].width, 177 encodings[n].height); 178 fprintf(stdout, " rate: %f\n", 179 (float)encodings[n].rate.numerator/ 180 (float)encodings[n].rate.denominator); 181 } 182 } 183 } 184 185 if(ImageEncodings && (ainfo[j].type & XvImageMask)) { 186 char imageName[5]; 187 188 for(n = 0; n < nencode; n++) { 189 if(!strcmp(encodings[n].name, "XV_IMAGE")) { 190 fprintf(stdout, 191 " maximum XvImage size: %li x %li\n", 192 encodings[n].width, encodings[n].height); 193 break; 194 } 195 } 196 197 formats = XvListImageFormats( 198 dpy, ainfo[j].base_id, &numImages); 199 200 fprintf(stdout, " Number of image formats: %i\n", 201 numImages); 202 203 for(n = 0; n < numImages; n++) { 204 sprintf(imageName, "%c%c%c%c", formats[n].id & 0xff, 205 (formats[n].id >> 8) & 0xff, 206 (formats[n].id >> 16) & 0xff, 207 (formats[n].id >> 24) & 0xff); 208 fprintf(stdout, " id: 0x%x", formats[n].id); 209 if(isprint(imageName[0]) && isprint(imageName[1]) && 210 isprint(imageName[2]) && isprint(imageName[3])) 211 { 212 fprintf(stdout, " (%s)\n", imageName); 213 } else { 214 fprintf(stdout, "\n"); 215 } 216 if ( ! shortmode ) { 217 fprintf(stdout, " guid: "); 218 fprintf(stdout, "%02x", (unsigned char) 219 formats[n].guid[0]); 220 fprintf(stdout, "%02x", (unsigned char) 221 formats[n].guid[1]); 222 fprintf(stdout, "%02x", (unsigned char) 223 formats[n].guid[2]); 224 fprintf(stdout, "%02x-", (unsigned char) 225 formats[n].guid[3]); 226 fprintf(stdout, "%02x", (unsigned char) 227 formats[n].guid[4]); 228 fprintf(stdout, "%02x-", (unsigned char) 229 formats[n].guid[5]); 230 fprintf(stdout, "%02x", (unsigned char) 231 formats[n].guid[6]); 232 fprintf(stdout, "%02x-", (unsigned char) 233 formats[n].guid[7]); 234 fprintf(stdout, "%02x", (unsigned char) 235 formats[n].guid[8]); 236 fprintf(stdout, "%02x-", (unsigned char) 237 formats[n].guid[9]); 238 fprintf(stdout, "%02x", (unsigned char) 239 formats[n].guid[10]); 240 fprintf(stdout, "%02x", (unsigned char) 241 formats[n].guid[11]); 242 fprintf(stdout, "%02x", (unsigned char) 243 formats[n].guid[12]); 244 fprintf(stdout, "%02x", (unsigned char) 245 formats[n].guid[13]); 246 fprintf(stdout, "%02x", (unsigned char) 247 formats[n].guid[14]); 248 fprintf(stdout, "%02x\n", (unsigned char) 249 formats[n].guid[15]); 250 251 fprintf(stdout, " bits per pixel: %i\n", 252 formats[n].bits_per_pixel); 253 fprintf(stdout, " number of planes: %i\n", 254 formats[n].num_planes); 255 fprintf(stdout, " type: %s (%s)\n", 256 (formats[n].type == XvRGB) ? "RGB" : "YUV", 257 (formats[n].format == XvPacked) ? "packed" : "planar"); 258 259 if(formats[n].type == XvRGB) { 260 fprintf(stdout, " depth: %i\n", 261 formats[n].depth); 262 263 fprintf(stdout, " red, green, blue masks: " 264 "0x%x, 0x%x, 0x%x\n", 265 formats[n].red_mask, 266 formats[n].green_mask, 267 formats[n].blue_mask); 268 } else { 269 270 } 271 } 272 273 274 } 275 if(formats) XFree(formats); 276 } 277 278 XvFreeEncodingInfo(encodings); 279 } 280 281 } 282 283 XvFreeAdaptorInfo(ainfo); 284 } 285 return 1; 286} 287