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