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