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